diff --git a/1-getting-started/lessons/1-introduction-to-iot/README.md b/1-getting-started/lessons/1-introduction-to-iot/README.md index b739ddc7..6d1401eb 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/README.md +++ b/1-getting-started/lessons/1-introduction-to-iot/README.md @@ -4,6 +4,14 @@ > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. +This lesson was taught as part of the [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) from the [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). The lesson was taught as 2 videos - a 1 hour lesson, and a 1 hour office hour diving deeper into parts of the lesson and answering questions. + +[![Lesson 1: Introduction to IoT](https://img.youtube.com/vi/bVFfcYh6UBw/0.jpg)](https://youtu.be/bVFfcYh6UBw) + +[![Lesson 1: Introduction to IoT - Office hours](https://img.youtube.com/vi/YI772q5v3yI/0.jpg)](https://youtu.be/YI772q5v3yI) + +> đŸŽĨ Click the images above to watch the videos + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/1) diff --git a/1-getting-started/lessons/1-introduction-to-iot/translations/assignment.zh-cn.md b/1-getting-started/lessons/1-introduction-to-iot/translations/assignment.zh-cn.md index fbcf4b2f..e7e8d448 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/translations/assignment.zh-cn.md +++ b/1-getting-started/lessons/1-introduction-to-iot/translations/assignment.zh-cn.md @@ -8,6 +8,6 @@ ## č¯„åˆ†čĄ¨ -| æĄäģļ | äŧ˜į§€ | 一čˆŦ | 需攚čŋ› | +| 标准 | äŧ˜į§€ | 一čˆŦ | 需攚čŋ› | | -------- | --------- | -------- | ----------------- | -| č§Ŗé‡ŠéĄšį›Žįš„åĨŊ处与坏处 | æŠŠéĄšį›Žįš„åĨŊå¤„ä¸Žåå¤„č§Ŗé‡Šåž—åžˆæ¸…æĨš |įŽ€čĻåœ°č§Ŗé‡ŠéĄšį›Žįš„åĨŊ处与坏处 | æ˛Ąæœ‰č§Ŗé‡ŠéĄšį›Žįš„åĨŊ处与坏处 | +| č§Ŗé‡ŠéĄšį›Žįš„åĨŊ处与坏处 | æŠŠéĄšį›Žįš„åĨŊå¤„ä¸Žåå¤„č§Ŗé‡Šåž—åžˆæ¸…æĨš | įŽ€čĻåœ°č§Ŗé‡ŠéĄšį›Žįš„åĨŊ处与坏处 | æ˛Ąæœ‰č§Ŗé‡ŠéĄšį›Žįš„åĨŊ处与坏处 | diff --git a/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md b/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md index dbda7c91..ec101791 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md +++ b/1-getting-started/lessons/1-introduction-to-iot/virtual-device.md @@ -55,11 +55,18 @@ Configure a Python virtual environment and install the pip packages for CounterF 1. Activate the virtual environment: - * On Windows run: + * On Windows: + * If you are using the Command Prompt, or the Command Prompt through Windows Terminal, run: - ```cmd - .venv\Scripts\activate.bat - ``` + ```cmd + .venv\Scripts\activate.bat + ``` + + * If you are using PowerShell, run: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` * On macOS or Linux, run: @@ -67,6 +74,8 @@ Configure a Python virtual environment and install the pip packages for CounterF source ./.venv/bin/activate ``` + > 💁 These commands should be run from the same location you ran the command to create the virtual environment. You will never need to navigate into the `.venv` folder, you should always run the activate command and any commands to install packages or run code from the folder you were in when you created the virtual environment. + 1. Once the virtual environment has been activated, the default `python` command will run the version of Python that was used to create the virtual environment. Run the following to get the version: ```sh diff --git a/1-getting-started/lessons/2-deeper-dive/README.md b/1-getting-started/lessons/2-deeper-dive/README.md index 7b8b2a59..f140f403 100644 --- a/1-getting-started/lessons/2-deeper-dive/README.md +++ b/1-getting-started/lessons/2-deeper-dive/README.md @@ -4,6 +4,14 @@ > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. +This lesson was taught as part of the [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) from the [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). The lesson was taught as 2 videos - a 1 hour lesson, and a 1 hour office hour diving deeper into parts of the lesson and answering questions. + +[![Lesson 2: A deeper dive into IoT](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M) + +[![Lesson 2: A deeper dive into IoT - Office hours](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E) + +> đŸŽĨ Click the images above to watch the videos + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/3) diff --git a/1-getting-started/lessons/2-deeper-dive/translations/assignment.zh-cn.md b/1-getting-started/lessons/2-deeper-dive/translations/assignment.zh-cn.md new file mode 100644 index 00000000..3c5f648b --- /dev/null +++ b/1-getting-started/lessons/2-deeper-dive/translations/assignment.zh-cn.md @@ -0,0 +1,12 @@ +# æ¯”čžƒä¸Žå¯šæ¯”åžŽæŽ§åˆļ器和单æŋčŽĄįŽ—æœē + +## 指į¤ē + +čŋ™ä¸Ēč¯žį¨‹æļĩį›–äē†åžŽæŽ§åˆļ器和单æŋčŽĄįŽ—æœē。创åģē一ä¸Ē襨æ ŧæĨæ¯”čžƒä¸Žå¯šæ¯”åŽƒäģŦīŧŒåšļčŽ°ä¸‹č‡ŗå°‘ä¸¤ä¸Ē垎控åˆļ器和单æŋčŽĄįŽ—æœēį›¸æ¯”äš‹ä¸‹é€‰æ‹ŠåžŽæŽ§åˆļå™¨įš„åŽŸå› īŧŒčŋ˜æœ‰č‡ŗå°‘两ä¸Ē垎控åˆļ器和单æŋčŽĄįŽ—æœēį›¸æ¯”äš‹ä¸‹é€‰æ‹Šå•æŋčŽĄįŽ—æœēįš„åŽŸå› ã€‚ + +## č¯„åˆ†čĄ¨ + +| 标准 | äŧ˜į§€ | 一čˆŦ | 需攚čŋ› | +| -------- | --------- | -------- | ----------------- | +| 创åģē一ä¸Ē襨æ ŧæĨæ¯”čžƒåžŽæŽ§åˆļ器和单æŋčŽĄįŽ—æœē | 创åģē一ä¸Ēæœ‰å¤šéĄšįš„åˆ—čĄ¨æĨæ­ŖįĄŽåœ°æ¯”čžƒå’Œå¯šæ¯”åŽƒäģŦ | 创åģē一ä¸ĒåĒæœ‰å‡ éĄšįš„åˆ—čĄ¨ | åĒčƒŊæƒŗå‡ē一项īŧŒæˆ–一饚ä🿞Ąæœ‰æĨæ¯”čžƒå’Œå¯šæ¯”åŽƒäģŦ | +| 两ä¸Ēį›¸æ¯”äš‹ä¸‹é€‰æ‹ŠæŸä¸€ä¸Ēįš„åŽŸå›  | čƒŊ够ä¸ē垎控åˆļ器提å‡ē臺少䏤ä¸Ē原因īŧŒč€Œä¸”ä¸ē单æŋčŽĄįŽ—æœē提å‡ē臺少䏤ä¸Ē原因 | åĒčƒŊä¸ē垎控åˆļ器提å‡ē一两ä¸Ē原因īŧŒč€Œä¸”ä¸ē单æŋčŽĄįŽ—æœē提å‡ē一两ä¸Ē原因 | æ— æŗ•ä¸ē垎控åˆļ器或单æŋčŽĄįŽ—æœē提å‡ē臺少䏀ä¸Ē原因 | diff --git a/1-getting-started/lessons/3-sensors-and-actuators/README.md b/1-getting-started/lessons/3-sensors-and-actuators/README.md index 1e17e0de..9f7a1615 100644 --- a/1-getting-started/lessons/3-sensors-and-actuators/README.md +++ b/1-getting-started/lessons/3-sensors-and-actuators/README.md @@ -4,6 +4,14 @@ > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. +This lesson was taught as part of the [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) from the [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). The lesson was taught as 2 videos - a 1 hour lesson, and a 1 hour office hour diving deeper into parts of the lesson and answering questions. + +[![Lesson 3: Interact with the Physical World with Sensors and Actuators](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4) + +[![Lesson 3: Interact with the Physical World with Sensors and Actuators - Office hours](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA) + +> đŸŽĨ Click the images above to watch the videos + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/5) diff --git a/1-getting-started/lessons/4-connect-internet/README.md b/1-getting-started/lessons/4-connect-internet/README.md index 475239f8..31567fcd 100644 --- a/1-getting-started/lessons/4-connect-internet/README.md +++ b/1-getting-started/lessons/4-connect-internet/README.md @@ -4,6 +4,14 @@ > Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. +This lesson was taught as part of the [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) from the [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn). The lesson was taught as 2 videos - a 1 hour lesson, and a 1 hour office hour diving deeper into parts of the lesson and answering questions. + +[![Lesson 4: Connect your Device to the Internet](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs) + +[![Lesson 4: Connect your Device to the Internet - Office hours](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)](https://youtu.be/j-cVCzRDE2Q) + +> đŸŽĨ Click the images above to watch the videos + ## Pre-lecture quiz [Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/7) @@ -178,11 +186,18 @@ Configure a Python virtual environment and install the MQTT pip packages. 1. Activate the virtual environment: - * On Windows run: + * On Windows: + * If you are using the Command Prompt, or the Command Prompt through Windows Terminal, run: - ```cmd - .venv\Scripts\activate.bat - ``` + ```cmd + .venv\Scripts\activate.bat + ``` + + * If you are using PowerShell, run: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` * On macOS or Linux, run: @@ -190,6 +205,8 @@ Configure a Python virtual environment and install the MQTT pip packages. source ./.venv/bin/activate ``` + > 💁 These commands should be run from the same location you ran the command to create the virtual environment. You will never need to navigate into the `.venv` folder, you should always run the activate command and any commands to install packages or run code from the folder you were in when you created the virtual environment. + 1. Once the virtual environment has been activated, the default `python` command will run the version of Python that was used to create the virtual environment. Run the following to get the version: ```sh diff --git a/1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/platformio.ini b/1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/platformio.ini index 0e141c71..1f170f4b 100644 --- a/1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/platformio.ini +++ b/1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/platformio.ini @@ -16,7 +16,7 @@ lib_deps = knolleary/PubSubClient @ 2.8 bblanchon/ArduinoJson @ 6.17.3 seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 \ No newline at end of file diff --git a/1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/src/main.cpp b/1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/src/main.cpp index e8c1ac21..8f0fd6b5 100644 --- a/1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/src/main.cpp +++ b/1-getting-started/lessons/4-connect-internet/code-commands/wio-terminal/nightlight/src/main.cpp @@ -100,8 +100,7 @@ void loop() doc["light"] = light; string telemetry; - JsonObject obj = doc.as(); - serializeJson(obj, telemetry); + serializeJson(doc, telemetry); Serial.print("Sending telemetry "); Serial.println(telemetry.c_str()); diff --git a/1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal/nightlight/platformio.ini b/1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal/nightlight/platformio.ini index f11c7019..3b572246 100644 --- a/1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal/nightlight/platformio.ini +++ b/1-getting-started/lessons/4-connect-internet/code-mqtt/wio-terminal/nightlight/platformio.ini @@ -15,7 +15,7 @@ framework = arduino lib_deps = knolleary/PubSubClient @ 2.8 seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 diff --git a/1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal/nightlight/platformio.ini b/1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal/nightlight/platformio.ini index db2bae01..f6f4f1c0 100644 --- a/1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal/nightlight/platformio.ini +++ b/1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal/nightlight/platformio.ini @@ -15,8 +15,8 @@ framework = arduino lib_deps = knolleary/PubSubClient @ 2.8 seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 bblanchon/ArduinoJson @ 6.17.3 diff --git a/1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal/nightlight/src/main.cpp b/1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal/nightlight/src/main.cpp index 5bf64b3e..81bcfff4 100644 --- a/1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal/nightlight/src/main.cpp +++ b/1-getting-started/lessons/4-connect-internet/code-telemetry/wio-terminal/nightlight/src/main.cpp @@ -74,8 +74,7 @@ void loop() doc["light"] = light; string telemetry; - JsonObject obj = doc.as(); - serializeJson(obj, telemetry); + serializeJson(doc, telemetry); Serial.print("Sending telemetry "); Serial.println(telemetry.c_str()); diff --git a/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md b/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md index f1dd6650..ee114562 100644 --- a/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md +++ b/1-getting-started/lessons/4-connect-internet/wio-terminal-mqtt.md @@ -25,8 +25,8 @@ Install the Arduino libraries. ```ini lib_deps = seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 ``` diff --git a/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md b/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md index 12897cf1..86dbbe62 100644 --- a/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md +++ b/1-getting-started/lessons/4-connect-internet/wio-terminal-telemetry.md @@ -53,8 +53,7 @@ Publish telemetry to the MQTT broker. doc["light"] = light; string telemetry; - JsonObject obj = doc.as(); - serializeJson(obj, telemetry); + serializeJson(doc, telemetry); Serial.print("Sending telemetry "); Serial.println(telemetry.c_str()); diff --git a/2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal/temperature-sensor/platformio.ini b/2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal/temperature-sensor/platformio.ini index 916fd4b6..f12154eb 100644 --- a/2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal/temperature-sensor/platformio.ini +++ b/2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal/temperature-sensor/platformio.ini @@ -17,7 +17,7 @@ lib_deps = knolleary/PubSubClient @ 2.8 bblanchon/ArduinoJson @ 6.17.3 seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 diff --git a/2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal/temperature-sensor/src/main.cpp b/2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal/temperature-sensor/src/main.cpp index c76c516b..21192256 100644 --- a/2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal/temperature-sensor/src/main.cpp +++ b/2-farm/lessons/1-predict-plant-growth/code-publish-temperature/wio-terminal/temperature-sensor/src/main.cpp @@ -77,8 +77,7 @@ void loop() doc["temperature"] = temp_hum_val[1]; string telemetry; - JsonObject obj = doc.as(); - serializeJson(obj, telemetry); + serializeJson(doc, telemetry); Serial.print("Sending telemetry "); Serial.println(telemetry.c_str()); diff --git a/2-farm/lessons/3-automated-plant-watering/code-mqtt/wio-terminal/soil-moisture-sensor/platformio.ini b/2-farm/lessons/3-automated-plant-watering/code-mqtt/wio-terminal/soil-moisture-sensor/platformio.ini index 2f148840..3888824e 100644 --- a/2-farm/lessons/3-automated-plant-watering/code-mqtt/wio-terminal/soil-moisture-sensor/platformio.ini +++ b/2-farm/lessons/3-automated-plant-watering/code-mqtt/wio-terminal/soil-moisture-sensor/platformio.ini @@ -16,7 +16,7 @@ lib_deps = knolleary/PubSubClient @ 2.8 bblanchon/ArduinoJson @ 6.17.3 seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 diff --git a/2-farm/lessons/3-automated-plant-watering/code-mqtt/wio-terminal/soil-moisture-sensor/src/main.cpp b/2-farm/lessons/3-automated-plant-watering/code-mqtt/wio-terminal/soil-moisture-sensor/src/main.cpp index fd4bac4a..486d7db8 100644 --- a/2-farm/lessons/3-automated-plant-watering/code-mqtt/wio-terminal/soil-moisture-sensor/src/main.cpp +++ b/2-farm/lessons/3-automated-plant-watering/code-mqtt/wio-terminal/soil-moisture-sensor/src/main.cpp @@ -100,8 +100,7 @@ void loop() doc["soil_moisture"] = soil_moisture; string telemetry; - JsonObject obj = doc.as(); - serializeJson(obj, telemetry); + serializeJson(doc, telemetry); Serial.print("Sending telemetry "); Serial.println(telemetry.c_str()); diff --git a/2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal/soil-moisture-sensor/platformio.ini b/2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal/soil-moisture-sensor/platformio.ini index 3daba989..32966cc9 100644 --- a/2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal/soil-moisture-sensor/platformio.ini +++ b/2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal/soil-moisture-sensor/platformio.ini @@ -15,8 +15,8 @@ framework = arduino lib_deps = bblanchon/ArduinoJson @ 6.17.3 seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 seeed-studio/Seeed Arduino RTC @ 2.0.0 diff --git a/2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal/soil-moisture-sensor/src/main.cpp b/2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal/soil-moisture-sensor/src/main.cpp index 23ef9191..7d18409f 100644 --- a/2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal/soil-moisture-sensor/src/main.cpp +++ b/2-farm/lessons/4-migrate-your-plant-to-the-cloud/code/wio-terminal/soil-moisture-sensor/src/main.cpp @@ -120,8 +120,7 @@ void loop() doc["soil_moisture"] = soil_moisture; string telemetry; - JsonObject obj = doc.as(); - serializeJson(obj, telemetry); + serializeJson(doc, telemetry); Serial.print("Sending telemetry "); Serial.println(telemetry.c_str()); diff --git a/2-farm/lessons/5-migrate-application-to-the-cloud/README.md b/2-farm/lessons/5-migrate-application-to-the-cloud/README.md index 3d428cec..3811b456 100644 --- a/2-farm/lessons/5-migrate-application-to-the-cloud/README.md +++ b/2-farm/lessons/5-migrate-application-to-the-cloud/README.md @@ -131,11 +131,18 @@ The Azure Functions CLI can be used to create a new Functions app. 1. Activate the virtual environment: - * On Windows run: + * On Windows: + * If you are using the Command Prompt, or the Command Prompt through Windows Terminal, run: - ```cmd - .venv\Scripts\activate.bat - ``` + ```cmd + .venv\Scripts\activate.bat + ``` + + * If you are using PowerShell, run: + + ```powershell + .\.venv\Scripts\Activate.ps1 + ``` * On macOS or Linux, run: @@ -143,6 +150,8 @@ The Azure Functions CLI can be used to create a new Functions app. source ./.venv/bin/activate ``` + > 💁 These commands should be run from the same location you ran the command to create the virtual environment. You will never need to navigate into the `.venv` folder, you should always run the activate command and any commands to install packages or run code from the folder you were in when you created the virtual environment. + 1. Run the following command to create a Functions app in this folder: ```sh diff --git a/2-farm/lessons/5-migrate-application-to-the-cloud/translations/assignment.bn.md b/2-farm/lessons/5-migrate-application-to-the-cloud/translations/assignment.bn.md index 0697bf5a..41bae594 100644 --- a/2-farm/lessons/5-migrate-application-to-the-cloud/translations/assignment.bn.md +++ b/2-farm/lessons/5-migrate-application-to-the-cloud/translations/assignment.bn.md @@ -54,4 +54,3 @@ | --------- | ------------------ | ------------- | --------------------- | | HTTP āĻŸā§āϰāĻŋāĻ—āĻžāϰ āϤ⧈āϰ⧀ | āϏāĻ āĻŋāĻ• āύāĻžāĻŽāĻ•āϰāϪ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ ⧍āϟāĻŋ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āϰāĻŋāϞ⧇ āĻ…āύ/āĻ…āĻĢ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇ | āϏāĻ āĻŋāĻ• āύāĻžāĻŽāĻ•āϰāϪ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ ā§§āϟāĻŋ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āϛ⧇ | āϕ⧋āύ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āϤ⧈āϰ⧀ āĻ•āϰāϤ⧇ āϏāĻŽāĻ°ā§āĻĨ āĻšā§ŸāύāĻŋ | | āĻāχāϚāϟāĻŋāϟāĻŋāĻĒāĻŋ āĻŸā§āϰāĻŋāĻ—āĻžāϰāϗ⧁āϞāĻŋ āĻĨ⧇āϕ⧇ āϰāĻŋāϞ⧇ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāĻž | āωāĻ­āϝāĻŧ āĻŸā§āϰāĻŋāĻ—āĻžāϰāϕ⧇ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϝāĻĨā§‹āĻĒāϝ⧁āĻ•ā§āϤāĻ­āĻžāĻŦ⧇ āϰāĻŋāϞ⧇ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ| āϕ⧇āĻŦāϞ ā§§āϟāĻŋ āĻŸā§āϰāĻŋāĻ—āĻžāϰāϕ⧇ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϝāĻĨā§‹āĻĒāϝ⧁āĻ•ā§āϤāĻ­āĻžāĻŦ⧇ āϰāĻŋāϞ⧇ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ | āĻŸā§āϰāĻŋāĻ—āĻžāϰāϕ⧇ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āϏāĻŽāĻ°ā§āĻĨ āĻšā§ŸāύāĻŋ | -{"mode":"full","isActive":false} diff --git a/2-farm/lessons/6-keep-your-plant-secure/translations/.dummy.md b/2-farm/lessons/6-keep-your-plant-secure/translations/.dummy.md deleted file mode 100644 index 6e7db247..00000000 --- a/2-farm/lessons/6-keep-your-plant-secure/translations/.dummy.md +++ /dev/null @@ -1,9 +0,0 @@ -# Dummy File - -This file acts as a placeholder for the `translations` folder.
-**Please remove this file after adding the first translation** - -For the instructions, follow the directives in the [translations guide](https://github.com/microsoft/IoT-For-Beginners/blob/main/TRANSLATIONS.md) . - -## THANK YOU -We truly appreciate your efforts! diff --git a/2-farm/lessons/6-keep-your-plant-secure/translations/README.bn.md b/2-farm/lessons/6-keep-your-plant-secure/translations/README.bn.md new file mode 100644 index 00000000..f9de5322 --- /dev/null +++ b/2-farm/lessons/6-keep-your-plant-secure/translations/README.bn.md @@ -0,0 +1,245 @@ +# āωāĻĻā§āĻ­āĻŋāĻĻ⧇āϰ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤāĻ•āϰāĻŖ + +![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-10.jpg) + +> āĻ¸ā§āϕ⧇āϚāύ⧋āϟāϟāĻŋ āϤ⧈āϰ⧀ āĻ•āϰ⧇āϛ⧇āύ [Nitya Narasimhan](https://github.com/nitya). āĻŦ⧜ āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇ āĻĻ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻ›āĻŦāĻŋāϟāĻŋāϤ⧇ āĻ•ā§āϞāĻŋāĻ• āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ + +## āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ + +[āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/19) + +## āϏ⧂āϚāύāĻž + + +āĻ—āϤ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻĒāĻžāϠ⧇ āφāĻŽāϰāĻž āĻŽāĻžāϟāĻŋ āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĻ›āĻŋ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇āĻ›āĻŋāĨ¤ āϤāĻŦ⧇ āϝāĻĻāĻŋ āĻšā§āϝāĻžāĻ•āĻžāϰāϰāĻž āφāĻŽāĻžāĻĻ⧇āϰ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋāϰ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻĻāĻ–āϞ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧ āϤāĻŦ⧇ āϕ⧀ āĻšāĻŦ⧇? āϕ⧀ āĻšāĻŦ⧇ āϝāĻĻāĻŋ āϤāĻžāϰāĻž āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻžāϰ āϏāĻ āĻŋāĻ• āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇, āωāĻšā§āϚāĻŽāĻžāύ āĻĒāĻžāĻ āĻžāϝāĻŧ - āϝāĻžāϤ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻ—āĻžāĻ›āĻĒāĻžāϞāĻž āĻ•āĻ–āύāχ āϏ⧇āϚ āύāĻž āĻĒāĻžā§Ÿ āĻ…āĻĨāĻŦāĻž āφāĻŽāĻžāĻĻ⧇āϰ āϏ⧇āϚāĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻž āϏāĻŦāϏāĻŽā§Ÿ āϚāĻžāϞ⧁ āϰ⧇āϖ⧇ āϝāĻĻāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āĻ—āĻžāĻ›āϗ⧁āϞāĻŋāϕ⧇ āĻŦ⧇āĻļāĻŋ āĻĒāĻžāύāĻŋāϤ⧇ āĻĄā§āĻŦāĻŋā§Ÿā§‡ āϰāĻžāϖ⧇ ? + +āĻāχ āĻĒāĻžāϠ⧇ āφāĻŽāϰāĻž āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāϰ āĻŦāĻŋāώāϝāĻŧ⧇ āĻļāĻŋāĻ–āĻŦāĨ¤ āϝ⧇āĻšā§‡āϤ⧁ āĻāϟāĻŋ āĻāχ āĻĒā§āϰāĻ•āĻ˛ā§āĻĒ⧇āϰ āĻļ⧇āώ āĻĒāĻžāĻ , āφāĻŽāϰāĻž āφāĻŽāĻžāĻĻ⧇āϰ āĻ•ā§āϞāĻžāωāĻĄ āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϗ⧁āϞāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āϗ⧁āĻ›āĻŋā§Ÿā§‡ āϰāĻžāĻ–āϤ⧇ āĻĒāĻžāϰāĻŋ āϝāĻžāϤ⧇ āĻŦā§āϝāϝāĻŧ āĻšā§āϰāĻžāϏ āĻšā§Ÿ - āϤāĻž āĻļāĻŋāĻ–āĻŦāĨ¤ + +āĻāχ āĻĒāĻžāϠ⧇ āφāĻŽāϰāĻž āĻĻ⧇āĻ–āĻŦā§‹: + +* [āϕ⧇āύ āφāĻŽāĻžāĻĻ⧇āϰ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āĻ•āϰāĻž āĻĻāϰāĻ•āĻžāϰ?](#āϕ⧇āύ-āφāĻŽāĻžāĻĻ⧇āϰ-āφāχāĻ“āϟāĻŋ-āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋ-āϏ⧁āϰāĻ•ā§āώāĻŋāϤ-āĻ•āϰāĻž-āĻĻāϰāĻ•āĻžāϰ) +* [āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ (Cryptography)](#āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ) +* [āφāĻŽāĻžāĻĻ⧇āϰ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āύāĻŋāϰāĻžāĻĒāĻĻ āϰāĻžāĻ–āĻž](#āφāχāĻ“āϟāĻŋ-āĻĄāĻŋāĻ­āĻžāχāϏ-āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž) +* [X.509 Certificate āϤ⧈āϰ⧀ āĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰ](#X.509-Certificate-āϤ⧈āϰ⧀-āĻ“-āĻŦā§āϝāĻŦāĻšāĻžāϰ) + +> 🗑 āĻāϟāĻŋ āĻāχ āĻĒā§āϰāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āĻļ⧇āώ āϞ⧇āϏāύ, āϏ⧁āϤāϰāĻžāĻ‚ āĻāχ āĻĒāĻžāĻ  āĻāĻŦāĻ‚ āĻāϰ āĻ…ā§āϝāĻžāϏāĻžāχāύāĻŽā§‡āĻ¨ā§āϟ āĻļ⧇āώ āĻ•āϰāĻžāϰ āĻĒāϰ⧇, āφāĻŽāĻžāĻĻ⧇āϰ āĻ•ā§āϞāĻžāωāĻĄ ā§āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϗ⧁āϞāĻŋ āφāĻŽāĻžāĻĻ⧇āϰāϕ⧇ āĻ…āĻŦāĻļā§āϝāχ āϗ⧁āĻ›āĻŋā§Ÿā§‡ āϰ⧇āϖ⧇ āĻĻāĻŋāϤ⧇ āĻšāĻŦ⧇ āĻŦāĻž clean up āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻ…ā§āϝāĻžāϏāĻžāχāύāĻŽā§‡āĻ¨ā§āϟāϟāĻŋ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āϝ⧇āϏāĻŦ āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϗ⧁āϞāĻŋāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāĻŦ⧇, āϏ⧇āϗ⧁āϞ⧋ āφāϗ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ + +> āĻāĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ [āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ āĻ•ā§āϞ⧀āύ-āφāĻĒ āĻ—āĻžāχāĻĄā§‡](../../../../../translations/clean-up.bn.md) āύāĻŋāĻ°ā§āĻĻ⧇āĻļāύāĻž āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžāĻŦ⧇ āϝāĻžāϤ⧇ āφāĻŽāϰāĻž āĻ•ā§āϞāĻžāωāĻĄ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϗ⧁āĻ›āĻŋā§Ÿā§‡ āϰāĻžāĻ–āϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ + +## āϕ⧇āύ āφāĻŽāĻžāĻĻ⧇āϰ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āĻ•āϰāĻž āĻĻāϰāĻ•āĻžāϰ? + +āφāχāĻ“āϟāĻŋ āϏ⧁āϰāĻ•ā§āώāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āĻāϟāĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻšāϝāĻŧ āϝ⧇ āϕ⧇āĻŦāϞāĻŽāĻžāĻ¤ā§āϰ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻŋāϛ⧁ āĻĄāĻŋāĻ­āĻžāχāϏāχ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•ā§āϞāĻžāωāĻĄ āφāχāĻ“āϟāĻŋ ā§āϏāĻžāĻ°ā§āĻ­āĻŋāϏāϤ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻŸā§‡āϞāĻŋāĻŽā§‡āĻŸā§āϰāĻŋ āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāϟāĻŋāĻ“ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāĻž āĻšā§Ÿ āϝ⧇āύ āϕ⧇āĻŦāϞ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•ā§āϞāĻžāωāĻĄ āϏāĻžāĻ°ā§āĻ­āĻŋāϏāχ āφāĻŽāĻžāĻĻ⧇āϰ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āφāχāĻ“āϟāĻŋ āĻĄā§‡āϟāĻž āϚāĻŋāĻ•āĻŋāĻ¤ā§āϏāĻž āĻŦāĻž āĻŦ⧇āĻļ āĻ…āĻ¨ā§āϤāϰāĻ™ā§āĻ— āĻĄā§‡āϟāĻž āϏāĻš āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤāĻ“ āĻšāϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻžāχ āĻāχ āϤāĻĨā§āϝ āĻĢāĻžāρāϏ āĻšāĻ“āϝāĻŧāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰāϤ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒ⧁āϰ⧋ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžāĻĒāύāĻžāϰ āϏ⧁āϰāĻ•ā§āώāĻž āĻŦāĻŋāĻŦ⧇āϚāύāĻž āĻ•āϰāĻž āωāϚāĻŋāϤāĨ¤ + +āϝāĻĻāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āφāχāĻ“āϟāĻŋ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āύāĻž āĻšāϝāĻŧ āϤāĻŦ⧇ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻā§āρāĻ•āĻŋ āϰāϝāĻŧ⧇āϛ⧇: + +* āĻāĻ•āϟāĻŋ āύāĻ•āϞ āĻĄāĻŋāĻ­āĻžāχāϏ āφāĻŽāĻžāĻĻ⧇āϰ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύāϟāĻŋāϕ⧇ āϭ⧁āϞāĻ­āĻžāĻŦ⧇ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻžāϰ āϏāĻ āĻŋāĻ• āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇, āωāĻšā§āϚāĻŽāĻžāύ āĻĒāĻžāĻ āĻžāϞ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āϏ⧇āϚ āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻž āĻ•āĻ–āύāχ āϚāĻžāϞ⧁ āĻšāĻŦ⧇āύāĻž āĻāĻŦāĻ‚ āφāĻŽāĻžāĻĻ⧇āϰ āĻ—āĻžāĻ›āĻĒāĻžāϞāĻž āĻĒāĻžāύāĻŋāϰ āĻ…āĻ­āĻžāĻŦ⧇ āĻŽāĻžāϰāĻž āϝāĻžāĻŦ⧇āĨ¤ + +* āĻ…āύāύ⧁āĻŽā§‹āĻĻāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āĻŦāĻž āĻŦā§āϝāĻŦāϏāĻžāϝāĻŧāĻŋāĻ• āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āĨ¤ + +* āĻšā§āϝāĻžāĻ•āĻžāϰāϰāĻž āϕ⧋āύ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻāĻŽāύāĻ­āĻžāĻŦ⧇ āĻ•āĻŽāĻžāĻ¨ā§āĻĄāϗ⧁āϞāĻŋ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻžāϤ⧇ āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋ āĻŦāĻž āĻāϰ āϏāĻžāĻĨ⧇ āĻšāĻžāĻ°ā§āĻĄāĻ“āϝāĻŧāĻžāϰ āĻāϰ āĻ•ā§āώāϤāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ + +* āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ¸ā§āĻĨāĻžāĻĒāύ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡, āĻšā§āϝāĻžāĻ•āĻžāϰāϰāĻž āĻāϟāĻŋ āĻ…āϤāĻŋāϰāĻŋāĻ•ā§āϤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āϗ⧁āϞāĻŋāϤ⧇ āĻĒā§āϰāĻŦ⧇āĻļ⧇āϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĒā§‡ā§Ÿā§‡ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ + +* āĻ•ā§āώāϤāĻŋāĻ•āĻžāϰāĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰāĻž āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āĻĄā§‡āϟāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋ āĻŦā§āĻ˛ā§āϝāĻžāĻ•āĻŽā§‡āχāϞ⧇āϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ + +āĻāϗ⧁āϞāĻŋ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻĒāϰāĻŋāĻ¸ā§āĻĨāĻŋāϤāĻŋ āĻāĻŦāĻ‚ āϏāĻ°ā§āĻŦāĻĻāĻžāχ āϘāĻŸā§‡āĨ¤ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻĒāĻžāĻ āϗ⧁āϞāĻŋāϤ⧇ āĻ•āĻŋāϛ⧁ āωāĻĻāĻžāĻšāϰāĻŖ āĻĻ⧇āĻ“āϝāĻŧāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ, āĻāĻ–āĻžāύ⧇ āφāϰāĻ“ āĻ•āĻŋāϛ⧁ āϰāϝāĻŧ⧇āϛ⧇: + +* 2018 āϏāĻžāϞ⧇, āĻšā§āϝāĻžāĻ•āĻžāϰāϰāĻž āĻĄā§‡āϟāĻž āϚ⧁āϰāĻŋāϰ āϜāĻ¨ā§āϝ āĻ•ā§āϝāĻžāϏāĻŋāύ⧋āϰ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒ⧇āϤ⧇ āĻāĻ•āϟāĻŋ āĻĢāĻŋāĻļ āĻŸā§āϝāĻžāĻ™ā§āĻ• āĻĨāĻžāĻ°ā§āĻŽā§‹āĻ¸ā§āĻŸā§‡āĻŸā§‡ āĻāĻ•āϟāĻŋ āĻ“āĻĒ⧇āύ āĻ“āϝāĻŧāĻžāχāĻĢāĻžāχ āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻĒāϝāĻŧ⧇āĻ¨ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋāϞāĨ¤ [āϏ⧂āĻ¤ā§āϰāσ The Hacker News - Casino Gets Hacked Through Its Internet-Connected Fish Tank Thermometer](https://thehackernews.com/2018/04/iot-hacking-thermometer.html) +* ⧍ā§Ļā§§ā§Ŧ āϏāĻžāϞ⧇ āĻŽāĻŋāϰāĻžāχ āĻŦāϟāύ⧇āϟ denial of service (Dos) āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ Dyn āύāĻžāĻŽāĻ• āĻāĻ•āϟāĻŋ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻĒā§āϰāĻĻāĻžāύāĻ•āĻžāϰ⧀ āϏāϰāĻŦāϰāĻžāĻšāĻ•āĻžāϰ⧀āϰ āĻŦāĻŋāϰ⧁āĻĻā§āϧ⧇ āφāĻ•ā§āϰāĻŽāĻŖ āĻ•āϰ⧇āĨ¤ āĻāχ āĻŦāϟāύ⧇āϟ āϏāĻžāϧāĻžāϰāĻŖ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϝ⧇āĻŽāύ āĻĄāĻŋāĻ­āĻŋāφāϰ āĻāĻŦāĻ‚ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻžāϗ⧁āϞāĻŋāϤ⧇ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āύāĻžāĻŽ āĻāĻŦāĻ‚ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϏ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇ āφāĻ•ā§āϰāĻŽāĻŖ āϚāĻžāϞāĻŋāϝāĻŧ⧇āĻ›āĻŋāϞ connect [āϏ⧂āĻ¤ā§āϰāσ The Guardian - DDoS attack that disrupted internet was largest of its kind in history, experts say](https://www.theguardian.com/technology/2016/oct/26/ddos-attack-dyn-mirai-botnet) +* Spiral Toys āĻāϰ āĻ•āĻžāϛ⧇ āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āϏāĻ•āϞ⧇āϰ āϜāĻ¨ā§āϝ āĻāϭ⧇āχāϞ⧇āĻŦāϞ āĻĄā§‡āϟāĻžāĻŦ⧇āϏ āĻ›āĻŋāϞ⧋ āϝ⧇āϟāĻŋāϤ⧇ āϤāĻžāĻĻ⧇āϰ āĻ•ā§āϞāĻžāωāĻĄāĻĒ⧇āϟāϏ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āϖ⧇āϞāύāĻžāϗ⧁āϞāĻŋāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āϤāĻĨā§āϝ āĻ›āĻŋāϞ⧋ āĨ¤ [āϏ⧂āĻ¤ā§āϰāσ Troy Hunt - Data from connected CloudPets teddy bears leaked and ransomed, exposing kids' voice messages](https://www.troyhunt.com/data-from-connected-cloudpets-teddy-bears-leaked-and-ransomed-exposing-kids-voice-messages/). +* Strava āϤ⧇ āĻāĻ•āϜāύ āĻāĻĨāϞāĻŋāϟ āφāϰ⧇āĻ•āϜāύāϕ⧇ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻ…āϤāĻŋāĻ•ā§āϰāĻŽ āĻ•āϰ⧇ āϗ⧇āϞ⧇, āĻāϕ⧇ āĻ…āĻĒāϰ⧇āϰ āϰ⧂āϟ āϏāĻš āĻ…āύ⧇āĻ• āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϤāĻĨā§āϝ āĻĢāĻžāρāϏ āĻ•āϰ⧇ āĻĻā§‡ā§Ÿ [āϏ⧂āĻ¤ā§āϰāσ Kim Komndo - Fitness app could lead a stranger right to our home — change this setting](https://www.komando.com/security-privacy/strava-fitness-app-privacy/755349/). + +✅ āĻ•āĻŋāϛ⧁ āĻ—āĻŦ⧇āώāĻŖāĻž āĻ•āϰāĻž āϝāĻžāĻ•: āφāϰāĻ“ āωāĻĻāĻžāĻšāϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻ…āύ⧁āϏāĻ¨ā§āϧāĻžāύ āĻ•āϰāĻŋ āφāχāĻ“āϟāĻŋ āĻšā§āϝāĻžāĻ•āϏ āĻāĻŦāĻ‚ āφāχāĻ“āϟāĻŋ āĻĄā§‡āϟāĻž āϞāĻ™ā§āϘāύ⧇āϰ āϘāϟāύāĻžāϗ⧁āϞāĻŋ, āĻŦāĻŋāĻļ⧇āώāϤ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āĻŦāĻŋāώ⧟āĻžāĻĻāĻŋ āϝ⧇āĻŽāύ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āϟ⧁āĻĨāĻŦā§āϰāĻžāĻļ āĻŦāĻž āĻ¸ā§āϕ⧇āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻšā§āϝāĻžāĻ•āĨ¤ āĻāχ āĻšā§āϝāĻžāĻ•āϗ⧁āϞāĻŋ āϭ⧁āĻ•ā§āϤāĻ­ā§‹āĻ—ā§€ āĻŦāĻž āĻ—ā§āϰāĻžāĻšāĻ•āĻĻ⧇āϰ āωāĻĒāϰ āϕ⧀ āĻĒā§āϰāĻ­āĻžāĻŦ āĻĢ⧇āϞāϤ⧇ āĻĒāĻžāϰ⧇ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϚāĻŋāĻ¨ā§āϤāĻž āĻ•āϰāĻŋāĨ¤ + +> 💁 āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļāĻžāϞ āĻŦāĻŋāώāϝāĻŧ āĻāĻŦāĻ‚ āĻāχ āĻĒāĻžāĻ āϟāĻŋ āϕ⧇āĻŦāϞāĻŽāĻžāĻ¤ā§āϰ āφāĻŽāĻžāĻĻ⧇āϰ āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋāϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻŦāĻŋāώāϝāĻŧ āĻļ⧇āĻ–āĻžāĻŦ⧇āĨ¤ āĻ…āĻ¨ā§āϝāĻžāĻ¨ā§āϝ āĻŦāĻŋāώāϝāĻŧ āϝāĻž āφāϞ⧋āϚāύāĻž āĻ•āϰāĻž āĻšāĻŦ⧇ āύāĻž āϤāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āϰāϝāĻŧ⧇āϛ⧇ āĻŸā§āϰāĻžāύāϜāĻŋāĻŸā§‡ āĻĄā§‡āϟāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āϜāĻ¨ā§āϝ āύāϜāϰāĻĻāĻžāϰāĻŋ, āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻšā§āϝāĻžāĻ•āĻŋāĻ‚, āĻŦāĻž āĻĄāĻŋāĻ­āĻžāχāϏ āĻ•āύāĻĢāĻŋāĻ—āĻžāϰ⧇āĻļāύ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āχāĻ¤ā§āϝāĻžāĻĻāĻŋ āĨ¤ IoT āĻšā§āϝāĻžāĻ•āĻŋāĻ‚ āĻāϰ āĻŽāϤ āϏāĻŽāĻ¸ā§āϝāĻž āĻŽā§‹āĻ•āĻžāĻŦ⧇āϞāĻž āĻ•āϰāϤ⧇ [Azure Defender for IoT](https://azure.microsoft.com/services/azure-defender-for-iot/?WT.mc_id=academic-17441-jabenn) āϤ⧈āϰ⧀ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤ āĻāϟāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻāĻ¨ā§āϟāĻŋāĻ­āĻžāχāϰāĻžāϏ⧇āϰāχ āĻŽāϤ⧋, āϝāĻž āϛ⧋āϟ āĻāĻŦāĻ‚ āĻ•āĻŽ āĻĒāĻžāĻ“ā§ŸāĻžāϰ⧇ āϚāϞāĻŽāĻžāύ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϜāĻ¨ā§āϝ āĻŦāĻžāύāĻžāύ⧋āĨ¤ + +## āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ + +āϝāĻ–āύ āϕ⧋āύ āĻĄāĻŋāĻ­āĻžāχāϏ āφāχāĻ“āϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϤ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻĨāĻžāϕ⧇, āϤāĻ–āύ āĻāϟāĻŋ āύāĻŋāĻœā§‡āϕ⧇ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻāĻ•āϟāĻŋ āφāχāĻĄāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϞ āĻāχ āφāχāĻĄāĻŋāϟāĻŋ āĻ•ā§āϞ⧋āύ āĻ•āϰāĻž āϝāĻžāϝāĻŧ - āĻšā§āϝāĻžāĻ•āĻžāϰ āĻāĻ•āϟāĻŋ āύāĻ•āϞ āĻĄāĻŋāĻ­āĻžāχāϏ āϏ⧇āϟ āφāĻĒ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻž āĻāĻ•āχ āφāχāĻĄāĻŋāϟāĻŋāϕ⧇ āφāϏāϞ āĻĄāĻŋāĻ­āĻžāχāϏ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϤāĻŦ⧇ āϭ⧁āϞ āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇āĨ¤ + +![Both valid and malicious devices could use the same ID to send telemetry](../../../../images/iot-device-and-hacked-device-connecting.png) + +āĻāχ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ⧇āϰ āϜāĻ¨ā§āϝ āϕ⧇āĻŦāϞāĻŽāĻžāĻ¤ā§āϰ āĻĄāĻŋāĻ­āĻžāχāϏ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāωāĻĄā§‡āϰ āĻĒāϰāĻŋāϚāĻŋāϤ āĻ•āĻŋāϛ⧁ āĻ­ā§āϝāĻžāϞ⧁ āĻŦāĻž āĻ—ā§‹āĻĒāύ āϏāĻ‚āϕ⧇āϤ āĻĻā§āĻŦāĻžāϰāĻž āĻĄā§‡āϟāĻž āφāĻĻāĻžāύ āĻĒā§āϰāĻĻāĻžāύ⧇āϰ āϏāĻŽā§Ÿ āϤāĻž āĻ…āĻ—ā§‹āĻ›āĻžāϞ⧋ āĻ•āϰ⧇ āĻāĻ•āϧāϰāϪ⧇āϰ āĻ—ā§‹āĻĒāύ āϏāĻ‚āϕ⧇āϤ-āύāĻŋāĻ°ā§āĻ­āϰ āĻ•āϰ⧇ āĻĻā§‡ā§ŸāĻžāĨ¤ āĻāχ āĻĒā§āϰāĻ•ā§āϰāĻŋ⧟āĻžāϕ⧇ āĻŦāϞ⧇ *encryption* āĻāĻŦāĻ‚ āϝ⧇ āĻ­ā§āϝāĻžāϞ⧁ āĻŦāĻž āĻ—ā§‹āĻĒāύ āϏāĻ‚āϕ⧇āϤ āĻĻā§āĻŦāĻžāϰāĻž āĻĄā§‡āϟāĻžāϕ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāĻŋāϤ āĻ•āϰāĻž āĻšā§Ÿ, āϤāĻžāϕ⧇ āĻŦāϞ⧇ *encryption key* āĨ¤ + +![If encryption is used, then only encrypted messages will be accepted, others will be rejected](../../../../images/iot-device-and-hacked-device-connecting-encryption.png) + +āϝ⧇ āĻ•ā§āϞāĻžāωāĻĄ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϟāĻŋ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻ•ā§āϰāĻŋāϝāĻŧāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĄā§‡āϟāĻžāϟāĻŋāϕ⧇ āĻāĻ•āϟāĻŋ āĻĒāĻ āύāϝ⧋āĻ—ā§āϝ āĻĢāĻ°ā§āĻŽā§āϝāĻžāĻŸā§‡ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϏ⧇āχ āĻĒā§āϰāĻ•ā§āϰāĻŋ⧟āĻžāϕ⧇ āĻŦāϞ⧇ *decryption (āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒāĻļāύ)* āĻāĻŦāĻ‚ āĻāχ āĻ•āĻžāĻœā§‡ āĻāĻ•āχ āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϕ⧀ āĻŦāĻž āĻāĻ•āϟāĻŋ *āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϕ⧀* āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāĨ¤ āϝāĻĻāĻŋ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻŦāĻžāĻ°ā§āϤāĻž āϕ⧀ āĻĻā§āĻŦāĻžāϰāĻž āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āύāĻž āϝāĻžā§Ÿ, āϏ⧇āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϧāϰ⧇ āĻ¨ā§‡ā§ŸāĻž āĻšā§Ÿ āϝ⧇ āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋ āĻšā§āϝāĻžāĻ• āĻšāϝāĻŧ⧇ āϗ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻŦāĻžāĻ°ā§āϤāĻžāϟāĻŋ āϤāĻ–āύ āĻĒā§āϰāĻ¤ā§āϝāĻžāĻ–ā§āϝāĻžāύ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ + +āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻāĻŦāĻ‚ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒāĻļāύ⧇āϰ āĻŸā§‡āĻ•āύāĻŋāĻ•āϕ⧇ āĻāĻ•āϏāĻžāĻĨ⧇ āĻŦāϞāĻž āĻšā§Ÿ - *āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ (Cryptography)* āĨ¤ + +### āφāĻĻāĻŋāĻĒāĻ°ā§āϝāĻžā§Ÿā§‡āϰ āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ + +āϏāĻŦāĻĨ⧇āϕ⧇ āφāĻĻāĻŋāϝ⧁āϗ⧇āϰ āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ (Cryptography) āĻ›āĻŋāϞ⧋ āϏāĻžāχāĻĢāĻžāϰ āĻĒā§āϰāϤāĻŋāĻ¸ā§āĻĨāĻžāĻĒāύ āϝāĻž āĻĒā§āϰāĻžā§Ÿ ā§Šā§Ģā§Ļā§Ļ āĻŦāĻ›āϰ āφāϗ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϤ⧋āĨ¤ āĻāϗ⧁āϞ⧋āϤ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻ°ā§āϪ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āφāϰ⧇āĻ•āϟāĻŋ āĻŦāϏāĻžāύ⧋ āĻšāϤāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, [āϏāĻŋāϜāĻžāϰ āϏāĻžāχāĻĢāĻžāϰ⧇](https://wikipedia.org/wiki/Caesar_cipher) āĻŦāĻ°ā§āĻŖāϗ⧁āϞ⧋ āϏāĻžāĻŽāύ⧇ āĻŦāĻž āĻĒ⧇āĻ›āύ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻ‚āĻ–ā§āϝāĻ• āϘāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāĻž āĻšāϤ⧋ āϝ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻŽāĻžāύ āϕ⧇āĻŦāϞ āĻĒā§āϰ⧇āϰāĻ• āĻ“ āĻ—ā§āϰāĻžāĻšāĻ• āϜāĻžāύāϤ⧋āĨ¤ + +āφāĻŦāĻžāϰ [Vigenère cipher](https://wikipedia.org/wiki/Vigenère_cipher) āĻāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻŦāĻ°ā§āĻŖāϗ⧁āϞ⧋ āĻ­āĻŋāĻ¨ā§āύ āĻ­āĻŋāĻ¨ā§āύ āϘāϰ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻŽāĻžāύ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧋ āϝāĻž āϏāĻžāχāĻĢāĻžāϰ āĻŸā§‡āĻ•ā§āϏāϟ āĻĨ⧇āϕ⧇āĻ“ āĻ•āĻ āĻŋāύ āĻšā§Ÿā§‡ āϝāĻžā§ŸāĨ¤ + +āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‹āĻ—ā§āϰāĻžāĻĢāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āωāĻĻā§āĻĻ⧇āĻļā§āϝ⧇ āϝ⧇āĻŽāύ āĻĒā§āϰāĻžāĻšā§€āύ āĻŽā§‡āϏ⧋āĻĒāĻŸā§‡āĻŽāĻŋāϝāĻŧāĻžāϝāĻŧ āĻāĻ•āϟāĻŋ āϕ⧁āĻŽāĻžāϰ āĻ—ā§āϞāĻžāχāϜ āϰ⧇āϏāĻŋāĻĒāĻŋ āϰāĻ•ā§āώāĻž āĻ•āϰāĻž āĻŦāĻž āĻ­āĻžāϰāϤ⧇ āĻĒā§āϰ⧇āĻŽā§‡āϰ āĻ—ā§‹āĻĒāύ āϚāĻŋāĻ āĻŋ āϞ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ āĻŦāĻž āĻĒā§āϰāĻžāĻšā§€āύ āĻŽāĻŋāĻļāϰ⧀āϝāĻŧ āϝāĻžāĻĻ⧁āĻ•āϰ⧀ āĻŽāĻ¨ā§āĻ¤ā§āϰāϕ⧇ āĻ—ā§‹āĻĒāύ āϰāĻžāĻ–āĻžāϰ āĻŽāϤ⧋ āĻ•āĻžāĻœā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ + +### āφāϧ⧁āύāĻŋāĻ• āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ (Cryptography) + +āφāϧ⧁āύāĻŋāĻ• āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‹āĻ—ā§āϰāĻžāĻĢāĻŋ āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āωāĻ¨ā§āύāϤ, āĻāϟāĻŋ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻšā§‡āϝāĻŧ⧇ āĻ•ā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻž āφāϰāĻ“ āĻ…āύ⧇āĻ• āĻ•āĻ āĻŋāύ āĻ•āϰ⧇ āϤ⧋āϞ⧇āĨ¤ āφāϧ⧁āύāĻŋāĻ• āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‹āĻ—ā§āϰāĻžāĻĢāĻŋ āĻŦā§āϰ⧁āϟ āĻĢā§‹āĻ°ā§āϏ āφāĻ•ā§āϰāĻŽāĻŖāϕ⧇ āĻ…āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧇āĻ•āϗ⧁āϞāĻŋ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝ āϕ⧀(key) āĻĻāĻŋāϝāĻŧ⧇ āĻĄā§‡āϟāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāϤ⧇ āϜāϟāĻŋāϞ āĻ—āĻŖāĻŋāϤ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ + +āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āϝ⧋āĻ—āĻžāϝ⧋āϗ⧇āϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āωāĻĒāĻžāϝāĻŧ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āϝāĻĻāĻŋ āφāĻŽāϰāĻž āĻāχ āϞ⧇āϏāύāϟāĻŋ āϝāĻĻāĻŋ āĻ—āĻŋāϟāĻšāĻžāĻŦ āĻ āĻĒ⧜āĻŋ, āϤāĻŦ⧇ āφāĻŽāϰāĻž āϞāĻ•ā§āĻˇā§āϝ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āϝ⧇ āĻ“āϝāĻŧ⧇āĻŦ āϏāĻžāχāĻŸā§‡āϰ āĻ āĻŋāĻ•āĻžāύāĻžāϟāĻŋ *https* āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ, āϝāĻžāϰ āĻ…āĻ°ā§āĻĨ āφāĻŽāĻžāĻĻ⧇āϰ āĻŦā§āϰāĻžāωāϜāĻžāϰ āĻāĻŦāĻ‚ āĻ—āĻŋāϟāĻšāĻžāĻŦ⧇āϰ āĻ“āϝāĻŧ⧇āĻŦ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āφāϛ⧇āĨ¤ āϝāĻĻāĻŋ āϕ⧇āω āφāĻŽāĻžāĻĻ⧇āϰ āĻŦā§āϰāĻžāωāϜāĻžāϰ āĻāĻŦāĻ‚ āĻ—āĻŋāϟāĻšāĻžāĻŦ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻĒā§āϰāĻŦāĻžāĻšāĻŋāϤ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āĻŸā§āĻ°ā§āϝāĻžāĻĢāĻŋāĻ• āĻĒāĻĄāĻŧāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧāĻ“ āϤāĻŦ⧁āĻ“ āϤāĻžāϰāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāĻŦ⧇ āύāĻžāĨ¤ āφāĻŽāĻžāĻĻ⧇āϰ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ āĻāĻŽāύāĻ•āĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āĻšāĻžāĻ°ā§āĻĄāĻĄā§āϰāĻžāχāϭ⧇ āϏāĻŽāĻ¸ā§āϤ āĻĄā§‡āϟāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϝāĻžāϤ⧇ āϕ⧇āω āϝāĻĻāĻŋ āĻāϟāĻŋ āϚ⧁āϰāĻŋ āĻ•āϰ⧇, āϤāĻŦ⧁āĻ“ āϝ⧇āύ āϤāĻžāϰāĻž āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āĻ›āĻžāĻĄāĻŧāĻžāχ āφāĻŽāĻžāĻĻ⧇āϰ āĻĄā§‡āϟāĻž āĻĒāĻĄāĻŧāϤ⧇ āύāĻž āĻĒāĻžāϰ⧇āĨ¤ + +> 🎓 HTTPS āĻšāϞ⧋ HyperText Transfer Protocol **Secure** + +āĻĻ⧁āĻ°ā§āĻ­āĻžāĻ—ā§āϝāĻ•ā§āϰāĻŽā§‡, āϏāĻŦāĻ•āĻŋāϛ⧁āχ āύāĻŋāϰāĻžāĻĒāĻĻ āύāϝāĻŧāĨ¤ āĻ•āĻŋāϛ⧁ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϕ⧋āύ āϏ⧁āϰāĻ•ā§āώāĻž āύ⧇āχ, āĻ…āĻ¨ā§āϝāĻ•āĻŋāϛ⧁ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āφāĻŦāĻžāϰ āϏāĻšāĻœā§‡āχ āĻ•ā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻž āϝāĻžā§Ÿ āĻāĻŽāύ āϕ⧀(KEY) āϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻž āĻ•āĻ–āύāĻ“ āĻ•āĻ–āύāĻ“ āĻāĻ•āχ āϕ⧀(KEY) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āχ āϧāϰāϪ⧇āϰ āϏāĻŽāĻ¸ā§āϤ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āĨ¤ āϖ⧁āĻŦ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āĻ…ā§āϝāĻžāĻ•āĻžāωāĻ¨ā§āϟ āϰāϝāĻŧ⧇āϛ⧇ āϝ⧇āϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ“āϝāĻŧāĻžāχāĻĢāĻžāχ āĻŦāĻž āĻŦā§āϞ⧁āϟ⧁āĻĨ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĒāĻžāϏāĻ“āϝāĻŧāĻžāĻ°ā§āĻĄ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āφāĻŽāϰāĻž āϝāĻĻāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āύāĻŋāϜāĻ¸ā§āĻŦ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āϤāĻŦ⧇ āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāĻŽāϰāĻž āϚāĻžāχāϞ⧇ āĻ…āĻ¨ā§āϝ āĻ•āĻžāϰāĻ“ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āĻ“ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ (āĻ…āύ⧁āĻŽāϤāĻŋ āĻŦā§āϝāĻžāϤāĻŋāϰ⧇āϕ⧇ āĻāϟāĻŋ āĻ•āϰāĻž āĻ…āĻĒāϰāĻžāϧ)āĨ¤ āĻāĻ•āĻŦāĻžāϰ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻšāϝāĻŧ⧇ āφāĻŽāϰāĻž āĻ•āĻŋāϛ⧁ āϖ⧁āĻŦ āĻĒā§āϰāĻžāχāϭ⧇āϟ āĻĄā§‡āϟāĻž āĻ…ā§āϝāĻžāĻ•ā§āϏ⧇āϏ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ, āĻŦāĻž āϤāĻžāĻĻ⧇āϰ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āϰāĻžāĻ–āϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ + +> 💁 āφāϧ⧁āύāĻŋāĻ• āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ (Cryptography) āĻāϰ āϜāϟāĻŋāϞāϤāĻž āĻāĻŦāĻ‚ āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻ­āĻžāĻ™āϤ⧇ āĻŦāĻŋāϞāĻŋ⧟āύ āĻŦāĻŋāϞāĻŋ⧟āύ āĻŦāĻ›āϰ āϞāĻžāĻ—āĻŦ⧇ - āĻāĻŽāύ āĻĻāĻžāĻŦāĻŋ āĻ¸ā§āĻŦāĻ¤ā§āĻŦ⧇āĻ“ āĻ•ā§‹ā§ŸāĻžāĻ¨ā§āϟāĻžāĻŽ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻŋāĻ‚ āĻāϰ āφāĻŦāĻŋāĻ°ā§āĻ­āĻžāĻŦ⧇āϰ āĻĢāϞ⧇ āĻāχ āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϕ⧀ (KEY) āϗ⧁āϞ⧋ āϭ⧇āϙ⧇ āĻĢ⧇āϞāĻž āĻ…āύ⧇āĻ• āϏāĻšāϜ āĻšā§Ÿā§‡ āĻ—āĻŋā§Ÿā§‡āϛ⧇āĨ¤ + +### Symmetric āĻāĻŦāĻ‚ asymmetric keys + +āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ ⧍āĻ­āĻžāĻŦ⧇ āĻšā§Ÿ - symmetric āĻāĻŦāĻ‚ asymmetric. + +**Symmetric** āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻĄā§‡āϟāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻāĻŦāĻ‚ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāϤ⧇ āĻāĻ•āχ āϕ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻĒā§āϰ⧇āϰāĻ• āĻāĻŦāĻ‚ āĻĒā§āϰāĻžāĻĒāĻ• āωāĻ­āϝāĻŧ⧇āϰāχ āĻāĻ•āχ āϕ⧀ (KEY)āϟāĻŋ āϜāĻžāύāĻž āĻĻāϰāĻ•āĻžāϰāĨ¤ āĻāϟāĻŋ āϏāĻ°ā§āĻŦāύāĻŋāĻŽā§āύ āϏ⧁āϰāĻ•ā§āώāĻž āĻ¸ā§āϤāϰ, āĻ•āĻžāϰāĻŖ āϕ⧀ (KEY)āϟāĻŋ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻĒā§āϰ⧇āϰāϕ⧇āϰ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āϰāĻžāĻĒāϕ⧇āϰ āĻ•āĻžāϛ⧇ āĻāĻ•āϟāĻŋ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻŦāĻžāĻ°ā§āϤāĻž āĻĒā§āϰ⧇āϰāϪ⧇āϰ āϜāĻ¨ā§āϝ, āĻĒā§āϰ⧇āϰāĻ•āϕ⧇ āĻĒā§āϰāĻĨāĻŽā§‡ āĻĒā§āϰāĻžāĻĒāĻ•āϕ⧇ āϕ⧀ (KEY) āϟāĻŋ āĻĒāĻžāĻ āĻžāϤ⧇ āĻšāĻŦ⧇āĨ¤ + +![Symmetric key encryption uses the same key to encrypt and decrypt a message](../../../../images/send-message-symmetric-key.png) + +If the key gets stolen in transit, or the sender or recipient get hacked and the key is found, the encryption can be cracked. + +āϝāĻĻāĻŋ āĻŸā§āϰāĻžāύāϜāĻŋāĻŸā§‡ āϕ⧀ (KEY) āϟāĻŋ āϚ⧁āϰāĻŋ āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āĻŦāĻž āĻĒā§āϰ⧇āϰāĻ• āĻŦāĻž āĻĒā§āϰāĻžāĻĒāĻ• āĻšā§āϝāĻžāĻ• āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āϕ⧀(KEY)āϟāĻŋ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ, āϤāĻžāĻšāϞ⧇ āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύāϟāĻŋ āĻ•ā§āĻ°ā§āϝāĻžāĻ• āĻšā§Ÿā§‡ āϝāĻžāĻŦ⧇āĨ¤ + +![Symmetric key encryption is only secure if a hacker doesn't get the key - if so they can intercept and decrypt the message](../../../../images/send-message-symmetric-key-hacker.png) + +**Asymmetric** āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύāϟāĻŋāϤ⧇ 2āϟāĻŋ KEY āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ - āĻāĻ•āϟāĻŋ āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϕ⧀ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϕ⧀, āĻāϟāĻŋ āĻĒāĻžāĻŦāϞāĻŋāĻ•/āĻĒā§āϰāĻžāχāϭ⧇āϟ KEY Pair āĻšāĻŋāϏāĻžāĻŦ⧇ āωāĻ˛ā§āϞ⧇āĻ– āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ āĻŦāĻžāĻ°ā§āϤāĻžāϟāĻŋ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻ°ā§āĻŦāϜāύ⧀āύ (PUBLIC) āϕ⧀ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ āϤāĻŦ⧇ āĻāϟāĻŋ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāϤ⧇ āϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āύāĻžāĨ¤ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ (PRIVATE) KEY āĻāĻ–āĻžāύ⧇ āĻŦāĻžāĻ°ā§āϤāĻžāϟāĻŋ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧ āϤāĻŦ⧇ āĻāϟāĻŋ āφāĻŦāĻžāϰ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āύāĻžāĨ¤ + +![Asymmetric encryption uses a different key to encrypt and decrypt. The encryption key is sent to any message senders so they can encrypt a message before sending it to the recipient who owns the keys](../../../../images/send-message-asymmetric.png) + +āĻĒā§āϰāĻžāĻĒāĻ• āϤāĻžāϰ āĻĒāĻžāĻŦāϞāĻŋāĻ• KEY āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻĒā§āϰ⧇āϰāĻ• āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻžāĻ°ā§āϤāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰ⧇āĨ¤ āĻŽā§āϝāĻžāϏ⧇āϜ āĻĒāĻžāĻ āĻžāύ⧋āϰ āĻĒāϰ⧇,āĻĒā§āϰāĻžāĻĒāĻ• āϤāĻžāϰ āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āĻĻā§āĻŦāĻžāϰāĻž āϤāĻž āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰ⧇āĨ¤ āĻāϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āϤ⧁āϞāύāĻžāĻŽā§‚āϞāĻ•āĻ­āĻžāĻŦ⧇ āĻŦ⧇āĻļāĻŋ āύāĻŋāϰāĻžāĻĒāĻĻ āĻ•āĻžāϰāĻŖ āĻāĻ–āĻžāύ⧇ āĻĒā§āϰāĻžāĻĒāϕ⧇āϰ āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āĻ•āĻ–āύāχ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰāĻž āĻšā§ŸāύāĻžāĨ¤ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āϤ⧇ āϝ⧇ āϕ⧇āωāχ āĻāĻ•āϏ⧇āϏ āĻĒ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻŦ⧇ āĻāϟāĻŋ āĻĻāĻŋā§Ÿā§‡ āϕ⧇āĻŦāϞāĻŽāĻžāĻ¤ā§āϰ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āϝāĻžāĻŦ⧇āĨ¤ + +āϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āĻĒāĻĻā§āϧāϤāĻŋāϟāĻŋ āĻāϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āĻāϰ āϤ⧁āϞāύāĻžā§Ÿ āĻĻā§āϰ⧁āϤ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇, āϝāĻĻāĻŋāĻ“ āϤāĻž āĻ•āĻŽ āύāĻŋāϰāĻžāĻĒāĻĻāĨ¤ āĻ•āĻŋāϛ⧁ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āωāϭ⧟ āĻĒāĻĻā§āϧāϤāĻŋāχ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§ŸāĨ¤ āĻāϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž, āφāĻŦāĻžāϰ āϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āϕ⧀ āϟāĻŋ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰ⧇ āϏāĻ•āϞ āĻĄā§‡āϟāĻž āϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āϕ⧀ āĻĻā§āĻŦāĻžāϰāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻšā§ŸāĨ¤ āĻāϤ⧇ āĻ•āϰ⧇ āĻĒā§āϰ⧇āϰāĻ• āĻ“ āĻĒā§āϰāĻžāĻĒāϕ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āϕ⧀ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰāϞ⧇āĻ“ āϏ⧇āϟāĻž āĻ…āύ⧇āĻ• āĻŦ⧇āĻļāĻŋ āύāĻŋāϰāĻžāĻĒāĻĻ āĻĨāĻžāϕ⧇ āφāĻŦāĻžāϰ āĻĻā§āϰ⧁āϤāĻ“ āĻšā§ŸāĨ¤ + +## āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž + +āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āĻāĻŦāĻ‚ āĻāϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤ āϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ•āϟāĻŋ āϏāĻšāϜ, āϤāĻŦ⧇ āĻ•āĻŽ āύāĻŋāϰāĻžāĻĒāĻĻāĨ¤ + +### āϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• KEYs + +āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻāϰ āϜāĻ¨ā§āϝ āφāĻŽāϰāĻž āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĻ›āĻŋāϞāĻžāĻŽāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ : + +```output +HostName=soil-moisture-sensor.azure-devices.net;DeviceId=soil-moisture-sensor;SharedAccessKey=Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0= +``` + +āĻāχ āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ ā§ŠāĻ­āĻžāϗ⧇ āĻŦāĻŋāĻ­āĻ•ā§āϤ āϝāĻžāϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ…āĻ‚āĻļ āϏ⧇āĻŽāĻŋāϕ⧋āϞāύ āĻĻā§āĻŦāĻžāϰāĻž āĻĒ⧃āĻĨāϕ⧀āĻ•ā§ƒāϤ, āϝ⧇āĻ–āĻžāύ⧇ āĻĒā§āϰāϤāĻŋ āĻ…āĻ‚āĻļ⧇ Key āĻāĻŦāĻ‚ Value āĻ°ā§Ÿā§‡āϛ⧇āĨ¤ + +| āϕ⧀ | āĻ­ā§āϝāĻžāϞ⧁ | āĻŦāĻ°ā§āĻŖāύāĻž | +| --- | ----- | ----------- | +| Hostname | `soil-moisture-sensor.azure-devices.net` | āĻāϟāĻŋ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ URL | +| DeviceID | `soil-moisture-sensor` | āĻāϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āχāωāύāĻŋāĻ• āφāχāĻĄāĻŋ | +| SharedAccessKey | `Bhry+ind7kKEIDxubK61RiEHHRTrPl7HUow8cEm/mU0=` | āĻĄāĻŋāĻ­āĻžāχāϏ āĻāĻŦāĻ‚ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āĻ•āĻžāϛ⧇ āĻĨāĻžāĻ•āĻž āϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• KEY | + +āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻāϰ āĻļ⧇āώāĻžāĻ‚āĻļ `SharedAccessKey` āĻŽā§‚āϞāϤ āĻāĻ•āϟāĻŋ symmetric key āϝāĻž āĻĄāĻŋāĻ­āĻžāχāϏ āĻāĻŦāĻ‚ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āωāĻ­ā§Ÿā§‡āϰ āĻ•āĻžāϛ⧇āχ āĻ°ā§Ÿā§‡āϛ⧇āĨ¤ āĻāϟāĻŋ āĻ•āĻ–āύāχ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻŦāĻž āĻ•ā§āϞāĻžāωāĻĄ āĻĨ⧇āϕ⧇ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāĻž āĻšā§ŸāύāĻžāĨ¤ āĻŦāϰāĻ‚ āĻāϟāĻŋ āĻĒāϰāĻŋāĻŦāĻžāĻšāĻŋāϤ āĻĄā§‡āϟāĻžāϕ⧇ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰ⧇āĨ¤ + +✅ āĻāĻ•āϟāĻŋ āĻāĻ•ā§āϏāĻĒ⧇āϰāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāĻž āϝāĻžāĻ•āĨ¤ āφāĻŽāϰāĻž āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻšāĻŦāĻžāϰ āϏāĻŽā§Ÿ āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻāϰ `SharedAccessKey` āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰ⧇ āĻĻāĻŋāϞ⧇ āϕ⧀ āĻšāĻŦ⧇? āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇ āĻĻ⧇āĻ–ā§‹āĨ¤ + + +āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋ āĻĒā§āϰāĻĨāĻŽā§‡ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϞ⧇, āϤāĻ–āύ URL āϏāĻš shared access signature (SAS) āĻŸā§‹āϕ⧇āύ , āĻāĻ•āϟāĻŋ āϟāĻžāχāĻŽāĻ¸ā§āĻŸā§āϝāĻžāĻŽā§āĻĒ āϝ⧇āϟāĻŋāϰ āϏāĻŋāĻ—āύ⧇āϚāĻžāϰ āĻāĻ•āϏ⧇āϏ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽā§Ÿ āĻĒāϰ (āϏāĻžāϧāĻžāϰāĻŖāϤ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻŽāϝāĻŧ āĻĨ⧇āϕ⧇ 1 āĻĻāĻŋāύ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ) āĻļ⧇āώ āĻšā§Ÿā§‡ āϝāĻžā§Ÿ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āϏāĻŋāĻ—āύ⧇āϚāĻžāϰ - āĻāϏāĻŦ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇āĨ¤ āĻāχ āϏāĻŋāĻ—āύ⧇āϚāĻžāϰ⧇ āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻĨ⧇āϕ⧇ āχāωāφāϰāĻāϞ, āĻŽā§‡ā§ŸāĻžāĻĻā§‹āĻ¤ā§āϤ⧀āĻ°ā§āϪ⧇āϰ āϏāĻŽā§Ÿ āĻāĻŦāĻ‚ āĻāύāĻ•ā§āϰāĻŋāĻĒāĻŸā§‡āĻĄ āĻļā§‡ā§ŸāĻžāϰāĻĄ āĻāĻ•āϏ⧇āϏ āϕ⧀ āĻĨāĻžāϕ⧇āĨ¤ + +āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āĻļā§‡ā§ŸāĻžāϰāĻĄ āĻāĻ•āϏ⧇āϏ āϕ⧀ āĻĻāĻŋā§Ÿā§‡ āϏāĻŋāĻ—āύ⧇āϚāĻžāϰāϟāĻŋ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āϝāĻĻāĻŋ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻŽāĻžāύāϟāĻŋ āχāωāφāϰāĻāϞ āĻāĻŦāĻ‚ āĻŽā§‡ā§ŸāĻžāĻĻā§‹āĻ¤ā§āϤ⧀āĻ°ā§āϪ⧇āϰ āϏāĻŽā§Ÿā§‡āϰ āϏāĻžāĻĨ⧇ āĻŽāĻŋāϞ⧇ āϝāĻžāϝāĻŧ āϤāĻŦ⧇ āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋ āϏāĻ‚āϝ⧋āĻ— āĻ•āϰāĻžāϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĒāĻžā§ŸāĨ¤ āĻāϟāĻŋāĻ“ āϝāĻžāϚāĻžāχ āĻ•āϰāĻž āĻšā§Ÿ āϝ⧇ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻŽāϝāĻŧāϟāĻŋ āĻŽā§‡ā§ŸāĻžāĻĻā§‹āĻ¤ā§āϤ⧀āĻ°ā§āϪ⧇āϰ āϏāĻŽā§Ÿā§‡āϰ āφāϗ⧇ āϝāĻžāϤ⧇ āĻ•āϰ⧇ āϕ⧋āύ āĻĻ⧁āĻˇā§āϟ (malicious) āĻĄāĻŋāĻ­āĻžāχāϏ āϕ⧋āύ āφāϏāϞ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āĻāϏāĻāĻāϏ āĻŸā§‹āϕ⧇āύ āĻ•ā§āϝāĻžāĻĒāϚāĻžāϰ āĻ•āϰ⧇ āϤāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āύāĻž āĻĒāĻžāϰ⧇āĨ¤ + +āĻĒā§āϰ⧇āϰāĻ•āϟāĻŋ āϏāĻ āĻŋāĻ• āĻĄāĻŋāĻ­āĻžāχāϏ āĻ•āĻŋāύāĻž āϤāĻž āϝāĻžāϚāĻžāχ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋ āĻāĻ•āϟāĻŋ āωāĻ¤ā§āϤāĻŽ āωāĻĒāĻžāϝāĻŧāĨ¤ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻāĻŦāĻ‚ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻ•āĻŋāϛ⧁ āĻœā§āĻžāĻžāϤ āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋāϕ⧇ āϝāĻžāϚāĻžāχ āĻ•āϰ⧇ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰ⧇ āϝ⧇ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻĄā§‡āϟāĻžāϰ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ­āĻžāĻ°ā§āϏāύāϟāĻŋ, āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāĻž āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āϏāĻ‚āĻ¸ā§āĻ•āϰāϪ⧇āϰ āϏāĻžāĻĨ⧇ āĻŽā§‡āϞ⧇ āĻ•āĻŋāύāĻžāĨ¤ āϝāĻĻāĻŋ āĻāϟāĻŋ āĻŽā§‡āϞ⧇, āϤāĻŦ⧇ āĻĒā§āϰ⧇āϰāĻ• āĻāĻŦāĻ‚ āĻĒā§āϰāĻžāĻĒāĻ• āωāĻ­āϝāĻŧ⧇āϰāχ āĻāĻ•āχ Symmetric Encryption Key āϰāϝāĻŧ⧇āϛ⧇āĨ¤ + +> 💁 āϝ⧇āĻšā§‡āϤ⧁ āĻāĻ–āĻžāύ⧇ āĻŽā§‡ā§ŸāĻžāĻĻā§‹āĻ¤ā§āϤ⧀āĻ°ā§āϪ⧇āϰ āĻāĻ•āϟāĻŋ āĻŦāĻŋāώ⧟ āĻ°ā§Ÿā§‡āϛ⧇, āφāĻŽāĻžāĻĻ⧇āϰ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϜāĻ¨ā§āϝ āϤāĻžāχ āĻŦāĻ°ā§āϤāĻŽāĻžāύ āϏāĻŽā§ŸāϟāĻŋ āϜāĻžāύāĻž āϜāϰ⧁āϰ⧀āĨ¤ āϏāĻžāϧāĻžāϰāĻŖāϤ [NTP](https://wikipedia.org/wiki/Network_Time_Protocol) āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇āχ āĻāϟāĻŋ āϏāĻŽā§Ÿ āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āĻĄā§‡āϟāĻž āĻ¨ā§‡ā§ŸāĨ¤ āϏāĻŽā§Ÿ āϏāĻ āĻŋāĻ• āύāĻž āĻšāϞ⧇, āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻšāĻŦ⧇āύāĻžāĨ¤ + +āϏāĻ‚āϝ⧋āϗ⧇āϰ āĻĒāϰ⧇, āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āĻ•āĻžāϛ⧇ āĻŦāĻž āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āĻĨ⧇āϕ⧇ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻĒā§āϰ⧇āϰāĻŋāϤ āϏāĻŽāĻ¸ā§āϤ āĻĄā§‡āϟāĻž shared access key āĻĻāĻŋāϝāĻŧ⧇ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ + +✅ āĻāĻ•āĻžāϧāĻŋāĻ• āĻĄāĻŋāĻ­āĻžāχāϏ āĻāĻ•āχ āϏāĻ‚āϝ⧋āϗ⧇āϰ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰāϞ⧇ āϕ⧀ āϘāϟāĻŦ⧇ āĻŦāϞ⧇ āĻŽāύ⧇ āĻšā§Ÿ? + +> 💁 āϕ⧋āĻĄā§‡āϰ āĻŽāĻ§ā§āϝ⧇āχ āĻāχ KEY āϏāĻ‚āϰāĻ•ā§āώāĻŖ āĻ•āϰāĻž āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻžāϰ āĻĒā§āϰ⧇āĻ•ā§āώāĻŋāϤ⧇ āĻŦ⧇āĻļ āĻŦāĻžāĻœā§‡ āĻāĻ•āϟāĻŋ āϚāĻ°ā§āϚāĻžāĨ¤ āϕ⧋āύ āĻšā§āϝāĻžāĻ•āĻžāϰ āϝāĻĻāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄ āĻĒāĻžāϝāĻŧ āϤāĻŦ⧇ āϤāĻžāϰāĻž āφāĻŽāĻžāĻĻ⧇āϰ KEY āĻĒā§‡ā§Ÿā§‡ āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāĻ›āĻžā§œāĻžāĻ“ āϕ⧋āĻĄ āϰāĻŋāϞāĻŋāϜ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāϟāĻŋ āφāϰāĻ“ āĻ•āĻ āĻŋāύ āĻšāϝāĻŧ āĻ•āĻžāϰāĻŖ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āφāĻĒāĻĄā§‡āϟ āϕ⧀ āĻĻāĻŋāϝāĻŧ⧇ āĻĒ⧁āύāϰāĻžāϝāĻŧ ā§āϤāĻž āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāĻ•āϟāĻŋ āĻšāĻžāĻ°ā§āĻĄāĻ“āϝāĻŧā§āϝāĻžāϰ āϏ⧁āϰāĻ•ā§āώāĻž āĻŽāĻĄāĻŋāωāϞ āĻĨ⧇āϕ⧇ āĻāχ KEY āϞ⧋āĻĄ āĻ•āϰāĻž āĻ­āĻžāϞ āωāĻĒāĻžā§ŸāĨ¤ āĻāχ āĻŽāĻĄāĻŋāωāϞ āĻšāϞ⧋ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āĻāĻ•āϟāĻŋ āϚāĻŋāĻĒ āϝāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻž āĻŽāĻžāύāϗ⧁āϞāĻŋāϕ⧇ āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰ⧇ āϝāĻž āφāĻŽāĻžāĻĻ⧇āϰ āϕ⧋āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻāĻ•āϏ⧇āϏ āĻ•āϰāĻž āϝāĻžāĻŦ⧇āĨ¤ +> +> āφāχāĻ“āϟāĻŋ āĻļ⧇āĻ–āĻžāϰ āϏāĻŽāϝāĻŧ KEY āϗ⧁āϞ⧋ āϕ⧋āĻĄā§‡ āϰāĻžāĻ–āϞ⧇ āĻ•āĻžāϜ āĻ•āϰāĻž āϏāĻšāϜ āĻšā§Ÿ, āϝ⧇āĻŽāύ āφāĻŽāϰāĻž āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āĻĒāĻžāϠ⧇ āĻ•āϰ⧇āĻ›āĻŋāϞāĻžāĻŽāĨ¤ āϤāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻ…āĻŦāĻļā§āϝāχ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϝ⧇ āĻāχ KEY āϜāύāϏāĻžāϧāĻžāϰāϪ⧇āϰ āϜāĻ¨ā§āϝ āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄā§‡ āωāĻ¨ā§āĻŽā§āĻ•ā§āϤ āĻ•āϰāĻž āĻšāϝāĻŧāύāĻŋāĨ¤ + +Devices have 2 keys, and 2 corresponding connection strings. This allows we to rotate the keys - that is switch from one key to another if the first gets compromised, and re-generate the first key. + +āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋāϤ⧇ 2 āϟāĻŋ āϕ⧀ āĻāĻŦāĻ‚ 2 āϟāĻŋ āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻ¸ā§āĻŸā§āϰāĻŋāĻ‚ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāϟāĻŋ āφāĻŽāĻžāĻĻ⧇āϰ āϕ⧀āϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ⧇āϰ āĻ…āύ⧁āĻŽāϤāĻŋ āĻĻ⧇āϝāĻŧ āĨ¤ āϝāĻĻāĻŋ āĻĒā§āϰāĻĨāĻŽ āϕ⧀ āϟāĻŋ āϏāĻŽāĻ¸ā§āϝāĻžāϰ āĻŽā§āϖ⧇ āĻĒā§œā§‡, āϤāĻŦ⧇ ⧍⧟āϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻĒā§āϰāĻĨāĻŽ āϕ⧀ āĻĒ⧁āύāϰāĻžāϝāĻŧ āϤ⧈āϰ⧀ āĻ•āϰ⧇āĨ¤ + +### X.509 āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ + +āϝāĻ–āύ āφāĻŽāϰāĻž āϕ⧋āύāĻ“ āĻĒāĻžāĻŦāϞāĻŋāĻ•/āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āĻĒā§‡ā§ŸāĻžāϰ āĻāϰ āϏāĻžāĻĨ⧇ āĻāϏāĻŋāĻŽā§‡āĻŸā§āϰāĻŋāĻ• āĻāύāĻ•ā§āϰāĻŋāĻĒāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋ, āφāĻŽāĻžāĻĻ⧇āϰāϕ⧇ āϕ⧇āω āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāϤ⧇ āϚāĻžāχāϞ⧇ āϤāĻžāϕ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āϏāĻŽāĻ¸ā§āϝāĻžāϟāĻŋ āĻšāϞ āϕ⧀āĻ­āĻžāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻžāĻĒāĻ• āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āϝ⧇ āĻāϟāĻŋ āφāϏāϞ⧇āχ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝ āϕ⧇āω āφāĻŽāĻžāĻĻ⧇āϰ āϰ⧂āĻĒāϧāĻžāϰāĻŖ āĻ•āϰ⧇ āϏāĻ‚āϝ⧋āϗ⧇āϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϛ⧇ āύāĻž? KEY āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰāĻžāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇, āφāĻŽāϰāĻž āĻŦāϰāĻ‚ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āĻŸā§‡āϰ āĻ­āĻŋāϤāϰ⧇ āϏāϰāĻŦāϰāĻžāĻš āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āϝāĻž āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻ¸ā§āϤ āϤ⧃āϤ⧀āϝāĻŧ āĻĒāĻ•ā§āώ āĻĻā§āĻŦāĻžāϰāĻž āϝāĻžāϚāĻžāχ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋāϕ⧇ āĻŦāϞāĻž āĻšā§Ÿ X.509 āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟāĨ¤ + +X.509 āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āĻšāϞ⧋ āĻĄāĻŋāϜāĻŋāϟāĻžāϞ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āϟ āϝ⧇āϗ⧁āϞ⧋ āĻĒāĻžāĻŦāϞāĻŋāĻ•/āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āĻĒā§‡ā§ŸāĻžāϰ āĻāϰ āĻĒāĻžāĻŦāϞāĻŋāĻ• āĻ…āĻ‚āĻļāϟāĻŋ āϧāĻžāϰāĻŖ āĻ•āϰ⧇āĨ¤ āĻāϗ⧁āϞāĻŋ āϏāĻžāϧāĻžāϰāĻŖāϤ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻ¸ā§āϤ āϏāĻ‚āĻ¸ā§āĻĨāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āχāĻ¸ā§āϝ⧁ āĻ•āϰāĻž āĻšāϝāĻŧ āϝ⧇āϗ⧁āϞ⧋āϕ⧇ āĻŦāϞāĻž āĻšā§Ÿ [Certification authorities](https://wikipedia.org/wiki/Certificate_authority) (CAs) āĻāĻŦāĻ‚ āĻāϏāĻ•āϞ āϏāĻ‚āĻ¸ā§āĻĨāĻž āĻāχ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āϟāϗ⧁āϞ⧋ āϏāĻžāχāύ āĻ•āϰ⧇ āĻĻā§‡ā§Ÿ āϝāĻž āĻŦā§‹āĻāĻžā§Ÿ āϝ⧇ key āϗ⧁āϞ⧋ āϏāĻ āĻŋāĻ• āĻāĻŦāĻ‚ āĻ āĻŋāĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻ•āĻžāĻ› āĻĨ⧇āϕ⧇āχ āφāϏāϛ⧇āĨ¤ āϝ⧇āĻ­āĻžāĻŦ⧇ āφāĻŽāϰāĻž āĻĒāĻžāϏāĻĒā§‹āĻ°ā§āϟ āĻŦāĻž āĻĄā§āϰāĻžāχāĻ­āĻŋāĻ‚ āϞāĻžāχāϏ⧇āĻ¨ā§āϏ⧇ āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āĻ•āϰāĻŋ (āϝ⧇āĻšā§‡āϤ⧁ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āĻ°ā§āϤ⧃āĻĒāĻ•ā§āώ āĻĻā§āĻŦāĻžāϰāĻž āϤāĻž āĻ¸ā§āĻŦā§€āĻ•ā§ƒāϤ, āϏ⧇āĻ­āĻžāĻŦ⧇āχ āĻāĻ–āĻžāύ⧇āĻ“ āφāĻŽāϰāĻž āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟāϗ⧁āϞ⧋ āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āĻ•āϰāĻŋāĨ¤ āĻāϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ āĻ…āĻ°ā§āĻĨ āĻŦā§āϝāϝāĻŧ āĻšāϝāĻŧ, āϤāĻžāχ āφāĻŽāϰāĻž 'āĻ¸ā§āĻŦ-āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ'āĻ“ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ, āĻāϟāĻŋ āĻĒāϰ⧀āĻ•ā§āώāĻžāϰ āωāĻĻā§āĻĻ⧇āĻļā§āϝ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰāĻŋāϤ āĻāĻ•āϟāĻŋ āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āϤ⧈āϰāĻŋ āĻ•āϰ⧇āĨ¤ + +> 💁 āφāĻŽāĻžāĻĻ⧇āϰ āϕ⧋āύāĻ“ āĻĒā§āϰ⧋āĻĄāĻžāĻ•āĻļāύ āϰāĻŋāϞāĻŋāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻŦ-āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰāĻŋāϤ āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āωāϚāĻŋāϤ āύāϝāĻŧāĨ¤ + +These certificates have a number of fields in them, including who the public key is from, the details of the CA who issued it, how long it is valid for, and the public key itself. Before using a certificate, it is good practice to verify it by checking that is was signed by the original CA. + +āĻāχ āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āϗ⧁āϞāĻŋāϰ āĻŽāĻ§ā§āϝ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āĻ•ā§āώ⧇āĻ¤ā§āϰ āϰāϝāĻŧ⧇āϛ⧇ āϝ⧇āĻŽāύ - āϕ⧋āĻĨāĻžā§Ÿ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āϰāϝāĻŧ⧇āϛ⧇ , āϝ⧇ CA āĻāϟāĻŋāϰ āĻ¸ā§āĻŦā§€āĻ•ā§ƒāϤāĻŋ āĻĻāĻŋā§Ÿā§‡āϛ⧇ āϤāĻžāϰ āϤāĻĨā§āϝāĻžāĻŦāϞāĻŋ, āĻ•āϤāĻ•ā§āώāϪ⧇āϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋ āĻŦ⧈āϧ āĻšāĻŦ⧇ āϤāĻžāϰ āĻŦāĻŋāĻŦāϰāĻŖ āĻāĻŦāĻ‚ āϏ⧇āχ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀āĨ¤ āϕ⧋āύ āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āφāϗ⧇, āĻāϟāĻŋ āϝ⧇ āϏāĻŋāĻ āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰ āĻ•āϰ⧇āϛ⧇ āϤāĻž āϝāĻžāϚāĻžāχ āĻ•āϰāĻž āĻ­āĻžāϞ āĻāĻ•āϟāĻŋ āϚāĻ°ā§āϚāĻžāĨ¤ + +✅ āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āϗ⧁āϞāĻŋāϰ āϏāĻ•āϞ āĻ•ā§āώ⧇āĻ¤ā§āϰ āĻāϰ āĻŦāĻ°ā§āĻŖāύāĻž [Microsoft Understanding X.509 Public Key Certificates tutorial](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-certificates?WT.mc_id=academic-17441-jabenn#certificate-fields) āĻ āĻ°ā§Ÿā§‡āϛ⧇āĨ¤ + +X.509 āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻĒā§āϰ⧇āϰāĻ• āĻāĻŦāĻ‚ āĻĒā§āϰāĻžāĻĒāĻ• āωāĻ­āϝāĻŧ⧇āϰāχ āύāĻŋāϜāĻ¸ā§āĻŦ public and private keys āĻāĻŦāĻ‚ āϏ⧇āχāϏāĻžāĻĨ⧇ āωāĻ­āϝāĻŧ⧇āϰāχ X.509 āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āĻĨāĻžāĻ•āĻŦ⧇ āϝāĻžāϤ⧇ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āĻāϰāĻĒāϰ⧇ āϤāĻžāϰāĻž X.509 āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āϕ⧋āύāĻ­āĻžāĻŦ⧇ āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧ āĻ•āϰ⧇āύ, āĻāϕ⧇ āĻ…āĻĒāϰāϕ⧇ āϤāĻžāϰāĻž āĻĒāĻžāĻ āĻžāύ⧋ āĻĄā§‡āϟāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻžāĻĒā§āϤ āĻĄā§‡āϟāĻž āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϤāĻžāĻĻ⧇āϰ āύāĻŋāϜāĻ¸ā§āĻŦ āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ + +![Instead of sharing a public key, we can share a certificate. The user of the certificate can verify that it comes from we by checking with the certificate authority who signed it.](../../../../images/send-message-certificate.png) + +X.509 āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϗ⧁āϞāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āĻŦāĻĄāĻŧ āϏ⧁āĻŦāĻŋāϧāĻž āĻšāϞ āĻāϗ⧁āϞāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ āφāĻŽāϰāĻž āĻāĻ•āϟāĻŋ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ, āĻāϟāĻŋ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋ āĻāĻŦāĻ‚ āφāĻŽāĻžāĻĻ⧇āϰ āϏāĻŽāĻ¸ā§āϤ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϜāĻ¨ā§āϝ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻžāĻĒā§āϤ āĻŦāĻžāĻ°ā§āϤāĻžāϗ⧁āϞāĻŋ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋāϰ āϤāĻ–āύ āϕ⧇āĻŦāϞ āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āϜāĻžāύāϤ⧇ āĻšāĻŦ⧇āĨ¤ + +āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āĻ•āĻžāϛ⧇ āĻĒāĻžāĻ āĻžāύ⧋ āĻŦāĻžāĻ°ā§āϤāĻžāϗ⧁āϞāĻŋ āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĻā§āĻŦāĻžāϰāĻž āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϟāĻŋ āĻŽāĻžāχāĻ•ā§āϰ⧋āϏāĻĢā§āϟ āĻĒā§āϰāĻ•āĻžāĻļ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻāĻ•āχ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϝāĻž āĻĒā§āϰāϚ⧁āϰ āĻ…ā§āϝāĻžāϜ⧁āϰ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ•āĻ–āύāĻ“ āĻ•āĻ–āύāĻ“ SDK-āϗ⧁āϞāĻŋāϤ⧇ āĻ…āĻ¨ā§āϤāĻ°ā§āύāĻŋāĻ°ā§āĻŽāĻŋāϤ āĻĨāĻžāϕ⧇āĨ¤ + +> 💁 āĻŽāύ⧇ āϰāĻžāĻ–āϤ⧇ āĻšāĻŦ⧇, āĻāĻ•āϟāĻŋ public key āφāϏāϞ⧇āχ 'public'. āĻ…ā§āϝāĻžāϜ⧁āϰ⧇ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āϕ⧇āĻŦāϞ āĻāĻ–āĻžāύ⧇ āĻĒā§āϰ⧇āϰāĻŋāϤ āĻĄā§‡āϟāĻž āĻāύāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇, āĻāϟāĻŋ āĻĄāĻŋāĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āύāϝāĻŧ, āϏ⧁āϤāϰāĻžāĻ‚ āĻāϟāĻŋ āϏ⧋āĻ°ā§āϏ āϕ⧋āĻĄ āϏāĻš āϏāĻ°ā§āĻŦāĻ¤ā§āϰ āĻļā§‡ā§ŸāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ āωāĻĻāĻžāĻšāϰāĻŖāĻ¸ā§āĻŦāϰ⧂āĻĒ, āφāĻŽāϰāĻž [Azure IoT C SDK source code](https://github.com/Azure/azure-iot-sdk-c/blob/master/certs/certs.c) āĻāĻ“ āϤāĻž āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻŦā§‹āĨ¤ + +✅ X.509 certificates āĻ āĻ•āĻŋāϛ⧁ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻŦā§āĻĻ āĻŦāĻž āĻ­āĻžāώāĻž āĻ°ā§Ÿā§‡āϛ⧇āĨ¤ āĻ…āĻĒāĻŋāϰāĻŋāϚāĻŋāϤ āϕ⧋āύ āĻļā§‹āĻŦā§āĻĻ⧇āϰ āĻŽā§āĻ–ā§‹āĻŽā§āĻ–āĻŋ āĻšāϞ⧇ āφāĻŽāϰāĻž [The layman’s guide to X.509 certificate jargon](https://techcommunity.microsoft.com/t5/internet-of-things/the-layman-s-guide-to-x-509-certificate-jargon/ba-p/2203540?WT.mc_id=academic-17441-jabenn) āĻĒ⧜āϞ⧇ āϤāĻž āĻĒāĻžāĻŦā§‹āĨ¤ + +## X.509 certificate āϤ⧈āϰ⧀ āĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰ + +āĻāĻ•āϟāĻŋ X.509 āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϤ⧈āϰ⧀ āĻ•āϰāĻžāϰ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋ āĻšāϞ: + +1. āĻāĻ•āϟāĻŋ public/private key pair āϤ⧈āϰ⧀ āĻ•āϰāĻžāĨ¤ āĻāϟāĻŋāϰ āϜāĻ¨ā§āϝ āĻŦāĻšā§āϞ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻāĻ•āϟāĻŋ āĻāϞāĻ—āϰāĻŋāĻĻāĻŽ āĻšāϞ⧋ [Rivest–Shamir–Adleman](https://wikipedia.org/wiki/RSA_(cryptosystem))(RSA) āĻĒāĻĻā§āϧāϤāĻŋāĨ¤ + +1. CA āĻŦāĻž self-signing āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒāĻžāĻŦāϞāĻŋāĻ• āϕ⧀ āĻāĻŦāĻ‚ āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ āϤāĻĨā§āϝ āϏāĻžāĻŦāĻŽāĻŋāϟ āĻ•āϰāĻžāĨ¤ + +āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦāϟāĻŋāϤ⧇ āĻāĻ•āϟāĻŋ āύāϤ⧁āύ āĻĄāĻŋāĻ­āĻžāχāϏ āφāχāĻĄā§‡āύāϟāĻŋāϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻĒāĻžāĻŦāϞāĻŋāĻ• / āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āĻĒā§‡ā§ŸāĻžāϰ āϤ⧈āϰ⧀ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻ¸ā§āĻŦ-āĻ¸ā§āĻŦāĻžāĻ•ā§āώāϰāĻŋāϤ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāϜ⧁āϰ āϏāĻŋāĻāϞāφāχāϝāĻŧ⧇āϰ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ + +> 💁 āĻ•āĻžāĻœā§‡āϰ āϧāĻžāĻĒāϗ⧁āϞ⧋ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤ āĻĻ⧇āĻ–āϤ⧇ āĻšāϞ⧇ āφāĻŽāϰāĻž āĻŦāϰāĻ‚ CLI āĻāϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ [Using OpenSSL to create self-signed certificates tutorial in the Microsoft IoT Hub documentation](https://docs.microsoft.com/azure/iot-hub/tutorial-x509-self-sign?WT.mc_id=academic-17441-jabenn) āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ + +### āĻ•āĻžāϜ - X.509 certificate āĻĻā§āĻŦāĻžāϰāĻž āĻĄāĻŋāĻ­āĻžāχāϏ āφāχāĻĄā§‡āύāϟāĻŋāϟāĻŋ āϤ⧈āϰ⧀ + +1. āύāϤ⧁āύ āĻĄāĻŋāĻ­āĻžāχāϏ āφāχāĻĄā§‡āύāϟāĻŋāϟāĻŋ āϤ⧈āϰ⧀āϰ āϜāĻ¨ā§āϝ āύāĻŋāĻŽā§āύ⧇āϰ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āϰāĻžāύ āĻĻāĻŋāχ, āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ āϕ⧀ āĻāĻŦāĻ‚ āĻļāĻ‚āϏāĻžāĻĒāĻ¤ā§āϰāϗ⧁āϞāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāĻšā§āϛ⧇: + + ```sh + az iot hub device-identity create --device-id soil-moisture-sensor-x509 \ + --am x509_thumbprint \ + --output-dir . \ + --hub-name + ``` + + āĻāĻ–āĻžāύ⧇ `` āĻāϰ āϜāĻžā§ŸāĻ—āĻžā§Ÿ āφāĻŽāĻžāĻĻ⧇āϰ IoT Hub āĻ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āύāĻžāĻŽāϟāĻŋ āĻĻāĻŋāϤ⧇ āĻšāĻŦ⧇āĨ¤ + + āĻāϟāĻŋ `soil-moisture-sensor-x509` āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āφāχāĻĄāĻŋ āϏāĻš āĻĄāĻŋāĻ­āĻžāχāϏ āϤ⧈āϰ⧀ āĻ•āϰ⧇ āĻĻāĻŋāĻŦ⧇ āϝāĻž āφāϗ⧇āϰ āϞ⧇āϏāύ⧇ āϤ⧈āϰ⧀ āĻ•āϰāĻž āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻ­āĻŋāĻ¨ā§āύ āĨ¤ āĻāĻ›āĻžā§œāĻžāĻ“ ⧍āϟāĻŋ āĻĢāĻžāχāϞ āϤ⧈āϰ⧀ āĻšāĻŦ⧇: + + * `soil-moisture-sensor-x509-key.pem` - āĻāχ āĻĢāĻžāχāϞ⧇ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϜāĻ¨ā§āϝ āĻĒā§āϰāĻžāχāϭ⧇āϟ āϕ⧀ āĻĨāĻžāϕ⧇āĨ¤ + * `soil-moisture-sensor-x509-cert.pem` - āĻāϟāĻŋāϤ⧇ X.509 āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āĻĨāĻžāϕ⧇āĨ¤ + + āĻāχ āĻĢāĻžāχāϞ āϗ⧁āϞ⧋ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āϰāĻžāĻ–āϤ⧇ āĻšāĻŦ⧇! āĻĒāĻžāĻŦāϞāĻŋāϕ⧇ āĻāĻ•āϏ⧇āϏ āĻĒāĻžāĻ“ā§ŸāĻžāϰ āĻŽāϤ āĻ•āϰ⧇ āϰāĻžāĻ–āĻž āϝāĻžāĻŦ⧇āύāĻžāĨ¤ + +### āĻ•āĻžāϜ - āĻĄāĻŋāĻ­āĻžāχāϏ āϕ⧋āĻĄā§‡ X.509 certificate āĻŦā§āϝāĻŦāĻšāĻžāϰ + +āύāĻŋāĻŽā§āύ⧇āϰ āĻĒā§āϰāĻžāϏāĻ™ā§āĻ—āĻŋāĻ• āϕ⧋āύ āĻāĻ•āϟāĻŋ āĻ—āĻžāχāĻĄ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āσ + +* [Arduino - Wio Terminal](wio-terminal-x509.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-x509.md) + +--- + +## 🚀 āĻšā§āϝāĻžāϞ⧇āĻžā§āϜ + +Azure āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϤ⧈āϰ⧀, āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻāĻŦāĻ‚ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ…āύ⧇āĻ•āϗ⧁āϞ⧋ āωāĻĒāĻžā§Ÿ āĻ°ā§Ÿā§‡āϛ⧇āĨ¤ āĻāϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āĻšāϞ⧋ [Azure Portal](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) - āĻāĻ•āϟāĻŋ āĻ“ā§Ÿā§Ÿā§‡āĻŦ-āĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ āĻāĻ•ā§āϏ⧇āĻ–āĻžāύ āĻĨ⧇āϕ⧇ āφāĻŽāϰāĻž āϏāĻšāĻœā§‡āχ Azure services āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ + +āφāĻŽāϰāĻž [portal.azure.com](https://portal.azure.com?WT.mc_id=academic-17441-jabenn) āĻ āĻ—āĻŋā§Ÿā§‡ āĻĒā§‹āĻ°ā§āϟāĻžāϞāϟāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻ–āĻžāύ⧇ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āϤ⧈āϰ⧀ āĻ•āϰ⧇, āĻĒāϰ⧇ āĻĄāĻŋāϞāĻŋāϟ āĻ•āϰ⧇ āĻĻāĻŋāχāĨ¤ + +**Hint** - āĻĒā§‹āĻ°ā§āϟāĻžāϞ⧇āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ, āφāĻŽāĻžāĻĻ⧇āϰ āĻļ⧁āϰ⧁āϤ⧇āχ āϕ⧋āύāĻ“ āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻ—ā§āϰ⧁āĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āĻĻāϰāĻ•āĻžāϰ āύ⧇āχ, āϝāĻ–āύ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āĻšāϝāĻŧ āϤāĻ–āύ āĻāĻ•āϟāĻŋ āϰāĻŋāϏ⧋āĻ°ā§āϏ āĻ—ā§āϰ⧁āĻĒ āϤ⧈āϰāĻŋ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āϏāĻŦāĻļ⧇āώ⧇ āύāĻŋāĻļā§āϚāĻŋāϤ āĻšāϝāĻŧ⧇ āύāĻŋāϤ⧇ āĻšāĻŦ⧇ āϝ⧇ āφāĻŽāϰāĻž āĻ•āĻžāϜ āĻļ⧇āώ āĻšāϝāĻŧ⧇ āϗ⧇āϞ⧇ āĻāϟāĻŋ āĻŽā§āϛ⧇ āĻĢ⧇āϞ⧇āĻ›āĻŋ! + +Azure Portal āύāĻŋā§Ÿā§‡ āĻĄāϕ⧁āĻŽā§‡āĻ¨ā§āϟ, āϟāĻŋāωāĻŸā§‹āϰāĻŋ⧟āĻžāϞ, āĻ—āĻžāχāĻĄ [Azure portal documentation](https://docs.microsoft.com/azure/azure-portal/?WT.mc_id=academic-17441-jabenn) āĻ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžāĻŦ⧇āĨ¤ + +## āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ + +[āϞ⧇āĻ•āϚāĻžāϰ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/20) + +## āϰāĻŋāĻ­āĻŋāω āĻāĻŦāĻ‚ āĻ¸ā§āĻŦ-āĻ…āĻ§ā§āϝ⧟āύ + +* āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ āĻāϰ āχāϤāĻŋāĻšāĻžāϏ [History of Cryptography - Wikipedia](https://wikipedia.org/wiki/History_of_āϏāĻ‚āϕ⧇āϤāϞāĻŋāĻĒāĻŋ (Cryptography))āĻĨ⧇āϕ⧇ āĻœā§‡āύ⧇ āύāĻŋāχāĨ¤ +* X.509 āϏāĻžāĻ°ā§āϟāĻŋāĻĢāĻŋāϕ⧇āϟ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ [X.509 page on Wikipedia](https://wikipedia.org/wiki/X.509) āĻĨ⧇āϕ⧇ āĻŦāĻŋāĻļāĻĻāĻ­āĻžāĻŦ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ āĻ•āϰāĻŋāĨ¤ + +## āĻāϏāĻžāχāύāĻŽā§‡āĻ¨ā§āϟ + +[āύāϤ⧁āύ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϤ⧈āϰāĻŋ](assignment.bn.md) diff --git a/2-farm/lessons/6-keep-your-plant-secure/translations/assignment.bn.md b/2-farm/lessons/6-keep-your-plant-secure/translations/assignment.bn.md new file mode 100644 index 00000000..3f23fe46 --- /dev/null +++ b/2-farm/lessons/6-keep-your-plant-secure/translations/assignment.bn.md @@ -0,0 +1,15 @@ +# āύāϤ⧁āύ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϤ⧈āϰāĻŋ + +## āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻžāĻŦāϞ⧀ + +āφāĻŽāϰāĻž āĻĄāĻŋāϜāĻŋāϟāĻžāϞ āĻ•ā§ƒāώāĻŋāĻ•āĻžāϜ āĻāĻŦāĻ‚ āωāĻĻā§āĻ­āĻŋāĻĻ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āĻĄā§‡āϟāĻž āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ āĻāĻŦāĻ‚ āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āĻĒāĻžāϠ⧇āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āϏ⧇āϚāĻ•āĻžāĻ°ā§āϝ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āϰāĻŦ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ—āϤ 6 āϟāĻŋ āĻĒāĻžāϠ⧇ āĻļāĻŋāϖ⧇āĻ›āĻŋāĨ¤ + +āφāĻŽāĻžāĻĻ⧇āϰ āĻĒāĻ›āĻ¨ā§āĻĻāĻŽāϤ⧋ āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āύāϤ⧁āύ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāĻ•āϟāĻŋ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇ āĻŸā§‡āϞāĻŋāĻŽā§‡āĻŸā§āϰāĻŋ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰāĻŋ āĻāĻŦāĻ‚ āϏāĻžāĻ°ā§āĻ­āĻžāϰāϞ⧇āϏ āϕ⧋āĻĄā§‡āϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ āϕ⧋āύ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰāϕ⧇ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŋāĨ¤ āφāĻŽāϰāĻž āϤ⧋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻŦ⧇āĻļ āĻ•āĻŋāϛ⧁ āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻļāĻŋāϖ⧇āĻ›āĻŋ - āϏ⧇āϗ⧁āϞ⧋ āĻŦāĻž āĻāĻ•āĻĻāĻŽ āύāϤ⧁āύ āĻ•āĻŋāϛ⧁ āύāĻŋā§Ÿā§‡ āĻ•āĻžāϜ āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŋāĨ¤ + +## āĻāϏāĻžāχāύāĻŽā§‡āĻ¨ā§āϟ āĻŽā§‚āĻ˛ā§āϝāĻžā§Ÿāύ āĻŽāĻžāύāĻĻāĻ¨ā§āĻĄ + +| āĻ•ā§āϰāĻžāχāĻŸā§‡āϰāĻŋ⧟āĻž | āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤāĻŽā§‚āϞāĻ• (āϏāĻ°ā§āĻŦā§‹āĻ¤ā§āϤāĻŽ) | āĻĒāĻ°ā§āϝāĻžāĻĒā§āϤ (āĻŽāĻžāĻāĻžāϰāĻŋ) | āωāĻ¨ā§āύāϤāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ (āύāĻŋāĻŽā§āύāĻŽāĻžāύ) | +| --------- | ------------------ | -------------- | -------------------- | +| āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻāĻ•āϟāĻŋ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϕ⧋āĻĄ āĻ•āϰāĻž | āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϤ⧈āϰ⧀ āĻ•āϰ⧇āϛ⧇ |āĻšā§Ÿ āϏ⧇āĻ¨ā§āϏāϰ āĻŦāĻž āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϤ⧈āϰ⧀ āĻ•āϰ⧇āϛ⧇| āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϤ⧈āϰ⧀ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻžāĻ°ā§āĻĨ | +| āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āϏāĻžāĻĨ⧇ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇āϰ āĻ•āĻžāύ⧇āĻ•āĻļāύ | āĻāĻ•āϟāĻŋ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āĻĄā§‡āĻĒā§āϞ⧟ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻāϤ⧇ āĻŸā§‡āϞāĻŋāĻŽā§‡āĻŸā§āϰāĻŋ āĻĒāĻžāĻ āĻžāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āĻāĻŦāĻ‚ āĻāϰ āĻĨ⧇āϕ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāϤ⧇ āĻĒ⧇āϰ⧇āĻ›āĻŋāϞ | āĻāĻ•āϟāĻŋ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āĻĄā§‡āĻĒā§āϞ⧟ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻšā§Ÿ āĻāϤ⧇ āĻŸā§‡āϞāĻŋāĻŽā§‡āĻŸā§āϰāĻŋ āĻĒāĻžāĻ āĻžāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āĻ…āĻĨāĻŦāĻž āĻāϰ āĻĨ⧇āϕ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāϤ⧇ āĻĒ⧇āϰ⧇āĻ›āĻŋāϞ | āĻāĻ•āϟāĻŋ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āĻĄā§‡āĻĒā§āϞ⧟ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āϏāĻ‚āϝ⧋āĻ— āϤ⧈āϰ⧀ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻžāĻ°ā§āĻĨ | +| āϏāĻžāĻ°ā§āĻ­āĻžāϰāϞ⧇āϏ āϕ⧋āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāĻŖ | āĻŸā§‡āϞāĻŋāĻŽā§‡āĻŸā§āϰāĻŋ āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻšāĻ“āϝāĻŧāĻž āĻĄāĻŋāĻ­āĻžāχāϏ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāϤ⧇ āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāϜ⧁āϰ āĻĢāĻžāĻ‚āĻļāύ āĻĄā§‡āĻĒā§āϞ⧟ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ | āĻŸā§‡āϞāĻŋāĻŽā§‡āĻŸā§āϰāĻŋ āχāϭ⧇āĻ¨ā§āϟāϗ⧁āϞāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž āĻāĻ•āϟāĻŋ āĻ…ā§āϝāĻžāϜ⧁āϰ āĻĢāĻžāĻ‚āĻļāύ āϤ⧈āϰ⧀ āĻ•āϰāϤ⧇ āϏāĻ•ā§āώāĻŽ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĻŋ | āĻ…ā§āϝāĻžāϜ⧁āϰ āĻĢāĻžāĻ‚āĻļāύ āĻĄā§‡āĻĒā§āϞ⧟ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻžāĻ°ā§āĻĨ | diff --git a/2-farm/translations/Readme.hi.md b/2-farm/translations/Readme.hi.md new file mode 100644 index 00000000..60c61651 --- /dev/null +++ b/2-farm/translations/Readme.hi.md @@ -0,0 +1,20 @@ +# ā¤†ā¤ˆ.⤓.⤟āĨ€ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ⤖āĨ‡ā¤¤āĨ€ + +⤜āĨˆā¤¸āĨ‡-⤜āĨˆā¤¸āĨ‡ ā¤œā¤¨ā¤¸ā¤‚ā¤–āĨā¤¯ā¤ž ā¤Ŧā¤ĸā¤ŧ⤤āĨ€ ā¤šāĨˆ, ā¤ĩāĨˆā¤¸āĨ‡-ā¤ĩāĨˆā¤¸āĨ‡ ⤕āĨƒā¤ˇā¤ŋ ⤕āĨ€ ā¤Žā¤žā¤‚ā¤— ⤭āĨ€ ā¤Ŧā¤ĸā¤ŧ⤤āĨ€ ā¤šāĨˆāĨ¤ ā¤Žā¤—ā¤° ⤉ā¤Ē⤞ā¤ŦāĨā¤§ ⤭āĨ‚ā¤Žā¤ŋ ⤕āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ā¤Ŧā¤Ļ⤞⤤āĨ€ ā¤šāĨˆ, ⤞āĨ‡ā¤•ā¤ŋ⤍ ⤜⤞ā¤ĩā¤žā¤¯āĨ ā¤Ŧā¤Ļ⤞⤤āĨ€ ā¤šāĨˆ ⤜āĨ‹ ā¤¯ā¤žā¤šā¤ž ⤕ā¤ŋā¤¸ā¤žā¤¨āĨ‹ā¤‚ ⤕āĨ‹ ⤔⤰ ⤭āĨ€ ⤅⤧ā¤ŋ⤕ ⤚āĨā¤¨āĨŒā¤¤ā¤ŋā¤¯ā¤žā¤ ā¤ĻāĨ‡ā¤¤āĨ€ ā¤šāĨˆ, ā¤ĩā¤ŋā¤ļāĨ‡ā¤ˇā¤•⤰ 2 ā¤Ŧā¤ŋ⤞ā¤ŋ⤝⤍ [⤍ā¤ŋ⤰āĨā¤ĩā¤žā¤š ⤕ā¤ŋā¤¸ā¤žā¤¨](https://wikipedia.org/wiki/Subsistence_agriculture) ⤜āĨ‹ ⤇⤏ ā¤Ŧā¤žā¤¤ ā¤Ē⤰ ⤭⤰āĨ‹ā¤¸ā¤ž ⤕⤰⤤āĨ‡ ā¤šāĨˆā¤‚ ⤕ā¤ŋ ā¤ĩāĨ‡ ⤕āĨā¤¯ā¤ž ā¤‰ā¤—ā¤žā¤¤āĨ‡ ā¤šāĨˆā¤‚ ⤅ā¤Ē⤍āĨ‡ ā¤Ē⤰ā¤ŋā¤ĩā¤žā¤° ā¤•ā¤ž ⤭⤰⤪-ā¤ĒāĨ‹ā¤ˇā¤Ŗ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤āĨ¤ ā¤†ā¤ˆ.⤓.⤟āĨ€ ⤕ā¤ŋā¤¸ā¤žā¤¨āĨ‹ā¤‚ ⤕āĨ‹ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ⤍ā¤ŋ⤰āĨā¤Ŗā¤¯ ⤞āĨ‡ā¤¨āĨ‡ ā¤ŽāĨ‡ā¤‚ ā¤Žā¤Ļā¤Ļ ⤕⤰ ā¤¸ā¤•ā¤¤ā¤ž ā¤šāĨˆ ⤕ā¤ŋ ⤕āĨā¤¯ā¤ž ā¤‰ā¤—ā¤žā¤¯ā¤ž ā¤œā¤žā¤ ⤔⤰ ⤕ā¤Ŧ ā¤•ā¤Ÿā¤žā¤ˆ ⤕āĨ€ ā¤œā¤žā¤, ā¤ĒāĨˆā¤Ļā¤žā¤ĩā¤žā¤° ā¤Ŧā¤ĸā¤ŧā¤žā¤ˆ ā¤œā¤žā¤, ā¤ļā¤žā¤°āĨ€ā¤°ā¤ŋ⤕ ā¤ļāĨā¤°ā¤Ž ⤕āĨ€ ā¤Žā¤žā¤¤āĨā¤°ā¤ž ⤕āĨ‹ ā¤•ā¤Ž ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤ ⤔⤰ ⤕āĨ€ā¤ŸāĨ‹ā¤‚ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤¯ā¤ž ā¤œā¤žā¤ ⤔⤰ ⤉⤍⤏āĨ‡ ⤍ā¤ŋā¤Ēā¤Ÿā¤ž ā¤œā¤ž ⤏⤕āĨ‡āĨ¤ + +⤇⤍ 6 ā¤Ēā¤žā¤ āĨ‹ā¤‚ ā¤ŽāĨ‡ā¤‚ ⤆ā¤Ē ⤏āĨ€ā¤–āĨ‡ā¤‚⤗āĨ‡ ⤕ā¤ŋ ⤖āĨ‡ā¤¤āĨ€ ⤕āĨ‹ ā¤ŦāĨ‡ā¤šā¤¤ā¤° ā¤Ŧā¤¨ā¤žā¤¨āĨ‡ ⤔⤰ ⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ⤕⤰⤍āĨ‡ ⤕āĨ‡ ⤞ā¤ŋā¤ ā¤‡ā¤‚ā¤Ÿā¤°ā¤¨āĨ‡ā¤Ÿ ⤑ā¤Ģ ā¤Ĩā¤ŋ⤂⤗āĨā¤¸ ⤕āĨ‹ ⤕āĨˆā¤¸āĨ‡ ā¤˛ā¤žā¤—āĨ‚ ⤕ā¤ŋā¤¯ā¤ž ā¤œā¤žā¤āĨ¤ + +> 💁 ⤝āĨ‡ ā¤Ēā¤žā¤  ⤕āĨā¤› ⤕āĨā¤˛ā¤žā¤‰ā¤Ą ā¤¸ā¤‚ā¤¸ā¤žā¤§ā¤¨āĨ‹ā¤‚ ā¤•ā¤ž ⤉ā¤Ē⤝āĨ‹ā¤— ⤕⤰āĨ‡ā¤‚⤗āĨ‡āĨ¤ ⤝ā¤Ļā¤ŋ ⤆ā¤Ē ⤇⤏ ā¤Ē⤰ā¤ŋ⤝āĨ‹ā¤œā¤¨ā¤ž ⤕āĨ‡ ⤏⤭āĨ€ ā¤Ēā¤žā¤ āĨ‹ā¤‚ ⤕āĨ‹ ā¤ĒāĨ‚ā¤°ā¤ž ā¤¨ā¤šāĨ€ā¤‚ ⤕⤰⤤āĨ‡ ā¤šāĨˆā¤‚, ⤤āĨ‹ ⤏āĨā¤¨ā¤ŋā¤ļāĨā¤šā¤ŋ⤤ ⤕⤰āĨ‡ā¤‚ ⤕ā¤ŋ ⤆ā¤Ē [⤅ā¤Ē⤍āĨ€ ā¤Ē⤰ā¤ŋ⤝āĨ‹ā¤œā¤¨ā¤ž ⤕āĨ‹ ā¤¸ā¤žā¤Ģ ⤕⤰āĨ‡ā¤‚](ā¤Ēā¤žā¤ /6-⤕āĨ€ā¤Ē-⤝āĨ‹ā¤°-ā¤ĒāĨā¤˛ā¤žā¤‚ā¤Ÿ-⤏ā¤ŋ⤕āĨā¤¯āĨ‹ā¤°/⤰āĨ€ā¤Ąā¤ā¤Žā¤ˆ.ā¤ā¤Žā¤ĄāĨ€#⤕āĨā¤˛āĨ€ā¤¨-⤅ā¤Ē-⤝āĨ‹ā¤°-ā¤ĒāĨā¤°āĨ‹ā¤œāĨ‡ā¤•āĨā¤Ÿ) ⤚⤰⤪ ā¤•ā¤ž ā¤Ēā¤žā¤˛ā¤¨ ⤕⤰āĨ‡ā¤‚āĨ¤ [ā¤Ēā¤žā¤  āĨŦ] ā¤ŽāĨ‡ā¤‚ (ā¤Ēā¤žā¤ /6-⤕āĨ€ā¤Ē-⤝āĨ‹ā¤°-ā¤ĒāĨā¤˛ā¤žā¤‚ā¤Ÿ-⤏ā¤ŋ⤕āĨā¤¯āĨ‹ā¤°/⤰āĨ€ā¤Ąā¤ā¤Žā¤ˆ.ā¤ā¤Žā¤ĄāĨ€)āĨ¤ + +## ā¤ĩā¤ŋ⤎⤝ + +1. [ā¤†ā¤ˆā¤“ā¤ŸāĨ€ ⤕āĨ‡ ā¤¸ā¤žā¤Ĩ ā¤ĒāĨŒā¤§āĨ‡ ⤕āĨ€ ā¤ĩāĨƒā¤ĻāĨā¤§ā¤ŋ ⤕āĨ€ ⤭ā¤ĩā¤ŋ⤎āĨā¤¯ā¤ĩā¤žā¤ŖāĨ€ ⤕⤰āĨ‡ā¤‚](lessons/1-predict-plant-growth/README.md) +1. [ā¤Žā¤ŋ⤟āĨā¤ŸāĨ€ ⤕āĨ€ ā¤¨ā¤ŽāĨ€ ā¤•ā¤ž ā¤Ēā¤¤ā¤ž ā¤˛ā¤—ā¤žā¤ā¤‚] (lessons/2-detect-soil-moisture/README.md) +1. [⤏āĨā¤ĩā¤šā¤žā¤˛ā¤ŋ⤤ ā¤ĒāĨŒā¤§āĨ‹ā¤‚ ⤕āĨ‹ ā¤Ēā¤žā¤¨āĨ€ ā¤ĻāĨ‡ā¤¨ā¤ž] (lessons/3-automated-plant-watering/README.md) +1. [⤅ā¤Ē⤍āĨ‡ ā¤ĒāĨŒā¤§āĨ‡ ⤕āĨ‹ ⤕āĨā¤˛ā¤žā¤‰ā¤Ą ā¤ŽāĨ‡ā¤‚ ā¤Žā¤žā¤‡ā¤—āĨā¤°āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚](lessons/4-migrate-your-plant-to-the-cloud/README.md) +1. [⤅ā¤Ē⤍āĨ‡ ā¤ā¤ĒāĨā¤˛ā¤ŋ⤕āĨ‡ā¤ļ⤍ ⤞āĨ‰ā¤œā¤ŋ⤕ ⤕āĨ‹ ⤕āĨā¤˛ā¤žā¤‰ā¤Ą ā¤Ē⤰ ā¤Žā¤žā¤‡ā¤—āĨā¤°āĨ‡ā¤Ÿ ⤕⤰āĨ‡ā¤‚](lessons/5-migrate-application-to-the-cloud/README.md) +1. [⤅ā¤Ē⤍āĨ‡ ⤏⤂⤝⤂⤤āĨā¤° ⤕āĨ‹ ⤏āĨā¤°ā¤•āĨā¤ˇā¤ŋ⤤ ⤰⤖āĨ‡ā¤‚](lessons/6-keep-your-plant-secure/README.md) + +## ⤕āĨā¤°āĨ‡ā¤Ąā¤ŋ⤟ + +⤏⤭āĨ€ ā¤Ēā¤žā¤  [⤜ā¤ŋā¤Ž ā¤ŦāĨ‡ā¤¨āĨ‡ā¤Ÿ](https://GitHub.com/JimBobBennett) ā¤ĻāĨā¤ĩā¤žā¤°ā¤ž ī¸â™Ĩī¸ ā¤¸ā¤žā¤Ĩ ⤞ā¤ŋ⤖āĨ‡ ā¤—ā¤ ā¤ĨāĨ‡ diff --git a/3-transport/lessons/2-store-location-data/code/wio-terminal/gps-sensor/platformio.ini b/3-transport/lessons/2-store-location-data/code/wio-terminal/gps-sensor/platformio.ini index 6aee0066..1f6ca207 100644 --- a/3-transport/lessons/2-store-location-data/code/wio-terminal/gps-sensor/platformio.ini +++ b/3-transport/lessons/2-store-location-data/code/wio-terminal/gps-sensor/platformio.ini @@ -15,8 +15,8 @@ framework = arduino lib_deps = bblanchon/ArduinoJson @ 6.17.3 seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 seeed-studio/Seeed Arduino RTC @ 2.0.0 diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/code-camera/wio-terminal/fruit-quality-detector/platformio.ini b/4-manufacturing/lessons/2-check-fruit-from-device/code-camera/wio-terminal/fruit-quality-detector/platformio.ini index d2d6f51d..ebe92e30 100644 --- a/4-manufacturing/lessons/2-check-fruit-from-device/code-camera/wio-terminal/fruit-quality-detector/platformio.ini +++ b/4-manufacturing/lessons/2-check-fruit-from-device/code-camera/wio-terminal/fruit-quality-detector/platformio.ini @@ -14,8 +14,8 @@ board = seeed_wio_terminal framework = arduino lib_deps = seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 seeed-studio/Seeed Arduino RTC @ 2.0.0 diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/code-classify/wio-terminal/fruit-quality-detector/platformio.ini b/4-manufacturing/lessons/2-check-fruit-from-device/code-classify/wio-terminal/fruit-quality-detector/platformio.ini index 5f3eb8a7..826cb386 100644 --- a/4-manufacturing/lessons/2-check-fruit-from-device/code-classify/wio-terminal/fruit-quality-detector/platformio.ini +++ b/4-manufacturing/lessons/2-check-fruit-from-device/code-classify/wio-terminal/fruit-quality-detector/platformio.ini @@ -14,8 +14,8 @@ board = seeed_wio_terminal framework = arduino lib_deps = seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 seeed-studio/Seeed Arduino RTC @ 2.0.0 diff --git a/4-manufacturing/lessons/3-run-fruit-detector-edge/code-classify/wio-terminal/fruit-quality-detector/platformio.ini b/4-manufacturing/lessons/3-run-fruit-detector-edge/code-classify/wio-terminal/fruit-quality-detector/platformio.ini index 5f3eb8a7..826cb386 100644 --- a/4-manufacturing/lessons/3-run-fruit-detector-edge/code-classify/wio-terminal/fruit-quality-detector/platformio.ini +++ b/4-manufacturing/lessons/3-run-fruit-detector-edge/code-classify/wio-terminal/fruit-quality-detector/platformio.ini @@ -14,8 +14,8 @@ board = seeed_wio_terminal framework = arduino lib_deps = seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 seeed-studio/Seeed Arduino RTC @ 2.0.0 diff --git a/5-retail/lessons/2-check-stock-device/code-count/wio-terminal/stock-counter/platformio.ini b/5-retail/lessons/2-check-stock-device/code-count/wio-terminal/stock-counter/platformio.ini index 5f3eb8a7..826cb386 100644 --- a/5-retail/lessons/2-check-stock-device/code-count/wio-terminal/stock-counter/platformio.ini +++ b/5-retail/lessons/2-check-stock-device/code-count/wio-terminal/stock-counter/platformio.ini @@ -14,8 +14,8 @@ board = seeed_wio_terminal framework = arduino lib_deps = seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 seeed-studio/Seeed Arduino RTC @ 2.0.0 diff --git a/5-retail/lessons/2-check-stock-device/code-detect/wio-terminal/stock-counter/platformio.ini b/5-retail/lessons/2-check-stock-device/code-detect/wio-terminal/stock-counter/platformio.ini index 5f3eb8a7..826cb386 100644 --- a/5-retail/lessons/2-check-stock-device/code-detect/wio-terminal/stock-counter/platformio.ini +++ b/5-retail/lessons/2-check-stock-device/code-detect/wio-terminal/stock-counter/platformio.ini @@ -14,8 +14,8 @@ board = seeed_wio_terminal framework = arduino lib_deps = seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 seeed-studio/Seeed Arduino RTC @ 2.0.0 diff --git a/6-consumer/README.md b/6-consumer/README.md index 4b986ad9..d3c8c9d8 100644 --- a/6-consumer/README.md +++ b/6-consumer/README.md @@ -6,6 +6,8 @@ The latest iterations are now part of our smart devices. In kitchens in homes al In these 4 lessons you'll learn how to build a smart timer, using AI to recognize your voice, understand what you are asking for, and reply with information about your timer. You'll also add support for multiple languages. +> âš ī¸ Working with speech and microphone data uses a lot of memory, meaning it is easy to hit limits on microcontrollers. The project here works around these issues, but be aware the Wio Terminal labs are complex and may take more time that other labs in this curriculum. + > 💁 These lessons will use some cloud resources. If you don't complete all the lessons in this project, make sure you [clean up your project](../clean-up.md). ## Topics diff --git a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/platformio.ini b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/platformio.ini index c5999f17..c8443c8d 100644 --- a/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/platformio.ini +++ b/6-consumer/lessons/1-speech-recognition/code-record/wio-terminal/smart-timer/platformio.ini @@ -13,7 +13,7 @@ platform = atmelsam board = seeed_wio_terminal framework = arduino lib_deps = - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 build_flags = -DSFUD_USING_QSPI diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/platformio.ini b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/platformio.ini index 5adbe733..9d79654b 100644 --- a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/platformio.ini +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/platformio.ini @@ -13,8 +13,8 @@ platform = atmelsam board = seeed_wio_terminal framework = arduino lib_deps = - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 diff --git a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/speech_to_text.h b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/speech_to_text.h index a7ce075f..74b4b4fd 100644 --- a/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/speech_to_text.h +++ b/6-consumer/lessons/1-speech-recognition/code-speech-to-text/wio-terminal/smart-timer/src/speech_to_text.h @@ -67,6 +67,11 @@ public: return text; } + String AccessToken() + { + return _access_token; + } + private: String getAccessToken() { diff --git a/6-consumer/lessons/1-speech-recognition/wio-terminal-audio.md b/6-consumer/lessons/1-speech-recognition/wio-terminal-audio.md index 302d67d9..8b3a45bb 100644 --- a/6-consumer/lessons/1-speech-recognition/wio-terminal-audio.md +++ b/6-consumer/lessons/1-speech-recognition/wio-terminal-audio.md @@ -24,8 +24,8 @@ Once each buffer has been captured, it can be written to the flash memory. Flash ```ini lib_deps = - seeed-studio/Seeed Arduino FS @ 2.0.3 - seeed-studio/Seeed Arduino SFUD @ 2.0.1 + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 ``` 1. Open the `main.cpp` file and add the following include directive for the flash memory library to the top of the file: diff --git a/6-consumer/lessons/1-speech-recognition/wio-terminal-microphone.md b/6-consumer/lessons/1-speech-recognition/wio-terminal-microphone.md index 66e65dc8..8cd8c32d 100644 --- a/6-consumer/lessons/1-speech-recognition/wio-terminal-microphone.md +++ b/6-consumer/lessons/1-speech-recognition/wio-terminal-microphone.md @@ -18,6 +18,8 @@ To connect the ReSpeaker 2-Mics Pi Hat you will need 40 pin-to-pin (also referre > 💁 If you are comfortable soldering, then you can use the [40 Pin Raspberry Pi Hat Adapter Board For Wio Terminal](https://www.seeedstudio.com/40-Pin-Raspberry-Pi-Hat-Adapter-Board-For-Wio-Terminal-p-4730.html) to connect the ReSpeaker. +You will also need an SD card to use to download and playback audio. The Wio Terminal only supports SD Cards up to 16GB in size, and these need to be formatted as FAT32 or exFAT. + ### Task - connect the ReSpeaker Pi Hat 1. With the Wio Terminal powered off, connect the ReSpeaker 2-Mics Pi Hat to the Wio Terminal using the jumper leads and the GPIO sockets on the back of the Wio Terminal: @@ -59,3 +61,15 @@ To connect the ReSpeaker 2-Mics Pi Hat you will need 40 pin-to-pin (also referre * If you are using a speaker with a 3.5mm jack, or headphones, insert them into the 3.5mm jack socket. ![A speaker connected to the ReSpeaker via the 3.5mm jack socket](../../../images/respeaker-35mm-speaker.png) + +### Task - set up the SD card + +1. Connect the SD Card to your computer, using na external reader if you don't have an SD Card slot. + +1. Format the SD Card using the appropriate tool on your computer, making sure to use a FAT32 or exFAT file system + +1. Insert the SD card into the SD Card slot on the left-hand side of the Wio Terminal, just below the power button. Make sure the card is all the way in and clicks in - you may need a thin tool or another SD Card to help push it all the way in. + + ![Inserting the SD card into the SD card slot below the power switch](../../../images/wio-sd-card.png) + + > 💁 To eject the SD Card, you need to push it in slightly and it will eject. You will need a thin tool to do this such as a flat-head screwdriver or another SD Card. diff --git a/6-consumer/lessons/1-speech-recognition/wio-terminal-speech-to-text.md b/6-consumer/lessons/1-speech-recognition/wio-terminal-speech-to-text.md index a1e2cddb..9010417e 100644 --- a/6-consumer/lessons/1-speech-recognition/wio-terminal-speech-to-text.md +++ b/6-consumer/lessons/1-speech-recognition/wio-terminal-speech-to-text.md @@ -180,6 +180,15 @@ The audio can be sent to the speech service using the REST API. To use the speec This code builds the URL for the token issuer API using the location of the speech resource. It then creates an `HTTPClient` to make the web request, setting it up to use the WiFi client configured with the token endpoints certificate. It sets the API key as a header for the call. It then makes a POST request to get the certificate, retrying if it gets any errors. Finally the access token is returned. +1. To the `public` section, add a method to get the access token. This will be needed in later lessons to convert text to speech. + + ```cpp + String AccessToken() + { + return _access_token; + } + ``` + 1. To the `public` section, add an `init` method that sets up the token client: ```cpp @@ -497,7 +506,7 @@ The audio can be sent to the speech service using the REST API. To use the speec Serial.println(text); ``` -1. Build this code, upload it to your Wio Terminal and test it out through the serial monitor. Press the C button (the one on the left-hand side, closest to the power switch), and speak. 4 seconds of audio will be captured, then converted to text. +1. Build this code, upload it to your Wio Terminal and test it out through the serial monitor. Once you see `Ready` in the serial monitor, press the C button (the one on the left-hand side, closest to the power switch), and speak. 4 seconds of audio will be captured, then converted to text. ```output --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time diff --git a/6-consumer/lessons/2-language-understanding/README.md b/6-consumer/lessons/2-language-understanding/README.md index b2a7cc9f..0c3a5082 100644 --- a/6-consumer/lessons/2-language-understanding/README.md +++ b/6-consumer/lessons/2-language-understanding/README.md @@ -274,7 +274,7 @@ Rather than calling LUIS from the IoT device, you can use serverless code with a func new --name text-to-timer --template "HTTP trigger" ``` - This will crate an HTTP trigger called `text-to-timer`. + This will create an HTTP trigger called `text-to-timer`. 1. Test the HTTP trigger by running the functions app. When it runs you will see the endpoint listed in the output: @@ -493,9 +493,35 @@ Rather than calling LUIS from the IoT device, you can use serverless code with a ### Task - make your function available to your IoT device -1. For your IoT device to call your REST endpoint, it will need to know the URL. When you accessed it earlier, you used `localhost`, which is a shortcut to access REST endpoints on your local machine. To allow you IoT device to get access, you need to either: +1. For your IoT device to call your REST endpoint, it will need to know the URL. When you accessed it earlier, you used `localhost`, which is a shortcut to access REST endpoints on your local machine. To allow you IoT device to get access, you need to either publish to the cloud, or get your IP address to access it locally. + + > âš ī¸ If you are using a Wio Terminal, it is easier to run the function app locally, as there will be a dependency on libraries that mean you cannot deploy the function app in the same way as you have done before. Run the function app locally and access it via your computers IP address. If you do want to deploy to the cloud, information will be provided in a later lesson on the way to do this. + + * Publish the Functions app - follow the instructions in earlier lessons to publish your functions app to the cloud. Once published, the URL will be `https://.azurewebsites.net/api/text-to-timer`, where `` will be the name of your functions app. Make sure to also publish your local settings. + + When working with HTTP triggers, they are secured by default with a function app key. To get this key, run the following command: + + ```sh + az functionapp keys list --resource-group smart-timer \ + --name + ``` + + Copy the value of the `default` entry from the `functionKeys` section. + + ```output + { + "functionKeys": { + "default": "sQO1LQaeK9N1qYD6SXeb/TctCmwQEkToLJU6Dw8TthNeUH8VA45hlA==" + }, + "masterKey": "RSKOAIlyvvQEQt9dfpabJT018scaLpQu9p1poHIMCxx5LYrIQZyQ/g==", + "systemKeys": {} + } + ``` + + This key will need to be added as a query parameter to the URL, so the final URL will be `https://.azurewebsites.net/api/text-to-timer?code=`, where `` will be the name of your functions app, and `` will be your default function key. + + > 💁 You can change the type of authorization of the HTTP trigger using `authlevel` setting in the `function.json` file. You can read more about this in the [configuration section of the Azure Functions HTTP trigger documentation on Microsoft docs](https://docs.microsoft.com/azure/azure-functions/functions-bindings-http-webhook-trigger?tabs=python&WT.mc_id=academic-17441-jabenn#configuration). - * Publish the Functions app - follow the instructions in earlier lessons to publish your functions app to the cloud. Once published, the URL will be `http://.azurewebsites.net/api/text-to-timer`, where `` will be the name of your functions app. * Run the functions app locally, and access using the IP address - you can get the IP address of your computer on your local network, and use that to build the URL. Find your IP address: @@ -504,11 +530,13 @@ Rather than calling LUIS from the IoT device, you can use serverless code with a * On macOS, follow the [how to find you IP address on a Mac guide](https://www.hellotech.com/guide/for/how-to-find-ip-address-on-mac) * On linux, follow the section on finding your private IP address in the [how to find your IP address in Linux guide](https://opensource.com/article/18/5/how-find-ip-address-linux) - Once you have your IP address, you will able to access the function at `http://:7071/api/text-to-timer`, where `` will be your IP address, for example `http://192.168.1.10:7071/api/text-to-timer`. + Once you have your IP address, you will able to access the function at `http://:7071/api/text-to-timer`, where `` will be your IP address, for example `http://192.168.1.10:7071/api/text-to-timer`. + + > 💁 Not that this uses port 7071, so after the IP address you will need to have `:7071`. - > 💁 This will only work if your IoT device is on the same network as your computer. + > 💁 This will only work if your IoT device is on the same network as your computer. -1. Test the endpoint by accessing it using your browser. +1. Test the endpoint by accessing it using curl. --- diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/get-voices/__init__.py b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/get-voices/__init__.py new file mode 100644 index 00000000..44c81900 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/get-voices/__init__.py @@ -0,0 +1,26 @@ +import json +import os +import requests + +import azure.functions as func + +def main(req: func.HttpRequest) -> func.HttpResponse: + location = os.environ['SPEECH_LOCATION'] + speech_key = os.environ['SPEECH_KEY'] + + req_body = req.get_json() + language = req_body['language'] + + url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/voices/list' + + headers = { + 'Ocp-Apim-Subscription-Key': speech_key + } + + response = requests.get(url, headers=headers) + voices_json = json.loads(response.text) + + voices = filter(lambda x: x['Locale'].lower() == language.lower(), voices_json) + voices = map(lambda x: x['ShortName'], voices) + + return func.HttpResponse(json.dumps(list(voices)), status_code=200) diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/get-voices/function.json b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/get-voices/function.json new file mode 100644 index 00000000..d9019652 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/get-voices/function.json @@ -0,0 +1,20 @@ +{ + "scriptFile": "__init__.py", + "bindings": [ + { + "authLevel": "function", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "$return" + } + ] +} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/host.json b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/host.json new file mode 100644 index 00000000..291065f8 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/host.json @@ -0,0 +1,15 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + } + } + }, + "extensionBundle": { + "id": "Microsoft.Azure.Functions.ExtensionBundle", + "version": "[2.*, 3.0.0)" + } +} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/local.settings.json b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/local.settings.json new file mode 100644 index 00000000..afc05864 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/local.settings.json @@ -0,0 +1,12 @@ +{ + "IsEncrypted": false, + "Values": { + "FUNCTIONS_WORKER_RUNTIME": "python", + "AzureWebJobsStorage": "", + "LUIS_KEY": "", + "LUIS_ENDPOINT_URL": "", + "LUIS_APP_ID": "", + "SPEECH_KEY": "", + "SPEECH_LOCATION": "" + } +} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/requirements.txt b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/requirements.txt new file mode 100644 index 00000000..a2596be3 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/requirements.txt @@ -0,0 +1,5 @@ +# Do not include azure-functions-worker as it may conflict with the Azure Functions platform + +azure-functions +azure-cognitiveservices-language-luis +librosa \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-speech/__init__.py b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-speech/__init__.py new file mode 100644 index 00000000..f09404f3 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-speech/__init__.py @@ -0,0 +1,52 @@ +import io +import os +import requests + +import librosa +import soundfile as sf +import azure.functions as func + +location = os.environ['SPEECH_LOCATION'] +speech_key = os.environ['SPEECH_KEY'] + +def get_access_token(): + headers = { + 'Ocp-Apim-Subscription-Key': speech_key + } + + token_endpoint = f'https://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken' + response = requests.post(token_endpoint, headers=headers) + return str(response.text) + +playback_format = 'riff-48khz-16bit-mono-pcm' + +def main(req: func.HttpRequest) -> func.HttpResponse: + req_body = req.get_json() + language = req_body['language'] + voice = req_body['voice'] + text = req_body['text'] + + url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/v1' + + headers = { + 'Authorization': 'Bearer ' + get_access_token(), + 'Content-Type': 'application/ssml+xml', + 'X-Microsoft-OutputFormat': playback_format + } + + ssml = f'' + ssml += f'' + ssml += text + ssml += '' + ssml += '' + + response = requests.post(url, headers=headers, data=ssml.encode('utf-8')) + + raw_audio, sample_rate = librosa.load(io.BytesIO(response.content), sr=48000) + resampled = librosa.resample(raw_audio, sample_rate, 44100) + + output_buffer = io.BytesIO() + sf.write(output_buffer, resampled, 44100, 'PCM_16', format='wav') + output_buffer.seek(0) + + return func.HttpResponse(output_buffer.read(), status_code=200) diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-speech/function.json b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-speech/function.json new file mode 100644 index 00000000..d9019652 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-speech/function.json @@ -0,0 +1,20 @@ +{ + "scriptFile": "__init__.py", + "bindings": [ + { + "authLevel": "function", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "$return" + } + ] +} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-timer/__init__.py b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-timer/__init__.py new file mode 100644 index 00000000..d15d6e68 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-timer/__init__.py @@ -0,0 +1,46 @@ +import logging + +import azure.functions as func +import json +import os +from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient +from msrest.authentication import CognitiveServicesCredentials + + +def main(req: func.HttpRequest) -> func.HttpResponse: + luis_key = os.environ['LUIS_KEY'] + endpoint_url = os.environ['LUIS_ENDPOINT_URL'] + app_id = os.environ['LUIS_APP_ID'] + + credentials = CognitiveServicesCredentials(luis_key) + client = LUISRuntimeClient(endpoint=endpoint_url, credentials=credentials) + + req_body = req.get_json() + text = req_body['text'] + logging.info(f'Request - {text}') + prediction_request = { 'query' : text } + + prediction_response = client.prediction.get_slot_prediction(app_id, 'Staging', prediction_request) + + if prediction_response.prediction.top_intent == 'set timer': + numbers = prediction_response.prediction.entities['number'] + time_units = prediction_response.prediction.entities['time unit'] + total_seconds = 0 + + for i in range(0, len(numbers)): + number = numbers[i] + time_unit = time_units[i][0] + + if time_unit == 'minute': + total_seconds += number * 60 + else: + total_seconds += number + + logging.info(f'Timer required for {total_seconds} seconds') + + payload = { + 'seconds': total_seconds + } + return func.HttpResponse(json.dumps(payload), status_code=200) + + return func.HttpResponse(status_code=404) \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-timer/function.json b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-timer/function.json new file mode 100644 index 00000000..d9019652 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/functions/smart-timer-trigger/text-to-timer/function.json @@ -0,0 +1,20 @@ +{ + "scriptFile": "__init__.py", + "bindings": [ + { + "authLevel": "function", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "$return" + } + ] +} \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/include/README b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/include/README new file mode 100644 index 00000000..194dcd43 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/lib/README b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/lib/README new file mode 100644 index 00000000..6debab1e --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/platformio.ini b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/platformio.ini new file mode 100644 index 00000000..8836ab42 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/platformio.ini @@ -0,0 +1,23 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:seeed_wio_terminal] +platform = atmelsam +board = seeed_wio_terminal +framework = arduino +lib_deps = + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 + seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 + seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 + seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 + seeed-studio/Seeed Arduino RTC @ 2.0.0 + bblanchon/ArduinoJson @ 6.17.3 + contrem/arduino-timer @ 2.3.0 diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/config.h b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/config.h new file mode 100644 index 00000000..f2e912c4 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/config.h @@ -0,0 +1,93 @@ +#pragma once + +#define RATE 16000 +#define SAMPLE_LENGTH_SECONDS 4 +#define SAMPLES RATE * SAMPLE_LENGTH_SECONDS +#define BUFFER_SIZE (SAMPLES * 2) + 44 +#define ADC_BUF_LEN 1600 + +const char *SSID = ""; +const char *PASSWORD = ""; + +const char *SPEECH_API_KEY = ""; +const char *SPEECH_LOCATION = ""; +const char *LANGUAGE = ""; + +const char *TOKEN_URL = "https://%s.api.cognitive.microsoft.com/sts/v1.0/issuetoken"; +const char *SPEECH_URL = "https://%s.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=%s"; + +const char *TEXT_TO_TIMER_FUNCTION_URL = "http://:7071/api/text-to-timer"; +const char *GET_VOICES_FUNCTION_URL = "http://:7071/api/get-voices"; +const char *TEXT_TO_SPEECH_FUNCTION_URL = "http://:7071/api/text-to-speech"; + +const char *TOKEN_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQAueRcfuAIek/4tmDg0xQwDANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwNjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBALVGARl56bx3KBUSGuPc4H5uoNFkFH4e7pvTCxRi4j/+z+Xb\r\n" + "wjEz+5CipDOqjx9/jWjskL5dk7PaQkzItidsAAnDCW1leZBOIi68Lff1bjTeZgMY\r\n" + "iwdRd3Y39b/lcGpiuP2d23W95YHkMMT8IlWosYIX0f4kYb62rphyfnAjYb/4Od99\r\n" + "ThnhlAxGtfvSbXcBVIKCYfZgqRvV+5lReUnd1aNjRYVzPOoifgSx2fRyy1+pO1Uz\r\n" + "aMMNnIOE71bVYW0A1hr19w7kOb0KkJXoALTDDj1ukUEDqQuBfBxReL5mXiu1O7WG\r\n" + "0vltg0VZ/SZzctBsdBlx1BkmWYBW261KZgBivrql5ELTKKd8qgtHcLQA5fl6JB0Q\r\n" + "gs5XDaWehN86Gps5JW8ArjGtjcWAIP+X8CQaWfaCnuRm6Bk/03PQWhgdi84qwA0s\r\n" + "sRfFJwHUPTNSnE8EiGVk2frt0u8PG1pwSQsFuNJfcYIHEv1vOzP7uEOuDydsmCjh\r\n" + "lxuoK2n5/2aVR3BMTu+p4+gl8alXoBycyLmj3J/PUgqD8SL5fTCUegGsdia/Sa60\r\n" + "N2oV7vQ17wjMN+LXa2rjj/b4ZlZgXVojDmAjDwIRdDUujQu0RVsJqFLMzSIHpp2C\r\n" + "Zp7mIoLrySay2YYBu7SiNwL95X6He2kS8eefBBHjzwW/9FxGqry57i71c2cDAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQU1cFnOsKjnfR3UltZEjgp5lVou6UwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQB2oWc93fB8esci/8esixj++N22meiGDjgF\r\n" + "+rA2LUK5IOQOgcUSTGKSqF9lYfAxPjrqPjDCUPHCURv+26ad5P/BYtXtbmtxJWu+\r\n" + "cS5BhMDPPeG3oPZwXRHBJFAkY4O4AF7RIAAUW6EzDflUoDHKv83zOiPfYGcpHc9s\r\n" + "kxAInCedk7QSgXvMARjjOqdakor21DTmNIUotxo8kHv5hwRlGhBJwps6fEVi1Bt0\r\n" + "trpM/3wYxlr473WSPUFZPgP1j519kLpWOJ8z09wxay+Br29irPcBYv0GMXlHqThy\r\n" + "8y4m/HyTQeI2IMvMrQnwqPpY+rLIXyviI2vLoI+4xKE4Rn38ZZ8m\r\n" + "-----END CERTIFICATE-----\r\n"; + +const char *SPEECH_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQCq+mxcpjxFFB6jvh98dTFzANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwMTCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBAMedcDrkXufP7pxVm1FHLDNA9IjwHaMoaY8arqqZ4Gff4xyr\r\n" + "RygnavXL7g12MPAx8Q6Dd9hfBzrfWxkF0Br2wIvlvkzW01naNVSkHp+OS3hL3W6n\r\n" + "l/jYvZnVeJXjtsKYcXIf/6WtspcF5awlQ9LZJcjwaH7KoZuK+THpXCMtzD8XNVdm\r\n" + "GW/JI0C/7U/E7evXn9XDio8SYkGSM63aLO5BtLCv092+1d4GGBSQYolRq+7Pd1kR\r\n" + "EkWBPm0ywZ2Vb8GIS5DLrjelEkBnKCyy3B0yQud9dpVsiUeE7F5sY8Me96WVxQcb\r\n" + "OyYdEY/j/9UpDlOG+vA+YgOvBhkKEjiqygVpP8EZoMMijephzg43b5Qi9r5UrvYo\r\n" + "o19oR/8pf4HJNDPF0/FJwFVMW8PmCBLGstin3NE1+NeWTkGt0TzpHjgKyfaDP2tO\r\n" + "4bCk1G7pP2kDFT7SYfc8xbgCkFQ2UCEXsaH/f5YmpLn4YPiNFCeeIida7xnfTvc4\r\n" + "7IxyVccHHq1FzGygOqemrxEETKh8hvDR6eBdrBwmCHVgZrnAqnn93JtGyPLi6+cj\r\n" + "WGVGtMZHwzVvX1HvSFG771sskcEjJxiQNQDQRWHEh3NxvNb7kFlAXnVdRkkvhjpR\r\n" + "GchFhTAzqmwltdWhWDEyCMKC2x/mSZvZtlZGY+g37Y72qHzidwtyW7rBetZJAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQUDyBd16FXlduSzyvQx8J3BM5ygHYwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQAlFvNh7QgXVLAZSsNR2XRmIn9iS8OHFCBA\r\n" + "WxKJoi8YYQafpMTkMqeuzoL3HWb1pYEipsDkhiMnrpfeYZEA7Lz7yqEEtfgHcEBs\r\n" + "K9KcStQGGZRfmWU07hPXHnFz+5gTXqzCE2PBMlRgVUYJiA25mJPXfB00gDvGhtYa\r\n" + "+mENwM9Bq1B9YYLyLjRtUz8cyGsdyTIG/bBM/Q9jcV8JGqMU/UjAdh1pFyTnnHEl\r\n" + "Y59Npi7F87ZqYYJEHJM2LGD+le8VsHjgeWX2CJQko7klXvcizuZvUEDTjHaQcs2J\r\n" + "+kPgfyMIOY1DMJ21NxOJ2xPRC/wAh/hzSBRVtoAnyuxtkZ4VjIOh\r\n" + "-----END CERTIFICATE-----\r\n"; diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/flash_stream.h b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/flash_stream.h new file mode 100644 index 00000000..b841f1d0 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/flash_stream.h @@ -0,0 +1,69 @@ +#pragma once + +#include +#include +#include + +#include "config.h" + +class FlashStream : public Stream +{ +public: + FlashStream() + { + _pos = 0; + _flash_address = 0; + _flash = sfud_get_device_table() + 0; + + populateBuffer(); + } + + virtual size_t write(uint8_t val) + { + return 0; + } + + virtual int available() + { + int remaining = BUFFER_SIZE - ((_flash_address - HTTP_TCP_BUFFER_SIZE) + _pos); + int bytes_available = min(HTTP_TCP_BUFFER_SIZE, remaining); + + if (bytes_available == 0) + { + bytes_available = -1; + } + + return bytes_available; + } + + virtual int read() + { + int retVal = _buffer[_pos++]; + + if (_pos == HTTP_TCP_BUFFER_SIZE) + { + populateBuffer(); + } + + return retVal; + } + + virtual int peek() + { + return _buffer[_pos]; + } + +private: + void populateBuffer() + { + sfud_read(_flash, _flash_address, HTTP_TCP_BUFFER_SIZE, _buffer); + _flash_address += HTTP_TCP_BUFFER_SIZE; + _pos = 0; + } + + size_t _pos; + size_t _flash_address; + const sfud_flash *_flash; + + byte _buffer[HTTP_TCP_BUFFER_SIZE]; +}; diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/flash_writer.h b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/flash_writer.h new file mode 100644 index 00000000..87fdff29 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/flash_writer.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include + +class FlashWriter +{ +public: + void init() + { + _flash = sfud_get_device_table() + 0; + _sfudBufferSize = _flash->chip.erase_gran; + _sfudBuffer = new byte[_sfudBufferSize]; + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void reset() + { + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void writeSfudBuffer(byte b) + { + _sfudBuffer[_sfudBufferPos++] = b; + if (_sfudBufferPos == _sfudBufferSize) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void flushSfudBuffer() + { + if (_sfudBufferPos > 0) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void writeSfudBuffer(byte *b, size_t len) + { + for (size_t i = 0; i < len; ++i) + { + writeSfudBuffer(b[i]); + } + } + +private: + byte *_sfudBuffer; + size_t _sfudBufferSize; + size_t _sfudBufferPos; + size_t _sfudBufferWritePos; + + const sfud_flash *_flash; +}; \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/language_understanding.h b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/language_understanding.h new file mode 100644 index 00000000..1c8d8653 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/language_understanding.h @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include +#include + +#include "config.h" + +class LanguageUnderstanding +{ +public: + int GetTimerDuration(String text) + { + DynamicJsonDocument doc(1024); + doc["text"] = text; + + String body; + serializeJson(doc, body); + + HTTPClient httpClient; + httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + + int seconds = 0; + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + seconds = obj["seconds"].as(); + } + else + { + Serial.print("Failed to understand text - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + + return seconds; + } + +private: + WiFiClient _client; +}; + +LanguageUnderstanding languageUnderstanding; \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/main.cpp b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/main.cpp new file mode 100644 index 00000000..a075f6cb --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/main.cpp @@ -0,0 +1,130 @@ +#include +#include +#include +#include +#include + +#include "config.h" +#include "language_understanding.h" +#include "mic.h" +#include "speech_to_text.h" +#include "text_to_speech.h" + +void connectWiFi() +{ + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); +} + +void setup() +{ + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + + connectWiFi(); + + while (!(sfud_init() == SFUD_SUCCESS)) + ; + + sfud_qspi_fast_read_enable(sfud_get_device(SFUD_W25Q32_DEVICE_INDEX), 2); + + pinMode(WIO_KEY_C, INPUT_PULLUP); + + mic.init(); + + speechToText.init(); + textToSpeech.init(); + + Serial.println("Ready."); +} + +auto timer = timer_create_default(); + +void say(String text) +{ + Serial.println(text); + textToSpeech.convertTextToSpeech(text); +} + +bool timerExpired(void *announcement) +{ + say((char *)announcement); + return false; +} + +void processAudio() +{ + String text = speechToText.convertSpeechToText(); + Serial.println(text); + + int total_seconds = languageUnderstanding.GetTimerDuration(text); + if (total_seconds == 0) + { + return; + } + + int minutes = total_seconds / 60; + int seconds = total_seconds % 60; + + String begin_message; + if (minutes > 0) + { + begin_message += minutes; + begin_message += " minute "; + } + if (seconds > 0) + { + begin_message += seconds; + begin_message += " second "; + } + + begin_message += "timer started."; + + String end_message("Times up on your "); + if (minutes > 0) + { + end_message += minutes; + end_message += " minute "; + } + if (seconds > 0) + { + end_message += seconds; + end_message += " second "; + } + + end_message += "timer."; + + say(begin_message); + + timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str())); +} + +void loop() +{ + if (digitalRead(WIO_KEY_C) == LOW && !mic.isRecording()) + { + Serial.println("Starting recording..."); + mic.startRecording(); + } + + if (!mic.isRecording() && mic.isRecordingReady()) + { + Serial.println("Finished recording"); + + processAudio(); + + mic.reset(); + } + + timer.tick(); +} diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/mic.h b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/mic.h new file mode 100644 index 00000000..5f0815de --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/mic.h @@ -0,0 +1,242 @@ +#pragma once + +#include + +#include "config.h" +#include "flash_writer.h" + +class Mic +{ +public: + Mic() + { + _isRecording = false; + _isRecordingReady = false; + } + + void startRecording() + { + _isRecording = true; + _isRecordingReady = false; + } + + bool isRecording() + { + return _isRecording; + } + + bool isRecordingReady() + { + return _isRecordingReady; + } + + void init() + { + analogReference(AR_INTERNAL2V23); + + _writer.init(); + + initBufferHeader(); + configureDmaAdc(); + } + + void reset() + { + _isRecordingReady = false; + _isRecording = false; + + _writer.reset(); + + initBufferHeader(); + } + + void dmaHandler() + { + static uint8_t count = 0; + + if (DMAC->Channel[1].CHINTFLAG.bit.SUSP) + { + DMAC->Channel[1].CHCTRLB.reg = DMAC_CHCTRLB_CMD_RESUME; + DMAC->Channel[1].CHINTFLAG.bit.SUSP = 1; + + if (count) + { + audioCallback(_adc_buf_0, ADC_BUF_LEN); + } + else + { + audioCallback(_adc_buf_1, ADC_BUF_LEN); + } + + count = (count + 1) % 2; + } + } + +private: + volatile bool _isRecording; + volatile bool _isRecordingReady; + FlashWriter _writer; + +typedef struct + { + uint16_t btctrl; + uint16_t btcnt; + uint32_t srcaddr; + uint32_t dstaddr; + uint32_t descaddr; + } dmacdescriptor; + + // Globals - DMA and ADC + volatile dmacdescriptor _wrb[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor_section[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor __attribute__((aligned(16))); + + void configureDmaAdc() + { + // Configure DMA to sample from ADC at a regular interval (triggered by timer/counter) + DMAC->BASEADDR.reg = (uint32_t)_descriptor_section; // Specify the location of the descriptors + DMAC->WRBADDR.reg = (uint32_t)_wrb; // Specify the location of the write back descriptors + DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf); // Enable the DMAC peripheral + DMAC->Channel[1].CHCTRLA.reg = DMAC_CHCTRLA_TRIGSRC(TC5_DMAC_ID_OVF) | // Set DMAC to trigger on TC5 timer overflow + DMAC_CHCTRLA_TRIGACT_BURST; // DMAC burst transfer + + _descriptor.descaddr = (uint32_t)&_descriptor_section[1]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_0 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_0 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[0], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + _descriptor.descaddr = (uint32_t)&_descriptor_section[0]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_1 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_1 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[1], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + // Configure NVIC + NVIC_SetPriority(DMAC_1_IRQn, 0); // Set the Nested Vector Interrupt Controller (NVIC) priority for DMAC1 to 0 (highest) + NVIC_EnableIRQ(DMAC_1_IRQn); // Connect DMAC1 to Nested Vector Interrupt Controller (NVIC) + + // Activate the suspend (SUSP) interrupt on DMAC channel 1 + DMAC->Channel[1].CHINTENSET.reg = DMAC_CHINTENSET_SUSP; + + // Configure ADC + ADC1->INPUTCTRL.bit.MUXPOS = ADC_INPUTCTRL_MUXPOS_AIN12_Val; // Set the analog input to ADC0/AIN2 (PB08 - A4 on Metro M4) + while (ADC1->SYNCBUSY.bit.INPUTCTRL) + ; // Wait for synchronization + ADC1->SAMPCTRL.bit.SAMPLEN = 0x00; // Set max Sampling Time Length to half divided ADC clock pulse (2.66us) + while (ADC1->SYNCBUSY.bit.SAMPCTRL) + ; // Wait for synchronization + ADC1->CTRLA.reg = ADC_CTRLA_PRESCALER_DIV128; // Divide Clock ADC GCLK by 128 (48MHz/128 = 375kHz) + ADC1->CTRLB.reg = ADC_CTRLB_RESSEL_12BIT | // Set ADC resolution to 12 bits + ADC_CTRLB_FREERUN; // Set ADC to free run mode + while (ADC1->SYNCBUSY.bit.CTRLB) + ; // Wait for synchronization + ADC1->CTRLA.bit.ENABLE = 1; // Enable the ADC + while (ADC1->SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + ADC1->SWTRIG.bit.START = 1; // Initiate a software trigger to start an ADC conversion + while (ADC1->SYNCBUSY.bit.SWTRIG) + ; // Wait for synchronization + + // Enable DMA channel 1 + DMAC->Channel[1].CHCTRLA.bit.ENABLE = 1; + + // Configure Timer/Counter 5 + GCLK->PCHCTRL[TC5_GCLK_ID].reg = GCLK_PCHCTRL_CHEN | // Enable perhipheral channel for TC5 + GCLK_PCHCTRL_GEN_GCLK1; // Connect generic clock 0 at 48MHz + + TC5->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; // Set TC5 to Match Frequency (MFRQ) mode + TC5->COUNT16.CC[0].reg = 3000 - 1; // Set the trigger to 16 kHz: (4Mhz / 16000) - 1 + while (TC5->COUNT16.SYNCBUSY.bit.CC0) + ; // Wait for synchronization + + // Start Timer/Counter 5 + TC5->COUNT16.CTRLA.bit.ENABLE = 1; // Enable the TC5 timer + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + } + + uint16_t _adc_buf_0[ADC_BUF_LEN]; + uint16_t _adc_buf_1[ADC_BUF_LEN]; + + // WAV files have a header. This struct defines that header + struct wavFileHeader + { + char riff[4]; /* "RIFF" */ + long flength; /* file length in bytes */ + char wave[4]; /* "WAVE" */ + char fmt[4]; /* "fmt " */ + long chunk_size; /* size of FMT chunk in bytes (usually 16) */ + short format_tag; /* 1=PCM, 257=Mu-Law, 258=A-Law, 259=ADPCM */ + short num_chans; /* 1=mono, 2=stereo */ + long srate; /* Sampling rate in samples per second */ + long bytes_per_sec; /* bytes per second = srate*bytes_per_samp */ + short bytes_per_samp; /* 2=16-bit mono, 4=16-bit stereo */ + short bits_per_samp; /* Number of bits per sample */ + char data[4]; /* "data" */ + long dlength; /* data length in bytes (filelength - 44) */ + }; + + void initBufferHeader() + { + wavFileHeader wavh; + + strncpy(wavh.riff, "RIFF", 4); + strncpy(wavh.wave, "WAVE", 4); + strncpy(wavh.fmt, "fmt ", 4); + strncpy(wavh.data, "data", 4); + + wavh.chunk_size = 16; + wavh.format_tag = 1; // PCM + wavh.num_chans = 1; // mono + wavh.srate = RATE; + wavh.bytes_per_sec = (RATE * 1 * 16 * 1) / 8; + wavh.bytes_per_samp = 2; + wavh.bits_per_samp = 16; + wavh.dlength = RATE * 2 * 1 * 16 / 2; + wavh.flength = wavh.dlength + 44; + + _writer.writeSfudBuffer((byte *)&wavh, 44); + } + + void audioCallback(uint16_t *buf, uint32_t buf_len) + { + static uint32_t idx = 44; + + if (_isRecording) + { + for (uint32_t i = 0; i < buf_len; i++) + { + int16_t audio_value = ((int16_t)buf[i] - 2048) * 16; + + _writer.writeSfudBuffer(audio_value & 0xFF); + _writer.writeSfudBuffer((audio_value >> 8) & 0xFF); + } + + idx += buf_len; + + if (idx >= BUFFER_SIZE) + { + _writer.flushSfudBuffer(); + idx = 44; + _isRecording = false; + _isRecordingReady = true; + } + } + } +}; + +Mic mic; + +void DMAC_1_Handler() +{ + mic.dmaHandler(); +} diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/speech_to_text.h b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/speech_to_text.h new file mode 100644 index 00000000..a7ce075f --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/speech_to_text.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include +#include +#include + +#include "config.h" +#include "flash_stream.h" + +class SpeechToText +{ +public: + void init() + { + _token_client.setCACert(TOKEN_CERTIFICATE); + _speech_client.setCACert(SPEECH_CERTIFICATE); + _access_token = getAccessToken(); + } + + String convertSpeechToText() + { + char url[128]; + sprintf(url, SPEECH_URL, SPEECH_LOCATION, LANGUAGE); + + HTTPClient httpClient; + httpClient.begin(_speech_client, url); + + httpClient.addHeader("Authorization", String("Bearer ") + _access_token); + httpClient.addHeader("Content-Type", String("audio/wav; codecs=audio/pcm; samplerate=") + String(RATE)); + httpClient.addHeader("Accept", "application/json;text/xml"); + + Serial.println("Sending speech..."); + + FlashStream stream; + int httpResponseCode = httpClient.sendRequest("POST", &stream, BUFFER_SIZE); + + Serial.println("Speech sent!"); + + String text = ""; + + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + text = obj["DisplayText"].as(); + } + else if (httpResponseCode == 401) + { + Serial.println("Access token expired, trying again with a new token"); + _access_token = getAccessToken(); + return convertSpeechToText(); + } + else + { + Serial.print("Failed to convert text to speech - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + + return text; + } + +private: + String getAccessToken() + { + char url[128]; + sprintf(url, TOKEN_URL, SPEECH_LOCATION); + + HTTPClient httpClient; + httpClient.begin(_token_client, url); + + httpClient.addHeader("Ocp-Apim-Subscription-Key", SPEECH_API_KEY); + int httpResultCode = httpClient.POST("{}"); + + if (httpResultCode != 200) + { + Serial.println("Error getting access token, trying again..."); + delay(10000); + return getAccessToken(); + } + + Serial.println("Got access token."); + String result = httpClient.getString(); + + httpClient.end(); + + return result; + } + + WiFiClientSecure _token_client; + WiFiClientSecure _speech_client; + String _access_token; +}; + +SpeechToText speechToText; diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/text_to_speech.h b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/text_to_speech.h new file mode 100644 index 00000000..d7174fcd --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/src/text_to_speech.h @@ -0,0 +1,86 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" + +class TextToSpeech +{ +public: + void init() + { + DynamicJsonDocument doc(1024); + doc["language"] = LANGUAGE; + + String body; + serializeJson(doc, body); + + HTTPClient httpClient; + httpClient.begin(_client, GET_VOICES_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonArray obj = doc.as(); + _voice = obj[0].as(); + + Serial.print("Using voice "); + Serial.println(_voice); + } + else + { + Serial.print("Failed to get voices - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + } + + void convertTextToSpeech(String text) + { + DynamicJsonDocument doc(1024); + doc["language"] = LANGUAGE; + doc["voice"] = _voice; + doc["text"] = text; + + String body; + serializeJson(doc, body); + + HTTPClient httpClient; + httpClient.begin(_client, TEXT_TO_SPEECH_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + + if (httpResponseCode == 200) + { + File wav_file = SD.open("SPEECH.WAV", FILE_WRITE); + httpClient.writeToStream(&wav_file); + wav_file.close(); + } + else + { + Serial.print("Failed to get speech - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + } +private: + WiFiClient _client; + String _voice; +}; + +TextToSpeech textToSpeech; \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/test/README b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/test/README new file mode 100644 index 00000000..b94d0890 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-spoken-response/wio-terminal/smart-timer/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/include/README b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/include/README new file mode 100644 index 00000000..194dcd43 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/lib/README b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/lib/README new file mode 100644 index 00000000..6debab1e --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/platformio.ini b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/platformio.ini new file mode 100644 index 00000000..8836ab42 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/platformio.ini @@ -0,0 +1,23 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:seeed_wio_terminal] +platform = atmelsam +board = seeed_wio_terminal +framework = arduino +lib_deps = + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 + seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 + seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 + seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 + seeed-studio/Seeed Arduino RTC @ 2.0.0 + bblanchon/ArduinoJson @ 6.17.3 + contrem/arduino-timer @ 2.3.0 diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/config.h b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/config.h new file mode 100644 index 00000000..4c06dc6a --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/config.h @@ -0,0 +1,91 @@ +#pragma once + +#define RATE 16000 +#define SAMPLE_LENGTH_SECONDS 4 +#define SAMPLES RATE * SAMPLE_LENGTH_SECONDS +#define BUFFER_SIZE (SAMPLES * 2) + 44 +#define ADC_BUF_LEN 1600 + +const char *SSID = ""; +const char *PASSWORD = ""; + +const char *SPEECH_API_KEY = ""; +const char *SPEECH_LOCATION = ""; +const char *LANGUAGE = ""; + +const char *TOKEN_URL = "https://%s.api.cognitive.microsoft.com/sts/v1.0/issuetoken"; +const char *SPEECH_URL = "https://%s.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=%s"; + +const char *TEXT_TO_TIMER_FUNCTION_URL = "http://:7071/api/text-to-timer"; + +const char *TOKEN_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQAueRcfuAIek/4tmDg0xQwDANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwNjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBALVGARl56bx3KBUSGuPc4H5uoNFkFH4e7pvTCxRi4j/+z+Xb\r\n" + "wjEz+5CipDOqjx9/jWjskL5dk7PaQkzItidsAAnDCW1leZBOIi68Lff1bjTeZgMY\r\n" + "iwdRd3Y39b/lcGpiuP2d23W95YHkMMT8IlWosYIX0f4kYb62rphyfnAjYb/4Od99\r\n" + "ThnhlAxGtfvSbXcBVIKCYfZgqRvV+5lReUnd1aNjRYVzPOoifgSx2fRyy1+pO1Uz\r\n" + "aMMNnIOE71bVYW0A1hr19w7kOb0KkJXoALTDDj1ukUEDqQuBfBxReL5mXiu1O7WG\r\n" + "0vltg0VZ/SZzctBsdBlx1BkmWYBW261KZgBivrql5ELTKKd8qgtHcLQA5fl6JB0Q\r\n" + "gs5XDaWehN86Gps5JW8ArjGtjcWAIP+X8CQaWfaCnuRm6Bk/03PQWhgdi84qwA0s\r\n" + "sRfFJwHUPTNSnE8EiGVk2frt0u8PG1pwSQsFuNJfcYIHEv1vOzP7uEOuDydsmCjh\r\n" + "lxuoK2n5/2aVR3BMTu+p4+gl8alXoBycyLmj3J/PUgqD8SL5fTCUegGsdia/Sa60\r\n" + "N2oV7vQ17wjMN+LXa2rjj/b4ZlZgXVojDmAjDwIRdDUujQu0RVsJqFLMzSIHpp2C\r\n" + "Zp7mIoLrySay2YYBu7SiNwL95X6He2kS8eefBBHjzwW/9FxGqry57i71c2cDAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQU1cFnOsKjnfR3UltZEjgp5lVou6UwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQB2oWc93fB8esci/8esixj++N22meiGDjgF\r\n" + "+rA2LUK5IOQOgcUSTGKSqF9lYfAxPjrqPjDCUPHCURv+26ad5P/BYtXtbmtxJWu+\r\n" + "cS5BhMDPPeG3oPZwXRHBJFAkY4O4AF7RIAAUW6EzDflUoDHKv83zOiPfYGcpHc9s\r\n" + "kxAInCedk7QSgXvMARjjOqdakor21DTmNIUotxo8kHv5hwRlGhBJwps6fEVi1Bt0\r\n" + "trpM/3wYxlr473WSPUFZPgP1j519kLpWOJ8z09wxay+Br29irPcBYv0GMXlHqThy\r\n" + "8y4m/HyTQeI2IMvMrQnwqPpY+rLIXyviI2vLoI+4xKE4Rn38ZZ8m\r\n" + "-----END CERTIFICATE-----\r\n"; + +const char *SPEECH_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQCq+mxcpjxFFB6jvh98dTFzANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwMTCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBAMedcDrkXufP7pxVm1FHLDNA9IjwHaMoaY8arqqZ4Gff4xyr\r\n" + "RygnavXL7g12MPAx8Q6Dd9hfBzrfWxkF0Br2wIvlvkzW01naNVSkHp+OS3hL3W6n\r\n" + "l/jYvZnVeJXjtsKYcXIf/6WtspcF5awlQ9LZJcjwaH7KoZuK+THpXCMtzD8XNVdm\r\n" + "GW/JI0C/7U/E7evXn9XDio8SYkGSM63aLO5BtLCv092+1d4GGBSQYolRq+7Pd1kR\r\n" + "EkWBPm0ywZ2Vb8GIS5DLrjelEkBnKCyy3B0yQud9dpVsiUeE7F5sY8Me96WVxQcb\r\n" + "OyYdEY/j/9UpDlOG+vA+YgOvBhkKEjiqygVpP8EZoMMijephzg43b5Qi9r5UrvYo\r\n" + "o19oR/8pf4HJNDPF0/FJwFVMW8PmCBLGstin3NE1+NeWTkGt0TzpHjgKyfaDP2tO\r\n" + "4bCk1G7pP2kDFT7SYfc8xbgCkFQ2UCEXsaH/f5YmpLn4YPiNFCeeIida7xnfTvc4\r\n" + "7IxyVccHHq1FzGygOqemrxEETKh8hvDR6eBdrBwmCHVgZrnAqnn93JtGyPLi6+cj\r\n" + "WGVGtMZHwzVvX1HvSFG771sskcEjJxiQNQDQRWHEh3NxvNb7kFlAXnVdRkkvhjpR\r\n" + "GchFhTAzqmwltdWhWDEyCMKC2x/mSZvZtlZGY+g37Y72qHzidwtyW7rBetZJAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQUDyBd16FXlduSzyvQx8J3BM5ygHYwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQAlFvNh7QgXVLAZSsNR2XRmIn9iS8OHFCBA\r\n" + "WxKJoi8YYQafpMTkMqeuzoL3HWb1pYEipsDkhiMnrpfeYZEA7Lz7yqEEtfgHcEBs\r\n" + "K9KcStQGGZRfmWU07hPXHnFz+5gTXqzCE2PBMlRgVUYJiA25mJPXfB00gDvGhtYa\r\n" + "+mENwM9Bq1B9YYLyLjRtUz8cyGsdyTIG/bBM/Q9jcV8JGqMU/UjAdh1pFyTnnHEl\r\n" + "Y59Npi7F87ZqYYJEHJM2LGD+le8VsHjgeWX2CJQko7klXvcizuZvUEDTjHaQcs2J\r\n" + "+kPgfyMIOY1DMJ21NxOJ2xPRC/wAh/hzSBRVtoAnyuxtkZ4VjIOh\r\n" + "-----END CERTIFICATE-----\r\n"; diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/flash_stream.h b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/flash_stream.h new file mode 100644 index 00000000..b841f1d0 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/flash_stream.h @@ -0,0 +1,69 @@ +#pragma once + +#include +#include +#include + +#include "config.h" + +class FlashStream : public Stream +{ +public: + FlashStream() + { + _pos = 0; + _flash_address = 0; + _flash = sfud_get_device_table() + 0; + + populateBuffer(); + } + + virtual size_t write(uint8_t val) + { + return 0; + } + + virtual int available() + { + int remaining = BUFFER_SIZE - ((_flash_address - HTTP_TCP_BUFFER_SIZE) + _pos); + int bytes_available = min(HTTP_TCP_BUFFER_SIZE, remaining); + + if (bytes_available == 0) + { + bytes_available = -1; + } + + return bytes_available; + } + + virtual int read() + { + int retVal = _buffer[_pos++]; + + if (_pos == HTTP_TCP_BUFFER_SIZE) + { + populateBuffer(); + } + + return retVal; + } + + virtual int peek() + { + return _buffer[_pos]; + } + +private: + void populateBuffer() + { + sfud_read(_flash, _flash_address, HTTP_TCP_BUFFER_SIZE, _buffer); + _flash_address += HTTP_TCP_BUFFER_SIZE; + _pos = 0; + } + + size_t _pos; + size_t _flash_address; + const sfud_flash *_flash; + + byte _buffer[HTTP_TCP_BUFFER_SIZE]; +}; diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/flash_writer.h b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/flash_writer.h new file mode 100644 index 00000000..87fdff29 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/flash_writer.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include + +class FlashWriter +{ +public: + void init() + { + _flash = sfud_get_device_table() + 0; + _sfudBufferSize = _flash->chip.erase_gran; + _sfudBuffer = new byte[_sfudBufferSize]; + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void reset() + { + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void writeSfudBuffer(byte b) + { + _sfudBuffer[_sfudBufferPos++] = b; + if (_sfudBufferPos == _sfudBufferSize) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void flushSfudBuffer() + { + if (_sfudBufferPos > 0) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void writeSfudBuffer(byte *b, size_t len) + { + for (size_t i = 0; i < len; ++i) + { + writeSfudBuffer(b[i]); + } + } + +private: + byte *_sfudBuffer; + size_t _sfudBufferSize; + size_t _sfudBufferPos; + size_t _sfudBufferWritePos; + + const sfud_flash *_flash; +}; \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/language_understanding.h b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/language_understanding.h new file mode 100644 index 00000000..1c8d8653 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/language_understanding.h @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include +#include + +#include "config.h" + +class LanguageUnderstanding +{ +public: + int GetTimerDuration(String text) + { + DynamicJsonDocument doc(1024); + doc["text"] = text; + + String body; + serializeJson(doc, body); + + HTTPClient httpClient; + httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + + int seconds = 0; + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + seconds = obj["seconds"].as(); + } + else + { + Serial.print("Failed to understand text - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + + return seconds; + } + +private: + WiFiClient _client; +}; + +LanguageUnderstanding languageUnderstanding; \ No newline at end of file diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/main.cpp b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/main.cpp new file mode 100644 index 00000000..1f538015 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/main.cpp @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include + +#include "config.h" +#include "language_understanding.h" +#include "mic.h" +#include "speech_to_text.h" + +void connectWiFi() +{ + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); +} + +void setup() +{ + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + + connectWiFi(); + + while (!(sfud_init() == SFUD_SUCCESS)) + ; + + sfud_qspi_fast_read_enable(sfud_get_device(SFUD_W25Q32_DEVICE_INDEX), 2); + + pinMode(WIO_KEY_C, INPUT_PULLUP); + + mic.init(); + + speechToText.init(); + + Serial.println("Ready."); +} + +auto timer = timer_create_default(); + +void say(String text) +{ + Serial.println(text); +} + +bool timerExpired(void *announcement) +{ + say((char *)announcement); + return false; +} + +void processAudio() +{ + String text = speechToText.convertSpeechToText(); + Serial.println(text); + + int total_seconds = languageUnderstanding.GetTimerDuration(text); + if (total_seconds == 0) + { + return; + } + + int minutes = total_seconds / 60; + int seconds = total_seconds % 60; + + String begin_message; + if (minutes > 0) + { + begin_message += minutes; + begin_message += " minute "; + } + if (seconds > 0) + { + begin_message += seconds; + begin_message += " second "; + } + + begin_message += "timer started."; + + String end_message("Times up on your "); + if (minutes > 0) + { + end_message += minutes; + end_message += " minute "; + } + if (seconds > 0) + { + end_message += seconds; + end_message += " second "; + } + + end_message += "timer."; + + say(begin_message); + + timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str())); +} + +void loop() +{ + if (digitalRead(WIO_KEY_C) == LOW && !mic.isRecording()) + { + Serial.println("Starting recording..."); + mic.startRecording(); + } + + if (!mic.isRecording() && mic.isRecordingReady()) + { + Serial.println("Finished recording"); + + processAudio(); + + mic.reset(); + } + + timer.tick(); +} diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/mic.h b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/mic.h new file mode 100644 index 00000000..5f0815de --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/mic.h @@ -0,0 +1,242 @@ +#pragma once + +#include + +#include "config.h" +#include "flash_writer.h" + +class Mic +{ +public: + Mic() + { + _isRecording = false; + _isRecordingReady = false; + } + + void startRecording() + { + _isRecording = true; + _isRecordingReady = false; + } + + bool isRecording() + { + return _isRecording; + } + + bool isRecordingReady() + { + return _isRecordingReady; + } + + void init() + { + analogReference(AR_INTERNAL2V23); + + _writer.init(); + + initBufferHeader(); + configureDmaAdc(); + } + + void reset() + { + _isRecordingReady = false; + _isRecording = false; + + _writer.reset(); + + initBufferHeader(); + } + + void dmaHandler() + { + static uint8_t count = 0; + + if (DMAC->Channel[1].CHINTFLAG.bit.SUSP) + { + DMAC->Channel[1].CHCTRLB.reg = DMAC_CHCTRLB_CMD_RESUME; + DMAC->Channel[1].CHINTFLAG.bit.SUSP = 1; + + if (count) + { + audioCallback(_adc_buf_0, ADC_BUF_LEN); + } + else + { + audioCallback(_adc_buf_1, ADC_BUF_LEN); + } + + count = (count + 1) % 2; + } + } + +private: + volatile bool _isRecording; + volatile bool _isRecordingReady; + FlashWriter _writer; + +typedef struct + { + uint16_t btctrl; + uint16_t btcnt; + uint32_t srcaddr; + uint32_t dstaddr; + uint32_t descaddr; + } dmacdescriptor; + + // Globals - DMA and ADC + volatile dmacdescriptor _wrb[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor_section[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor __attribute__((aligned(16))); + + void configureDmaAdc() + { + // Configure DMA to sample from ADC at a regular interval (triggered by timer/counter) + DMAC->BASEADDR.reg = (uint32_t)_descriptor_section; // Specify the location of the descriptors + DMAC->WRBADDR.reg = (uint32_t)_wrb; // Specify the location of the write back descriptors + DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf); // Enable the DMAC peripheral + DMAC->Channel[1].CHCTRLA.reg = DMAC_CHCTRLA_TRIGSRC(TC5_DMAC_ID_OVF) | // Set DMAC to trigger on TC5 timer overflow + DMAC_CHCTRLA_TRIGACT_BURST; // DMAC burst transfer + + _descriptor.descaddr = (uint32_t)&_descriptor_section[1]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_0 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_0 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[0], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + _descriptor.descaddr = (uint32_t)&_descriptor_section[0]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_1 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_1 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[1], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + // Configure NVIC + NVIC_SetPriority(DMAC_1_IRQn, 0); // Set the Nested Vector Interrupt Controller (NVIC) priority for DMAC1 to 0 (highest) + NVIC_EnableIRQ(DMAC_1_IRQn); // Connect DMAC1 to Nested Vector Interrupt Controller (NVIC) + + // Activate the suspend (SUSP) interrupt on DMAC channel 1 + DMAC->Channel[1].CHINTENSET.reg = DMAC_CHINTENSET_SUSP; + + // Configure ADC + ADC1->INPUTCTRL.bit.MUXPOS = ADC_INPUTCTRL_MUXPOS_AIN12_Val; // Set the analog input to ADC0/AIN2 (PB08 - A4 on Metro M4) + while (ADC1->SYNCBUSY.bit.INPUTCTRL) + ; // Wait for synchronization + ADC1->SAMPCTRL.bit.SAMPLEN = 0x00; // Set max Sampling Time Length to half divided ADC clock pulse (2.66us) + while (ADC1->SYNCBUSY.bit.SAMPCTRL) + ; // Wait for synchronization + ADC1->CTRLA.reg = ADC_CTRLA_PRESCALER_DIV128; // Divide Clock ADC GCLK by 128 (48MHz/128 = 375kHz) + ADC1->CTRLB.reg = ADC_CTRLB_RESSEL_12BIT | // Set ADC resolution to 12 bits + ADC_CTRLB_FREERUN; // Set ADC to free run mode + while (ADC1->SYNCBUSY.bit.CTRLB) + ; // Wait for synchronization + ADC1->CTRLA.bit.ENABLE = 1; // Enable the ADC + while (ADC1->SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + ADC1->SWTRIG.bit.START = 1; // Initiate a software trigger to start an ADC conversion + while (ADC1->SYNCBUSY.bit.SWTRIG) + ; // Wait for synchronization + + // Enable DMA channel 1 + DMAC->Channel[1].CHCTRLA.bit.ENABLE = 1; + + // Configure Timer/Counter 5 + GCLK->PCHCTRL[TC5_GCLK_ID].reg = GCLK_PCHCTRL_CHEN | // Enable perhipheral channel for TC5 + GCLK_PCHCTRL_GEN_GCLK1; // Connect generic clock 0 at 48MHz + + TC5->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; // Set TC5 to Match Frequency (MFRQ) mode + TC5->COUNT16.CC[0].reg = 3000 - 1; // Set the trigger to 16 kHz: (4Mhz / 16000) - 1 + while (TC5->COUNT16.SYNCBUSY.bit.CC0) + ; // Wait for synchronization + + // Start Timer/Counter 5 + TC5->COUNT16.CTRLA.bit.ENABLE = 1; // Enable the TC5 timer + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + } + + uint16_t _adc_buf_0[ADC_BUF_LEN]; + uint16_t _adc_buf_1[ADC_BUF_LEN]; + + // WAV files have a header. This struct defines that header + struct wavFileHeader + { + char riff[4]; /* "RIFF" */ + long flength; /* file length in bytes */ + char wave[4]; /* "WAVE" */ + char fmt[4]; /* "fmt " */ + long chunk_size; /* size of FMT chunk in bytes (usually 16) */ + short format_tag; /* 1=PCM, 257=Mu-Law, 258=A-Law, 259=ADPCM */ + short num_chans; /* 1=mono, 2=stereo */ + long srate; /* Sampling rate in samples per second */ + long bytes_per_sec; /* bytes per second = srate*bytes_per_samp */ + short bytes_per_samp; /* 2=16-bit mono, 4=16-bit stereo */ + short bits_per_samp; /* Number of bits per sample */ + char data[4]; /* "data" */ + long dlength; /* data length in bytes (filelength - 44) */ + }; + + void initBufferHeader() + { + wavFileHeader wavh; + + strncpy(wavh.riff, "RIFF", 4); + strncpy(wavh.wave, "WAVE", 4); + strncpy(wavh.fmt, "fmt ", 4); + strncpy(wavh.data, "data", 4); + + wavh.chunk_size = 16; + wavh.format_tag = 1; // PCM + wavh.num_chans = 1; // mono + wavh.srate = RATE; + wavh.bytes_per_sec = (RATE * 1 * 16 * 1) / 8; + wavh.bytes_per_samp = 2; + wavh.bits_per_samp = 16; + wavh.dlength = RATE * 2 * 1 * 16 / 2; + wavh.flength = wavh.dlength + 44; + + _writer.writeSfudBuffer((byte *)&wavh, 44); + } + + void audioCallback(uint16_t *buf, uint32_t buf_len) + { + static uint32_t idx = 44; + + if (_isRecording) + { + for (uint32_t i = 0; i < buf_len; i++) + { + int16_t audio_value = ((int16_t)buf[i] - 2048) * 16; + + _writer.writeSfudBuffer(audio_value & 0xFF); + _writer.writeSfudBuffer((audio_value >> 8) & 0xFF); + } + + idx += buf_len; + + if (idx >= BUFFER_SIZE) + { + _writer.flushSfudBuffer(); + idx = 44; + _isRecording = false; + _isRecordingReady = true; + } + } + } +}; + +Mic mic; + +void DMAC_1_Handler() +{ + mic.dmaHandler(); +} diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/speech_to_text.h b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/speech_to_text.h new file mode 100644 index 00000000..a7ce075f --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/src/speech_to_text.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include +#include +#include + +#include "config.h" +#include "flash_stream.h" + +class SpeechToText +{ +public: + void init() + { + _token_client.setCACert(TOKEN_CERTIFICATE); + _speech_client.setCACert(SPEECH_CERTIFICATE); + _access_token = getAccessToken(); + } + + String convertSpeechToText() + { + char url[128]; + sprintf(url, SPEECH_URL, SPEECH_LOCATION, LANGUAGE); + + HTTPClient httpClient; + httpClient.begin(_speech_client, url); + + httpClient.addHeader("Authorization", String("Bearer ") + _access_token); + httpClient.addHeader("Content-Type", String("audio/wav; codecs=audio/pcm; samplerate=") + String(RATE)); + httpClient.addHeader("Accept", "application/json;text/xml"); + + Serial.println("Sending speech..."); + + FlashStream stream; + int httpResponseCode = httpClient.sendRequest("POST", &stream, BUFFER_SIZE); + + Serial.println("Speech sent!"); + + String text = ""; + + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + text = obj["DisplayText"].as(); + } + else if (httpResponseCode == 401) + { + Serial.println("Access token expired, trying again with a new token"); + _access_token = getAccessToken(); + return convertSpeechToText(); + } + else + { + Serial.print("Failed to convert text to speech - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + + return text; + } + +private: + String getAccessToken() + { + char url[128]; + sprintf(url, TOKEN_URL, SPEECH_LOCATION); + + HTTPClient httpClient; + httpClient.begin(_token_client, url); + + httpClient.addHeader("Ocp-Apim-Subscription-Key", SPEECH_API_KEY); + int httpResultCode = httpClient.POST("{}"); + + if (httpResultCode != 200) + { + Serial.println("Error getting access token, trying again..."); + delay(10000); + return getAccessToken(); + } + + Serial.println("Got access token."); + String result = httpClient.getString(); + + httpClient.end(); + + return result; + } + + WiFiClientSecure _token_client; + WiFiClientSecure _speech_client; + String _access_token; +}; + +SpeechToText speechToText; diff --git a/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/test/README b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/test/README new file mode 100644 index 00000000..b94d0890 --- /dev/null +++ b/6-consumer/lessons/3-spoken-feedback/code-timer/wio-terminal/smart-timer/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md b/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md index b2b87597..828fde95 100644 --- a/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md +++ b/6-consumer/lessons/3-spoken-feedback/single-board-computer-set-timer.md @@ -1,6 +1,6 @@ # Set a timer - Virtual IoT Hardware and Raspberry Pi -In this part of the lesson, you will set a timer on your virtual IoT device or Raspberry Pi based off a command from the IoT Hub. +In this part of the lesson, you will call your serverless code to understand the speech, and set a timer n your virtual IoT device or Raspberry Pi based off the results. ## Set a timer diff --git a/6-consumer/lessons/3-spoken-feedback/wio-terminal-set-timer.md b/6-consumer/lessons/3-spoken-feedback/wio-terminal-set-timer.md index 2e8910e5..3480a4fd 100644 --- a/6-consumer/lessons/3-spoken-feedback/wio-terminal-set-timer.md +++ b/6-consumer/lessons/3-spoken-feedback/wio-terminal-set-timer.md @@ -1,3 +1,287 @@ # Set a timer - Wio Terminal -Coming soon +In this part of the lesson, you will call your serverless code to understand the speech, and set a timer on your Wio Terminal based off the results. + +## Set a timer + +The text that comes back from the speech to text call needs to be sent to your serverless code to be processed by LUIS, getting back the number of seconds for the timer. This number of seconds can be used to set a timer. + +Microcontrollers don't natively have support for multiple threads in Arduino, so there are no standard timer classes like you might find when coding in Python or other higher-level languages. Instead you can use timer libraries that work by measuring elapsed time in the `loop` function, and calling functions when the time is up. + +### Task - send the text to the serverless function + +1. Open the `smart-timer` project in VS Code if it is not already open. + +1. Open the `config.h` header file and add the URL for your function app: + + ```cpp + const char *TEXT_TO_TIMER_FUNCTION_URL = ""; + ``` + + Replace `` with the URL for your function app that you obtained in the last step of the last lesson, pointing to the IP address of your local machine that is running the function app. + +1. Create a new file in the `src` folder called `language_understanding.h`. This will be used to define a class to send the recognized speech to your function app to be converted to seconds using LUIS. + +1. Add the following to the top of this file: + + ```cpp + #pragma once + + #include + #include + #include + #include + + #include "config.h" + ``` + + This includes some needed header files. + +1. Define a class called `LanguageUnderstanding`, and declare an instance of this class: + + ```cpp + class LanguageUnderstanding + { + public: + private: + }; + + LanguageUnderstanding languageUnderstanding; + ``` + +1. To call your functions app, you need to declare a WiFi client. Add the following to the `private` section of the class: + + ```cpp + WiFiClient _client; + ``` + +1. In the `public` section, declare a method called `GetTimerDuration` to call the functions app: + + ```cpp + int GetTimerDuration(String text) + { + } + ``` + +1. In the `GetTimerDuration` method, add the following code to build the JSON to be sent to the functions app: + + ```cpp + DynamicJsonDocument doc(1024); + doc["text"] = text; + + String body; + serializeJson(doc, body); + ``` + + This coverts the text passed to the `GetTimerDuration` method into the following JSON: + + ```json + { + "text" : "" + } + ``` + + where `` is the text passed to the function. + +1. Below this, add the following code to make the functions app call: + + ```cpp + HTTPClient httpClient; + httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + ``` + + This makes a POST request to the functions app, passing the JSON body and getting the response code. + +1. Add the following code below this: + + ```cpp + int seconds = 0; + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + seconds = obj["seconds"].as(); + } + else + { + Serial.print("Failed to understand text - error "); + Serial.println(httpResponseCode); + } + ``` + + This code checks the response code. If it is 200 (success), then the number of seconds for the time is retrieved from the response body. Otherwise an error is sent to the serial monitor and the number of seconds is set to 0. + +1. Add the following code to the end of this method to close the HTTP connection and return the number of seconds: + + ```cpp + httpClient.end(); + + return seconds; + ``` + +1. In the `main.cpp` file, include this new header: + + ```cpp + #include "speech_to_text.h" + ``` + +1. On the end of the `processAudio` function, call the `GetTimerDuration` method to get the timer duration: + + ```cpp + int total_seconds = languageUnderstanding.GetTimerDuration(text); + ``` + + This converts the text from the call to the `SpeechToText` class into the number of seconds for the timer. + +### Task - set a timer + +The number of seconds can be used to set a timer. + +1. Add the following library dependency to the `platformio.ini` file to add a library to set a timer: + + ```ini + contrem/arduino-timer @ 2.3.0 + ``` + +1. Add an include directive for this library to the `main.cpp` file: + + ```cpp + #include + ``` + +1. Above the `processAudio` function, add the following code: + + ```cpp + auto timer = timer_create_default(); + ``` + + This code declares a timer called `timer`. + +1. Below this, add the following code: + + ```cpp + void say(String text) + { + Serial.print("Saying "); + Serial.println(text); + } + ``` + + This `say` function will eventually convert text to speech, but for now it will just write the passed in text to the serial monitor. + +1. Below the `say` function, add the following code: + + ```cpp + bool timerExpired(void *announcement) + { + say((char *)announcement); + return false; + } + ``` + + This is a callback function that will be called when a timer expires. It is passed a message to say when the timer expires. Timers can repeat, and this can be controlled by the return value of this callback - this returns `false`, to tell the timer to not run again. + +1. Add the following code to the end of the `processAudio` function: + + ```cpp + if (total_seconds == 0) + { + return; + } + + int minutes = total_seconds / 60; + int seconds = total_seconds % 60; + ``` + + This code checks the total number of seconds, and if it is 0, returns from teh function call so no timers are set. It then converts the total number of seconds into minutes and seconds. + +1. Below this code, add the following to create a message to say when the timer is started: + + ```cpp + String begin_message; + if (minutes > 0) + { + begin_message += minutes; + begin_message += " minute "; + } + if (seconds > 0) + { + begin_message += seconds; + begin_message += " second "; + } + + begin_message += "timer started."; + ``` + +1. Below this, add similar code to create a message to say when the timer has expired: + + ```cpp + String end_message("Times up on your "); + if (minutes > 0) + { + end_message += minutes; + end_message += " minute "; + } + if (seconds > 0) + { + end_message += seconds; + end_message += " second "; + } + + end_message += "timer."; + ``` + +1. After this, say the timer started message: + + ```cpp + say(begin_message); + ``` + +1. At the end of this function, start the timer: + + ```cpp + timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str())); + ``` + + This triggers the timer. The timer is set using milliseconds, so the total number of seconds is multiplied by 1,000 to convert to milliseconds. The `timerExpired` function is passed as the callback, and the `end_message` is passed as an argument to pass to the callback. This callback only takes `void *` arguments, so the string is converted appropriately. + +1. Finally, the timer needs to *tick*, and this is done in the `loop` function. Add the following code at the end of the `loop` function: + + ```cpp + timer.tick(); + ``` + +1. Build this code, upload it to your Wio Terminal and test it out through the serial monitor. Once you see `Ready` in the serial monitor, press the C button (the one on the left-hand side, closest to the power switch), and speak. 4 seconds of audio will be captured, converted to text, then sent to your function app, and a timer will be set. Make sure your functions app is running locally. + + You will see when the timer starts, and when it ends. + + ```output + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Connecting to WiFi.. + Connected! + Got access token. + Ready. + Starting recording... + Finished recording + Sending speech... + Speech sent! + {"RecognitionStatus":"Success","DisplayText":"Set a 2 minute and 27 second timer.","Offset":4700000,"Duration":35300000} + Set a 2 minute and 27 second timer. + {"seconds": 147} + 2 minute 27 second timer started. + Times up on your 2 minute 27 second timer. + ``` + +> 💁 You can find this code in the [code-timer/wio-terminal](code-timer/wio-terminal) folder. + +😀 Your timer program was a success! diff --git a/6-consumer/lessons/3-spoken-feedback/wio-terminal-text-to-speech.md b/6-consumer/lessons/3-spoken-feedback/wio-terminal-text-to-speech.md index e27369e6..bb247e19 100644 --- a/6-consumer/lessons/3-spoken-feedback/wio-terminal-text-to-speech.md +++ b/6-consumer/lessons/3-spoken-feedback/wio-terminal-text-to-speech.md @@ -1,3 +1,522 @@ # Text to speech - Wio Terminal -Coming soon +In this part of the lesson, you will convert text to speech to provide spoken feedback. + +## Text to speech + +The speech services SDK that you used in the last lesson to convert speech to text can be used to convert text back to speech. + +## Get a list of voices + +When requesting speech, you need to provide the voice to use as speech can be generated using a variety of different voices. Each language supports a range of different voices, and you can get the list of supported voices for each language from the speech services SDK. The limitations of microcontrollers come into play here - the call to get the list of voices supported by the text to speech services is a JSON document of over 77KB in size, far to large to be processed by the Wio Terminal. At the time of writing, the full list contains 215 voices, each defined by a JSON document like the following: + +```json +{ + "Name": "Microsoft Server Speech Text to Speech Voice (en-US, AriaNeural)", + "DisplayName": "Aria", + "LocalName": "Aria", + "ShortName": "en-US-AriaNeural", + "Gender": "Female", + "Locale": "en-US", + "StyleList": [ + "chat", + "customerservice", + "narration-professional", + "newscast-casual", + "newscast-formal", + "cheerful", + "empathetic" + ], + "SampleRateHertz": "24000", + "VoiceType": "Neural", + "Status": "GA" +} +``` + +This JSON is for the **Aria** voice, which has multiple voice styles. All that is needed when converting text to speech is the shortname, `en-US-AriaNeural`. + +Instead of downloading and decoding this entire list on your microcontroller, you will need to write some more serverless code to retrieve the list of voices for the language you are using, and call this from your Wio Terminal. Your code can then pick an appropriate voice from the list, such as the first one it finds. + +### Task - create a serverless function to get a list of voices + +1. Open your `smart-timer-trigger` project in VS Code, and open the terminal ensuring the virtual environment is activated. If not, kill and re-create the terminal. + +1. Open the `local.settings.json` file and add settings for the speech API key and location: + + ```json + "SPEECH_KEY": "", + "SPEECH_LOCATION": "" + ``` + + Replace `` with the API key for your speech service resource. Replace `` with the location you used when you created the speech service resource. + +1. Add a new HTTP trigger to this app called `get-voices` using the following command from inside the VS Code terminal in the root folder of the functions app project: + + ```sh + func new --name get-voices --template "HTTP trigger" + ``` + + This will create an HTTP trigger called `get-voices`. + +1. Replace the contents of the `__init__.py` file in the `get-voices` folder with the following: + + ```python + import json + import os + import requests + + import azure.functions as func + + def main(req: func.HttpRequest) -> func.HttpResponse: + location = os.environ['SPEECH_LOCATION'] + speech_key = os.environ['SPEECH_KEY'] + + req_body = req.get_json() + language = req_body['language'] + + url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/voices/list' + + headers = { + 'Ocp-Apim-Subscription-Key': speech_key + } + + response = requests.get(url, headers=headers) + voices_json = json.loads(response.text) + + voices = filter(lambda x: x['Locale'].lower() == language.lower(), voices_json) + voices = map(lambda x: x['ShortName'], voices) + + return func.HttpResponse(json.dumps(list(voices)), status_code=200) + ``` + + This code makes an HTTP request to the endpoint to get the voices. This voices list is a large block of JSON with voices for all languages, so the voices for the language passed in the request body are filtered out, then the shortname is extracted and returned as a JSON list. The shortname is the value needed to convert text to speech, so only this value is returned. + + > 💁 You can change the filter as necessary to select just the voices you want. + + This reduces the size of the data from 77KB (at the time of writing), to a much smaller JSON document. For example, for US voices this is 408 bytes. + +1. Run your function app locally. You can then call this using a tool like curl in the same way that you tested your `text-to-timer` HTTP trigger. Make sure to pass your language as a JSON body: + + ```json + { + "language":"" + } + ``` + + Replace `` with your language, such as `en-GB`, or `zh-CN`. + +> 💁 You can find this code in the [code-spoken-response/functions](code-spoken-response/functions) folder. + +### Task - retrieve the voice from your Wio Terminal + +1. Open the `smart-timer` project in VS Code if it is not already open. + +1. Open the `config.h` header file and add the URL for your function app: + + ```cpp + const char *GET_VOICES_FUNCTION_URL = ""; + ``` + + Replace `` with the URL for the `get-voices` HTTP trigger on your function app. This will be the same as the value for `TEXT_TO_TIMER_FUNCTION_URL`, except with a function name of `get-voices` instead of `text-to-timer`. + +1. Create a new file in the `src` folder called `text_to_speech.h`. This will be used to define a class to convert from text to speech. + +1. Add the following include directives to the top of the new `text_to_speech.h` file: + + ```cpp + #pragma once + + #include + #include + #include + #include + #include + #include + #include + + #include "config.h" + #include "speech_to_text.h" + ``` + +1. Add the following code below this to declare the `TextToSpeech` class, along with an instance that can be used in the rest of the application: + + ```cpp + class TextToSpeech + { + public: + private: + }; + + TextToSpeech textToSpeech; + ``` + +1. To call your functions app, you need to declare a WiFi client. Add the following to the `private` section of the class: + + ```cpp + WiFiClient _client; + ``` + +1. In the `private` section, add a field for the selected voice: + + ```cpp + String _voice; + ``` + +1. To the `public` section, add an `init` function that will get the first voice: + + ```cpp + void init() + { + } + ``` + +1. To get the voices, a JSON document needs to be sent to the function app with the language. Add the following code to the `init` function to create this JSON document: + + ```cpp + DynamicJsonDocument doc(1024); + doc["language"] = LANGUAGE; + + String body; + serializeJson(doc, body); + ``` + +1. Next create an `HTTPClient`, then use it to call the functions app to get the voices, posting the JSON document: + + ```cpp + HTTPClient httpClient; + httpClient.begin(_client, GET_VOICES_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + ``` + +1. Below this add code to check the response code, and if it is 200 (success), then extract the list of voices, retrieving the first one from the list: + + ```cpp + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonArray obj = doc.as(); + _voice = obj[0].as(); + + Serial.print("Using voice "); + Serial.println(_voice); + } + else + { + Serial.print("Failed to get voices - error "); + Serial.println(httpResponseCode); + } + ``` + +1. After this, end the HTTP client connection: + + ```cpp + httpClient.end(); + ``` + +1. Open the `main.cpp` file, and add the following include directive at the top to include this new header file: + + ```cpp + #include "text_to_speech.h" + ``` + +1. In the `setup` function, underneath the call to `speechToText.init();`, add the following to initialize the `TextToSpeech` class: + + ```cpp + textToSpeech.init(); + ``` + +1. Build this code, upload it to your Wio Terminal and test it out through the serial monitor. Make sure your function app is running. + + You will see the list of available voices returned from the function app, along with the selected voice. + + ```output + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1101 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Connecting to WiFi.. + Connected! + Got access token. + ["en-US-JennyNeural", "en-US-JennyMultilingualNeural", "en-US-GuyNeural", "en-US-AriaNeural", "en-US-AmberNeural", "en-US-AnaNeural", "en-US-AshleyNeural", "en-US-BrandonNeural", "en-US-ChristopherNeural", "en-US-CoraNeural", "en-US-ElizabethNeural", "en-US-EricNeural", "en-US-JacobNeural", "en-US-MichelleNeural", "en-US-MonicaNeural", "en-US-AriaRUS", "en-US-BenjaminRUS", "en-US-GuyRUS", "en-US-ZiraRUS"] + Using voice en-US-JennyNeural + Ready. + ``` + +## Convert text to speech + +Once you have a voice to use, it can be used to convert text to speech. The same memory limitations with voices also apply when converting speech to text, so you will need to write the speech to an SD card ready to be played over the ReSpeaker. + +> 💁 In earlier lessons in this project you used flash memory to store speech captured from the microphone. This lesson uses an SD card as is it easier to play audio from it using the Seeed audio libraries. + +There is also another limitation to consider, the available audio data from the speech service, and the formats that the Wio Terminal supports. Unlike full computers, audio libraries for microcontrollers can be very limited in the audio formats they support. For example, the Seeed Arduino Audio library that can play sound over the ReSpeaker only supports audio at a 44.1KHz sample rate. The Azure speech services can provide audio in a number of formats, but none of them use this sample rate, they only provide 8KHz, 16KHz, 24KHz and 48KHz. This means the audio needs to be re-sampled to 44.1KHz, something that would need more resources that the Wio Terminal has, especially memory. + +When needing to manipulate data like this, it is often better to use serverless code, especially if the data is sourced via a web call. The Wio Terminal can call a serverless function, passing in the text to convert, and the serverless function can both call the speech service to convert text to speech, as well as re-sample the audio to the required sample rate. It can then return the audio in the form the Wio Terminal needs to be stored on the SD card and played over the ReSpeaker. + +### Task - create a serverless function to convert text to speech + +1. Open your `smart-timer-trigger` project in VS Code, and open the terminal ensuring the virtual environment is activated. If not, kill and re-create the terminal. + +1. Add a new HTTP trigger to this app called `text-to-speech` using the following command from inside the VS Code terminal in the root folder of the functions app project: + + ```sh + func new --name text-to-speech --template "HTTP trigger" + ``` + + This will create an HTTP trigger called `text-to-speech`. + +1. The [librosa](https://librosa.org) Pip package has functions to re-sample audio, so add this to the `requirements.txt` file: + + ```sh + librosa + ``` + + Once this has been added, install the Pip packages using the following command from the VS Code terminal: + + ```sh + pip install -r requirements.txt + ``` + + > âš ī¸ If you are using Linux, including Raspberry Pi OS, you may need to install `libsndfile` with the following command: + > + > ```sh + > sudo apt update + > sudo apt install libsndfile1-dev + > ``` + +1. To convert text to speech, you cannot use the speech API key directly, instead you need to request an access token, using the API key to authenticate the access token request. Open the `__init__.py` file from the `text-to-speech` folder and replace all the code in it with the following: + + ```python + import io + import os + import requests + + import librosa + import soundfile as sf + import azure.functions as func + + location = os.environ['SPEECH_LOCATION'] + speech_key = os.environ['SPEECH_KEY'] + + def get_access_token(): + headers = { + 'Ocp-Apim-Subscription-Key': speech_key + } + + token_endpoint = f'https://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken' + response = requests.post(token_endpoint, headers=headers) + return str(response.text) + ``` + + This defines constants for the location and speech key that will be read from the settings. It then defines the `get_access_token` function that will retrieve an access token for the speech service. + +1. Below this code, add the following: + + ```python + playback_format = 'riff-48khz-16bit-mono-pcm' + + def main(req: func.HttpRequest) -> func.HttpResponse: + req_body = req.get_json() + language = req_body['language'] + voice = req_body['voice'] + text = req_body['text'] + + url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/v1' + + headers = { + 'Authorization': 'Bearer ' + get_access_token(), + 'Content-Type': 'application/ssml+xml', + 'X-Microsoft-OutputFormat': playback_format + } + + ssml = f'' + ssml += f'' + ssml += text + ssml += '' + ssml += '' + + response = requests.post(url, headers=headers, data=ssml.encode('utf-8')) + + raw_audio, sample_rate = librosa.load(io.BytesIO(response.content), sr=48000) + resampled = librosa.resample(raw_audio, sample_rate, 44100) + + output_buffer = io.BytesIO() + sf.write(output_buffer, resampled, 44100, 'PCM_16', format='wav') + output_buffer.seek(0) + + return func.HttpResponse(output_buffer.read(), status_code=200) + ``` + + This defines the HTTP trigger that converts the text to speech. It extracts the text to convert, the language and the voice from the JSON body set to the request, builds some SSML to request the speech, then calls the relevant REST API authenticating using the access token. This REST API call returns the audio encoded as 16-bit, 48KHz mono WAV file, defined by the value of `playback_format`, which is sent to the REST API call. + + This is then re-sampled by `librosa` from a sample rate of 48KHz to a sample rate of 44.1KHz, then this audio is saved to a binary buffer that is then returned. + +1. Run your function app locally, or deploy it to the cloud. You can then call this using a tool like curl in the same way that you tested your `text-to-timer` HTTP trigger. Make sure to pass the language, voice and text as the JSON body: + + ```json + { + "language": "", + "voice": "", + "text": "" + } + ``` + + Replace `` with your language, such as `en-GB`, or `zh-CN`. Replace `` with the voice you want to use. Replace `` with the text you want to convert to speech. You can save the output to a file and play it with any audio player that can play WAV files. + + For example, to convert "Hello" to speech using US English with the Jenny Neural voice, with the function app running locally, you can use the following curl command: + + ```sh + curl -X GET 'http://localhost:7071/api/text-to-speech' \ + -H 'Content-Type: application/json' \ + -o hello.wav \ + -d '{ + "language":"en-US", + "voice": "en-US-JennyNeural", + "text": "Hello" + }' + ``` + + This will save the audio to `hello.wav` in the current directory. + +> 💁 You can find this code in the [code-spoken-response/functions](code-spoken-response/functions) folder. + +### Task - retrieve the speech from your Wio Terminal + +1. Open the `smart-timer` project in VS Code if it is not already open. + +1. Open the `config.h` header file and add the URL for your function app: + + ```cpp + const char *TEXT_TO_SPEECH_FUNCTION_URL = ""; + ``` + + Replace `` with the URL for the `text-to-speech` HTTP trigger on your function app. This will be the same as the value for `TEXT_TO_TIMER_FUNCTION_URL`, except with a function name of `text-to-speech` instead of `text-to-timer`. + +1. Open the `text_to_speech.h` header file, and add the following method to the `public` section of the `TextToSpeech` class: + + ```cpp + void convertTextToSpeech(String text) + { + } + ``` + +1. To the `convertTextToSpeech` method, add the following code to create the JSON to send to the function app: + + ```cpp + DynamicJsonDocument doc(1024); + doc["language"] = LANGUAGE; + doc["voice"] = _voice; + doc["text"] = text; + + String body; + serializeJson(doc, body); + ``` + + This writes the language, voice and text to the JSON document, then serializes it to a string. + +1. Below this, add the following code to call the function app: + + ```cpp + HTTPClient httpClient; + httpClient.begin(_client, TEXT_TO_SPEECH_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + ``` + + This creates an HTTPClient, then makes a POST request using the JSON document to the text to speech HTTP trigger. + +1. If the call works, the raw binary data returned from the function app call can be streamed to a file on the SD card. Add the following code to do this: + + ```cpp + if (httpResponseCode == 200) + { + File wav_file = SD.open("SPEECH.WAV", FILE_WRITE); + httpClient.writeToStream(&wav_file); + wav_file.close(); + } + else + { + Serial.print("Failed to get speech - error "); + Serial.println(httpResponseCode); + } + ``` + + This code checks the response, and if it is 200 (success), the binary data is streamed to a file in the root of the SD Card called `SPEECH.WAV`. + +1. At the end of this method, close the HTTP connection: + + ```cpp + httpClient.end(); + ``` + +1. The text to be spoken can now be converted to audio. In the `main.cpp` file, add the following line to the end of the `say` function to convert the text to say into audio: + + ```cpp + textToSpeech.convertTextToSpeech(text); + ``` + +### Task - play audio from your Wio Terminal + +**Coming soon** + +## Deploying your functions app to the cloud + +The reason for running the functions app locally is because the `librosa` Pip package on linux has a dependency on a library that is not installed by default, and will need to be installed before the function app can run. Function apps are serverless - there are no servers you can manage yourself, so no way to install this library up front. + +The way to do this is instead to deploy your functions app using a Docker container. This container is deployed by the cloud whenever it needs to spin up a new instance of your function app (such as when the demand exceeds the available resources, or if the function app hasn't been used for a while and is closed down). + +You can find the instructions to set up a function app and deploy via Docker in the [create a function on Linux using a custom container documentation on Microsoft Docs](https://docs.microsoft.com/azure/azure-functions/functions-create-function-linux-custom-image?tabs=bash%2Cazurecli&pivots=programming-language-python&WT.mc_id=academic-17441-jabenn). + +Once this has been deployed, you can port your Wio Terminal code to access this function: + +1. Add the Azure Functions certificate to `config.h`: + + ```cpp + const char *FUNCTIONS_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIFWjCCBEKgAwIBAgIQDxSWXyAgaZlP1ceseIlB4jANBgkqhkiG9w0BAQsFADBa\r\n" + "MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl\r\n" + "clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw\r\n" + "MDcyMTIzMDAwMFoXDTI0MTAwODA3MDAwMFowTzELMAkGA1UEBhMCVVMxHjAcBgNV\r\n" + "BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEgMB4GA1UEAxMXTWljcm9zb2Z0IFJT\r\n" + "QSBUTFMgQ0EgMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqYnfP\r\n" + "mmOyBoTzkDb0mfMUUavqlQo7Rgb9EUEf/lsGWMk4bgj8T0RIzTqk970eouKVuL5R\r\n" + "IMW/snBjXXgMQ8ApzWRJCZbar879BV8rKpHoAW4uGJssnNABf2n17j9TiFy6BWy+\r\n" + "IhVnFILyLNK+W2M3zK9gheiWa2uACKhuvgCca5Vw/OQYErEdG7LBEzFnMzTmJcli\r\n" + "W1iCdXby/vI/OxbfqkKD4zJtm45DJvC9Dh+hpzqvLMiK5uo/+aXSJY+SqhoIEpz+\r\n" + "rErHw+uAlKuHFtEjSeeku8eR3+Z5ND9BSqc6JtLqb0bjOHPm5dSRrgt4nnil75bj\r\n" + "c9j3lWXpBb9PXP9Sp/nPCK+nTQmZwHGjUnqlO9ebAVQD47ZisFonnDAmjrZNVqEX\r\n" + "F3p7laEHrFMxttYuD81BdOzxAbL9Rb/8MeFGQjE2Qx65qgVfhH+RsYuuD9dUw/3w\r\n" + "ZAhq05yO6nk07AM9c+AbNtRoEcdZcLCHfMDcbkXKNs5DJncCqXAN6LhXVERCw/us\r\n" + "G2MmCMLSIx9/kwt8bwhUmitOXc6fpT7SmFvRAtvxg84wUkg4Y/Gx++0j0z6StSeN\r\n" + "0EJz150jaHG6WV4HUqaWTb98Tm90IgXAU4AW2GBOlzFPiU5IY9jt+eXC2Q6yC/Zp\r\n" + "TL1LAcnL3Qa/OgLrHN0wiw1KFGD51WRPQ0Sh7QIDAQABo4IBJTCCASEwHQYDVR0O\r\n" + "BBYEFLV2DDARzseSQk1Mx1wsyKkM6AtkMB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoI\r\n" + "VDaGezq1BE3wMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYI\r\n" + "KwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADA0BggrBgEFBQcBAQQoMCYwJAYI\r\n" + "KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTA6BgNVHR8EMzAxMC+g\r\n" + "LaArhilodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vT21uaXJvb3QyMDI1LmNybDAq\r\n" + "BgNVHSAEIzAhMAgGBmeBDAECATAIBgZngQwBAgIwCwYJKwYBBAGCNyoBMA0GCSqG\r\n" + "SIb3DQEBCwUAA4IBAQCfK76SZ1vae4qt6P+dTQUO7bYNFUHR5hXcA2D59CJWnEj5\r\n" + "na7aKzyowKvQupW4yMH9fGNxtsh6iJswRqOOfZYC4/giBO/gNsBvwr8uDW7t1nYo\r\n" + "DYGHPpvnpxCM2mYfQFHq576/TmeYu1RZY29C4w8xYBlkAA8mDJfRhMCmehk7cN5F\r\n" + "JtyWRj2cZj/hOoI45TYDBChXpOlLZKIYiG1giY16vhCRi6zmPzEwv+tk156N6cGS\r\n" + "Vm44jTQ/rs1sa0JSYjzUaYngoFdZC4OfxnIkQvUIA4TOFmPzNPEFdjcZsgbeEz4T\r\n" + "cGHTBPK4R28F44qIMCtHRV55VMX53ev6P3hRddJb\r\n" + "-----END CERTIFICATE-----\r\n"; + ``` + +1. Change all includes of `` to ``. + +1. Change all `WiFiClient` fields to `WiFiClientSecure`. + +1. In every class that has a `WiFiClientSecure` field, add a constructor and set the certificate in that constructor: + + ```cpp + _client.setCACert(FUNCTIONS_CERTIFICATE); + ``` diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/get-voices/__init__.py b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/get-voices/__init__.py new file mode 100644 index 00000000..44c81900 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/get-voices/__init__.py @@ -0,0 +1,26 @@ +import json +import os +import requests + +import azure.functions as func + +def main(req: func.HttpRequest) -> func.HttpResponse: + location = os.environ['SPEECH_LOCATION'] + speech_key = os.environ['SPEECH_KEY'] + + req_body = req.get_json() + language = req_body['language'] + + url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/voices/list' + + headers = { + 'Ocp-Apim-Subscription-Key': speech_key + } + + response = requests.get(url, headers=headers) + voices_json = json.loads(response.text) + + voices = filter(lambda x: x['Locale'].lower() == language.lower(), voices_json) + voices = map(lambda x: x['ShortName'], voices) + + return func.HttpResponse(json.dumps(list(voices)), status_code=200) diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/get-voices/function.json b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/get-voices/function.json new file mode 100644 index 00000000..d9019652 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/get-voices/function.json @@ -0,0 +1,20 @@ +{ + "scriptFile": "__init__.py", + "bindings": [ + { + "authLevel": "function", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "$return" + } + ] +} \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/host.json b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/host.json new file mode 100644 index 00000000..291065f8 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/host.json @@ -0,0 +1,15 @@ +{ + "version": "2.0", + "logging": { + "applicationInsights": { + "samplingSettings": { + "isEnabled": true, + "excludedTypes": "Request" + } + } + }, + "extensionBundle": { + "id": "Microsoft.Azure.Functions.ExtensionBundle", + "version": "[2.*, 3.0.0)" + } +} \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/local.settings.json b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/local.settings.json new file mode 100644 index 00000000..a88a77ff --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/local.settings.json @@ -0,0 +1,14 @@ +{ + "IsEncrypted": false, + "Values": { + "FUNCTIONS_WORKER_RUNTIME": "python", + "AzureWebJobsStorage": "", + "LUIS_KEY": "", + "LUIS_ENDPOINT_URL": "", + "LUIS_APP_ID": "", + "SPEECH_KEY": "", + "SPEECH_LOCATION": "", + "TRANSLATOR_KEY": "", + "TRANSLATOR_LOCATION": "" + } +} \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/requirements.txt b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/requirements.txt new file mode 100644 index 00000000..a2596be3 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/requirements.txt @@ -0,0 +1,5 @@ +# Do not include azure-functions-worker as it may conflict with the Azure Functions platform + +azure-functions +azure-cognitiveservices-language-luis +librosa \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-speech/__init__.py b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-speech/__init__.py new file mode 100644 index 00000000..f09404f3 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-speech/__init__.py @@ -0,0 +1,52 @@ +import io +import os +import requests + +import librosa +import soundfile as sf +import azure.functions as func + +location = os.environ['SPEECH_LOCATION'] +speech_key = os.environ['SPEECH_KEY'] + +def get_access_token(): + headers = { + 'Ocp-Apim-Subscription-Key': speech_key + } + + token_endpoint = f'https://{location}.api.cognitive.microsoft.com/sts/v1.0/issuetoken' + response = requests.post(token_endpoint, headers=headers) + return str(response.text) + +playback_format = 'riff-48khz-16bit-mono-pcm' + +def main(req: func.HttpRequest) -> func.HttpResponse: + req_body = req.get_json() + language = req_body['language'] + voice = req_body['voice'] + text = req_body['text'] + + url = f'https://{location}.tts.speech.microsoft.com/cognitiveservices/v1' + + headers = { + 'Authorization': 'Bearer ' + get_access_token(), + 'Content-Type': 'application/ssml+xml', + 'X-Microsoft-OutputFormat': playback_format + } + + ssml = f'' + ssml += f'' + ssml += text + ssml += '' + ssml += '' + + response = requests.post(url, headers=headers, data=ssml.encode('utf-8')) + + raw_audio, sample_rate = librosa.load(io.BytesIO(response.content), sr=48000) + resampled = librosa.resample(raw_audio, sample_rate, 44100) + + output_buffer = io.BytesIO() + sf.write(output_buffer, resampled, 44100, 'PCM_16', format='wav') + output_buffer.seek(0) + + return func.HttpResponse(output_buffer.read(), status_code=200) diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-speech/function.json b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-speech/function.json new file mode 100644 index 00000000..d9019652 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-speech/function.json @@ -0,0 +1,20 @@ +{ + "scriptFile": "__init__.py", + "bindings": [ + { + "authLevel": "function", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "$return" + } + ] +} \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-timer/__init__.py b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-timer/__init__.py new file mode 100644 index 00000000..d15d6e68 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-timer/__init__.py @@ -0,0 +1,46 @@ +import logging + +import azure.functions as func +import json +import os +from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient +from msrest.authentication import CognitiveServicesCredentials + + +def main(req: func.HttpRequest) -> func.HttpResponse: + luis_key = os.environ['LUIS_KEY'] + endpoint_url = os.environ['LUIS_ENDPOINT_URL'] + app_id = os.environ['LUIS_APP_ID'] + + credentials = CognitiveServicesCredentials(luis_key) + client = LUISRuntimeClient(endpoint=endpoint_url, credentials=credentials) + + req_body = req.get_json() + text = req_body['text'] + logging.info(f'Request - {text}') + prediction_request = { 'query' : text } + + prediction_response = client.prediction.get_slot_prediction(app_id, 'Staging', prediction_request) + + if prediction_response.prediction.top_intent == 'set timer': + numbers = prediction_response.prediction.entities['number'] + time_units = prediction_response.prediction.entities['time unit'] + total_seconds = 0 + + for i in range(0, len(numbers)): + number = numbers[i] + time_unit = time_units[i][0] + + if time_unit == 'minute': + total_seconds += number * 60 + else: + total_seconds += number + + logging.info(f'Timer required for {total_seconds} seconds') + + payload = { + 'seconds': total_seconds + } + return func.HttpResponse(json.dumps(payload), status_code=200) + + return func.HttpResponse(status_code=404) \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-timer/function.json b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-timer/function.json new file mode 100644 index 00000000..d9019652 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/text-to-timer/function.json @@ -0,0 +1,20 @@ +{ + "scriptFile": "__init__.py", + "bindings": [ + { + "authLevel": "function", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "$return" + } + ] +} \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/__init__.py b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/__init__.py new file mode 100644 index 00000000..850200a6 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/__init__.py @@ -0,0 +1,36 @@ +import logging +import os +import requests + +import azure.functions as func + +location = os.environ['TRANSLATOR_LOCATION'] +translator_key = os.environ['TRANSLATOR_KEY'] + +def main(req: func.HttpRequest) -> func.HttpResponse: + req_body = req.get_json() + from_language = req_body['from_language'] + to_language = req_body['to_language'] + text = req_body['text'] + + logging.info(f'Translating {text} from {from_language} to {to_language}') + + url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0' + + headers = { + 'Ocp-Apim-Subscription-Key': translator_key, + 'Ocp-Apim-Subscription-Region': location, + 'Content-type': 'application/json' + } + + params = { + 'from': from_language, + 'to': to_language + } + + body = [{ + 'text' : text + }] + + response = requests.post(url, headers=headers, params=params, json=body) + return func.HttpResponse(response.json()[0]['translations'][0]['text']) diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/__pycache__/__init__.cpython-39.pyc b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 00000000..1e106428 Binary files /dev/null and b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/__pycache__/__init__.cpython-39.pyc differ diff --git a/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/function.json b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/function.json new file mode 100644 index 00000000..d9019652 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/functions/smart-timer-trigger/translate-text/function.json @@ -0,0 +1,20 @@ +{ + "scriptFile": "__init__.py", + "bindings": [ + { + "authLevel": "function", + "type": "httpTrigger", + "direction": "in", + "name": "req", + "methods": [ + "get", + "post" + ] + }, + { + "type": "http", + "direction": "out", + "name": "$return" + } + ] +} \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/include/README b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/include/README new file mode 100644 index 00000000..194dcd43 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/include/README @@ -0,0 +1,39 @@ + +This directory is intended for project header files. + +A header file is a file containing C declarations and macro definitions +to be shared between several project source files. You request the use of a +header file in your project source file (C, C++, etc) located in `src` folder +by including it, with the C preprocessing directive `#include'. + +```src/main.c + +#include "header.h" + +int main (void) +{ + ... +} +``` + +Including a header file produces the same results as copying the header file +into each source file that needs it. Such copying would be time-consuming +and error-prone. With a header file, the related declarations appear +in only one place. If they need to be changed, they can be changed in one +place, and programs that include the header file will automatically use the +new version when next recompiled. The header file eliminates the labor of +finding and changing all the copies as well as the risk that a failure to +find one copy will result in inconsistencies within a program. + +In C, the usual convention is to give header files names that end with `.h'. +It is most portable to use only letters, digits, dashes, and underscores in +header file names, and at most one dot. + +Read more about using header files in official GCC documentation: + +* Include Syntax +* Include Operation +* Once-Only Headers +* Computed Includes + +https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/lib/README b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/lib/README new file mode 100644 index 00000000..6debab1e --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/platformio.ini b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/platformio.ini new file mode 100644 index 00000000..8836ab42 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/platformio.ini @@ -0,0 +1,23 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[env:seeed_wio_terminal] +platform = atmelsam +board = seeed_wio_terminal +framework = arduino +lib_deps = + seeed-studio/Seeed Arduino FS @ 2.1.1 + seeed-studio/Seeed Arduino SFUD @ 2.0.2 + seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5 + seeed-studio/Seeed Arduino rpcUnified @ 2.1.3 + seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1 + seeed-studio/Seeed Arduino RTC @ 2.0.0 + bblanchon/ArduinoJson @ 6.17.3 + contrem/arduino-timer @ 2.3.0 diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/config.h b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/config.h new file mode 100644 index 00000000..9822eb2e --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/config.h @@ -0,0 +1,95 @@ +#pragma once + +#define RATE 16000 +#define SAMPLE_LENGTH_SECONDS 4 +#define SAMPLES RATE * SAMPLE_LENGTH_SECONDS +#define BUFFER_SIZE (SAMPLES * 2) + 44 +#define ADC_BUF_LEN 1600 + +const char *SSID = ""; +const char *PASSWORD = ""; + +const char *SPEECH_API_KEY = ""; +const char *SPEECH_LOCATION = ""; +const char *LANGUAGE = ""; +const char *SERVER_LANGUAGE = ""; + +const char *TOKEN_URL = "https://%s.api.cognitive.microsoft.com/sts/v1.0/issuetoken"; +const char *SPEECH_URL = "https://%s.stt.speech.microsoft.com/speech/recognition/conversation/cognitiveservices/v1?language=%s"; + +const char *TEXT_TO_TIMER_FUNCTION_URL = "http://:7071/api/text-to-timer"; +const char *GET_VOICES_FUNCTION_URL = "http://:7071/api/get-voices"; +const char *TEXT_TO_SPEECH_FUNCTION_URL = "http://:7071/api/text-to-speech"; +const char *TRANSLATE_FUNCTION_URL = "http://:7071/api/translate-text"; + +const char *TOKEN_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQAueRcfuAIek/4tmDg0xQwDANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwNjCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBALVGARl56bx3KBUSGuPc4H5uoNFkFH4e7pvTCxRi4j/+z+Xb\r\n" + "wjEz+5CipDOqjx9/jWjskL5dk7PaQkzItidsAAnDCW1leZBOIi68Lff1bjTeZgMY\r\n" + "iwdRd3Y39b/lcGpiuP2d23W95YHkMMT8IlWosYIX0f4kYb62rphyfnAjYb/4Od99\r\n" + "ThnhlAxGtfvSbXcBVIKCYfZgqRvV+5lReUnd1aNjRYVzPOoifgSx2fRyy1+pO1Uz\r\n" + "aMMNnIOE71bVYW0A1hr19w7kOb0KkJXoALTDDj1ukUEDqQuBfBxReL5mXiu1O7WG\r\n" + "0vltg0VZ/SZzctBsdBlx1BkmWYBW261KZgBivrql5ELTKKd8qgtHcLQA5fl6JB0Q\r\n" + "gs5XDaWehN86Gps5JW8ArjGtjcWAIP+X8CQaWfaCnuRm6Bk/03PQWhgdi84qwA0s\r\n" + "sRfFJwHUPTNSnE8EiGVk2frt0u8PG1pwSQsFuNJfcYIHEv1vOzP7uEOuDydsmCjh\r\n" + "lxuoK2n5/2aVR3BMTu+p4+gl8alXoBycyLmj3J/PUgqD8SL5fTCUegGsdia/Sa60\r\n" + "N2oV7vQ17wjMN+LXa2rjj/b4ZlZgXVojDmAjDwIRdDUujQu0RVsJqFLMzSIHpp2C\r\n" + "Zp7mIoLrySay2YYBu7SiNwL95X6He2kS8eefBBHjzwW/9FxGqry57i71c2cDAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQU1cFnOsKjnfR3UltZEjgp5lVou6UwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQB2oWc93fB8esci/8esixj++N22meiGDjgF\r\n" + "+rA2LUK5IOQOgcUSTGKSqF9lYfAxPjrqPjDCUPHCURv+26ad5P/BYtXtbmtxJWu+\r\n" + "cS5BhMDPPeG3oPZwXRHBJFAkY4O4AF7RIAAUW6EzDflUoDHKv83zOiPfYGcpHc9s\r\n" + "kxAInCedk7QSgXvMARjjOqdakor21DTmNIUotxo8kHv5hwRlGhBJwps6fEVi1Bt0\r\n" + "trpM/3wYxlr473WSPUFZPgP1j519kLpWOJ8z09wxay+Br29irPcBYv0GMXlHqThy\r\n" + "8y4m/HyTQeI2IMvMrQnwqPpY+rLIXyviI2vLoI+4xKE4Rn38ZZ8m\r\n" + "-----END CERTIFICATE-----\r\n"; + +const char *SPEECH_CERTIFICATE = + "-----BEGIN CERTIFICATE-----\r\n" + "MIIF8zCCBNugAwIBAgIQCq+mxcpjxFFB6jvh98dTFzANBgkqhkiG9w0BAQwFADBh\r\n" + "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\r\n" + "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH\r\n" + "MjAeFw0yMDA3MjkxMjMwMDBaFw0yNDA2MjcyMzU5NTlaMFkxCzAJBgNVBAYTAlVT\r\n" + "MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKjAoBgNVBAMTIU1pY3Jv\r\n" + "c29mdCBBenVyZSBUTFMgSXNzdWluZyBDQSAwMTCCAiIwDQYJKoZIhvcNAQEBBQAD\r\n" + "ggIPADCCAgoCggIBAMedcDrkXufP7pxVm1FHLDNA9IjwHaMoaY8arqqZ4Gff4xyr\r\n" + "RygnavXL7g12MPAx8Q6Dd9hfBzrfWxkF0Br2wIvlvkzW01naNVSkHp+OS3hL3W6n\r\n" + "l/jYvZnVeJXjtsKYcXIf/6WtspcF5awlQ9LZJcjwaH7KoZuK+THpXCMtzD8XNVdm\r\n" + "GW/JI0C/7U/E7evXn9XDio8SYkGSM63aLO5BtLCv092+1d4GGBSQYolRq+7Pd1kR\r\n" + "EkWBPm0ywZ2Vb8GIS5DLrjelEkBnKCyy3B0yQud9dpVsiUeE7F5sY8Me96WVxQcb\r\n" + "OyYdEY/j/9UpDlOG+vA+YgOvBhkKEjiqygVpP8EZoMMijephzg43b5Qi9r5UrvYo\r\n" + "o19oR/8pf4HJNDPF0/FJwFVMW8PmCBLGstin3NE1+NeWTkGt0TzpHjgKyfaDP2tO\r\n" + "4bCk1G7pP2kDFT7SYfc8xbgCkFQ2UCEXsaH/f5YmpLn4YPiNFCeeIida7xnfTvc4\r\n" + "7IxyVccHHq1FzGygOqemrxEETKh8hvDR6eBdrBwmCHVgZrnAqnn93JtGyPLi6+cj\r\n" + "WGVGtMZHwzVvX1HvSFG771sskcEjJxiQNQDQRWHEh3NxvNb7kFlAXnVdRkkvhjpR\r\n" + "GchFhTAzqmwltdWhWDEyCMKC2x/mSZvZtlZGY+g37Y72qHzidwtyW7rBetZJAgMB\r\n" + "AAGjggGtMIIBqTAdBgNVHQ4EFgQUDyBd16FXlduSzyvQx8J3BM5ygHYwHwYDVR0j\r\n" + "BBgwFoAUTiJUIBiV5uNu5g/6+rkS7QYXjzkwDgYDVR0PAQH/BAQDAgGGMB0GA1Ud\r\n" + "JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMHYG\r\n" + "CCsGAQUFBwEBBGowaDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu\r\n" + "Y29tMEAGCCsGAQUFBzAChjRodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln\r\n" + "aUNlcnRHbG9iYWxSb290RzIuY3J0MHsGA1UdHwR0MHIwN6A1oDOGMWh0dHA6Ly9j\r\n" + "cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5jcmwwN6A1oDOG\r\n" + "MWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RHMi5j\r\n" + "cmwwHQYDVR0gBBYwFDAIBgZngQwBAgEwCAYGZ4EMAQICMBAGCSsGAQQBgjcVAQQD\r\n" + "AgEAMA0GCSqGSIb3DQEBDAUAA4IBAQAlFvNh7QgXVLAZSsNR2XRmIn9iS8OHFCBA\r\n" + "WxKJoi8YYQafpMTkMqeuzoL3HWb1pYEipsDkhiMnrpfeYZEA7Lz7yqEEtfgHcEBs\r\n" + "K9KcStQGGZRfmWU07hPXHnFz+5gTXqzCE2PBMlRgVUYJiA25mJPXfB00gDvGhtYa\r\n" + "+mENwM9Bq1B9YYLyLjRtUz8cyGsdyTIG/bBM/Q9jcV8JGqMU/UjAdh1pFyTnnHEl\r\n" + "Y59Npi7F87ZqYYJEHJM2LGD+le8VsHjgeWX2CJQko7klXvcizuZvUEDTjHaQcs2J\r\n" + "+kPgfyMIOY1DMJ21NxOJ2xPRC/wAh/hzSBRVtoAnyuxtkZ4VjIOh\r\n" + "-----END CERTIFICATE-----\r\n"; diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/flash_stream.h b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/flash_stream.h new file mode 100644 index 00000000..b841f1d0 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/flash_stream.h @@ -0,0 +1,69 @@ +#pragma once + +#include +#include +#include + +#include "config.h" + +class FlashStream : public Stream +{ +public: + FlashStream() + { + _pos = 0; + _flash_address = 0; + _flash = sfud_get_device_table() + 0; + + populateBuffer(); + } + + virtual size_t write(uint8_t val) + { + return 0; + } + + virtual int available() + { + int remaining = BUFFER_SIZE - ((_flash_address - HTTP_TCP_BUFFER_SIZE) + _pos); + int bytes_available = min(HTTP_TCP_BUFFER_SIZE, remaining); + + if (bytes_available == 0) + { + bytes_available = -1; + } + + return bytes_available; + } + + virtual int read() + { + int retVal = _buffer[_pos++]; + + if (_pos == HTTP_TCP_BUFFER_SIZE) + { + populateBuffer(); + } + + return retVal; + } + + virtual int peek() + { + return _buffer[_pos]; + } + +private: + void populateBuffer() + { + sfud_read(_flash, _flash_address, HTTP_TCP_BUFFER_SIZE, _buffer); + _flash_address += HTTP_TCP_BUFFER_SIZE; + _pos = 0; + } + + size_t _pos; + size_t _flash_address; + const sfud_flash *_flash; + + byte _buffer[HTTP_TCP_BUFFER_SIZE]; +}; diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/flash_writer.h b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/flash_writer.h new file mode 100644 index 00000000..87fdff29 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/flash_writer.h @@ -0,0 +1,60 @@ +#pragma once + +#include +#include + +class FlashWriter +{ +public: + void init() + { + _flash = sfud_get_device_table() + 0; + _sfudBufferSize = _flash->chip.erase_gran; + _sfudBuffer = new byte[_sfudBufferSize]; + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void reset() + { + _sfudBufferPos = 0; + _sfudBufferWritePos = 0; + } + + void writeSfudBuffer(byte b) + { + _sfudBuffer[_sfudBufferPos++] = b; + if (_sfudBufferPos == _sfudBufferSize) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void flushSfudBuffer() + { + if (_sfudBufferPos > 0) + { + sfud_erase_write(_flash, _sfudBufferWritePos, _sfudBufferSize, _sfudBuffer); + _sfudBufferWritePos += _sfudBufferSize; + _sfudBufferPos = 0; + } + } + + void writeSfudBuffer(byte *b, size_t len) + { + for (size_t i = 0; i < len; ++i) + { + writeSfudBuffer(b[i]); + } + } + +private: + byte *_sfudBuffer; + size_t _sfudBufferSize; + size_t _sfudBufferPos; + size_t _sfudBufferWritePos; + + const sfud_flash *_flash; +}; \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/language_understanding.h b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/language_understanding.h new file mode 100644 index 00000000..1c8d8653 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/language_understanding.h @@ -0,0 +1,53 @@ +#pragma once + +#include +#include +#include +#include + +#include "config.h" + +class LanguageUnderstanding +{ +public: + int GetTimerDuration(String text) + { + DynamicJsonDocument doc(1024); + doc["text"] = text; + + String body; + serializeJson(doc, body); + + HTTPClient httpClient; + httpClient.begin(_client, TEXT_TO_TIMER_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + + int seconds = 0; + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + seconds = obj["seconds"].as(); + } + else + { + Serial.print("Failed to understand text - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + + return seconds; + } + +private: + WiFiClient _client; +}; + +LanguageUnderstanding languageUnderstanding; \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/main.cpp b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/main.cpp new file mode 100644 index 00000000..3d2c6182 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/main.cpp @@ -0,0 +1,133 @@ +#include +#include +#include +#include +#include + +#include "config.h" +#include "language_understanding.h" +#include "mic.h" +#include "speech_to_text.h" +#include "text_to_speech.h" +#include "text_translator.h" + +void connectWiFi() +{ + while (WiFi.status() != WL_CONNECTED) + { + Serial.println("Connecting to WiFi.."); + WiFi.begin(SSID, PASSWORD); + delay(500); + } + + Serial.println("Connected!"); +} + +void setup() +{ + Serial.begin(9600); + + while (!Serial) + ; // Wait for Serial to be ready + + delay(1000); + + connectWiFi(); + + while (!(sfud_init() == SFUD_SUCCESS)) + ; + + sfud_qspi_fast_read_enable(sfud_get_device(SFUD_W25Q32_DEVICE_INDEX), 2); + + pinMode(WIO_KEY_C, INPUT_PULLUP); + + mic.init(); + + speechToText.init(); + textToSpeech.init(); + + Serial.println("Ready."); +} + +auto timer = timer_create_default(); + +void say(String text) +{ + text = textTranslator.translateText(text, SERVER_LANGUAGE, LANGUAGE); + Serial.println(text); + textToSpeech.convertTextToSpeech(text); +} + +bool timerExpired(void *announcement) +{ + say((char *)announcement); + return false; +} + +void processAudio() +{ + String text = speechToText.convertSpeechToText(); + text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE); + Serial.println(text); + + int total_seconds = languageUnderstanding.GetTimerDuration(text); + if (total_seconds == 0) + { + return; + } + + int minutes = total_seconds / 60; + int seconds = total_seconds % 60; + + String begin_message; + if (minutes > 0) + { + begin_message += minutes; + begin_message += " minute "; + } + if (seconds > 0) + { + begin_message += seconds; + begin_message += " second "; + } + + begin_message += "timer started."; + + String end_message("Times up on your "); + if (minutes > 0) + { + end_message += minutes; + end_message += " minute "; + } + if (seconds > 0) + { + end_message += seconds; + end_message += " second "; + } + + end_message += "timer."; + + say(begin_message); + + timer.in(total_seconds * 1000, timerExpired, (void *)(end_message.c_str())); +} + +void loop() +{ + if (digitalRead(WIO_KEY_C) == LOW && !mic.isRecording()) + { + Serial.println("Starting recording..."); + mic.startRecording(); + } + + if (!mic.isRecording() && mic.isRecordingReady()) + { + Serial.println("Finished recording"); + + processAudio(); + + mic.reset(); + } + + timer.tick(); +} diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/mic.h b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/mic.h new file mode 100644 index 00000000..5f0815de --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/mic.h @@ -0,0 +1,242 @@ +#pragma once + +#include + +#include "config.h" +#include "flash_writer.h" + +class Mic +{ +public: + Mic() + { + _isRecording = false; + _isRecordingReady = false; + } + + void startRecording() + { + _isRecording = true; + _isRecordingReady = false; + } + + bool isRecording() + { + return _isRecording; + } + + bool isRecordingReady() + { + return _isRecordingReady; + } + + void init() + { + analogReference(AR_INTERNAL2V23); + + _writer.init(); + + initBufferHeader(); + configureDmaAdc(); + } + + void reset() + { + _isRecordingReady = false; + _isRecording = false; + + _writer.reset(); + + initBufferHeader(); + } + + void dmaHandler() + { + static uint8_t count = 0; + + if (DMAC->Channel[1].CHINTFLAG.bit.SUSP) + { + DMAC->Channel[1].CHCTRLB.reg = DMAC_CHCTRLB_CMD_RESUME; + DMAC->Channel[1].CHINTFLAG.bit.SUSP = 1; + + if (count) + { + audioCallback(_adc_buf_0, ADC_BUF_LEN); + } + else + { + audioCallback(_adc_buf_1, ADC_BUF_LEN); + } + + count = (count + 1) % 2; + } + } + +private: + volatile bool _isRecording; + volatile bool _isRecordingReady; + FlashWriter _writer; + +typedef struct + { + uint16_t btctrl; + uint16_t btcnt; + uint32_t srcaddr; + uint32_t dstaddr; + uint32_t descaddr; + } dmacdescriptor; + + // Globals - DMA and ADC + volatile dmacdescriptor _wrb[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor_section[DMAC_CH_NUM] __attribute__((aligned(16))); + dmacdescriptor _descriptor __attribute__((aligned(16))); + + void configureDmaAdc() + { + // Configure DMA to sample from ADC at a regular interval (triggered by timer/counter) + DMAC->BASEADDR.reg = (uint32_t)_descriptor_section; // Specify the location of the descriptors + DMAC->WRBADDR.reg = (uint32_t)_wrb; // Specify the location of the write back descriptors + DMAC->CTRL.reg = DMAC_CTRL_DMAENABLE | DMAC_CTRL_LVLEN(0xf); // Enable the DMAC peripheral + DMAC->Channel[1].CHCTRLA.reg = DMAC_CHCTRLA_TRIGSRC(TC5_DMAC_ID_OVF) | // Set DMAC to trigger on TC5 timer overflow + DMAC_CHCTRLA_TRIGACT_BURST; // DMAC burst transfer + + _descriptor.descaddr = (uint32_t)&_descriptor_section[1]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_0 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_0 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[0], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + _descriptor.descaddr = (uint32_t)&_descriptor_section[0]; // Set up a circular descriptor + _descriptor.srcaddr = (uint32_t)&ADC1->RESULT.reg; // Take the result from the ADC0 RESULT register + _descriptor.dstaddr = (uint32_t)_adc_buf_1 + sizeof(uint16_t) * ADC_BUF_LEN; // Place it in the adc_buf_1 array + _descriptor.btcnt = ADC_BUF_LEN; // Beat count + _descriptor.btctrl = DMAC_BTCTRL_BEATSIZE_HWORD | // Beat size is HWORD (16-bits) + DMAC_BTCTRL_DSTINC | // Increment the destination address + DMAC_BTCTRL_VALID | // Descriptor is valid + DMAC_BTCTRL_BLOCKACT_SUSPEND; // Suspend DMAC channel 0 after block transfer + memcpy(&_descriptor_section[1], &_descriptor, sizeof(_descriptor)); // Copy the descriptor to the descriptor section + + // Configure NVIC + NVIC_SetPriority(DMAC_1_IRQn, 0); // Set the Nested Vector Interrupt Controller (NVIC) priority for DMAC1 to 0 (highest) + NVIC_EnableIRQ(DMAC_1_IRQn); // Connect DMAC1 to Nested Vector Interrupt Controller (NVIC) + + // Activate the suspend (SUSP) interrupt on DMAC channel 1 + DMAC->Channel[1].CHINTENSET.reg = DMAC_CHINTENSET_SUSP; + + // Configure ADC + ADC1->INPUTCTRL.bit.MUXPOS = ADC_INPUTCTRL_MUXPOS_AIN12_Val; // Set the analog input to ADC0/AIN2 (PB08 - A4 on Metro M4) + while (ADC1->SYNCBUSY.bit.INPUTCTRL) + ; // Wait for synchronization + ADC1->SAMPCTRL.bit.SAMPLEN = 0x00; // Set max Sampling Time Length to half divided ADC clock pulse (2.66us) + while (ADC1->SYNCBUSY.bit.SAMPCTRL) + ; // Wait for synchronization + ADC1->CTRLA.reg = ADC_CTRLA_PRESCALER_DIV128; // Divide Clock ADC GCLK by 128 (48MHz/128 = 375kHz) + ADC1->CTRLB.reg = ADC_CTRLB_RESSEL_12BIT | // Set ADC resolution to 12 bits + ADC_CTRLB_FREERUN; // Set ADC to free run mode + while (ADC1->SYNCBUSY.bit.CTRLB) + ; // Wait for synchronization + ADC1->CTRLA.bit.ENABLE = 1; // Enable the ADC + while (ADC1->SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + ADC1->SWTRIG.bit.START = 1; // Initiate a software trigger to start an ADC conversion + while (ADC1->SYNCBUSY.bit.SWTRIG) + ; // Wait for synchronization + + // Enable DMA channel 1 + DMAC->Channel[1].CHCTRLA.bit.ENABLE = 1; + + // Configure Timer/Counter 5 + GCLK->PCHCTRL[TC5_GCLK_ID].reg = GCLK_PCHCTRL_CHEN | // Enable perhipheral channel for TC5 + GCLK_PCHCTRL_GEN_GCLK1; // Connect generic clock 0 at 48MHz + + TC5->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ; // Set TC5 to Match Frequency (MFRQ) mode + TC5->COUNT16.CC[0].reg = 3000 - 1; // Set the trigger to 16 kHz: (4Mhz / 16000) - 1 + while (TC5->COUNT16.SYNCBUSY.bit.CC0) + ; // Wait for synchronization + + // Start Timer/Counter 5 + TC5->COUNT16.CTRLA.bit.ENABLE = 1; // Enable the TC5 timer + while (TC5->COUNT16.SYNCBUSY.bit.ENABLE) + ; // Wait for synchronization + } + + uint16_t _adc_buf_0[ADC_BUF_LEN]; + uint16_t _adc_buf_1[ADC_BUF_LEN]; + + // WAV files have a header. This struct defines that header + struct wavFileHeader + { + char riff[4]; /* "RIFF" */ + long flength; /* file length in bytes */ + char wave[4]; /* "WAVE" */ + char fmt[4]; /* "fmt " */ + long chunk_size; /* size of FMT chunk in bytes (usually 16) */ + short format_tag; /* 1=PCM, 257=Mu-Law, 258=A-Law, 259=ADPCM */ + short num_chans; /* 1=mono, 2=stereo */ + long srate; /* Sampling rate in samples per second */ + long bytes_per_sec; /* bytes per second = srate*bytes_per_samp */ + short bytes_per_samp; /* 2=16-bit mono, 4=16-bit stereo */ + short bits_per_samp; /* Number of bits per sample */ + char data[4]; /* "data" */ + long dlength; /* data length in bytes (filelength - 44) */ + }; + + void initBufferHeader() + { + wavFileHeader wavh; + + strncpy(wavh.riff, "RIFF", 4); + strncpy(wavh.wave, "WAVE", 4); + strncpy(wavh.fmt, "fmt ", 4); + strncpy(wavh.data, "data", 4); + + wavh.chunk_size = 16; + wavh.format_tag = 1; // PCM + wavh.num_chans = 1; // mono + wavh.srate = RATE; + wavh.bytes_per_sec = (RATE * 1 * 16 * 1) / 8; + wavh.bytes_per_samp = 2; + wavh.bits_per_samp = 16; + wavh.dlength = RATE * 2 * 1 * 16 / 2; + wavh.flength = wavh.dlength + 44; + + _writer.writeSfudBuffer((byte *)&wavh, 44); + } + + void audioCallback(uint16_t *buf, uint32_t buf_len) + { + static uint32_t idx = 44; + + if (_isRecording) + { + for (uint32_t i = 0; i < buf_len; i++) + { + int16_t audio_value = ((int16_t)buf[i] - 2048) * 16; + + _writer.writeSfudBuffer(audio_value & 0xFF); + _writer.writeSfudBuffer((audio_value >> 8) & 0xFF); + } + + idx += buf_len; + + if (idx >= BUFFER_SIZE) + { + _writer.flushSfudBuffer(); + idx = 44; + _isRecording = false; + _isRecordingReady = true; + } + } + } +}; + +Mic mic; + +void DMAC_1_Handler() +{ + mic.dmaHandler(); +} diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/speech_to_text.h b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/speech_to_text.h new file mode 100644 index 00000000..a7ce075f --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/speech_to_text.h @@ -0,0 +1,102 @@ +#pragma once + +#include +#include +#include +#include + +#include "config.h" +#include "flash_stream.h" + +class SpeechToText +{ +public: + void init() + { + _token_client.setCACert(TOKEN_CERTIFICATE); + _speech_client.setCACert(SPEECH_CERTIFICATE); + _access_token = getAccessToken(); + } + + String convertSpeechToText() + { + char url[128]; + sprintf(url, SPEECH_URL, SPEECH_LOCATION, LANGUAGE); + + HTTPClient httpClient; + httpClient.begin(_speech_client, url); + + httpClient.addHeader("Authorization", String("Bearer ") + _access_token); + httpClient.addHeader("Content-Type", String("audio/wav; codecs=audio/pcm; samplerate=") + String(RATE)); + httpClient.addHeader("Accept", "application/json;text/xml"); + + Serial.println("Sending speech..."); + + FlashStream stream; + int httpResponseCode = httpClient.sendRequest("POST", &stream, BUFFER_SIZE); + + Serial.println("Speech sent!"); + + String text = ""; + + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonObject obj = doc.as(); + text = obj["DisplayText"].as(); + } + else if (httpResponseCode == 401) + { + Serial.println("Access token expired, trying again with a new token"); + _access_token = getAccessToken(); + return convertSpeechToText(); + } + else + { + Serial.print("Failed to convert text to speech - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + + return text; + } + +private: + String getAccessToken() + { + char url[128]; + sprintf(url, TOKEN_URL, SPEECH_LOCATION); + + HTTPClient httpClient; + httpClient.begin(_token_client, url); + + httpClient.addHeader("Ocp-Apim-Subscription-Key", SPEECH_API_KEY); + int httpResultCode = httpClient.POST("{}"); + + if (httpResultCode != 200) + { + Serial.println("Error getting access token, trying again..."); + delay(10000); + return getAccessToken(); + } + + Serial.println("Got access token."); + String result = httpClient.getString(); + + httpClient.end(); + + return result; + } + + WiFiClientSecure _token_client; + WiFiClientSecure _speech_client; + String _access_token; +}; + +SpeechToText speechToText; diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/text_to_speech.h b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/text_to_speech.h new file mode 100644 index 00000000..d7174fcd --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/text_to_speech.h @@ -0,0 +1,86 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +#include "config.h" + +class TextToSpeech +{ +public: + void init() + { + DynamicJsonDocument doc(1024); + doc["language"] = LANGUAGE; + + String body; + serializeJson(doc, body); + + HTTPClient httpClient; + httpClient.begin(_client, GET_VOICES_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + + if (httpResponseCode == 200) + { + String result = httpClient.getString(); + Serial.println(result); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, result.c_str()); + + JsonArray obj = doc.as(); + _voice = obj[0].as(); + + Serial.print("Using voice "); + Serial.println(_voice); + } + else + { + Serial.print("Failed to get voices - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + } + + void convertTextToSpeech(String text) + { + DynamicJsonDocument doc(1024); + doc["language"] = LANGUAGE; + doc["voice"] = _voice; + doc["text"] = text; + + String body; + serializeJson(doc, body); + + HTTPClient httpClient; + httpClient.begin(_client, TEXT_TO_SPEECH_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + + if (httpResponseCode == 200) + { + File wav_file = SD.open("SPEECH.WAV", FILE_WRITE); + httpClient.writeToStream(&wav_file); + wav_file.close(); + } + else + { + Serial.print("Failed to get speech - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + } +private: + WiFiClient _client; + String _voice; +}; + +TextToSpeech textToSpeech; \ No newline at end of file diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/text_translator.h b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/text_translator.h new file mode 100644 index 00000000..0404fa39 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/src/text_translator.h @@ -0,0 +1,58 @@ +#pragma once + +#include +#include +#include +#include + +#include "config.h" + +class TextTranslator +{ +public: + String translateText(String text, String from_language, String to_language) + { + DynamicJsonDocument doc(1024); + doc["text"] = text; + doc["from_language"] = from_language; + doc["to_language"] = to_language; + + String body; + serializeJson(doc, body); + + Serial.print("Translating "); + Serial.print(text); + Serial.print(" from "); + Serial.print(from_language); + Serial.print(" to "); + Serial.println(to_language); + + HTTPClient httpClient; + httpClient.begin(_client, TRANSLATE_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + + String translated_text = ""; + + if (httpResponseCode == 200) + { + translated_text = httpClient.getString(); + Serial.print("Translated: "); + Serial.println(translated_text); + } + else + { + Serial.print("Failed to translate text - error "); + Serial.println(httpResponseCode); + } + + httpClient.end(); + + return translated_text; + } + +private: + WiFiClient _client; +}; + +TextTranslator textTranslator; diff --git a/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/test/README b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/test/README new file mode 100644 index 00000000..b94d0890 --- /dev/null +++ b/6-consumer/lessons/4-multiple-language-support/code/wio-terminal/smart-timer/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html diff --git a/6-consumer/lessons/4-multiple-language-support/pi-translate-speech.md b/6-consumer/lessons/4-multiple-language-support/pi-translate-speech.md index 51305971..59c08ff5 100644 --- a/6-consumer/lessons/4-multiple-language-support/pi-translate-speech.md +++ b/6-consumer/lessons/4-multiple-language-support/pi-translate-speech.md @@ -8,7 +8,7 @@ The speech service REST API doesn't support direct translations, instead you can ### Task - use the translator resource to translate text -1. Your smart timer will have 2 languages set - the language of the server that was used to train LUIS, and the language spoken by the user. Update the `language` variable to be the language that will be spoken by the used, and add a new variable called `server_language` for the language used to train LUIS: +1. Your smart timer will have 2 languages set - the language of the server that was used to train LUIS (the same language is also used to build the messages to speak to the user), and the language spoken by the user. Update the `language` variable to be the language that will be spoken by the user, and add a new variable called `server_language` for the language used to train LUIS: ```python language = '' diff --git a/6-consumer/lessons/4-multiple-language-support/virtual-device-translate-speech.md b/6-consumer/lessons/4-multiple-language-support/virtual-device-translate-speech.md index 15db3690..493a5b40 100644 --- a/6-consumer/lessons/4-multiple-language-support/virtual-device-translate-speech.md +++ b/6-consumer/lessons/4-multiple-language-support/virtual-device-translate-speech.md @@ -20,7 +20,7 @@ The speech service can take speech and not only convert to text in the same lang This imports classes used to translate speech, and a `requests` library that will be used to make a call to the Translator service later in this lesson. -1. Your smart timer will have 2 languages set - the language of the server that was used to train LUIS, and the language spoken by the user. Update the `language` variable to be the language that will be spoken by the used, and add a new variable called `server_language` for the language used to train LUIS: +1. Your smart timer will have 2 languages set - the language of the server that was used to train LUIS (the same language is also used to build the messages to speak to the user), and the language spoken by the user. Update the `language` variable to be the language that will be spoken by the user, and add a new variable called `server_language` for the language used to train LUIS: ```python language = '' diff --git a/6-consumer/lessons/4-multiple-language-support/wio-terminal-translate-speech.md b/6-consumer/lessons/4-multiple-language-support/wio-terminal-translate-speech.md index 7d25fa0f..2e3ce926 100644 --- a/6-consumer/lessons/4-multiple-language-support/wio-terminal-translate-speech.md +++ b/6-consumer/lessons/4-multiple-language-support/wio-terminal-translate-speech.md @@ -1,3 +1,270 @@ # Translate speech - Wio Terminal -Coming soon! +In this part of the lesson, you will write code to translate text using the translator service. + +## Convert text to speech using the translator service + +The speech service REST API doesn't support direct translations, instead you can use the Translator service to translate the text generated by the speech to text service, and the text of the spoken response. This service has a REST API you can use to translate the text, but to make it easier to use this will be wrapped in another HTTP trigger in your functions app. + +### Task - create a serverless function to translate text + +1. Open your `smart-timer-trigger` project in VS Code, and open the terminal ensuring the virtual environment is activated. If not, kill and re-create the terminal. + +1. Open the `local.settings.json` file and add settings for the translator API key and location: + + ```json + "TRANSLATOR_KEY": "", + "TRANSLATOR_LOCATION": "" + ``` + + Replace `` with the API key for your translator service resource. Replace `` with the location you used when you created the translator service resource. + +1. Add a new HTTP trigger to this app called `translate-text` using the following command from inside the VS Code terminal in the root folder of the functions app project: + + ```sh + func new --name translate-text --template "HTTP trigger" + ``` + + This will create an HTTP trigger called `translate-text`. + +1. Replace the contents of the `__init__.py` file in the `translate-text` folder with the following: + + ```python + import logging + import os + import requests + + import azure.functions as func + + location = os.environ['TRANSLATOR_LOCATION'] + translator_key = os.environ['TRANSLATOR_KEY'] + + def main(req: func.HttpRequest) -> func.HttpResponse: + req_body = req.get_json() + from_language = req_body['from_language'] + to_language = req_body['to_language'] + text = req_body['text'] + + logging.info(f'Translating {text} from {from_language} to {to_language}') + + url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0' + + headers = { + 'Ocp-Apim-Subscription-Key': translator_key, + 'Ocp-Apim-Subscription-Region': location, + 'Content-type': 'application/json' + } + + params = { + 'from': from_language, + 'to': to_language + } + + body = [{ + 'text' : text + }] + + response = requests.post(url, headers=headers, params=params, json=body) + return func.HttpResponse(response.json()[0]['translations'][0]['text']) + ``` + + This code extracts the text and the languages from the HTTP request. It then makes a request to the translator REST API, passing the languages as parameters for the URL and the text to translate as the body. Finally, the translation is returned. + +1. Run your function app locally. You can then call this using a tool like curl in the same way that you tested your `text-to-timer` HTTP trigger. Make sure to pass the text to translate and the languages as a JSON body: + + ```json + { + "text": "DÊfinir une minuterie de 30 secondes", + "from_language": "fr-FR", + "to_language": "en-US" + } + ``` + + This example translates *DÊfinir une minuterie de 30 secondes* from French to US English. It will return *Set a 30-second timer*. + +> 💁 You can find this code in the [code/functions](code/functions) folder. + +### Task - use the translator function to translate text + +1. Open the `smart-timer` project in VS Code if it is not already open. + +1. Your smart timer will have 2 languages set - the language of the server that was used to train LUIS (the same language is also used to build the messages to speak to the user), and the language spoken by the user. Update the `LANGUAGE` constant in the `config.h` header file to be the language that will be spoken by the user, and add a new constant called `SERVER_LANGUAGE` for the language used to train LUIS: + + ```cpp + const char *LANGUAGE = ""; + const char *SERVER_LANGUAGE = ""; + ``` + + Replace `` with the locale name for language you will be speaking in, for example `fr-FR` for French, or `zn-HK` for Cantonese. + + Replace `` with the locale name for language used to train LUIS. + + You can find a list of the supported languages and their locale names in the [Language and voice support documentation on Microsoft docs](https://docs.microsoft.com/azure/cognitive-services/speech-service/language-support?WT.mc_id=academic-17441-jabenn#speech-to-text). + + > 💁 If you don't speak multiple languages you can use a service like [Bing Translate](https://www.bing.com/translator) or [Google Translate](https://translate.google.com) to translate from your preferred language to a language of your choice. These services can then play audio of the translated text. + > + > For example, if you train LUIS in English, but want to use French as the user language, you can translate sentences like "set a 2 minute and 27 second timer" from English into French using Bing Translate, then use the **Listen translation** button to speak the translation into your microphone. + > + > ![The listen translation button on Bing translate](../../../images/bing-translate.png) + +1. Add the translator API key and location below the `SPEECH_LOCATION`: + + ```cpp + const char *TRANSLATOR_API_KEY = ""; + const char *TRANSLATOR_LOCATION = ""; + ``` + + Replace `` with the API key for your translator service resource. Replace `` with the location you used when you created the translator service resource. + +1. Add the translator trigger URL below the `VOICE_URL`: + + ```cpp + const char *TRANSLATE_FUNCTION_URL = ""; + ``` + + Replace `` with the URL for the `translate-text` HTTP trigger on your function app. This will be the same as the value for `TEXT_TO_TIMER_FUNCTION_URL`, except with a function name of `translate-text` instead of `text-to-timer`. + +1. Add a new file to the `src` folder called `text_translator.h`. + +1. This new `text_translator.h` header file will contain a class to translate text. Add the following to this file to declare this class: + + ```cpp + #pragma once + + #include + #include + #include + #include + + #include "config.h" + + class TextTranslator + { + public: + private: + WiFiClient _client; + }; + + TextTranslator textTranslator; + ``` + + This declares the `TextTranslator` class, along with an instance of this class. The class has a single field for the WiFi client. + +1. To the `public` section of this class, add a method to translate text: + + ```cpp + String translateText(String text, String from_language, String to_language) + { + } + ``` + + This method takes the language to translate from, and the language to translate to. When handling speech, the speech will be translated from the user language to the LUIS server language, and when giving responses it will translate from the LUIS server language to the users language. + +1. In this method, add code to construct a JSON body containing the text to translate and the languages: + + ```cpp + DynamicJsonDocument doc(1024); + doc["text"] = text; + doc["from_language"] = from_language; + doc["to_language"] = to_language; + + String body; + serializeJson(doc, body); + + Serial.print("Translating "); + Serial.print(text); + Serial.print(" from "); + Serial.print(from_language); + Serial.print(" to "); + Serial.print(to_language); + ``` + +1. Below this, add the following code to send the body to the serverless function app: + + ```cpp + HTTPClient httpClient; + httpClient.begin(_client, TRANSLATE_FUNCTION_URL); + + int httpResponseCode = httpClient.POST(body); + ``` + +1. Next, add code to get the response: + + ```cpp + String translated_text = ""; + + if (httpResponseCode == 200) + { + translated_text = httpClient.getString(); + Serial.print("Translated: "); + Serial.println(translated_text); + } + else + { + Serial.print("Failed to translate text - error "); + Serial.println(httpResponseCode); + } + ``` + +1. Finally, add code to close the connection and return the translated text: + + ```cpp + httpClient.end(); + + return translated_text; + ``` + +### Task - translate the recognized speech and the responses + +1. Open the `main.cpp` file. + +1. Add an include directive at the top of the file for the `TextTranslator` class header file: + + ```cpp + #include "text_translator.h" + ``` + +1. The text that is said when a timer is set or expires needs to be translated. To do this, add the following as the first line of the `say` function: + + ```cpp + text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE); + ``` + + This will translate the text to the users language. + +1. In the `processAudio` function, text is retrieved from the captured audio with the `String text = speechToText.convertSpeechToText();` call. After this call, translate the text: + + ```cpp + String text = speechToText.convertSpeechToText(); + text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE); + ``` + + This will translate the text from the users language into the language used on the server. + +1. Build this code, upload it to your Wio Terminal and test it out through the serial monitor. Once you see `Ready` in the serial monitor, press the C button (the one on the left-hand side, closest to the power switch), and speak. Ensure your function app is running, and request a timer in the user language, either by speaking that language yourself, or using a translation app. + + ```output + Connecting to WiFi.. + Connected! + Got access token. + Ready. + Starting recording... + Finished recording + Sending speech... + Speech sent! + {"RecognitionStatus":"Success","DisplayText":"DÊfinir une minuterie de 2 minutes 27 secondes.","Offset":9600000,"Duration":40400000} + Translating DÊfinir une minuterie de 2 minutes 27 secondes. from fr-FR to en-US + Translated: Set a timer of 2 minutes 27 seconds. + Set a timer of 2 minutes 27 seconds. + {"seconds": 147} + Translating 2 minute 27 second timer started. from en-US to fr-FR + Translated: 2 minute 27 seconde minute a commencÊ. + 2 minute 27 seconde minute a commencÊ. + Translating Times up on your 2 minute 27 second timer. from en-US to fr-FR + Translated: ChronomÊtrant votre minuterie de 2 minutes 27 secondes. + ChronomÊtrant votre minuterie de 2 minutes 27 secondes. + ``` + +> 💁 You can find this code in the [code/wio-terminal](code/wio-terminal) folder. + +😀 Your multi-lingual timer program was a success! diff --git a/README.md b/README.md index 84e45fd3..a4bacfb8 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,10 @@ npm i npm run convert ``` +### Slides + +There are slide decks for some of the lessons in the [slides](./slides) folder. + ## Help Wanted! Would you like to contribute a translation? Please read our [translation guidelines](TRANSLATIONS.md) and add input [to one of the translations issues](https://github.com/microsoft/IoT-For-Beginners/issues?q=is%3Aissue+is%3Aopen+label%3Atranslation). If you want to translate into a new language, please raise a new issue for tracking. diff --git a/hardware.md b/hardware.md index 90fc4cc0..784c7858 100644 --- a/hardware.md +++ b/hardware.md @@ -46,7 +46,7 @@ These are specific to using the Wio terminal Arduino device, and are not relevan * [Breadboard Jumper Wires](https://www.seeedstudio.com/Breadboard-Jumper-Wire-Pack-241mm-200mm-160mm-117m-p-234.html) * Headphones or other speaker with a 3.5mm jack, or a JST speaker such as: * [Mono Enclosed Speaker - 2W 6 Ohm](https://www.seeedstudio.com/Mono-Enclosed-Speaker-2W-6-Ohm-p-2832.html) -* *Optional* - microSD Card 16GB or less for testing image capture, along with a connector to use the SD card with your computer if you don't have one built-in. **NOTE** - the Wio Terminal only supports SD cards up to 16GB, it does not support higher capacities. +* microSD Card 16GB or less, along with a connector to use the SD card with your computer if you don't have one built-in. **NOTE** - the Wio Terminal only supports SD cards up to 16GB, it does not support higher capacities. ## Raspberry Pi diff --git a/images/Diagrams.sketch b/images/Diagrams.sketch index 53c08897..6dfeb3b5 100644 Binary files a/images/Diagrams.sketch and b/images/Diagrams.sketch differ diff --git a/images/wio-sd-card.png b/images/wio-sd-card.png new file mode 100644 index 00000000..c69b0b30 Binary files /dev/null and b/images/wio-sd-card.png differ diff --git a/quiz-app/package-lock.json b/quiz-app/package-lock.json index de80584c..ba15a276 100644 --- a/quiz-app/package-lock.json +++ b/quiz-app/package-lock.json @@ -1,8 +1,15014 @@ { "name": "quizzes", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "quizzes", + "version": "0.1.0", + "dependencies": { + "core-js": "^3.6.5", + "vue": "^2.6.11", + "vue-i18n": "^8.22.2", + "vue-router": "^3.4.9" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-eslint": "~4.5.0", + "@vue/cli-service": "~4.5.0", + "babel-eslint": "^10.1.0", + "eslint": "^6.7.2", + "eslint-plugin-vue": "^6.2.2", + "vue-template-compiler": "^2.6.11" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "dev": true + }, + "node_modules/@babel/core": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.10", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.11", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", + "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "regexpu-core": "^4.7.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.7" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "dependencies": { + "@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/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.10" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.1" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.12.11" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", + "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", + "dev": true + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", + "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", + "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.12.12.tgz", + "integrity": "sha512-fhkE9lJYpw2mjHelBpM2zCbaA11aov2GJs7q4cFaXNrWx0H3bW58H9Esy2rdtYOghFBEYUDRIpvlgi+ZD+AvvQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-decorators": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", + "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", + "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", + "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", + "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.1.tgz", + "integrity": "sha512-ir9YW5daRrTYiy9UJ2TzdNIJEZu8KclVzDcfSt4iEmOtwQ4llPtWInNKJyKnVXp1vE4bbVd5S31M/im3mYMO1w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", + "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "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.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.10.4", + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz", + "integrity": "sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.12.5", + "@babel/helper-plugin-utils": "^7.10.4", + "semver": "^5.5.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", + "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", + "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", + "dev": true, + "dependencies": { + "@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/helper-validator-option": "^7.12.11", + "@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.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", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@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.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.11", + "@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.10", + "@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.12.11", + "core-js-compat": "^3.8.0", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "node_modules/@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "deprecated": "Moved to 'npm install @sideway/address'", + "dev": true + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "deprecated": "Switch to 'npm install joi'", + "dev": true, + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "deprecated": "This version has been deprecated and is no longer supported or maintained", + "dev": true, + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "dependencies": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.0.tgz", + "integrity": "sha512-RLotfx6k1+nfLacwNCenj7VnTMPxVwYKoGOcffMFoJDKM8tXzBiCN0hMHFJNnoAojduYAsxuiMm0EOMixgiRow==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "error-stack-parser": "^2.0.2", + "string-width": "^2.0.0", + "strip-ansi": "^5" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@soda/friendly-errors-webpack-plugin/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true + }, + "node_modules/@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.34", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz", + "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz", + "integrity": "sha512-7SxFCd+FLlxCfwVwbyPxbR4khL9aNikJhrorw8nUIOqeuooc9gifBuDQOJw5kzN7i6i3vLn9G8Wde/4QDihpYw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.9", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz", + "integrity": "sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.17.tgz", + "integrity": "sha512-YYlVaCni5dnHc+bLZfY908IG1+x5xuibKZMGv8srKkvtul3wUuanYvpIj9GXXoWkQbaAdR+kgX46IETKUALWNQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz", + "integrity": "sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy-middleware": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz", + "integrity": "sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/http-proxy": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", + "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", + "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.14.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.16.tgz", + "integrity": "sha512-naXYePhweTi+BMv11TgioE2/FXU4fSl29HAH1ffxVciNsH3rYXjNP2yM8wqmSm7jS20gM8TIklKiTen+1iVncw==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", + "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz", + "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "node_modules/@types/tapable": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", + "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", + "dev": true + }, + "node_modules/@types/uglify-js": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.11.1.tgz", + "integrity": "sha512-7npvPKV+jINLu1SpSYVWG8KvyJBhBa8tmzMMdDoVc2pWUYHN8KIXlPJhjJ4LT97c4dXJA2SHL/q6ADbDriZN+Q==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.25", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz", + "integrity": "sha512-cr6kZ+4m9lp86ytQc1jPOJXgINQyz3kLLunZ57jznW+WIAL0JqZbGubQk4GlD42MuQL5JGOABrxdpqqWeovlVQ==", + "dev": true, + "dependencies": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-dev-server": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-rIb+LtUkKnh7+oIJm3WiMJONd71Q0lZuqGLcSqhZ5qjN9gV/CNmZe7Bai+brnBPZ/KVYOsr+4bFLiNZwjBicLw==", + "dev": true, + "dependencies": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/http-proxy-middleware": "*", + "@types/serve-static": "*", + "@types/webpack": "*" + } + }, + "node_modules/@types/webpack-sources": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-2.1.0.tgz", + "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.0.tgz", + "integrity": "sha512-svFuKPoXP92TJ76ztENOglOsLjcMGUXkdeQhYDxl6KBnZCpqFjqx6RodUPWFg1bj4zsUVsfoIh1RibLO86fUUQ==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.0.tgz", + "integrity": "sha512-WoqRUaslY52PKJFcd7PZExAxhvm6xU5u47l2xFi+UbywzTh/vU2WwgGg3rA2N1HqYJbWFT9hDGFcFqOT6hcBHw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.0", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-preset-app": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.9.tgz", + "integrity": "sha512-d2H4hFnJsGnZtJAAZIbo1dmQJ2SI1MYix1Tc9/etlnJtCDPRHeCNodCSeuLgDwnoAyT3unzyHmTtaO56KRDuOQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.0-0", + "@vue/babel-preset-jsx": "^1.1.2", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + }, + "peerDependencies": { + "@babel/core": "*", + "core-js": "^3", + "vue": "^2 || ^3.0.0-0" + }, + "peerDependenciesMeta": { + "core-js": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-preset-app/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/babel-sugar-v-model/node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-overlay": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.9.tgz", + "integrity": "sha512-E2PWv6tCdUz+eEDj2Th2oxiKmzMe02qi0PcxiNaO7oaqggmEOrp1rLgop7DWpiLDBiqUZk2x0vjK/q2Tz8z/eg==", + "dev": true + }, + "node_modules/@vue/cli-plugin-babel": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.9.tgz", + "integrity": "sha512-2tzaJU5yqAfXVhg1aYyd/Yfif6brv+tDZ49D1aOk7ZgMIwH5YUa0yo5HPcPOcmfpoVoNYcpqVYRfyT4EXIYSpg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.0", + "@vue/babel-preset-app": "^4.5.9", + "@vue/cli-shared-utils": "^4.5.9", + "babel-loader": "^8.1.0", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", + "webpack": "^4.0.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/@vue/cli-plugin-eslint": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.9.tgz", + "integrity": "sha512-wTsWRiRWPW5ik4bgtlh4P4h63Zgjsyvqx2FY0kcj+bSAnQGPJ3bKUOMU9KQP5EyNH6pAXMVGh2LEXK9WwJMf1w==", + "dev": true, + "dependencies": { + "@vue/cli-shared-utils": "^4.5.9", + "eslint-loader": "^2.2.1", + "globby": "^9.2.0", + "inquirer": "^7.1.0", + "webpack": "^4.0.0", + "yorkie": "^2.0.0" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0", + "eslint": ">= 1.6.0 < 7.0.0" + } + }, + "node_modules/@vue/cli-plugin-router": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.9.tgz", + "integrity": "sha512-eBBfbZpQ1sJrdlx8i7iReFxSnuzwmrv+s2OCT3kjBd6uWRqGnD4VihpS4srC7vZLzDQrDplumSn0a93L9Qf3wQ==", + "dev": true, + "dependencies": { + "@vue/cli-shared-utils": "^4.5.9" + }, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/@vue/cli-plugin-vuex": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.9.tgz", + "integrity": "sha512-mFNIJhYiJjzCgytkDHX00ROy5Yzl7prkZpUbeDE0biwcLteMf2s3qZVbESOQl6GcviqcfEt2f3tHQQtLNa+OLg==", + "dev": true, + "peerDependencies": { + "@vue/cli-service": "^3.0.0 || ^4.0.0-0" + } + }, + "node_modules/@vue/cli-service": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.9.tgz", + "integrity": "sha512-E3XlfM0q+UnnjbC9rwLIWNo2umZCRwnlMJY0KOhY1hFvqisGIYzFmQQ4o01KGyTx2BZNMuQg7Kw+BZ5gyM1Wig==", + "dev": true, + "dependencies": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@soda/get-current-script": "^1.0.0", + "@types/minimist": "^1.2.0", + "@types/webpack": "^4.0.0", + "@types/webpack-dev-server": "^3.11.0", + "@vue/cli-overlay": "^4.5.9", + "@vue/cli-plugin-router": "^4.5.9", + "@vue/cli-plugin-vuex": "^4.5.9", + "@vue/cli-shared-utils": "^4.5.9", + "@vue/component-compiler-utils": "^3.1.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.8.6", + "browserslist": "^4.12.0", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.3.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.5.3", + "cssnano": "^4.1.10", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.5", + "pnp-webpack-plugin": "^1.6.4", + "portfinder": "^1.0.26", + "postcss-loader": "^3.0.0", + "ssri": "^7.1.0", + "terser-webpack-plugin": "^2.3.6", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.9.2", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-chain": "^6.4.0", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2" + }, + "bin": { + "vue-cli-service": "bin/vue-cli-service.js" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "vue-loader-v16": "npm:vue-loader@^16.0.0-beta.7" + }, + "peerDependencies": { + "@vue/compiler-sfc": "^3.0.0-beta.14", + "vue-template-compiler": "^2.0.0" + }, + "peerDependenciesMeta": { + "@vue/compiler-sfc": { + "optional": true + }, + "less-loader": { + "optional": true + }, + "pug-plain-loader": { + "optional": true + }, + "raw-loader": { + "optional": true + }, + "sass-loader": { + "optional": true + }, + "stylus-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/@vue/cli-service/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@vue/cli-service/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vue/cli-service/node_modules/cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "dependencies": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@vue/cli-service/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "optional": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@vue/cli-service/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@vue/cli-service/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "node_modules/@vue/cli-service/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-service/node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "optional": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/@vue/cli-service/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/cli-service/node_modules/ssri": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.1.tgz", + "integrity": "sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@vue/cli-service/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@vue/cli-service/node_modules/terser-webpack-plugin": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz", + "integrity": "sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w==", + "dev": true, + "dependencies": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.3.1", + "jest-worker": "^25.4.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.6.12", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@vue/cli-service/node_modules/vue-loader-v16": { + "name": "vue-loader", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.2.0.tgz", + "integrity": "sha512-TitGhqSQ61RJljMmhIGvfWzJ2zk9m1Qug049Ugml6QP3t0e95o0XJjk29roNEiPKJQBEi8Ord5hFuSuELzSp8Q==", + "dev": true, + "optional": true, + "dependencies": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + } + }, + "node_modules/@vue/cli-shared-utils": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.9.tgz", + "integrity": "sha512-anvsrv+rkQC+hgxaT2nQQxnSWSsIzyysZ36LO7qPjXvDRBvcvKLAAviFlUkYbZ+ntbV8puzJ3zw+gUhQw4SEVA==", + "dev": true, + "dependencies": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz", + "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==", + "dev": true, + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "node_modules/@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "html-webpack-plugin": ">=2.26.0", + "webpack": ">=4.0.0" + } + }, + "node_modules/@vue/web-component-wrapper": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz", + "integrity": "sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz", + "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "colorette": "^1.2.1", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "deprecated": "babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "eslint": ">= 4.12.1" + } + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/browserslist/node_modules/caniuse-lite": { + "version": "1.0.30001240", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001240.tgz", + "integrity": "sha512-nb8mDzfMdxBDN7ZKx8chWafAdBp5DAAlpWvNyUGe5tcDWd838zpzDN3Rah9cjCqhfOKkrvx40G2SDtP0qiWX/w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/browserslist/node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dev": true, + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", + "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001170", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001170.tgz", + "integrity": "sha512-Dd4d/+0tsK0UNLrZs3CvNukqalnVTRrxb5mcQm8rHL49t7V5ZaTygwXkrq+FB+dVDf++4ri8eJnFEJAB8332PA==", + "dev": true + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz", + "integrity": "sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/chokidar/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.9.tgz", + "integrity": "sha512-t8RNIZgiI24i/mslZ8XT8o660RUj5ZbUJpEZrZa/BNekTzdC2LfMRAnt0Y7sgzNM4FGW5tmWg/YnbTH8o1eIOQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.0.0", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^15.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cli-highlight/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cli-highlight/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-highlight/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "dependencies": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clipboardy/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz", + "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/copy-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.1.tgz", + "integrity": "sha512-9Id2xHY1W7m8hCl8NkhQn5CufmF/WuR30BTRewvCXc1aZd3kMECwNZ69ndLbekKfakw9Rf2Xyc+QR6E7Gg+obg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", + "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.15.0", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz", + "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", + "dev": true, + "dependencies": { + "execa": "^3.3.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/default-gateway/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": "^8.12.0 || >=9.7.0" + } + }, + "node_modules/default-gateway/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz", + "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domhandler/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true, + "hasInstallScript": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.760", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.760.tgz", + "integrity": "sha512-XPKwjX6pHezJWB4FLVuSil9gGmU6XYl27ahUwEHODXF4KjCEB8RuIT05MkU1au2Tdye57o49yY0uCMK+bwUt+A==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "dependencies": { + "stackframe": "^1.1.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", + "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", + "deprecated": "This loader has been deprecated. Please use eslint-webpack-plugin", + "dev": true, + "dependencies": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + }, + "peerDependencies": { + "eslint": ">=1.6.0 <7.0.0", + "webpack": ">=2.0.0 <5.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz", + "integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==", + "dev": true, + "dependencies": { + "natural-compare": "^1.4.0", + "semver": "^5.6.0", + "vue-eslint-parser": "^7.0.0" + }, + "engines": { + "node": ">=8.10" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/highlight.js": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.5.0.tgz", + "integrity": "sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "node_modules/html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "deprecated": "3.x is no longer supported", + "dev": true, + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-ip/node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "dependencies": { + "html-comment-regex": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/javascript-stringify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.0.1.tgz", + "integrity": "sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.5.0.tgz", + "integrity": "sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==", + "dev": true, + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, + "dependencies": { + "easy-stack": "^1.0.1" + }, + "engines": { + "node": ">=1.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "dev": true, + "dependencies": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "node_modules/launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "dev": true, + "dependencies": { + "launch-editor": "^2.2.1" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/loader-fs-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", + "dev": true, + "dependencies": { + "find-cache-dir": "^0.1.1", + "mkdirp": "^0.5.1" + } + }, + "node_modules/loader-fs-cache/node_modules/find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-fs-cache/node_modules/pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "dependencies": { + "find-up": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-ipc": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.1.3.tgz", + "integrity": "sha512-8RS4RZyS/KMKKYG8mrje+cLxwATe9dBCuOiqKFSWND4oOuKytfuKCiR9yinvhoXF/nGdX/WnbywaUee+9U87zA==", + "dev": true, + "dependencies": { + "event-pubsub": "4.3.0", + "js-message": "1.0.7", + "js-queue": "2.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.2.tgz", + "integrity": "sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dev": true, + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-comments/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-overridden/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-merge-longhand/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-gradients/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-params/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-selectors/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-extract-imports/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-scope/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "dependencies": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", + "dev": true, + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "node_modules/sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "dependencies": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "dependencies": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + }, + "engines": { + "node": ">= 6.9.0 <7.0.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "dev": true, + "dependencies": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-parse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", + "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util.promisify/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/vue": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz", + "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==" + }, + "node_modules/vue-eslint-parser": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.3.0.tgz", + "integrity": "sha512-n5PJKZbyspD0+8LnaZgpEvNCrjQx1DyDHw8JdWwoxhhC+yRip4TAvSDpXGf9SWX6b0umeB5aR61gwUo6NVvFxw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "eslint-scope": "^5.0.0", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.0.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=8.10" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "node_modules/vue-i18n": { + "version": "8.22.2", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.22.2.tgz", + "integrity": "sha512-rb569fVJInPUgS/bbCxEQ9DrAoFTntuJvYoK4Fpk2VfNbA09WzdTKk57ppjz3S+ps9hW+p9H+2ASgMvojedkow==" + }, + "node_modules/vue-loader": { + "version": "15.9.6", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.6.tgz", + "integrity": "sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==", + "dev": true, + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/vue-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/vue-router": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz", + "integrity": "sha512-CGAKWN44RqXW06oC+u4mPgHLQQi2t6vLD/JbGRDAXm0YpMv0bgpKuU5bBd7AvMgfTz9kXVRIWKHqRwGEb8xFkA==" + }, + "node_modules/vue-style-loader": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz", + "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==", + "dev": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/vue-template-compiler": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz", + "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "4.44.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", + "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.3.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", + "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.19", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 6.14.4" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/string-width/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/webpack-dev-server/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "dependencies": { + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/yorkie/node_modules/execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yorkie/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/yorkie/node_modules/normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yorkie/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + }, "dependencies": { "@babel/code-frame": { "version": "7.12.11", @@ -1638,7 +16644,8 @@ "version": "4.5.9", "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.9.tgz", "integrity": "sha512-mFNIJhYiJjzCgytkDHX00ROy5Yzl7prkZpUbeDE0biwcLteMf2s3qZVbESOQl6GcviqcfEt2f3tHQQtLNa+OLg==", - "dev": true + "dev": true, + "requires": {} }, "@vue/cli-service": { "version": "4.5.9", @@ -1929,7 +16936,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", - "dev": true + "dev": true, + "requires": {} }, "@vue/web-component-wrapper": { "version": "1.2.0", @@ -2144,7 +17152,8 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -2184,13 +17193,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "alphanum-sort": { "version": "1.0.2", @@ -10352,6 +25363,15 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -10383,15 +25403,6 @@ "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", diff --git a/quiz-app/src/App.vue b/quiz-app/src/App.vue index a6a92613..ca812e48 100644 --- a/quiz-app/src/App.vue +++ b/quiz-app/src/App.vue @@ -3,10 +3,10 @@
@@ -30,12 +30,26 @@ export default { }, data() { return { - locale: "en", + native_name: "English", + + // Native names are from + // https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes + iso_639_1_map: { + "Ø§Ų„ØšØąØ¨ŲŠØŠ": "ar", + "āĻŦāĻžāĻ‚āϞāĻž": "bn", + "English": "en", + "中文 - å¤§é™†įŽ€äŊ“": "zh-cn", + }, }; }, + computed: { + iso_639_1_map_keys() { + return Object.keys(this.iso_639_1_map); + } + }, watch: { - locale(val) { - this.$root.$i18n.locale = val; + native_name(val) { + this.$root.$i18n.locale = this.iso_639_1_map[val]; }, }, created() { diff --git a/quiz-app/src/assets/translations/bn.json b/quiz-app/src/assets/translations/bn.json index 1617b609..13c05a16 100644 --- a/quiz-app/src/assets/translations/bn.json +++ b/quiz-app/src/assets/translations/bn.json @@ -410,7 +410,7 @@ }, { "id": 9, - "title": "āϞ⧇āϏāύ ā§Ģ - āĻ—āĻžāϛ⧇āϰ āĻŦ⧃āĻĻā§āϧāĻŋ āĻ…āύ⧁āĻŽāĻžāύ āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "title": "āϞ⧇āϏāύ ā§Ģ - āωāĻĻā§āĻ­āĻŋāĻĻ⧇āϰ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ: āϞ⧇āĻ•āϚāĻžāϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", "quiz": [ { "questionText": "āφāχāϟ āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞāĻŋ āĻ•ā§ƒāώāĻŋāĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āϏāĻšāĻžāϝāĻŧāϤāĻž āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇", @@ -459,7 +459,7 @@ }, { "id": 10, - "title": "āϞ⧇āϏāύ ā§Ģ - āĻ—āĻžāϛ⧇āϰ āĻŦ⧃āĻĻā§āϧāĻŋ āĻ…āύ⧁āĻŽāĻžāύ āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "title": "āϞ⧇āϏāύ ā§Ģ - āωāĻĻā§āĻ­āĻŋāĻĻ⧇āϰ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ: āϞ⧇āĻ•āϚāĻžāϰ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", "quiz": [ { "questionText": "āωāĻĻā§āĻ­āĻŋāĻĻ⧇āϰ āĻŦ⧃āĻĻā§āϧāĻŋ āϤāĻžāĻĒāĻŽāĻžāĻ¤ā§āϰāĻžāϰ āωāĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰāĻļā§€āϞ", @@ -1011,6 +1011,1450 @@ ] } ] + }, + { + "id": 21, + "title": "āϞ⧇āϏāύ ā§§ā§§ - āϞ⧋āϕ⧇āĻļāύ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚: āϞ⧇āĻ•āϚāĻžāϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āϏ⧁āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ•āϰāϤ⧇ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ -", + "answerOptions": [ + { + "answerText": "āϕ⧇āĻŦāϞ āĻ…āĻ•ā§āώāĻžāĻ‚āĻļ", + "isCorrect": "false" + }, + { + "answerText": "āϕ⧇āĻŦāϞ āĻĻā§āϰāĻžāϘāĻŋāĻŽāĻžāĻ‚āĻļ", + "isCorrect": "false" + }, + { + "answerText": "āĻ…āĻ•ā§āώāĻžāĻ‚āĻļ āĻāĻŦāĻ‚ āĻĻā§āϰāĻžāϘāĻŋāĻŽāĻžāĻ‚āĻļ", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āϝ⧇ āϧāϰāϪ⧇āϰ āϏ⧇āĻ¨ā§āϏāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻžāĻĻ⧇āϰ āĻŦāϞāĻž āĻšāϝāĻŧ -", + "answerOptions": [ + { + "answerText": "GPS", + "isCorrect": "true" + }, + { + "answerText": "PGP", + "isCorrect": "false" + }, + { + "answerText": "GIF", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻ—āĻžāĻĄāĻŧāĻŋāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻž āĻŽā§‚āĻ˛ā§āϝāĻšā§€āύ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 22, + "title": "āϞ⧇āϏāύ ā§§ā§§ - āϞ⧋āϕ⧇āĻļāύ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚: āϞ⧇āĻ•āϚāĻžāϰ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āϏ⧇āĻ¨ā§āϏāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϜāĻŋāĻĒāĻŋāĻāϏ āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāϪ⧇ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āĻšā§Ÿ ", + "answerOptions": [ + { + "answerText": "āĻ…āĻ•ā§āώāĻžāĻ‚āĻļ āĻāĻŦāĻ‚ āĻĻā§āϰāĻžāϘāĻŋāĻŽāĻžāĻ‚āĻļ āĻ¸ā§āĻĨāĻžāύāĻžāĻ™ā§āĻ•", + "isCorrect": "false" + }, + { + "answerText": "āĻ āĻŋāĻ•āĻžāύāĻž", + "isCorrect": "false" + }, + { + "answerText": "NMEA sentences", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻāĻ•āϟāĻŋ āĻ­āĻžāϞ āϜāĻŋāĻĒāĻŋāĻāϏ āĻĢāĻŋāĻ•ā§āϏ āĻĒ⧇āϤ⧇ āĻ•āĻŽāĻĒāĻ•ā§āώ⧇ āĻ•āϤāϟāĻŋ āĻ¸ā§āϝāĻžāĻŸā§‡āϞāĻžāχāϟ āĻĨ⧇āϕ⧇ āϏāĻŋāĻ—āĻ¨ā§āϝāĻžāϞ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāĻž āĻĻāϰāĻ•āĻžāϰ ? ", + "answerOptions": [ + { + "answerText": "1", + "isCorrect": "false" + }, + { + "answerText": "2", + "isCorrect": "false" + }, + { + "answerText": "3", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āϜāĻŋāĻĒāĻŋāĻāϏ āϏ⧇āĻ¨ā§āϏāϰāϗ⧁āϞāĻŋ āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇ āϕ⧋āύāϟāĻŋāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ ?", + "answerOptions": [ + { + "answerText": "SPI", + "isCorrect": "false" + }, + { + "answerText": "UART", + "isCorrect": "true" + }, + { + "answerText": "āχāĻŽā§‡āχāϞ", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 23, + "title": "āϞ⧇āϏāύ ⧧⧍ - āϞ⧋āϕ⧇āĻļāύ āĻĄā§‡āϟāĻž āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "IoT āĻĄā§‡āϟāĻž āĻ¸ā§āĻŸā§‹āϰ āĻšā§Ÿ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇-", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻĄā§‡āϟāĻžāϕ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤāĻ­āĻžāĻŦ⧇ āĻ­āĻžāĻ— āĻ•āϰāĻž āϝāĻžā§Ÿ -", + "answerOptions": [ + { + "answerText": "Blob āĻāĻŦāĻ‚ table", + "isCorrect": "false" + }, + { + "answerText": "Structured āĻāĻŦāĻ‚ unstructured", + "isCorrect": "true" + }, + { + "answerText": "āϞāĻžāϞ āĻāĻŦāĻ‚ āύ⧀āϞ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āϏāĻžāĻ°ā§āĻ­āĻžāϰāϞ⧇āϏ āϕ⧋āĻĄ āĻĻā§āĻŦāĻžāϰāĻž āĻĄā§‡āϟāĻžāĻŦ⧇āϏ āĻ āφāχāĻ“āϟāĻŋ āĻĄā§‡āϟāĻž āĻĒā§āϰāĻĻāĻžāύ āĻ•āϰāĻž āϝāĻžā§Ÿ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 24, + "title": "āϞ⧇āϏāύ ⧧⧍ - āϞ⧋āϕ⧇āĻļāύ āĻĄā§‡āϟāĻž āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "IoT āĻĄā§‡āϟāĻž āϤāĻžā§ŽāĻ•ā§āώāĻŖāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āϕ⧋āύ path āĻ āĻĒā§āϰāϏ⧇āϏ āĻ•āϰāĻž āĻšā§Ÿ:", + "answerOptions": [ + { + "answerText": "Hot", + "isCorrect": "true" + }, + { + "answerText": "Warm", + "isCorrect": "false" + }, + { + "answerText": "Cold", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Azure āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻāϰ āϕ⧋āύ āϕ⧋āύ āϧāϰāϪ⧇āϰ āĻ¸ā§āĻŸā§‹āϰ⧇āϜ āĻ°ā§Ÿā§‡āϛ⧇-", + "answerOptions": [ + { + "answerText": "Boxes, tubs, bins", + "isCorrect": "false" + }, + { + "answerText": "Blob, table, queue āĻāĻŦāĻ‚ file", + "isCorrect": "true" + }, + { + "answerText": "Hot, warm, cold", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Azure Functions āϕ⧇ āϕ⧋āύ āĻāĻ•āϟāĻŋ āĻĄā§‡āϟāĻžāĻŦ⧇āϏ⧇ āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ­ā§āϝāĻžāϞ⧁ āĻĻā§‡ā§ŸāĻžāϰ āĻŽāϤ āĻ•āϰ⧇ āϏ⧀āĻŽāĻžāĻŦāĻĻā§āϧ āĻ•āϰāĻž āϝāĻžā§Ÿ - can be bound to database to write return values to the database", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 25, + "title": "āϞ⧇āϏāύāĻƒā§§ā§Š - āϞ⧋āϕ⧇āĻļāύ āĻĄā§‡āϟāĻž Visualize āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻĄā§‡āϟāĻž āĻ–ā§‹āρāϜāĻžāϰ āϜāĻ¨ā§āϝ āĻŦ⧜ āĻŸā§‡āĻŦāϞāϗ⧁āϞ⧋ āϏ⧁āĻŦāĻŋāϧāĻžāϜāύāĻ•", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "GPS āĻĄā§‡āϟāĻž āϕ⧇āĻŦāϞāĻŽāĻžāĻ¤ā§āϰ āĻŽā§āϝāĻžāĻĒ⧇āχ āĻĻ⧇āĻ–āĻž āϝāĻžāĻŦ⧇", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻŦ⧃āĻšā§Ž āĻāϞāĻžāĻ•āĻžāϰ āĻŽā§āϝāĻžāĻĒ⧇ , āϕ⧋āύ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻĻā§‚āϰāĻ¤ā§āĻŦ āĻŽā§āϝāĻžāĻĒ⧇ āĻāĻŦāĻ‚ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻŋāĻ• āϜāĻ—āϤ⧇ āϏāĻŽāĻžāύ āĻšāĻŦ⧇ - āϤāĻž āϏ⧇ āϝ⧇āĻ–āĻžāύ⧇āχ āĻĒāϰāĻŋāĻŽāĻžāĻĒ āĻ•āϰāĻž āĻšā§‹āĻ• āύāĻž āϕ⧇āύ - ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 26, + "title": "āϞ⧇āϏāύ ā§§ā§Š - āϞ⧋āϕ⧇āĻļāύ āĻĄā§‡āϟāĻž Visualize āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āϝ⧇ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽā§āϝāĻžāĻĒ āφāρāĻ•āĻž āĻšā§Ÿ -", + "answerOptions": [ + { + "answerText": "Azure Maps", + "isCorrect": "true" + }, + { + "answerText": "Azure Atlas", + "isCorrect": "false" + }, + { + "answerText": "Azure World Visualizer", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Azure maps ___ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽā§āϝāĻžāĻĒ⧇āϰ āĻĄā§‡āϟāĻž āĻĒā§āϞāϟ āĻ•āϰ⧇ āĨ¤", + "answerOptions": [ + { + "answerText": "GeoJSON", + "isCorrect": "true" + }, + { + "answerText": "latitude āĻāĻŦāĻ‚ longitude āĻĨ⧇āϕ⧇", + "isCorrect": "false" + }, + { + "answerText": "Address āϏāĻŽā§‚āĻšā§‡āϰ āϞāĻŋāĻ¸ā§āϟ āĻĨ⧇āϕ⧇", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Blobs āϕ⧇ URL āĻāϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āϰāĻŋāĻŸā§āϰāĻŋāĻ­ āĻ•āϰāĻž āϝāĻžā§Ÿ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 27, + "title": "āϞ⧇āϏāύ 14 - Geofences: āϞ⧇āĻ•āϚāĻžāϰ āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "GPS āĻ¸ā§āĻĨāĻžāύāĻžāĻ™ā§āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻāϞāĻžāĻ•āĻžā§Ÿ āϕ⧋āύ āĻŦāĻ¸ā§āϤ⧁āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āϜāĻžāύāĻž āϝāĻžāĻŦ⧇ ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "GPS āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āύāĻŋāĻ°ā§āϭ⧁āϞāĻ­āĻžāĻŦ⧇ ā§§āĻŽāĻžāχāϞ⧇āϰ āĻ­āĻŋāϤāϰ⧇ ā§§āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ…āĻžā§āϚāϞ⧇ āϝāĻžāύāĻŦāĻžāĻšāύ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰāϞ⧇āχ āϤāĻž āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻ•āĻ–āύ āϝāĻžāύāĻŦāĻžāĻšāύ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ Geofences āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āωāϚāĻŋāϤ -", + "answerOptions": [ + { + "answerText": "āϕ⧇āĻŦāϞ āϝāĻ–āύ ā§§āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ…āĻžā§āϚāϞ⧇ āϝāĻžāύāĻŦāĻžāĻšāύ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰ⧇", + "isCorrect": "false" + }, + { + "answerText": "āϕ⧇āĻŦāϞ āϝāĻ–āύ ā§§āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ…āĻžā§āϚāϞ āĻĨ⧇āϕ⧇ āϝāĻžāύāĻŦāĻžāĻšāύ āĻ¤ā§āϝāĻžāĻ— āĻ•āϰ⧇", + "isCorrect": "false" + }, + { + "answerText": "āϝāĻ–āύ ā§§āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻ…āĻžā§āϚāϞ⧇ āϝāĻžāύāĻŦāĻžāĻšāύ āĻĒā§āϰāĻŦ⧇āĻļ āĻ•āϰ⧇ āĻ…āĻĨāĻŦāĻž āϏ⧇āχ āĻ…āĻžā§āϚāϞ āĻ¤ā§āϝāĻžāĻ— āĻ•āϰ⧇", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 28, + "title": "āϞ⧇āϏāύ 14 - Geofences: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āĻĨ⧇āϕ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻĻāĻŋā§Ÿā§‡ āĻĄā§‡āϟāĻž āĻ—ā§āϰāĻšāϪ⧇āϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āĻāĻ•āĻžāϧāĻŋāĻ• āϕ⧀ āĻĻāϰāĻ•āĻžāϰ -", + "answerOptions": [ + { + "answerText": "āĻ•āύāĻœā§āϝ⧁āĻŽāĻžāϰ āĻ—ā§āϰ⧁āĻĒ", + "isCorrect": "true" + }, + { + "answerText": "āĻĒāĻžāχāĻĒ", + "isCorrect": "false" + }, + { + "answerText": "āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āϜāĻŋāĻ“āĻĢ⧇āĻ¨ā§āϏ āĻ•āϞ⧇ āĻĄāĻŋāĻĢāϞāϟ āĻ•āϤāϟ⧁āϕ⧁ āĻŦāĻžāĻĢāĻžāϰ āĻĨāĻžāϕ⧇ ?", + "answerOptions": [ + { + "answerText": "5m", + "isCorrect": "false" + }, + { + "answerText": "50m", + "isCorrect": "true" + }, + { + "answerText": "500m", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āϜāĻŋāĻ“āĻĢ⧇āĻ¨ā§āϏ⧇āϰ āϭ⧇āϤāϰ⧇ āĻĒā§Ÿā§‡āĻ¨ā§āϟāϗ⧁āϞ⧋āϰ āĻĻā§‚āϰāĻ¤ā§āĻŦ -", + "answerOptions": [ + { + "answerText": "0 āĻāϰ āĻ•āĻŽ ( āĻ‹āĻŖāĻžāĻ¤ā§āĻŽāĻ• āĻŽāĻžāύ)", + "isCorrect": "true" + }, + { + "answerText": " 0 āĻāϰ āĻŦ⧜ (āĻ§ā§āĻŦāύāĻžāĻ¤ā§āĻŽāĻ• āĻŽāĻžāύ)", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 29, + "title": "āϞ⧇āϏāύ ā§§ā§Ģ - āĻĢāϞ⧇āϰ āĻŽāĻžāύ āĻļāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀ āĻŽāĻĄā§‡āϞāϕ⧇ āĻŸā§āϰ⧇āχāύāĻŋāĻ‚ āĻĻā§‡ā§ŸāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻžāϕ⧇ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ āϏ⧇āĻ¨ā§āϏāϰ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§Ÿ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĢāϞāϗ⧁āϞ⧋āϕ⧇ āĻļā§āϰ⧇āύāĻŋāĻŦāĻĻā§āϧ āĻ•āϰ⧇ āϏāĻžāϜāĻžāύ⧋ āϝāĻžā§Ÿ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻ¸ā§āĻĨāĻŋāϰāϚāĻŋāĻ¤ā§āϰ āĻŦāĻž āχāĻŽā§‡āϜ-āύāĻŋāĻ°ā§āĻ­āϰ āĻ•ā§ƒāĻ¤ā§āϰāĻŋāĻŽ āĻŦ⧁āĻĻā§āϧāĻŋāĻŽāĻ¤ā§āϤāĻž (AI) āĻŽāĻĄā§‡āϞāϗ⧁āϞ⧋ āϖ⧁āĻŦāχ āϜāϟāĻŋāϞ āĻāĻŦāĻ‚ āĻāϗ⧁āϞ⧋āϕ⧇ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāύ⧋ āϏāĻŽā§ŸāϏāĻžāĻ§ā§āϝ āϝ⧇āĻ–āĻžāύ⧇ āĻšāĻžāϜāĻžāϰ āĻšāĻžāϜāĻžāϰ āχāĻŽā§‡āϜ/āĻ›āĻŦāĻŋ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 30, + "title": "āϞ⧇āϏāύ ā§§ā§Ģ - āĻĢāϞ⧇āϰ āĻŽāĻžāύ āĻļāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀ āĻŽāĻĄā§‡āϞāϕ⧇ āĻŸā§āϰ⧇āχāύāĻŋāĻ‚ āĻĻā§‡ā§ŸāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻ­āĻŋāĻļāύ⧇āϰ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻŸā§‡āĻ•āύāĻŋāϕ⧇ āĻ…āĻ˛ā§āĻĒ āĻ•āĻŋāϛ⧁ āĻ›āĻŦāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽāĻĄā§‡āϞāϕ⧇ āĻŸā§āϰāĻžāχāύ āĻ•āϰāĻžāύ⧋ āĻšā§Ÿ -", + "answerOptions": [ + { + "answerText": "Transformational learning", + "isCorrect": "false" + }, + { + "answerText": "Transaction learning", + "isCorrect": "false" + }, + { + "answerText": "Transfer learning", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻ›āĻŦāĻŋ āĻļā§āϰ⧇āύāĻŋāĻŦāĻĻā§āϧāĻ•āĻžāϰ⧀ (Image classifiers) āϕ⧇ āύāĻŋāĻŽā§āύ⧇āϰ āϕ⧋āύāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāύ⧋ āϝāĻžā§Ÿ -", + "answerOptions": [ + { + "answerText": "āĻĒā§āϰāϤāĻŋ āĻŸā§āϝāĻžāϗ⧇ āϕ⧇āĻŦāϞ ā§§āϟāĻŋ āĻ›āĻŦāĻŋ", + "isCorrect": "false" + }, + { + "answerText": "āĻĒā§āϰāϤāĻŋ āĻŸā§āϝāĻžāϗ⧇ āĻ…āĻ¨ā§āϤāϤ ā§ĢāϟāĻŋ āĻ›āĻŦāĻŋ", + "isCorrect": "true" + }, + { + "answerText": "āĻĒā§āϰāϤāĻŋ āĻŸā§āϝāĻžāϗ⧇ āĻ…āĻ¨ā§āϤāϤ ā§Ģā§ĻāϟāĻŋ āĻ›āĻŦāĻŋ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āϝ⧇ āĻšāĻžāĻ°ā§āĻĄāĻ“ā§Ÿā§āϝāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻŽāĻĄā§‡āϞāϕ⧇ āĻĻā§āϰ⧁āϤ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāύ⧋ āϝāĻžā§Ÿ āĻāĻŦāĻ‚ Xbox āĻ āϏ⧁āĻ¨ā§āĻĻāϰ āĻ—ā§āϰāĻžāĻĢāĻŋāĻ•ā§āϏ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰ⧇ āϏ⧇āϟāĻŋāϰ āύāĻžāĻŽ -", + "answerOptions": [ + { + "answerText": "PGU", + "isCorrect": "false" + }, + { + "answerText": "GPU", + "isCorrect": "true" + }, + { + "answerText": "PUG", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 31, + "title": "āϞ⧇āϏāύ ā§§ā§Ŧ - āφāχāĻ“āϟāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻĢāϞ⧇āϰ āĻŽāĻžāύ āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "IoT āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞ⧋ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻŽāϤ⧋ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āύ⧟ ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āϏ⧇āĻ¨ā§āϏāϰāϗ⧁āϞ⧋ āĻĢāĻŋāĻ˛ā§āĻŽ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϚāĻŋāĻ¤ā§āϰ āϧāĻžāϰāĻŖ āĻ•āϰ⧇", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āϏ⧇āĻ¨ā§āϏāϰāϗ⧁āϞ⧋ āϕ⧋āύ āϧāϰāϪ⧇āϰ āĻĄā§‡āϟāĻž āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇ -", + "answerOptions": [ + { + "answerText": "āĻĄāĻŋāϜāĻŋāϟāĻžāϞ", + "isCorrect": "true" + }, + { + "answerText": "āĻāύāĻžāϞāĻ—", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 32, + "title": "āϞ⧇āϏāύ ā§§ā§Ŧ - āφāχāĻ“āϟāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āĻĢāϞ⧇āϰ āĻŽāĻžāύ āĻļāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻ­āĻŋāĻļāύ āĻŽāĻĄā§‡āϞ⧇āϰ āĻĒāĻžāĻŦāϞāĻŋāĻļāĻĄ āĻŦāĻž āĻĒā§āϰāĻ•āĻžāĻļāĻŋāϤ āϏāĻ‚āĻ¸ā§āĻ•āϰāĻŖ (version) āϕ⧇ āĻŦāϞāĻž āĻšā§Ÿ -", + "answerOptions": [ + { + "answerText": "Iteration", + "isCorrect": "true" + }, + { + "answerText": "Instance", + "isCorrect": "false" + }, + { + "answerText": "Iguana", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻļā§āϰ⧇āĻŖāĻŋāĻŦāĻĻā§āϧāϰāĻŖ (classification) āĻāϰ āϜāĻ¨ā§āϝ āϝāĻ–āύ āχāĻŽā§‡āϜ āĻĒāĻžāĻ āĻžāύ⧋ āĻšā§Ÿ, āϤāĻ–āύ āĻāϗ⧁āϞ⧋ āĻĻāĻŋā§Ÿā§‡ āĻŽāĻĄā§‡āϞāϕ⧇ āĻĒ⧁āύāϰāĻžā§Ÿ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāύ⧋ āϝāĻžā§Ÿ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻ•ā§āϝāĻžāĻĒāϚāĻžāϰ āĻ•āϰāĻž āχāĻŽā§‡āϜ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽāĻĄā§‡āϞāϗ⧁āϞ⧋āϕ⧇ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāϰ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āύ⧇āχ āĻ•āĻžāϰāĻŖ āϏāĻžāϧāĻžāϰāĻŖ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻāĻŦāĻ‚ āĻĢā§‹āύ āĻ•ā§āϝāĻžāĻŽā§‡āϰāĻž āĻāĻ•āχ āĻŽāĻžāύ⧇āϰ āĻ›āĻŦāĻŋ āĻĻā§‡ā§Ÿ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 33, + "title": "āϞ⧇āϏāύ 17 - āĻĢāϞ āĻļāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀ āĻŽāĻĄā§‡āϞāϕ⧇ Edge āĻ āϰāĻžāύ āĻ•āϰāĻžāύ⧋ : āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "Edge computing āϤ⧁āϞāύāĻžāĻŽā§‚āϞāĻ•āĻ­āĻžāĻŦ⧇ cloud computing āĻāϰ āϚāĻžāχāϤ⧇ āĻŦ⧇āĻļāĻŋ āύāĻŋāϰāĻžāĻĒāĻĻ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Edge āĻāϰ āϤ⧁āϞāύāĻžā§Ÿ āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻŽāĻĄā§‡āϞāϗ⧁āϞ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āϤāĻžāϰ āĻĢāϞāĻžāĻĢāϞ⧇ āϭ⧁āϞ⧇āϰ āĻŽāĻžāύ āĻŦ⧇āĻļāĻŋ āĻšā§Ÿ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝ", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Edge āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞ⧋āϰ āϏāĻŽāϏāĻŽā§Ÿ āχāĻ¨ā§āϟāĻžāϰāύ⧇āϟ āĻ•āĻžāύ⧇āĻ•āĻļāύ āĻĻāϰāĻ•āĻžāϰ.", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 34, + "title": "āϞ⧇āϏāύ 17 - āĻĢāϞ āĻļāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀ āĻŽāĻĄā§‡āϞāϕ⧇ Edge āĻ āϰāĻžāύ āĻ•āϰāĻžāύ⧋ : āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "Edge āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻ•āĻžāĻ¸ā§āϟāĻŽ āĻ­āĻŋāĻļāύ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻŽāĻĄā§‡āϞāϗ⧁āϞ⧋ āϰāĻžāύ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧋āύ āϧāϰāϪ⧇āϰ āĻĢāϰāĻŽā§āϝāĻžāϟ āĻŦāĻž āĻĄā§‹āĻŽā§‡āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻĻāϰāĻ•āĻžāϰ āĻšāĻŦ⧇ ?", + "answerOptions": [ + { + "answerText": "General", + "isCorrect": "false" + }, + { + "answerText": "Quick Training", + "isCorrect": "false" + }, + { + "answerText": "Standard", + "isCorrect": "false" + }, + { + "answerText": "Compact", + "isCorrect": "true" + }, + { + "answerText": "Food", + "isCorrect": "false" + }, + { + "answerText": "Remote Deployment", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻ•āύāĻŸā§‡āχāύāĻžāϰ āϕ⧀?", + "answerOptions": [ + { + "answerText": "Self-contained āĻāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϝ⧇āϗ⧁āϞ⧋āϤ⧇ āĻŽā§‡āĻļāĻŋāύ-āϞāĻžāĻ°ā§āύāĻŋāĻ‚āĻŽāĻĄā§‡āϞ āĻĨāĻžāϕ⧇", + "isCorrect": "false" + }, + { + "answerText": "Self-contained āĻāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϝ⧇āϗ⧁āϞ⧋ āĻ…āĻ¨ā§āϝ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āϤ⧁āϞāύāĻžā§Ÿ āĻ¸ā§āĻŦāϤāĻ¨ā§āĻ¤ā§āϰāĻ­āĻžāĻŦ⧇ āϰāĻžāύ āĻ•āϰ⧇", + "isCorrect": "true" + }, + { + "answerText": "Self-contained āĻāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϝ⧇āϗ⧁āϞ⧋ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ Edge āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āϰāĻžāύ āĻ•āϰ⧇", + "isCorrect": "false" + }, + { + "answerText": "self-contained applications āĻāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϝ⧇āϗ⧁āϞ⧋ āĻ•ā§āϞāĻžāωāĻĄ āĻāĻŦāĻ‚ Edge āĻĄāĻŋāĻ­āĻžāχāϏ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰ⧇", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Edge āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϚāϞāĻž āĻ•āĻžāĻ¸ā§āϟāĻŽāĻ­āĻŋāĻļāύ āĻŽāĻĄā§‡āϞ āĻĻāĻŋā§Ÿā§‡ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϕ⧇ āĻĒ⧁āύāϰāĻžā§Ÿ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāύ⧋ āϝāĻžā§Ÿ?", + "answerOptions": [ + { + "answerText": "Edge āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻ›āĻŦāĻŋ āϤ⧋āϞāĻž, āϤāĻž āϏ⧇āĻ–āĻžāύ⧇ āϏ⧇āχāĻ­ āĻ•āϰāĻž āĻāĻŦāĻ‚ ML model āϕ⧇ new image folder āĻāϰ āĻĻāĻŋāϕ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻ•āϰāĻž", + "isCorrect": "false" + }, + { + "answerText": "Edge āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āχāĻŽā§‡āϜ āφāĻĒāϞ⧋āĻĄ āĻ•āϰāĻž, āĻ•āĻžāĻ¸ā§āϟāĻŽāĻ­āĻŋāĻļāύ āĻŽāĻĄā§‡āϞ āĻĻāĻŋā§Ÿā§‡ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϕ⧇ āĻĒ⧁āύāϰāĻžā§Ÿ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻž, āϤāĻžāϰāĻĒāϰ āφāĻŦāĻžāϰ⧋ āĻāϟāĻŋāϕ⧇ EDGE āĻ āĻĄā§‡āĻĒā§āϞ⧟ āĻ•āϰāĻž", + "isCorrect": "true" + }, + { + "answerText": "Edge āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻ›āĻŦāĻŋ āϤ⧋āϞāĻž āĻāĻŦāĻ‚ āĻ­āĻŦāĻŋāĻˇā§āϝāĻĻā§āĻŦāĻžāĻŖā§€ (Prediction) āĻāϰ āφāωāϟāĻĒ⧁āϟ āĻĻ⧇āĻ–āĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 35, + "title": "āϞ⧇āϏāύ 18 - Trigger fruit quality detection from a sensor: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "Which part of your IoT application gathers data?", + "answerOptions": [ + { + "answerText": "Things", + "isCorrect": "true" + }, + { + "answerText": "Cloud services", + "isCorrect": "false" + }, + { + "answerText": "Edge devices", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āφāχāĻ“āϟāĻŋ āĻāĻĒā§āϞāĻŋāϕ⧇āĻļāύ⧇āϰ āφāωāϟāĻĒ⧁āϟ āϕ⧇āĻŦāϞ āĻāĻ•āĻšā§ā§Ÿā§‡āϟāϰ⧇āχ āφāϏ⧇ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āϏāĻŦāĻ•āĻŋāϛ⧁āϕ⧇ āϏāϰāĻžāϏāϰāĻŋ āφāχāĻ“āϟāĻŋ āĻšāĻžāĻŦ⧇ āĻ•āĻžāύ⧇āĻ•ā§āϟ āĻ•āϰāĻžāϰ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ āύ⧇āχ, āĻŦāϰāĻ‚ āϗ⧇āϟāĻ“ā§Ÿā§‡ āĻšāĻŋāϏ⧇āĻŦ⧇ EDGE āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞ⧋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§Ÿ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 36, + "title": "āϞ⧇āϏāύ ā§§ā§Ž - āϏ⧇āĻ¨ā§āϏāϰ āĻĻā§āĻŦāĻžāϰāĻž āĻĢāϞ⧇āϰ āĻŽāĻžāύ āĻļāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀āϕ⧇ āĻŸā§āϰāĻŋāĻ—āĻžāϰ āĻ•āϰāĻž : āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": " āφāχāĻ“āϟāĻŋ āĻāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϤ⧈āϰ⧀āϰ ā§ŠāϟāĻŋ āωāĻĒāĻžāĻĻāĻžāύ āĻšāϞ⧋-", + "answerOptions": [ + { + "answerText": "Things, Insights, Actions", + "isCorrect": "true" + }, + { + "answerText": "Things, Internet, Databases", + "isCorrect": "false" + }, + { + "answerText": "AI, Blockchain, FizzBuzzers", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āϝ⧇ āωāĻĒāĻžāĻĻāĻžāύāϟāĻŋ 'things' āĻāϰ āĻŽāĻ§ā§āϝ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ— āϰāĻ•ā§āώāĻž āĻ•āϰ⧇ āĻāĻŦāĻ‚ 'insights' āĻŦāĻž āĻĢāϞāĻžāĻĢāϞ āĻĻā§‡ā§Ÿ, āϏ⧇āϟāĻŋ āĻšāϞ⧋ - ", + "answerOptions": [ + { + "answerText": "Azure Functions", + "isCorrect": "false" + }, + { + "answerText": "IoT Hub", + "isCorrect": "true" + }, + { + "answerText": "Azure Maps", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Flight proximity āϏ⧇āĻ¨ā§āϏāϰ⧇āϰ āϟāĻžāχāĻŽāĻŋāĻ‚ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ work?", + "answerOptions": [ + { + "answerText": " āĻāϗ⧁āϞ⧋ āϞ⧇āϜāĻžāϰ āĻŦā§€āĻŽ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ•āϤ āϏāĻŽā§Ÿ āĻĒāϰ āϕ⧋āύ āĻŦāĻ¸ā§āϤ⧁ āĻĨ⧇āϕ⧇ āĻĢ⧇āϰāϤ āφāϏ⧇ āϤāĻž āĻšāĻŋāϏ⧇āĻŦ āĻ•āϰ⧇ ", + "isCorrect": "true" + }, + { + "answerText": "āĻāϗ⧁āϞ⧋ āĻļāĻŦā§āĻĻ āĻĒā§āϰ⧇āϰāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ•āϤ āϏāĻŽā§Ÿ āĻĒāϰ āϕ⧋āύ āĻŦāĻ¸ā§āϤ⧁ āĻĨ⧇āϕ⧇ āϤāĻž āĻĢ⧇āϰāϤ āφāϏ⧇ āϤāĻžāϰ āĻšāĻŋāϏ⧇āĻŦ āĻ•āϰ⧇", + "isCorrect": "false" + }, + { + "answerText": "āĻ…āύ⧇āĻ• āϞāĻŽā§āĻŦāĻž āϰ⧁āϞāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 37, + "title": "āϞ⧇āϏāύ ⧧⧝ - āĻ¸ā§āϟāĻ• āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻ• (Stock Detector) āĻŽāĻĄā§‡āϞ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāύ⧋: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "AI āĻŽāĻĄā§‡āϞāϗ⧁āϞ⧋āϕ⧇ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāĻŦ⧇āύāĻž?", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "IoT āĻāĻŦāĻ‚ AI āϖ⧁āϚāϰāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§Ÿ-", + "answerOptions": [ + { + "answerText": "āϕ⧇āĻŦāϞ āĻ¸ā§āϟāĻ• āĻšā§‡āĻ• āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻ…āύ⧇āĻ•āϧāϰāϪ⧇āϰ āĻ•āĻžāĻœā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§Ÿ āϝ⧇āĻŽāύāσ āĻ¸ā§āϟāĻ• āĻšā§‡āĻ•, āĻĒā§āĻ°ā§Ÿā§‹āϜāύāĻŽāĻžāĻĢāĻŋāĻ• āĻŽāĻžāĻ¸ā§āĻ• āĻŽāύāĻŋāϟāϰ āĻ•āϰāĻž, āĻĢ⧁āϟāĻĢāϞ āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻ…āĻŸā§‹āĻŽā§‡āϟāĻŋāĻ• āĻŦāĻŋāϞ āϤ⧈āϰ⧀", + "isCorrect": "true" + }, + { + "answerText": "IoT āĻāĻŦāĻ‚ AI āϖ⧁āϚāϰāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿā§‡ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§ŸāύāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": " āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻĄāĻŋāĻŸā§‡āĻ•āĻļāύ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšā§Ÿ ", + "answerOptions": [ + { + "answerText": "āϕ⧋āύ āϚāĻŋāĻ¤ā§āϰ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāϗ⧁āϞāĻŋ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āĻāĻŦāĻ‚ āϤāĻžāĻĻ⧇āϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ āĻāĻŦāĻ‚ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝāϤāĻž āĻŸā§āĻ°ā§āϝāĻžāĻ• āĻ•āϰāĻž", + "isCorrect": "true" + }, + { + "answerText": "āϕ⧇āĻŦāϞ āχāĻŽā§‡āϜ āĻĨ⧇āϕ⧇ āĻŦāĻ¸ā§āϤ⧁āϰ āϏāĻ‚āĻ–ā§āϝāĻž āĻ—āĻŖāύāĻž", + "isCorrect": "false" + }, + { + "answerText": "āχāĻŽā§‡āϜāϗ⧁āϞ⧋ āĻļā§āϰ⧇āĻŖāĻŋāĻŦāĻĻā§āϧ (Classify) āĻ•āϰāĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 38, + "title": "āϞ⧇āϏāύ ⧧⧝ - āĻ¸ā§āϟāĻ• āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻ• (Stock Detector) āĻŽāĻĄā§‡āϞ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāύ⧋: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "Object detectors āϗ⧁āϞ⧋ āϕ⧇āĻŦāϞ ā§§āϟāĻŋ āϰ⧇āϜāĻžāĻ˛ā§āϟ āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰ⧇, āϤāĻž āϏ⧇ āϝāϤāϟāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟāχ āĻĄāĻŋāĻŸā§‡āĻ•ā§āϟ āĻ•āϰ⧁āĻ•", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻ•āĻžāĻ¸ā§āϟāĻŽāĻ­āĻŋāĻļāύ āĻĻā§āĻŦāĻžāϰāĻž āĻ¸ā§āϟāĻ• āĻ—āĻŖāύāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧋āύ āĻĄā§‹āĻŽā§‡āχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āϏāĻ°ā§āĻŦā§‹āĻ¤ā§āϤāĻŽ?", + "answerOptions": [ + { + "answerText": "General", + "isCorrect": "false" + }, + { + "answerText": "Food", + "isCorrect": "false" + }, + { + "answerText": "Products on shelves", + "isCorrect": "true" + } + ] + }, + { + "questionText": " ā§§āϟāĻŋ object detector āϕ⧇ āĻŸā§āϰ⧇āχāύ āĻ•āϰāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻ…āĻ¨ā§āϤāϤ āĻ•ā§ŸāϟāĻŋ āχāĻŽā§‡āϜ āĻĻāϰāĻ•āĻžāϰ?", + "answerOptions": [ + { + "answerText": "1", + "isCorrect": "false" + }, + { + "answerText": "15", + "isCorrect": "true" + }, + { + "answerText": "100", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 39, + "title": "āϞ⧇āϏāύ 20 - āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĻā§āĻŦāĻžāϰāĻž āĻ¸ā§āϟāĻ• āĻšā§‡āĻ• āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "IoT devices āϗ⧁āϞ⧋ object detectors āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻŽāϤ āĻĒāĻžāĻ“ā§ŸāĻžāϰāĻĢ⧁āϞ āύ⧟", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Object detectors āĻĨ⧇āϕ⧇ āϝāĻž āĻĒāĻžāχ:", + "answerOptions": [ + { + "answerText": " āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻāϰ āϏāĻ‚āĻ–ā§āϝāĻž", + "isCorrect": "false" + }, + { + "answerText": "āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻāϰ āϏāĻ‚āĻ–ā§āϝāĻž āĻāĻŦāĻ‚ āϞ⧋āϕ⧇āĻļāύ", + "isCorrect": "false" + }, + { + "answerText": "āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻāϰ āϏāĻ‚āĻ–ā§āϝāĻž, āϞ⧋āϕ⧇āĻļāύ āĻāĻŦāĻ‚ āϏāĻŽā§āĻ­āĻžāĻŦā§āϝāϤāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Object detectors āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāĻ–ā§‹āρāϜ āĻ¸ā§āϟāĻ•āϗ⧁āϞ⧋ āϖ⧁āρāĻœā§‡ āϰ⧋āĻŦāϟ āĻĻā§āĻŦāĻžāϰāĻž āϏ⧇āϗ⧁āϞ⧋ āĻ āĻŋāĻ• āĻ•āϰāĻž āϝāĻžā§Ÿ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 40, + "title": "āϞ⧇āϏāύ ⧍ā§Ļ - āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĻā§āĻŦāĻžāϰāĻž āĻ¸ā§āϟāĻ• āĻšā§‡āĻ• āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻ¸ā§āϟāĻ• āĻ—āĻŖāύāĻžāϰ āϜāĻ¨ā§āϝ āφāĻŽāĻžāĻĻ⧇āϰ āϕ⧇āĻŦāϞ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻāϰ āϏāĻ‚āĻ–ā§āϝāĻžāχ āĻŦāĻŋāĻŦ⧇āϚāύāĻžā§Ÿ āφāύāϞ⧇āχ āĻšāĻŦ⧇", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Bounding boxes āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§Ÿ -", + "answerOptions": [ + { + "answerText": "āĻļāϤāĻ•āϰāĻž āύāĻŋāĻ°ā§āĻ­āϰ āĻ¸ā§āĻĨāĻžāύāĻžāĻ‚āĻ•āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžā§Ÿ", + "isCorrect": "true" + }, + { + "answerText": "āĻĒāĻŋāĻ•ā§āϏ⧇āϞ āύāĻŋāĻ°ā§āĻ­āϰ āĻ¸ā§āĻĨāĻžāύāĻžāĻ‚āĻ•āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžā§Ÿ", + "isCorrect": "false" + }, + { + "answerText": "āϏ⧇āĻ¨ā§āϟāĻŋāĻŽāĻŋāϟāĻžāϰ āύāĻŋāĻ°ā§āĻ­āϰ āĻ¸ā§āĻĨāĻžāύāĻžāĻ‚āĻ•āĻŦā§āϝāĻŦāĻ¸ā§āĻĨāĻžā§Ÿ", + "isCorrect": "false" + } + ] + }, + { + "questionText": " āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āĻ“āĻ­āĻžāϰāĻ˛ā§āϝāĻžāĻĒ āĻ•āϰāϞ⧇ āϤāĻž āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰ⧇?", + "answerOptions": [ + { + "answerText": "āĻšā§āϝāĻžāρ", + "isCorrect": "true" + }, + { + "answerText": "āύāĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 41, + "title": "āϞ⧇āϏāύ ⧍⧧ - āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĻā§āĻŦāĻžāϰāĻž āĻ¸ā§āĻĒā§€āϚ āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĻā§āĻŦāĻžāϰāĻž āĻ¸ā§āĻĒā§€āϚ āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻž āϝāĻžā§Ÿ āσ", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻ­ā§Ÿā§‡āϏ āĻāϏāĻŋāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϟāϗ⧁āϞ⧋āϰ āωāϚāĻŋāϤ āϏāĻ•āϞ āĻ…āĻĄāĻŋāĻ“ āĻĒā§āϰāϏ⧇āϏāĻŋāĻ‚ āĻāϰ āϜāĻ¨ā§āϝ āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻĒāĻžāĻ āĻžāύ⧋", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻ¸ā§āĻĒā§€āϚ āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻžāϰ āϜāĻ¨ā§āϝ IoT āĻĄāĻŋāĻ­āĻžāχāϏāϗ⧁āϞ⧋āϰ āĻŦ⧜ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĢā§‹āύ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ-", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 42, + "title": "āϞ⧇āϏāύ 21 - āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĻā§āĻŦāĻžāϰāĻž āĻ¸ā§āĻĒā§€āϚ āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻž : āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻŽāĻžāχāĻ•ā§āϰ⧋āĻĢā§‹āύ āϕ⧋āύ āϧāϰāϪ⧇āϰ āϏ⧇āĻ¨ā§āϏāϰ ?", + "answerOptions": [ + { + "answerText": "āĻĄāĻŋāϜāĻŋāϟāĻžāϞ", + "isCorrect": "false" + }, + { + "answerText": " āĻāύāĻžāϞāĻ—", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻļāĻŦā§āĻĻ āϏāĻ‚āϕ⧇āϤāϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻĄāĻŋāϜāĻŋāϟāĻžāϞ āϏāĻŋāĻ—āĻ¨ā§āϝāĻžāϞ⧇ āϰ⧂āĻĒāĻžāĻ¨ā§āϤāϰ āĻ•āϰāĻž āϝāĻžā§Ÿ ?", + "answerOptions": [ + { + "answerText": "Pulse Code Modulation", + "isCorrect": "true" + }, + { + "answerText": "Pure Code Multiplication", + "isCorrect": "false" + }, + { + "answerText": "Pulse Width Maximization", + "isCorrect": "false" + } + ] + }, + { + "questionText": "ā§§ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ 16-bit āĻāϰ āĻ…āĻĄāĻŋāĻ“ āϕ⧇ 16KHz āĻ āĻ¸ā§āϝāĻžāĻŽā§āĻĒāϞ āĻ•āϰāĻž āĻšāϞ⧇, āϤāĻž āĻ•āϤ āĻŦ⧜ ?", + "answerOptions": [ + { + "answerText": "1KB", + "isCorrect": "false" + }, + { + "answerText": "16KB", + "isCorrect": "false" + }, + { + "answerText": "32KB", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 43, + "title": "āϞ⧇āϏāύ ⧍⧍ - āĻ­āĻžāώāĻž āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻ­āĻžāώāĻž āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻžāϰ āϜāĻ¨ā§āϝ āĻ•āĻŋāϛ⧁ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻļāĻŦā§āĻĻ āĻŦā§‹āĻāĻž āϜāϰ⧁āϰ⧀", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "āĻ­āĻžāώāĻž āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ -", + "answerOptions": [ + { + "answerText": "āϕ⧋āύ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻŦāĻžāĻ•ā§āϝ⧇ āĻ¸ā§āĻŦāϤāĻ¨ā§āĻ¤ā§āϰ āĻ•āĻŋāϛ⧁ āĻļāĻŦā§āĻĻ āĻĻ⧇āϖ⧇ āϤāĻžāϰ āĻ…āĻ°ā§āĻĨ āĻŦā§‹āĻāĻž", + "isCorrect": "false" + }, + { + "answerText": "āφāϗ⧇ āĻĨ⧇āϕ⧇āχ āĻŦā§‹āĻāĻžāύ⧋ āĻŦāĻžāĻ•ā§āϝāϗ⧁āϞ⧋ āϖ⧁āρāĻœā§‡ āĻ…āĻ°ā§āĻĨ āĻŦā§‹āĻāĻž", + "isCorrect": "false" + }, + { + "answerText": "āĻĒ⧁āϰ⧋ āĻŦāĻžāĻ•ā§āϝ āĻĻ⧇āϖ⧇ āĻļāĻŦā§āĻĻāϗ⧁āϞ⧋āϰ āĻĒ⧇āĻ›āύ⧇āϰ āĻ•āύāĻŸā§‡āĻ•ā§āϏāϟ āĻĨ⧇āϕ⧇ āĻ…āĻ°ā§āĻĨ āĻŦā§‹āĻāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": " āĻ•ā§āϞāĻžāωāĻĄ āĻĒā§āϰ⧋āĻ­āĻžāχāĻĄāĻžāϰāĻĻ⧇āϰ āĻ•āĻžāϛ⧇ AI āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āĻ°ā§Ÿā§‡āϛ⧇ āϝ⧇āϗ⧁āϞ⧋ āĻ­āĻžāώāĻž āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰ⧇", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 44, + "title": "āϞ⧇āϏāύ ⧍⧍ - āĻ­āĻžāώāĻž āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "ā§§āϟāĻŋ āĻŦāĻžāĻ•ā§āϝāϕ⧇ āĻŦā§‹āĻāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ­āĻžāĻ™āĻž āĻšā§Ÿ -", + "answerOptions": [ + { + "answerText": "Ideas and explanations", + "isCorrect": "false" + }, + { + "answerText": "Intents and entities", + "isCorrect": "true" + }, + { + "answerText": "Imps and elves", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻ­āĻžāώāĻž āĻŦā§‹āĻāĻžāϰ āϜāĻ¨ā§āϝ āĻŦā§āϝāĻŦāĻšā§ƒāϤ Microsoft service āϕ⧇ āĻŦāϞāĻž āĻšā§Ÿ", + "answerOptions": [ + { + "answerText": "LUIS", + "isCorrect": "true" + }, + { + "answerText": "Luigi", + "isCorrect": "false" + }, + { + "answerText": "Jarvis", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻāĻ–āĻžāύ⧇ 'set a 3 minute timer' āĻŦāĻžāĻ•ā§āϝāϟāĻŋāϤ⧇ -", + "answerOptions": [ + { + "answerText": "āĻāĻ–āĻžāύ⧇ āχāĻ¨ā§āĻŸā§‡āĻ¨ā§āϟ āĻšāϞ⧋ 3 minutes āĻāĻŦāĻ‚ āĻāύāϟāĻŋāϟāĻŋ āĻšāϞ⧋ a timer", + "isCorrect": "false" + }, + { + "answerText": "āĻāĻ–āĻžāύ⧇ āχāĻ¨ā§āĻŸā§‡āĻ¨ā§āϟ āĻšāϞ⧋ minutes, āĻāĻŦāĻ‚ āĻāύāϟāĻŋāϟāĻŋ āĻšāϞ⧋ 3 timers", + "isCorrect": "false" + }, + { + "answerText": "āĻāĻ–āĻžāύ⧇ āχāĻ¨ā§āĻŸā§‡āĻ¨ā§āϟ āĻšāϞ⧋ set a timer āĻāĻŦāĻ‚ āĻāύāϟāĻŋāϟāĻŋ āĻšāϞ⧋ 3 minutes", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 45, + "title": "āϞ⧇āϏāύ ā§¨ā§Š - āϟāĻžāχāĻŽāĻžāϰ āϏ⧇āϟ āĻ•āϰ⧇ āĻŽā§ŒāĻ–āĻŋāĻ• āĻĢā§€āĻĄāĻŦā§āϝāĻžāĻ• āĻĻā§‡ā§ŸāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "AI āĻĨ⧇āϕ⧇ āĻŽā§ŒāĻ–āĻŋāĻ• āĻŦāĻ•ā§āϤāĻŦā§āϝ āϤ⧈āϰ⧀ āĻ•āϰāϞ⧇ āϏ⧇āϗ⧁āϞ⧋ āĻāĻ•āĻ˜ā§‡āĻā§Ÿā§‡ āĻāĻŦāĻ‚ āϰ⧋āĻŦā§‹āϟāĻŋāĻ•", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "AI model āϗ⧁āϞ⧋ āϕ⧇āĻŦāϞ American English āĻāχ āĻŦāĻ•ā§āϤāĻŦā§āϝ āϤ⧈āϰ⧀ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "AI model āϗ⧁āϞ⧋ '1234' āϞ⧇āĻ–āĻžāϟāĻŋāϕ⧇ āϕ⧋āύ āĻŽā§ŒāĻ–āĻŋāĻ• āĻŦāĻ•ā§āϤāĻŦā§āϝ⧇ āĻĒāϰāĻŋāĻŖāϤ āĻ•āϰāĻŦ⧇?", + "answerOptions": [ + { + "answerText": "One two three four", + "isCorrect": "false" + }, + { + "answerText": "One thousand two hundred and thirty four", + "isCorrect": "false" + }, + { + "answerText": "āĻāϟāĻŋ 'one two three four' āĻŦāĻž 'one thousand two hundred and thirty four' āϝ⧇āϕ⧋āύāϟāĻŋāχ āĻšāϤ⧇ āĻĒāĻžāϰ⧇, āĻ•āύāĻŸā§‡āĻ•ā§āϏāϟ āĻāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋāϤ⧇", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 46, + "title": "āϞ⧇āϏāύ ā§¨ā§Š - āϟāĻžāχāĻŽāĻžāϰ āϏ⧇āϟ āĻ•āϰ⧇ āĻŽā§ŒāĻ–āĻŋāĻ• āĻĢā§€āĻĄāĻŦā§āϝāĻžāĻ• āĻĻā§‡ā§ŸāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻŽā§ŒāĻ–āĻŋāĻ• āϤ⧈āϰ⧀āϰ ā§ŠāϟāĻŋ āĻ—āĻ āύāĻ—āϤ āĻ…āĻ‚āĻļ āĻšāϞ⧋-", + "answerOptions": [ + { + "answerText": "āĻŸā§‡āĻ•ā§āϏāϟ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ, āϏ⧇āχ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰāĻž, āĻļāĻŦā§āĻĻ āϤ⧈āϰ⧀", + "isCorrect": "false" + }, + { + "answerText": "āĻŸā§‡āĻ•ā§āϏāϟ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ, āĻ­āĻžāώāĻžāĻ—āϤ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ, āĻ—āĻžāĻ āύāĻŋāĻ• āϏāĻ‚āϕ⧇āϤ āϤ⧈āϰ⧀", + "isCorrect": "true" + }, + { + "answerText": "āĻļāĻŦā§āĻĻ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ, āĻ…āĻĄāĻŋāĻ“ āϤ⧈āϰ⧀", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻŦāĻ•ā§āϤāĻŦā§āϝ āϤ⧈āϰ⧀āĻ•āĻžāϰ⧀ āĻŽāĻĄā§‡āϞāϗ⧁āϞ⧋ āϏāĻ¤ā§āϝāĻŋāĻ•āĻžāϰ⧇āϰ āĻŽāĻžāύ⧁āώ⧇āϰ āĻŽāϤ āĻ•āĻĨāĻž āĻŦāϞāϤ⧇ āĻĒāĻžāϰ⧇ -", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āĻŦāĻ•ā§āϤāĻŦā§āϝ āĻāύāϕ⧋āĻĄ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϝ⧇ āĻŽāĻžāĻ°ā§āĻ•-āφāĻĒ āĻ˛ā§āϝāĻžāĻ‚āĻ—ā§ā§Ÿā§‡āϜ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšā§Ÿ, āϏ⧇āϟāĻŋ āĻšāϞ⧋ -", + "answerOptions": [ + { + "answerText": "SSML", + "isCorrect": "true" + }, + { + "answerText": "MSSL", + "isCorrect": "false" + }, + { + "answerText": "SpeechXML", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 47, + "title": "āϞ⧇āϏāύ 24 - āĻāĻ•āĻžāϧāĻŋāĻ• āĻ­āĻžāώāĻž āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒā§‚āĻ°ā§āĻŦāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻ­āĻžāώāĻž āĻŦā§‹āĻāĻžāϰ āĻŽāĻžāύ⧇ āĻšāϞ⧋ āχāĻ‚āϰ⧇āϜāĻŋ āĻŦā§‹āĻāĻž", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + }, + { + "questionText": "AI speech to text models understand multiple languages:", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "true" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "AI āĻ…āύ⧁āĻŦāĻžāĻĻ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻļāĻŦā§āĻĻāĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻ…āύ⧁āĻŦāĻžāĻĻ āĻšā§Ÿ-", + "answerOptions": [ + { + "answerText": "āϏāĻ¤ā§āϝ", + "isCorrect": "false" + }, + { + "answerText": "āĻŽāĻŋāĻĨā§āϝāĻž", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 48, + "title": "āϞ⧇āϏāύ ⧍ā§Ē - āĻāĻ•āĻžāϧāĻŋāĻ• āĻ­āĻžāώāĻž āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāĻž: āϞ⧇āĻ•āϚāĻžāϰ-āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϕ⧁āχāϜ", + "quiz": [ + { + "questionText": "āĻŽā§‡āĻļāĻŋāύ āĻŸā§āϰāĻžāĻ¨ā§āϏāϞ⧇āĻļāύ āύāĻŋā§Ÿā§‡ āĻ—āĻŦ⧇āώāĻŖāĻž āĻ•āϰāĻž āĻšāĻšā§āϛ⧇ āĻ•āϤ āĻŦāĻ›āϰ āϧāϰ⧇ -", + "answerOptions": [ + { + "answerText": "ā§­ā§Ļ āĻŦāĻ›āϰ", + "isCorrect": "true" + }, + { + "answerText": "ā§§ā§­ āĻŦāĻ›āϰ", + "isCorrect": "false" + }, + { + "answerText": "ā§­ āĻŦāĻ›āϰ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "AI āĻ­āĻžāώāĻž āĻ…āύ⧁āĻŦāĻžāĻĻāĻ•āϗ⧁āϞ⧋āϕ⧇ āĻŦāϞāĻž āĻšā§Ÿ -", + "answerOptions": [ + { + "answerText": "Noddy translators", + "isCorrect": "false" + }, + { + "answerText": "Neural translators", + "isCorrect": "true" + }, + { + "answerText": "AI āĻĻāĻŋā§Ÿā§‡ āĻ…āύ⧁āĻŦāĻžāĻĻ āĻ•āϰāĻž āϝāĻžā§ŸāύāĻž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "āϕ⧋āύ alien āĻ­āĻžāώāĻžāϗ⧁āĻ˛ā§‹ā§āϕ⧇ Microsoft translator āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰ⧇ -", + "answerOptions": [ + { + "answerText": "Na'vi", + "isCorrect": "false" + }, + { + "answerText": "Alienese", + "isCorrect": "false" + }, + { + "answerText": "Klingon", + "isCorrect": "true" + } + ] + } + ] } ] } diff --git a/quiz-app/src/assets/translations/en.json b/quiz-app/src/assets/translations/en.json index ef77fc3a..055f10be 100644 --- a/quiz-app/src/assets/translations/en.json +++ b/quiz-app/src/assets/translations/en.json @@ -413,7 +413,7 @@ "title": "Lesson 5 - Predict plant growth: Pre-Lecture Quiz", "quiz": [ { - "questionText": "Iot devices can be used to support agriculture", + "questionText": "IoT devices can be used to support agriculture", "answerOptions": [ { "answerText": "True", @@ -515,7 +515,7 @@ "title": "Lesson 6 - Detect soil moisture: Pre-Lecture Quiz", "quiz": [ { - "questionText": "Iot devices can be used to detect ambient properties like soil moisture", + "questionText": "IoT devices can be used to detect ambient properties like soil moisture", "answerOptions": [ { "answerText": "True", @@ -621,7 +621,7 @@ "title": "Lesson 7 - Automated plant watering: Pre-Lecture Quiz", "quiz": [ { - "questionText": "Iot devices are powerful enough to control water pumps", + "questionText": "IoT devices are powerful enough to control water pumps", "answerOptions": [ { "answerText": "True", @@ -2392,7 +2392,7 @@ "isCorrect": "false" }, { - "answerText": "false", + "answerText": "False", "isCorrect": "true" } ] diff --git a/quiz-app/src/assets/translations/index.js b/quiz-app/src/assets/translations/index.js index 1f118787..08cd4e01 100644 --- a/quiz-app/src/assets/translations/index.js +++ b/quiz-app/src/assets/translations/index.js @@ -2,6 +2,7 @@ import ar from './ar.json'; import bn from './bn.json'; import en from './en.json'; +import zh_cn from './zh-cn.json'; //export const defaultLocale = 'en'; @@ -9,6 +10,7 @@ const messages = { ar: ar[0], bn: bn[0], en: en[0], + "zh-cn": zh_cn[0], }; export default messages; diff --git a/quiz-app/src/assets/translations/zh-cn.json b/quiz-app/src/assets/translations/zh-cn.json new file mode 100644 index 00000000..54ba2e86 --- /dev/null +++ b/quiz-app/src/assets/translations/zh-cn.json @@ -0,0 +1,2461 @@ +[ + { + "title": "éĸ向初å­Ļč€…įš„į‰Šč”įŊ‘īŧˆIoTīŧ‰åŧ€å‘īŧšå°æĩ‹énj", + "complete": "恭喜äŊ īŧŒåŽŒæˆäē†čŋ™ä¸Ēæĩ‹énjīŧ", + "error": "寚不čĩˇīŧŒč¯ˇé‡č¯•", + "quizzes": [ + { + "id": 1, + "title": "įŦŦ1č¯ž - į‰Šč”įŊ‘īŧˆIoTīŧ‰įŽ€äģ‹īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTä¸­įš„IäģŖčĄ¨īŧš", + "answerOptions": [ + { + "answerText": "įŊ‘įģœīŧˆInternetīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "é“ąå…ƒį´ īŧˆIridiumīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "ᆍįƒĢīŧˆIroningīŧ‰", + "isCorrect": "false" + } + ] + }, + { + "questionText": "捎äŧ°čŽĄ2020åš´æœĢ大įēĻæœ‰å¤šå°‘æ­Ŗåœ¨äŊŋį”¨ä¸­įš„IoTčŽžå¤‡īŧŸ", + "answerOptions": [ + { + "answerText": "30ä¸Ē", + "isCorrect": "false" + }, + { + "answerText": "3000万", + "isCorrect": "false" + }, + { + "answerText": "300äēŋ", + "isCorrect": "true" + } + ] + }, + { + "questionText": "æ™ēčƒŊ手æœē是IoTčŽžå¤‡", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 2, + "title": "įŦŦ1č¯ž - į‰Šč”įŊ‘īŧˆIoTīŧ‰įŽ€äģ‹īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "IoTčŽžå¤‡éœ€čρ䏀ᛴčŋžæŽĨį€įŊ‘įģœ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "IoTčŽžå¤‡æ€ģæ˜¯åŽ‰å…¨įš„", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äēēåˇĨæ™ēčƒŊīŧˆAIīŧ‰å¯äģĨ在äŊŽåŠŸč€—įš„IoTčŽžå¤‡ä¸­čŋčĄŒ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 3, + "title": "įŦŦ2č¯ž - æˇąå…Ĩäē†č§Ŗį‰Šč”įŊ‘īŧˆIoTīŧ‰īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTä¸­įš„TäģŖčĄ¨", + "answerOptions": [ + { + "answerText": "æ™ļäŊ“įŽĄīŧˆTransistorsīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "ä¸‡į‰ŠīŧˆThingsīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "įĢ鸥īŧˆTurkeysīŧ‰", + "isCorrect": "false" + } + ] + }, + { + "questionText": "IoTčŽžå¤‡äŊŋᔍäģ€äšˆčŽˇå–å…ļå‘¨å›´ä¸–į•Œįš„äŋĄæ¯īŧŸ", + "answerOptions": [ + { + "answerText": "äŧ æ„Ÿå™¨", + "isCorrect": "true" + }, + { + "answerText": "æ‰§čĄŒå™¨", + "isCorrect": "false" + }, + { + "answerText": "äŋĄé¸Ŋ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "IoTčŽžå¤‡é€šå¸¸æ¯”å°åŧį”ĩč„‘æˆ–įŦ”čްæœŦį”ĩč„‘æ›´č€—į”ĩ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 4, + "title": "įŦŦ2č¯ž - æˇąå…Ĩäē†č§Ŗį‰Šč”įŊ‘īŧˆIoTīŧ‰īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "一ä¸ĒCPU指äģ¤å‘¨æœŸįš„三ä¸Ēæ­ĨéĒ¤åŒ…æ‹Ŧīŧš", + "answerOptions": [ + { + "answerText": "蝑᠁īŧŒæ‰§čĄŒīŧŒæå–", + "isCorrect": "false" + }, + { + "answerText": "提取īŧŒč¯‘᠁īŧŒæ‰§čĄŒ", + "isCorrect": "true" + }, + { + "answerText": "停æ­ĸīŧŒåˆäŊœīŧŒå€žåŦ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "æ ‘čŽ“æ´žīŧˆRaspberry Piīŧ‰čŋčĄŒäģ€äšˆæ“äŊœįŗģįģŸīŧŸ", + "answerOptions": [ + { + "answerText": "æ˛Ąæœ‰æ“äŊœįŗģįģŸ", + "isCorrect": "false" + }, + { + "answerText": "Windows 95", + "isCorrect": "false" + }, + { + "answerText": "Raspberry Pi OS", + "isCorrect": "true" + } + ] + }, + { + "questionText": "IoTčŽžå¤‡é€šå¸¸æ¯”å°åŧčŽĄįŽ—æœē和įŦ”čްæœŦčŽĄįŽ—æœēčŋčĄŒåž—æ›´åŋĢ且需čĻæ›´å¤šįš„å†…å­˜", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 5, + "title": "įŦŦ3č¯ž - 通čŋ‡äŧ æ„Ÿå™¨åŠæ‰§čĄŒå™¨å’Œį‰Šč´¨ä¸–į•Œäē¤äē’īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "发光ä猿žįŽĄīŧˆLEDīŧ‰æ˜¯äŧ æ„Ÿå™¨", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äŧ æ„Ÿå™¨čĸĢᔍæĨīŧš", + "answerOptions": [ + { + "answerText": "æ”ļ集æĨč‡Ēį‰Šč´¨ä¸–į•Œįš„æ•°æŽã€‚", + "isCorrect": "true" + }, + { + "answerText": "控åˆļį‰Šč´¨ä¸–į•Œã€‚", + "isCorrect": "false" + }, + { + "answerText": "åĒᔍæĨᛑæĩ‹æ¸ŠåēĻ。", + "isCorrect": "false" + } + ] + }, + { + "questionText": "æ‰§čĄŒå™¨čĸĢᔍæĨīŧš", + "answerOptions": [ + { + "answerText": "æ”ļ集æĨč‡Ēį‰Šč´¨ä¸–į•Œįš„æ•°æŽã€‚", + "isCorrect": "false" + }, + { + "answerText": "控åˆļį‰Šč´¨ä¸–į•Œã€‚", + "isCorrect": "true" + }, + { + "answerText": "čŽĄįŽ—äŋé™Šįš„éŖŽé™Šã€‚", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 6, + "title": "įŦŦ3č¯ž - 通čŋ‡äŧ æ„Ÿå™¨åŠæ‰§čĄŒå™¨å’Œį‰Šč´¨ä¸–į•Œäē¤äē’īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "数字äŧ æ„Ÿå™¨äģĨäģ€äšˆæ–šåŧäŧ é€’数捎īŧŸ", + "answerOptions": [ + { + "answerText": "čŋžįģ­į”ĩåŽ‹čŒƒå›´", + "isCorrect": "false" + }, + { + "answerText": "äģ…é̘äŊŽį”ĩåšŗ", + "isCorrect": "true" + }, + { + "answerText": "į”ĩ子邎äģļ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åŊ“按锎čĸĢæŒ‰ä¸‹æ—ļäŧšå‘送äģ€äšˆæ•°å­—äŋĄåˇīŧŸ", + "answerOptions": [ + { + "answerText": "0", + "isCorrect": "false" + }, + { + "answerText": "1", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äŊ å¯äģĨäŊŋį”¨æ•°å­—å™¨äģļįš„č„‰å†˛åŽŊåēĻ调åˆļīŧˆPWMīŧ‰åŠŸčƒŊ控åˆļæ¨Ąæ‹Ÿæ‰§čĄŒå™¨", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 7, + "title": "įŦŦ4č¯ž - 将äŊ įš„čŽžå¤‡čŋžæŽĨ到äē’联įŊ‘īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTčŽžå¤‡éœ€čρ䏀ᛴčŋžį€įŊ‘į윿‰čƒŊåˇĨäŊœ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "IoTčŽžå¤‡å’ŒįŊ‘įģœåē”į”¨åŠįŊ‘įģœAPIä¸€æ ˇīŧŒæ€ģ是äŊŋᔍHTTPæĨ通äŋĄ", + "answerOptions": [ + { + "answerText": "错蝝", + "isCorrect": "true" + }, + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "IoTčŽžå¤‡äžčĩ–ä瑿Ĩåšå†ŗį­–", + "answerOptions": [ + { + "answerText": "错蝝", + "isCorrect": "true" + }, + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 8, + "title": "įŦŦ4č¯ž - 将äŊ įš„čŽžå¤‡čŋžæŽĨ到äē’联įŊ‘īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "äģŽäŧ æ„Ÿå™¨é‡‡é›†æ•°æŽåšļäŧ åˆ°äē‘į̝åĢ做īŧš", + "answerOptions": [ + { + "answerText": "éĨæĩ‹īŧˆTelemetryīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "指äģ¤īŧˆCommandīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "æĩ‹é‡īŧˆMeasurementīŧ‰", + "isCorrect": "false" + } + ] + }, + { + "questionText": "因IoTčŽžå¤‡įĻģįēŋå¯ŧč‡´æŒ‡äģ¤ä¸å¯čžžæ—ļåē”č¯Ĩ怎䚈办īŧš", + "answerOptions": [ + { + "answerText": "æ€ģæ˜¯åœ¨čŽžå¤‡æĸ复在įēŋæ—ļ重äŧ ", + "isCorrect": "false" + }, + { + "answerText": "åŗäŊŋčŽžå¤‡æĸ复在įēŋīŧŒäšŸä¸é‡äŧ ", + "isCorrect": "false" + }, + { + "answerText": "å–å†ŗäēŽæŒ‡äģ¤ã€čŽžå¤‡åŠIoTåē”į”¨įš„éœ€æą‚īŧŒä¸čƒŊ一æĻ‚č€ŒčŽē", + "isCorrect": "true" + } + ] + }, + { + "questionText": "æļˆæ¯é˜Ÿåˆ—éĨæĩ‹äŧ čž“īŧˆMQTTīŧ‰æœ‰æļˆæ¯é˜Ÿåˆ—", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 9, + "title": "įŦŦ5č¯ž - éĸ„æĩ‹æ¤į‰Šį”Ÿé•ŋīŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTčŽžå¤‡å¯äģĨᔍæĨ支援农业", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "æ¤į‰Šéœ€čĻįš„ä¸œčĨŋ包æ‹Ŧīŧšīŧˆč¯ˇé€‰æ‹Šæœ€äŊŗé€‰éĄšīŧ‰", + "answerOptions": [ + { + "answerText": "ä猿°§åŒ–įĸŗã€æ°´ã€å…ģ分", + "isCorrect": "false" + }, + { + "answerText": "ä猿°§åŒ–įĸŗã€æ°´ã€å…ģ分、光", + "isCorrect": "false" + }, + { + "answerText": "ä猿°§åŒ–įĸŗã€æ°´ã€å…ģåˆ†ã€å…‰ã€é€‚åŽœįš„æ¸ŠåēĻ", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äŧ æ„Ÿå™¨å¯šäēŽå‘čžžå›ŊåŽļįš„å†œæ°‘æĨ蝴čŋ‡äēŽæ˜‚č´ĩ", + "answerOptions": [ + { + "answerText": "错蝝", + "isCorrect": "true" + }, + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 10, + "title": "įŦŦ5č¯ž - éĸ„æĩ‹æ¤į‰Šį”Ÿé•ŋīŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "æ¤į‰Šįš„į”Ÿé•ŋå–å†ŗäēŽæ¸ŠåēĻ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "æ¤į‰Šį”Ÿé•ŋ需čĻč€ƒč™‘įš„æ¸ŠåēĻ包æ‹Ŧīŧš", + "answerOptions": [ + { + "answerText": "最äŊŽæ¸Šã€æœ€éĢ˜æ¸Š", + "isCorrect": "false" + }, + { + "answerText": "æ¤į‰Šå‘č‚˛čĩˇį‚šæ¸ŠåēĻ、最适渊åēĻ、最éĢ˜æ¸Š", + "isCorrect": "true" + }, + { + "answerText": "äģ…æœ€éĢ˜æ¸Š", + "isCorrect": "false" + } + ] + }, + { + "questionText": "äģĨ下å“Ēä¸Ēå…Ŧåŧå¯äģĨčŽĄįŽ—æœ‰æ•ˆį§¯æ¸Šīŧš", + "answerOptions": [ + { + "answerText": "(æ—Ĩ内最éĢ˜æ¸Š + æ—Ĩ内最äŊŽæ¸Š) - æ¤į‰Šå‘č‚˛čĩˇį‚šæ¸ŠåēĻ", + "isCorrect": "false" + }, + { + "answerText": "((æ—Ĩ内最éĢ˜æ¸Š + æ—Ĩ内最äŊŽæ¸Š) / 2) - æ¤į‰Šå‘č‚˛čĩˇį‚šæ¸ŠåēĻ", + "isCorrect": "true" + }, + { + "answerText": "((æ—Ĩ内最äŊŽæ¸Š + æ¤į‰Šå‘č‚˛čĩˇį‚šæ¸ŠåēĻ) / 2)", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 11, + "title": "įŦŦ6č¯ž - æŖ€æĩ‹åœŸåŖ¤æ°´åˆ†īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTčŽžå¤‡å¯čĸĢᔍæĨæŖ€æĩ‹åĻ‚åœŸåŖ¤æ°´åˆ†äš‹įąģįš„įŽ¯åĸƒåąžæ€§", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "äģĨ下å“Ēä¸€éĄšå¯čƒŊå¯ŧč‡´æ¤į‰Šį”Ÿé•ŋ问éĸ˜īŧˆé€‰ä¸€éĄšīŧ‰?", + "answerOptions": [ + { + "answerText": "æĩ‡æ°´å¤Ē少", + "isCorrect": "false" + }, + { + "answerText": "æĩ‡æ°´å¤Ē多", + "isCorrect": "false" + }, + { + "answerText": "æĩ‡æ°´å¤Ē少或å¤Ē多", + "isCorrect": "true" + } + ] + }, + { + "questionText": "æ‰€æœ‰įš„äŧ æ„Ÿå™¨éƒŊ栚捎标准单äŊéĸ„先标åޚåĨŊäē†", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 12, + "title": "įŦŦ6č¯ž - æŖ€æĩ‹åœŸåŖ¤æ°´åˆ†īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "在æĩ‹é‡åœŸåŖ¤æ°´åˆ†įš„æ—ļ候īŧŒį”ĩé˜ģåŧå’Œį”ĩ厚åŧæšŋåēĻäŧ æ„Ÿå™¨įš„一ä¸Ēä¸åŒį‚šæ˜¯īŧš", + "answerOptions": [ + { + "answerText": "åŊ“æšŋåēĻ升éĢ˜įš„æ—ļ候īŧŒį”ĩé˜ģåŧäŧ æ„Ÿå™¨įš„į”ĩ压升é̘īŧŒį”ĩ厚åŧäŧ æ„Ÿå™¨įš„į”ĩ压降äŊŽ", + "isCorrect": "true" + }, + { + "answerText": "åŊ“æšŋåēĻ升éĢ˜įš„æ—ļ候īŧŒį”ĩé˜ģåŧäŧ æ„Ÿå™¨įš„į”ĩ压降äŊŽīŧŒį”ĩ厚åŧäŧ æ„Ÿå™¨įš„į”ĩ压升é̘", + "isCorrect": "false" + }, + { + "answerText": "åŊ“æšŋåēĻ升éĢ˜įš„æ—ļ候īŧŒį”ĩé˜ģåŧå’Œį”ĩ厚åŧäŧ æ„Ÿå™¨įš„į”ĩ压éƒŊ升é̘", + "isCorrect": "false" + } + ] + }, + { + "questionText": "SPIåčŽŽæ”¯æŒīŧš", + "answerOptions": [ + { + "answerText": "äģ…一ä¸Ē控åˆļ器和一ä¸Ēå¤–čŽž", + "isCorrect": "false" + }, + { + "answerText": "äģ…一ä¸Ē控åˆļ器äŊ†å¯äģĨ有多ä¸Ēå¤–čŽž", + "isCorrect": "true" + }, + { + "answerText": "多ä¸Ē控åˆļ器和多ä¸Ēå¤–čŽž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "I2CåčŽŽæ”¯æŒīŧš", + "answerOptions": [ + { + "answerText": "äģ…一ä¸Ē控åˆļ器和一ä¸Ēå¤–čŽž", + "isCorrect": "false" + }, + { + "answerText": "äģ…一ä¸Ē控åˆļ器äŊ†å¯äģĨ有多ä¸Ēå¤–čŽž", + "isCorrect": "false" + }, + { + "answerText": "多ä¸Ē控åˆļ器和多ä¸Ēå¤–čŽž", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 13, + "title": "įŦŦ7č¯ž - č‡ĒåŠ¨æ¤į‰Šæĩ‡æ°´īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTčŽžå¤‡įš„åŠŸįŽ‡čļŗäģĨį›´æŽĨ控åˆļæ°´æŗĩ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "æ‰§čĄŒå™¨å¯äģĨ控åˆļå…ļåŽƒčŽžå¤‡įš„į”ĩæē", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "äŧ æ„Ÿå™¨å¯äģĨįĢ‹åŗæŖ€æĩ‹åˆ°æ‰§čĄŒå™¨įš„变化", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 14, + "title": "įŦŦ7č¯ž - č‡ĒåŠ¨æ¤į‰Šæĩ‡æ°´īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "įģ§į”ĩ器是äģ€äšˆįąģåž‹įš„åŧ€å…ŗīŧš", + "answerOptions": [ + { + "answerText": "į”ĩ子åŧ€å…ŗīŧˆElectricalīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "æœēį”ĩåŧ€å…ŗīŧˆElectromechanicalīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "æœēæĸ°åŧ€å…ŗīŧˆMechanicalīŧ‰", + "isCorrect": "false" + } + ] + }, + { + "questionText": "įģ§į”ĩå™¨å…čŽ¸īŧš", + "answerOptions": [ + { + "answerText": "äŊŽåŠŸįŽ‡įš„čŽžå¤‡æŽ§åˆļéĢ˜åŠŸįŽ‡įš„čŽžå¤‡", + "isCorrect": "true" + }, + { + "answerText": "éĢ˜åŠŸįŽ‡įš„čŽžå¤‡æŽ§åˆļäŊŽåŠŸįŽ‡įš„čŽžå¤‡", + "isCorrect": "false" + }, + { + "answerText": "čŋåŠ¨å‘˜čˇ‘ä¸€åœēæŽĨ力čĩ›", + "isCorrect": "false" + } + ] + }, + { + "questionText": "æ‰§čĄŒå™¨æ€ģ是寚äŧ æ„Ÿå™¨įš„č¯ģ取įĢ‹åŗåšå‡ē反åē”", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 15, + "title": "įŦŦ8č¯ž - 将äŊ įš„æ¤į‰Ščŋį§ģ到äē‘į̝īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "åŧ€æ”žįš„MQTTæļˆæ¯äģŖį†é€‚åˆį”¨äēŽå•†ä¸šIoTéĄšį›Ž", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äē‘čŽĄįŽ—å…čŽ¸äŊ īŧš", + "answerOptions": [ + { + "answerText": "åĒčƒŊ᧟čĩčŽĄįŽ—æœē", + "isCorrect": "false" + }, + { + "answerText": "åĒčƒŊ᧟čĩčŽĄįŽ—æœē和åē”į”¨åšŗå°", + "isCorrect": "false" + }, + { + "answerText": "᧟čĩčŽĄįŽ—æœē、åē”į”¨åšŗå°ã€čŊ¯äģļã€æ— æœåŠĄå™¨čŽĄįŽ—åšŗå°äģĨ及å…ļåŽƒæœåŠĄ", + "isCorrect": "true" + } + ] + }, + { + "questionText": "有多åŽļäē‘åšŗå°äž›åē”商æ‹Ĩæœ‰éå¸ƒå…­å¤§æ´˛čŽ¸å¤šå›ŊåŽļįš„æ•°æŽä¸­åŋƒ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 16, + "title": "įŦŦ8č¯ž - 将äŊ įš„æ¤į‰Ščŋį§ģ到äē‘į̝īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "ä¸ēä熿ާåˆļæ‰§čĄŒå™¨äģĨ及äģŽIoTčŽžå¤‡čŽˇå–åéψīŧŒį¨‹åēäģŖį å¯äģĨäŊŋᔍīŧš", + "answerOptions": [ + { + "answerText": "äģŽčŽžå¤‡åˆ°äē‘åšŗå°įš„æļˆæ¯", + "isCorrect": "false" + }, + { + "answerText": "čŽžå¤‡å­Ēį”Ÿīŧˆdevice twinsīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "į›´æŽĨæ–šæŗ•č¯ˇæą‚", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äģģäŊ•čŽžå¤‡éƒŊ可äģĨäģĨä¸åŽ‰å…¨įš„æ–šåŧčŋžæŽĨIoT中åŋƒ", + "answerOptions": [ + { + "answerText": "错蝝", + "isCorrect": "true" + }, + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "IoT中åŋƒįš„名字åŋ…éĄģæ˜¯å”¯ä¸€įš„", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 17, + "title": "įŦŦ9č¯ž - 将äŊ įš„åē”ᔍፋåēé€ģ辑čŋį§ģ到äē‘į̝īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "æ— æœåŠĄå™¨čŽĄįŽ—äģŖį å¯äģĨᔍæĨ回åē”IoTäē‹äģļ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åŊ“IoTäē‹äģļ发送到IoT中åŋƒīŧš", + "answerOptions": [ + { + "answerText": "åĒ有一ä¸ĒæœåŠĄå¯äģĨäģŽIoT中åŋƒč¯ģ取äē‹äģļ", + "isCorrect": "false" + }, + { + "answerText": "äģģæ„å¤šįš„æœåŠĄå¯äģĨäģŽIoT中åŋƒč¯ģ取äē‹äģļ", + "isCorrect": "true" + }, + { + "answerText": "æœåŠĄæ— æŗ•äģŽIoT中åŋƒč¯ģ取äē‹äģļīŧŒåރäģŦåĒčƒŊå’ŒčŽžå¤‡į›´čŋž", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åĒ有čŋčĄŒåœ¨äē‘įĢ¯įš„äģŖį æ‰čƒŊäģŽIoT中åŋƒč¯ģ取äē‹äģļ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 18, + "title": "įŦŦ9č¯ž - 将äŊ įš„åē”ᔍፋåēé€ģ辑čŋį§ģ到äē‘į̝īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "Azure Functions可äģĨ在æœŦ地čŋčĄŒå’Œč°ƒč¯•", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "æ— æœåŠĄå™¨čŽĄįŽ—äģŖį åĒčƒŊäŊŋᔍJavaScript和COBOLįŧ–写", + "answerOptions": [ + { + "answerText": "错蝝", + "isCorrect": "true" + }, + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "ä¸ēäē†éƒ¨įŊ˛Functionsåē”į”¨åˆ°äē‘į̝īŧŒéœ€čĻåˆ›åģē和部įŊ˛īŧš", + "answerOptions": [ + { + "answerText": "äģ…Functionsåē”ᔍ", + "isCorrect": "false" + }, + { + "answerText": "äģ…Functionsåē”į”¨å’Œå­˜å‚¨č´Ļæˆˇ", + "isCorrect": "false" + }, + { + "answerText": "Functionsåē”į”¨ã€å­˜å‚¨č´ĻæˆˇäģĨ及åē”ᔍፋåēé…įŊŽ", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 19, + "title": "įŦŦ10č¯ž - įĄŽäŋäŊ įš„æ¤į‰Šåމ免īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTčŽžå¤‡æ€ģæ˜¯åŽ‰å…¨įš„", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "å°šæ— å……åˆ†č¯æŽčĄ¨æ˜Žéģ‘åŽĸåˇ˛æˆåŠŸåˆŠį”¨IoTčŽžå¤‡éģ‘å…ĨįŊ‘įģœ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "可äģĨ将IoTčŽžå¤‡įš„connection string分äēĢįģ™äģģäŊ•äēē", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 20, + "title": "įŦŦ10č¯ž - įĄŽäŋäŊ įš„æ¤į‰Šåމ免īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "å¯šį§°å¯†é’ĨåŠ å¯†į›¸æ¯”äēŽéžå¯šį§°å¯†é’Ĩ加密īŧš", + "answerOptions": [ + { + "answerText": "å¯šį§°å¯†é’ĨåŠ å¯†æ¯”éžå¯šį§°å¯†é’Ĩ加密æ…ĸ", + "isCorrect": "false" + }, + { + "answerText": "å¯šį§°å¯†é’ĨåŠ å¯†æ¯”éžå¯šį§°å¯†é’Ĩ加密厉全", + "isCorrect": "false" + }, + { + "answerText": "å¯šį§°å¯†é’ĨåŠ å¯†æ¯”éžå¯šį§°å¯†é’Ĩ加密åŋĢīŧŒäŊ†į›¸å¯šä¸åމ免", + "isCorrect": "true" + }, + { + "answerText": "å¯šį§°å¯†é’ĨåŠ å¯†æ¯”éžå¯šį§°å¯†é’Ĩ加密æ…ĸīŧŒäŊ†į›¸å¯šåމ免", + "isCorrect": "false" + } + ] + }, + { + "questionText": "č‡Ēį­žåįš„X.509蝁äšĻé€‚åˆį”Ÿäē§įޝåĸƒ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "X.509蝁äšĻīŧš", + "answerOptions": [ + { + "answerText": "不åē”č¯Ĩ在IoTčŽžå¤‡äš‹é—´å…ąäēĢ", + "isCorrect": "false" + }, + { + "answerText": "可äģĨåœ¨čŽžå¤‡äš‹é—´å…ąäēĢ", + "isCorrect": "true" + }, + { + "answerText": "åē”åŊ“åĻĨ善äŋįŽĄīŧŒä¸čƒŊčĸĢäģģäŊ•čŽžå¤‡äŊŋᔍ", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 21, + "title": "įŦŦ11č¯ž - äŊįŊŽčŋŊč¸Ēīŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "可äģĨäŊŋᔍäģ€äšˆæ ‡čްäŊ įš„äŊįŊŽ", + "answerOptions": [ + { + "answerText": "äģ…ᔍįēŦåēĻ", + "isCorrect": "false" + }, + { + "answerText": "äģ…ᔍįģåēĻ", + "isCorrect": "false" + }, + { + "answerText": "įģįēŦåēĻ", + "isCorrect": "true" + } + ] + }, + { + "questionText": "čƒŊ够čŋŊč¸ĒäŊįŊŽäŋĄæ¯įš„äŧ æ„Ÿå™¨åĢ做īŧš", + "answerOptions": [ + { + "answerText": "GPS", + "isCorrect": "true" + }, + { + "answerText": "PGP", + "isCorrect": "false" + }, + { + "answerText": "GIF", + "isCorrect": "false" + } + ] + }, + { + "questionText": "čŋŊč¸ĒčŊĻčž†įš„äŊįŊŽäŋĄæ¯æ˜¯æ˛Ąæœ‰æ„äš‰įš„", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 22, + "title": "įŦŦ11č¯ž - äŊįŊŽčŋŊč¸Ēīŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "äŧ æ„Ÿå™¨åĻ‚äŊ•äŧ čž“GPS数捎īŧš", + "answerOptions": [ + { + "answerText": "äŊŋᔍįģįēŦåēĻ", + "isCorrect": "false" + }, + { + "answerText": "äŊŋį”¨åœ°å€", + "isCorrect": "false" + }, + { + "answerText": "NMEA蝭åĨ", + "isCorrect": "true" + } + ] + }, + { + "questionText": "č‡ŗå°‘éœ€čρ几éĸ—åĢ星GPS才čƒŊ垈åĨŊ地厚äŊäŊ ", + "answerOptions": [ + { + "answerText": "1", + "isCorrect": "false" + }, + { + "answerText": "2", + "isCorrect": "false" + }, + { + "answerText": "3", + "isCorrect": "true" + } + ] + }, + { + "questionText": "GPS通čŋ‡äģ€äšˆå‘į”Ÿæ•°æŽīŧš", + "answerOptions": [ + { + "answerText": "SPIæŽĨåŖ", + "isCorrect": "false" + }, + { + "answerText": "ä¸˛åŖīŧˆUARTīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "į”ĩ子邎äģļ", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 23, + "title": "įŦŦ12č¯ž - 存储äŊįŊŽæ•°æŽīŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoT数捎äŋå­˜åœ¨IoT中åŋƒ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "数捎可čĸĢ分ä¸ēäģĨ下å“Ē两įąģ", + "answerOptions": [ + { + "answerText": "äēŒčŋ›åˆļå¤§å¯ščąĄīŧˆBlobīŧ‰å’ŒčĄ¨æ•°æŽīŧˆtableīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "į쓿ž„化数捎īŧˆStructured dataīŧ‰å’Œéžį쓿ž„化数捎īŧˆUnstructured dataīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "įēĸå’Œč“", + "isCorrect": "false" + } + ] + }, + { + "questionText": "可äģĨäŊŋį”¨æ— æœåŠĄå™¨čŽĄįŽ—äģŖį å°†IoT数捎写å…Ĩ数捎åē“中", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 24, + "title": "įŦŦ12č¯ž - 存储äŊįŊŽæ•°æŽīŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "需čρčĸĢįĢ‹åŗå¤„į†įš„IoT数捎在å“Ēä¸Ēčˇ¯åž„ä¸Šīŧš", + "answerOptions": [ + { + "answerText": "įƒ­čˇ¯åž„īŧˆHotīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "æ¸Ščˇ¯åž„īŧˆWarmīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "å†ˇčˇ¯åž„īŧˆColdīŧ‰", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Azureå­˜å‚¨æœ‰ä¸‹åˆ—įš„å“Ēäē›įąģ型īŧš", + "answerOptions": [ + { + "answerText": "į›’å­ã€æĄļã€įŽąå­", + "isCorrect": "false" + }, + { + "answerText": "äēŒčŋ›åˆļå¤§å¯ščąĄã€čĄ¨ã€é˜Ÿåˆ—å’Œæ–‡äģļ", + "isCorrect": "true" + }, + { + "answerText": "įƒ­æ•°æŽã€æ¸Šæ•°æŽå’Œå†ˇæ•°æŽ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Azure Functions可äģĨįģ‘厚到数捎åē“äģĨ将čŋ”回å€ŧ写å…Ĩ数捎åē“", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 25, + "title": "įŦŦ13č¯ž - å¯č§†åŒ–äŊįŊŽæ•°æŽīŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "čļ…įē§å¤§įš„æ•°æŽčĄ¨æ˜¯ä¸€ä¸ĒåŋĢ速æŸĨæ‰žæ•°æŽįš„įŽ€å•æ–šæŗ•", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "GPS数捎可äģĨåœ¨åœ°å›žä¸Šå¯č§†åŒ–", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "在一ä¸Ēå¤§įš„åŒēåŸŸįš„åœ°å›žä¸ŠīŧŒæ— čŽēäģŽäŊ•处æĩ‹é‡īŧŒåœ°å›žä¸Šį›¸åŒįš„距įĻģæ€ģæ˜¯äģŖčĄ¨įŽ°åŽžä¸–į•Œįš„į›¸åŒįš„čˇįĻģ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 26, + "title": "įŦŦ13č¯ž - å¯č§†åŒ–äŊįŊŽæ•°æŽīŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "在įŊ‘éĄĩ上įģ˜åˆļåœ°å›žįš„æœåŠĄåĢ做", + "answerOptions": [ + { + "answerText": "Azure地回īŧˆAzure Mapsīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "Azure Atlas", + "isCorrect": "false" + }, + { + "answerText": "Azure World Visualizer", + "isCorrect": "false" + } + ] + }, + { + "questionText": "Azure地回äŊŋᔍäģ€äšˆįģ˜åˆļ数捎īŧš", + "answerOptions": [ + { + "answerText": "GeoJSON", + "isCorrect": "true" + }, + { + "answerText": "įģįēŦåēĻåˆ—čĄ¨", + "isCorrect": "false" + }, + { + "answerText": "åœ°å€åˆ—čĄ¨", + "isCorrect": "false" + } + ] + }, + { + "questionText": "可äģĨ通čŋ‡URLčŽˇå–äēŒčŋ›åˆļå¤§å¯ščąĄ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 27, + "title": "įŦŦ14č¯ž - åœ°į†å›´æ īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "可äģĨäŊŋᔍGPSåæ ‡æŖ€æĩ‹į‰ŠäŊ“是åĻåœ¨č§„åŽšįš„åŒē域里", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åŊ“čŽžå¤‡čŋ›å…Ĩ一ä¸Ēįģ™åŽšįš„åŒē域æ—ļīŧŒGPS厞įģį˛žįĄŽåˆ°čƒŊå¤Ÿæäž›ä¸€įąŗäģĨå†…įš„į˛žåēĻ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "在čŋŊč¸ĒčŊĻčž†įš„æ—ļå€™åœ°į†å›´æ å¯äģĨᔍäŊœīŧš", + "answerOptions": [ + { + "answerText": "äģ…čƒŊᔍäŊœįĄŽåޚčŊĻ辆äŊ•æ—ļčŋ›å…Ĩäē†įģ™åŽšįš„åŒē域", + "isCorrect": "false" + }, + { + "answerText": "äģ…čƒŊᔍäŊœįĄŽåޚčŊĻ辆äŊ•æ—ļįĻģåŧ€äē†įģ™åŽšįš„åŒē域", + "isCorrect": "false" + }, + { + "answerText": "įĄŽåŽščŊĻ辆äŊ•æ—ļčŋ›å…Ĩ或įĻģåŧ€äē†įģ™åŽšįš„åŒē域", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 28, + "title": "įŦŦ14č¯ž - åœ°į†å›´æ īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "ä¸ēäē†čŽŠå¤šä¸ĒæœåŠĄäģŽIoT中åŋƒčŽˇå–æ•°æŽīŧŒäŊ éœ€čĻåˆ›åģē多ä¸Ēīŧš", + "answerOptions": [ + { + "answerText": "æļˆč´šč€…įž¤įģ„īŧˆConsumer groupīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "įŽĄé“īŧˆPipeīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "IoT中åŋƒīŧˆHubīŧ‰", + "isCorrect": "false" + } + ] + }, + { + "questionText": "一ä¸Ēåœ°į†å›´æ č°ƒį”¨įš„éģ˜čŽ¤æœį´ĸįŧ“存是īŧš", + "answerOptions": [ + { + "answerText": "5m", + "isCorrect": "false" + }, + { + "answerText": "50m", + "isCorrect": "true" + }, + { + "answerText": "500m", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åœ°į†å›´æ ä¸­į‚šįš„čˇįĻģīŧš", + "answerOptions": [ + { + "answerText": "小äēŽ0īŧˆä¸€ä¸Ē负å€ŧīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "大äēŽ0īŧˆä¸€ä¸Ēæ­Ŗå€ŧīŧ‰", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 29, + "title": "įŦŦ15č¯ž - 莭į샿°´æžœč´¨é‡æŖ€æĩ‹å™¨īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "摄像头可äģĨᔍäŊœIoTįš„äŧ æ„Ÿå™¨", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "可äģĨį”¨æ‘„åƒå¤´į왿°´æžœåˆ†įąģ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åŸēäēŽå›žåƒįš„äēēåˇĨæ™ēčƒŊīŧˆAIīŧ‰æ¨Ąåž‹ååˆ†įš„复杂īŧŒčŽ­įģƒäšŸååˆ†č´šæ—ļīŧŒåšļ且需čρäŊŋį”¨æ•°äģĨä¸‡čŽĄįš„å›žį‰‡æ•°æŽ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 30, + "title": "įŦŦ15č¯ž - 莭į샿°´æžœč´¨é‡æŖ€æĩ‹å™¨īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "厚åˆļ视觉äŊŋį”¨įš„äģ…į”¨å°‘é‡å›žį‰‡čŽ­į샿¨Ąåž‹įš„æŠ€æœ¯åĢ做īŧš", + "answerOptions": [ + { + "answerText": "čŊŦæĸå­Ļäš īŧˆTransformational learningīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "ä礿˜“å­Ļäš īŧˆTransaction learningīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "čŋį§ģå­Ļäš īŧˆTransfer learningīŧ‰", + "isCorrect": "true" + } + ] + }, + { + "questionText": "å›žį‰‡åˆ†įąģįš„čŽ­įģƒīŧš", + "answerOptions": [ + { + "answerText": "每ä¸Ēæ ‡į­žå¯äģĨåĒᔍ1åŧ å›žį‰‡", + "isCorrect": "false" + }, + { + "answerText": "每ä¸Ēæ ‡į­žč‡ŗå°‘5åŧ å›žį‰‡", + "isCorrect": "true" + }, + { + "answerText": "每ä¸Ēæ ‡į­žč‡ŗå°‘50åŧ å›žį‰‡", + "isCorrect": "false" + } + ] + }, + { + "questionText": "čƒŊ够åŋĢ速训į샿œē器å­Ļäš īŧˆMLīŧ‰æ¨Ąåž‹īŧŒåšļčƒŊå¤ŸčŽŠXboxé‡Œįš„å›žåƒįœ‹ä¸ŠåŽģ非常华ä¸Ŋįš„įĄŦäģļåĢ做", + "answerOptions": [ + { + "answerText": "PGU", + "isCorrect": "false" + }, + { + "answerText": "GPU", + "isCorrect": "true" + }, + { + "answerText": "PUG", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 31, + "title": "įŦŦ16č¯ž - äģŽ IoT čŽžå¤‡æŖ€æŸĨæ°´æžœč´¨é‡īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTčŽžå¤‡čŋ˜æ˛Ąæœ‰åŧē大到čƒŊ够äŊŋį”¨æ‘„åƒå¤´", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "æ‘„åƒå¤´įš„äŧ æ„Ÿå™¨äŊŋᔍčƒļቇæĨ捕捉回像", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "æ‘„åƒå¤´įš„äŧ æ„Ÿå™¨äŧ é€’å“Ēį§įąģåž‹įš„æ•°æŽ", + "answerOptions": [ + { + "answerText": "数字数捎", + "isCorrect": "true" + }, + { + "answerText": "æ¨Ąæ‹Ÿæ•°æŽ", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 32, + "title": "įŦŦ16č¯ž - äģŽ IoT čŽžå¤‡æŖ€æŸĨæ°´æžœč´¨é‡īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "č‡ĒåŽšäš‰č§†č§‰įš„ä¸€ä¸Ēå‘å¸ƒį‰ˆæœŦåĢ做īŧš", + "answerOptions": [ + { + "answerText": "čŋ­äģŖīŧˆIterationīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "厞䞋īŧˆInstanceīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "čœĨ蜴", + "isCorrect": "false" + } + ] + }, + { + "questionText": "在įģ™å›žį‰‡åšåˆ†įąģįš„æ—ļ候īŧŒå¯äģĨį”¨åŽƒäģŦé‡æ–°čŽ­į샿¨Ąåž‹", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "不需čρäŊŋᔍIoTčŽžå¤‡é‡‡é›†įš„å›žåƒæ•°æŽæĨ莭į샿¨Ąåž‹īŧŒå› ä¸ēåŽƒįš„æ‘„åƒå¤´æœ‰å’Œæ‰‹æœēæ‘„åƒå¤´į›¸åŒįš„č´¨é‡", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 33, + "title": "įŦŦ17č¯ž - åœ¨čžšįŧ˜ä¸ŠčŋčĄŒäŊ įš„æ°´æžœč´¨é‡æŖ€æĩ‹å™¨īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "čžšįŧ˜čŽĄįŽ—å¯äģĨ比äē‘čŽĄįŽ—æ›´åŠ åŽ‰å…¨ã€‚", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åœ¨čžšįŧ˜čŠ‚į‚ščŋčĄŒįš„æœē器å­Ļäš æ¨Ąåž‹æ˛Ąæœ‰åœ¨äē‘į̝čŋčĄŒįš„æœē器å­Ļäš æ¨Ąåž‹å‡†įĄŽã€‚", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "čžšįŧ˜čŠ‚į‚šéœ€čρ䏀ᛴčŋžį€äē’联įŊ‘。", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 34, + "title": "įŦŦ17č¯ž - åœ¨čžšįŧ˜ä¸ŠčŋčĄŒäŊ įš„æ°´æžœč´¨é‡æŖ€æĩ‹å™¨īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "ä¸ēäē†čŽŠCustom Visionįš„æœē器å­Ļäš æ¨Ąåž‹éĢ˜æ•ˆåœ°čŋčĄŒåœ¨čžšįŧ˜čŠ‚į‚šīŧŒæˆ‘äģŦ需čρäģ€äšˆæ ŧåŧīŧˆæˆ–者蝴äģ€äšˆįąģåž‹įš„éĸ†åŸŸīŧˆdomainīŧ‰īŧ‰īŧŸ", + "answerOptions": [ + { + "answerText": "é€šį”¨įąģ型", + "isCorrect": "false" + }, + { + "answerText": "åŋĢ速训įģƒįąģ型", + "isCorrect": "false" + }, + { + "answerText": "标准īŧˆStandardīŧ‰įąģ型", + "isCorrect": "false" + }, + { + "answerText": "ᴧ凑īŧˆCompactīŧ‰įąģ型", + "isCorrect": "true" + }, + { + "answerText": "éŖŸį‰Šéĸ†åŸŸ", + "isCorrect": "false" + }, + { + "answerText": "čŋœį̝郍įŊ˛", + "isCorrect": "false" + } + ] + }, + { + "questionText": "厚器īŧˆcontainerīŧ‰æ˜¯äģ€äšˆīŧŸ?", + "answerOptions": [ + { + "answerText": "包åĢæœē器å­Ļäš æ¨Ąåž‹įš„č‡Ē包åĢįš„åē”ᔍፋåēã€‚", + "isCorrect": "false" + }, + { + "answerText": "和å…ļåŽƒį¨‹åēéš”įĻģįš„č‡Ē包åĢįš„åē”ᔍፋåē", + "isCorrect": "true" + }, + { + "answerText": "åĒåœ¨čžšįŧ˜čŠ‚į‚ščŋčĄŒįš„č‡Ē包åĢįš„åē”ᔍፋåē.", + "isCorrect": "false" + }, + { + "answerText": "处ᐆäē‘įĢ¯å’Œčžšįŧ˜čŠ‚į‚šé€šäŋĄįš„č‡Ē包åĢįš„åē”ᔍፋåē", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åĻ‚äŊ•é‡æ–°čŽ­įģƒéƒ¨įŊ˛åœ¨čžšįŧ˜čŠ‚į‚šįš„Custom Visionæ¨Ąåž‹īŧŸ", + "answerOptions": [ + { + "answerText": "åœ¨čžšįŧ˜čŠ‚į‚šæ‹æ‘„ä¸€åŧ å›žį‰‡īŧŒåšļ将å…ļäŋå­˜åœ¨čžšįŧ˜čŠ‚į‚šä¸ŠīŧŒå†å°†æœē器å­Ļäš æ¨Ąåž‹æŒ‡å‘čŋ™ä¸Ēæ–°įš„å›žį‰‡æ–‡äģļ多。", + "isCorrect": "false" + }, + { + "answerText": "å°†å›žį‰‡äģŽčžšįŧ˜čŠ‚į‚šä¸Šäŧ åˆ°äē‘į̝īŧŒåœ¨Custom Visionä¸Šé‡æ–°čŽ­į샿¨Ąåž‹īŧŒå†å°†æ¨Ąåž‹é‡æ–°éƒ¨įŊ˛åˆ°čžšįŧ˜čŠ‚į‚šã€‚", + "isCorrect": "true" + }, + { + "answerText": "åœ¨čžšįŧ˜čŠ‚į‚šæ‹æ‘„ä¸€åŧ å›žį‰‡åšļæŖ€æŸĨæ¨Ąåž‹įš„éĸ„æĩ‹į쓿žœã€‚", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 35, + "title": "įŦŦ18č¯ž - äģŽäŧ æ„Ÿå™¨č§Ļå‘æ°´æžœč´¨é‡æŖ€æĩ‹īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTåē”į”¨įš„å“Ēä¸Ēéƒ¨åˆ†į”¨æĨčŽˇå–æ•°æŽīŧŸ", + "answerOptions": [ + { + "answerText": "į‰ŠīŧˆThingsīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "ä瑿œåŠĄīŧˆCloud servicesīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "čžšįŧ˜čŠ‚į‚šīŧˆEdge devicesīŧ‰", + "isCorrect": "false" + } + ] + }, + { + "questionText": "IoTåē”į”¨å”¯ä¸€įš„čž“å‡ēæ˜¯æ‰§čĄŒå™¨ã€‚", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "Things不需čρᛴæŽĨčŋžæŽĨ到IoT中åŋƒīŧŒåރäģŦ可äģĨäŊŋį”¨čžšįŧ˜čŠ‚į‚šå……åŊ“įŊ‘å…ŗã€‚", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 36, + "title": "įŦŦ18č¯ž - äģŽäŧ æ„Ÿå™¨č§Ļå‘æ°´æžœč´¨é‡æŖ€æĩ‹īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "构åģēIoTåē”į”¨įš„ä¸‰ä¸Ēįģ„äģ￘¯", + "answerOptions": [ + { + "answerText": "į‰ŠīŧˆThingsīŧ‰īŧŒæ€įģ´īŧˆInsightsīŧ‰īŧŒčĄŒåЍīŧˆActionsīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "į‰ŠīŧˆThingsīŧ‰īŧŒäē’联įŊ‘īŧˆInternetīŧ‰īŧŒæ•°æŽåē“īŧˆDatabasesīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "äēēåˇĨæ™ēčƒŊīŧˆAIīŧ‰īŧŒåŒē块铞īŧˆBlockchainīŧ‰īŧŒåŊåŊå–ŗå–ŗīŧˆFizzBuzzersīŧ‰", + "isCorrect": "false" + } + ] + }, + { + "questionText": "čŋžæŽĨį‰Šīŧˆthingsīŧ‰å’Œå¯äģĨ创åģ翀įģ´īŧˆinsightsīŧ‰įš„įģ„äģļįš„įģ„äģļåĢ做īŧš", + "answerOptions": [ + { + "answerText": "Azure Functions", + "isCorrect": "false" + }, + { + "answerText": "IoT中åŋƒ", + "isCorrect": "true" + }, + { + "answerText": "Azure地回", + "isCorrect": "false" + } + ] + }, + { + "questionText": "åŸēäēŽéŖžæ—ļæĩ‹čˇįš„æŽĨčŋ‘äŧ æ„Ÿå™¨įš„åˇĨäŊœåŽŸį†æ˜¯äģ€äšˆīŧŸ", + "answerOptions": [ + { + "answerText": "äŧ æ„Ÿå™¨å‘å°„æŋ€å…‰æŸåšļæĩ‹é‡äģŽį‰ŠäŊ“åå°„įš„æ—ļ间", + "isCorrect": "true" + }, + { + "answerText": "äŧ æ„Ÿå™¨äŊŋį”¨åŖ°éŸŗåšļæĩ‹é‡äģŽį‰ŠäŊ“襨éĸåå°„įš„æ—ļ间", + "isCorrect": "false" + }, + { + "answerText": "äŧ æ„Ÿå™¨äŊŋį”¨åžˆé•ŋįš„å°ē子", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 37, + "title": "įŦŦ19č¯ž - 莭įģƒå­˜č´§æŖ€æĩ‹å™¨īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "äēēåˇĨæ™ēčƒŊ不čƒŊᔍäēŽį왿Ÿä¸Ēį‰ŠäŊ“čŽĄæ•°īŧŸ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "在é›ļ唎éĸ†åŸŸīŧŒIoT和äēēåˇĨæ™ēčƒŊ可äģĨčĸĢᔍæĨīŧš", + "answerOptions": [ + { + "answerText": "åĒčƒŊᔍæĨæŖ€æŸĨåē“å­˜", + "isCorrect": "false" + }, + { + "answerText": "可äģĨåē”į”¨åœ¨åžˆåšŋæŗ›įš„åœ°æ–šīŧŒåŒ…æ‹Ŧåē“å­˜æŖ€æĩ‹īŧŒåœ¨éœ€čĻįš„åœ°æ–šæŖ€æĩ‹åŖįŊŠįš„äŊŠæˆ´æƒ…å†ĩīŧŒįģŸčŽĄåŽĸæĩé‡äģĨ及č‡Ē动įģ“č´Ļ", + "isCorrect": "true" + }, + { + "answerText": "IoT和äēēåˇĨæ™ēčƒŊ不čƒŊᔍäēŽé›ļ唎éĸ†åŸŸ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "į›Žæ ‡æŖ€æĩ‹į‰ĩæļ‰åˆ°īŧš", + "answerOptions": [ + { + "answerText": "æŖ€æĩ‹å›žį‰‡ä¸­åŒ…åĢ一ä¸Ēį‰ŠäŊ“įš„æĻ‚įŽ‡åšļčŋŊč¸Ēå…ļäŊįŊŽ", + "isCorrect": "true" + }, + { + "answerText": "åĒčρįģ™å›žį‰‡ä¸­įš„į‰ŠäŊ“čŽĄæ•°", + "isCorrect": "false" + }, + { + "answerText": "å›žį‰‡åˆ†įąģ", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 38, + "title": "įŦŦ19č¯ž - 莭įģƒå­˜č´§æŖ€æĩ‹å™¨īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "ä¸įŽĄå¤šå°‘å¯ščąĄčĸĢæŖ€æĩ‹åˆ°īŧŒį›Žæ ‡æŖ€æĩ‹į¨‹åēåĒčŋ”回一ä¸Ēį쓿žœ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "ä¸ēäē†į›˜į‚šåē“å­˜īŧŒCustom Visionä¸­æœ€é€‚åˆįš„domain是äģ€äšˆ", + "answerOptions": [ + { + "answerText": "é€šį”¨īŧˆGeneralīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "éŖŸį‰ŠīŧˆFoodīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "č´§æžļä¸Šįš„å•†å“īŧˆProducts on shelvesīŧ‰", + "isCorrect": "true" + } + ] + }, + { + "questionText": "莭įģƒä¸€ä¸Ēį›Žæ ‡æŖ€æĩ‹å™¨č‡ŗå°‘需čĻå¤šå°‘åŧ å›žį‰‡īŧŸ", + "answerOptions": [ + { + "answerText": "1", + "isCorrect": "false" + }, + { + "answerText": "15", + "isCorrect": "true" + }, + { + "answerText": "100", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 39, + "title": "įŦŦ20č¯ž - äģŽ IoT čŽžå¤‡æŖ€æŸĨ存货īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "IoTčŽžå¤‡å› ä¸å¤Ÿåŧēå¤§č€Œæ— æŗ•čƒœäģģį›Žæ ‡æŖ€æĩ‹įš„äģģåŠĄ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "į›Žæ ‡æŖ€æĩ‹į¨‹åēčŋ”回īŧš", + "answerOptions": [ + { + "answerText": "æŖ€æĩ‹åˆ°įš„į‰ŠäŊ“įš„æ•°é‡", + "isCorrect": "false" + }, + { + "answerText": "æŖ€æĩ‹åˆ°įš„į‰ŠäŊ“įš„æ•°é‡å’ŒäŊįŊŽ", + "isCorrect": "false" + }, + { + "answerText": "æŖ€æĩ‹åˆ°įš„į‰ŠäŊ“įš„æ•°é‡ã€äŊįŊŽäģĨ及æĻ‚įŽ‡", + "isCorrect": "true" + } + ] + }, + { + "questionText": "į›Žæ ‡æŖ€æĩ‹į¨‹åēå¯äģĨᔍæĨæŖ€æĩ‹å“Ē里įŧēč´§äē†īŧŒåšļå…čŽ¸æœē器äēēč‡Ē动čĄĨč´§", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 40, + "title": "įŦŦ20č¯ž - äģŽ IoT čŽžå¤‡æŖ€æŸĨ存货īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "ä¸ēäē†į›˜į‚šåē“å­˜īŧŒåĒ需čĻč€ƒč™‘į›Žæ ‡æŖ€æĩ‹į¨‹åēæŖ€æĩ‹åˆ°įš„į‰ŠäŊ“įš„æ•°é‡", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "čžšį•ŒæĄ†äŊŋᔍīŧš", + "answerOptions": [ + { + "answerText": "į™žåˆ†æ¯”åæ ‡", + "isCorrect": "true" + }, + { + "answerText": "åƒį´ åæ ‡", + "isCorrect": "false" + }, + { + "answerText": "åŽ˜įąŗåæ ‡", + "isCorrect": "false" + } + ] + }, + { + "questionText": "čĸĢæŖ€æĩ‹įš„į›Žæ ‡å¯äģĨ重合吗īŧŸ", + "answerOptions": [ + { + "answerText": "可äģĨ", + "isCorrect": "true" + }, + { + "answerText": "不可äģĨ", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 41, + "title": "įŦŦ21č¯ž - ᔍ IoT čŽžå¤‡č¯†åˆĢ蝭韺īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "可äģĨᔍ IoT čŽžå¤‡č¯†åˆĢ蝭韺īŧš", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "č¯­éŸŗåŠŠį†éœ€čĻå°†æ‰€æœ‰įš„éŸŗéĸ‘发送到äē‘į̝čŋ›čĄŒå¤„ᐆ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "ä¸ēäē†č¯†åˆĢ蝭韺īŧŒIoTčŽžå¤‡éœ€čρ䏀ä¸Ēå¤§įš„éēĻå…‹éŖŽ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 42, + "title": "įŦŦ21č¯ž - ᔍ IoT čŽžå¤‡č¯†åˆĢ蝭韺īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "éēĻå…‹éŖŽæ˜¯äģ€äšˆįąģåž‹įš„äŧ æ„Ÿå™¨īŧŸ", + "answerOptions": [ + { + "answerText": "数字", + "isCorrect": "false" + }, + { + "answerText": "æ¨Ąæ‹Ÿ", + "isCorrect": "true" + } + ] + }, + { + "questionText": "å°†č¯­éŸŗæŗĸåŊĸčŊŦæĸä¸ē数字äŋĄåˇäŊŋᔍäē†īŧš", + "answerOptions": [ + { + "answerText": "脉冞įŧ–į č°ƒåˆļ", + "isCorrect": "true" + }, + { + "answerText": "įē¯äģŖį ä𘿺•", + "isCorrect": "false" + }, + { + "answerText": "脉冞åŽŊåēĻæœ€å¤§åŒ–", + "isCorrect": "false" + } + ] + }, + { + "questionText": "1į§’é’Ÿé‡‡æ ˇéĸ‘įŽ‡ä¸ē16KHzīŧŒé‡åŒ–äŊæ•°ä¸ē16äŊįš„éŸŗéĸ‘有多大īŧŸ", + "answerOptions": [ + { + "answerText": "1KB", + "isCorrect": "false" + }, + { + "answerText": "16KB", + "isCorrect": "false" + }, + { + "answerText": "32KB", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 43, + "title": "įŦŦ22č¯ž - ᐆ觪蝭荀īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "č¯­č¨€įš„į†č§Ŗį‰ĩæļ‰åˆ°å¯ģæ‰žį‰šåŽšįš„č¯æą‡", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "č¯­č¨€įš„į†č§Ŗį‰ĩæļ‰åˆ°īŧš", + "answerOptions": [ + { + "answerText": "å…ŗæŗ¨åĨ子中一ä¸Ēä¸Ēå­¤įĢ‹įš„č¯æą‡åšļåŠĒ力垗到厃äģŦįš„åĢ义", + "isCorrect": "false" + }, + { + "answerText": "扞到éĸ„先厚䚉åĨŊįš„åĨ子īŧŒåšļį”ąæ­¤åž—åˆ°å¯šåē”įš„åĢ义", + "isCorrect": "false" + }, + { + "answerText": "å…ŗæŗ¨æ•´ä¸ĒåĨ子īŧŒåšļåŠĒ力äģŽč¯æą‡įš„ä¸Šä¸‹æ–‡čŽˇå–åĢ义", + "isCorrect": "true" + } + ] + }, + { + "questionText": "ä瑿œåŠĄäž›åē”商有čƒŊå¤Ÿį†č§Ŗč¯­č¨€įš„äēēåˇĨæ™ēčƒŊæœåŠĄ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 44, + "title": "įŦŦ22č¯ž - ᐆ觪蝭荀īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "ä¸ēäē†čĸĢᐆ觪īŧŒåĨ子需čρčĸĢ划分ä¸ēīŧš", + "answerOptions": [ + { + "answerText": "æƒŗæŗ•īŧˆIdeasīŧ‰å’Œč§Ŗé‡Šīŧˆexplanationsīŧ‰", + "isCorrect": "false" + }, + { + "answerText": "意回īŧˆIntentsīŧ‰å’ŒåŽžäŊ“īŧˆentitiesīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "įŸŗå¤´å’Œæ˛™å­", + "isCorrect": "false" + } + ] + }, + { + "questionText": "垎čŊ¯įš„č¯­č¨€į†č§ŖæœåŠĄåĢ做īŧš", + "answerOptions": [ + { + "answerText": "LUIS", + "isCorrect": "true" + }, + { + "answerText": "Luigi", + "isCorrect": "false" + }, + { + "answerText": "Jarvis", + "isCorrect": "false" + } + ] + }, + { + "questionText": "在åĨå­â€œčŽžåŽšä¸€ä¸Ē3åˆ†é’Ÿįš„åŽšæ—ļ器”中īŧš", + "answerOptions": [ + { + "answerText": "意回是3分钟īŧŒåŽžäŊ“是åޚæ—ļ器", + "isCorrect": "false" + }, + { + "answerText": "意回是分钟īŧŒåŽžäŊ“是3ä¸Ē厚æ—ļ器", + "isCorrect": "false" + }, + { + "answerText": "æ„å›žæ˜¯čŽžåŽšä¸€ä¸Ē厚æ—ļ器īŧŒåŽžäŊ“是3分钟", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 45, + "title": "įŦŦ23č¯ž - 莞įŊŽčŽĄæ—ļå™¨å’Œæäž›åŖå¤´åéψīŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "äēēåˇĨæ™ēčƒŊį”Ÿæˆįš„č¯­éŸŗå•č°ƒä¸”æœēæĸ°", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äēēåˇĨæ™ēčƒŊæ¨Ąåž‹åĒčƒŊį”ŸæˆįžŽåŧč‹ąč¯­įš„č¯­éŸŗ", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äēēåˇĨæ™ēčƒŊæ¨Ąåž‹å¯äģĨ将1234čŊŦæĸä¸ēå“Ēį§æŽĒčžžįš„č¯­éŸŗīŧš", + "answerOptions": [ + { + "answerText": "一äēŒä¸‰å››", + "isCorrect": "false" + }, + { + "answerText": "ä¸€åƒä¸¤į™žä¸‰åå››", + "isCorrect": "false" + }, + { + "answerText": "å–å†ŗäēŽä¸Šä¸‹æ–‡īŧŒå¯äģĨ是“一äēŒä¸‰å››â€æˆ–č€…â€œä¸€åƒä¸¤į™žä¸‰åå››â€", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 46, + "title": "įŦŦ23č¯ž - 莞įŊŽčŽĄæ—ļå™¨å’Œæäž›åŖå¤´åéψīŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "į”Ÿæˆč¯­éŸŗįš„ä¸‰ä¸Ēæ­ĨéĒ¤æ˜¯īŧš", + "answerOptions": [ + { + "answerText": "文æœŦåˆ†æžã€į†č§Ŗåˆ†æžã€č¯­éŸŗį”Ÿæˆ", + "isCorrect": "false" + }, + { + "answerText": "文æœŦåˆ†æžã€č¯­č¨€å­Ļ分析、æŗĸåŊĸį”Ÿæˆ", + "isCorrect": "true" + }, + { + "answerText": "å•č¯åˆ†æžã€éŸŗéĸ‘åˆļäŊœ", + "isCorrect": "false" + } + ] + }, + { + "questionText": "可äģĨ莭įģƒä¸€ä¸Ēč¯­éŸŗį”Ÿæˆæ¨Ąåž‹äŊŋå…ļåŦčĩˇæĨ像一ä¸Ēį‰šåŽšįš„äēē。", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "įŧ–į č¯­éŸŗįš„æ ‡čް蝭荀åĢ做īŧš", + "answerOptions": [ + { + "answerText": "SSML", + "isCorrect": "true" + }, + { + "answerText": "MSSL", + "isCorrect": "false" + }, + { + "answerText": "SpeechXML", + "isCorrect": "false" + } + ] + } + ] + }, + { + "id": 47, + "title": "įŦŦ24č¯ž - æ”¯æŒå¤šį§č¯­č¨€īŧšč¯žå‰æĩ‹énj", + "quiz": [ + { + "questionText": "蝭荀ᐆ觪åĒæ”¯æŒč‹ąč¯­", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + }, + { + "questionText": "äēēåˇĨæ™ēčƒŊ蝭韺čŊŦ文æœŦæ¨Ąåž‹į†č§Ŗå¤šį§č¯­č¨€", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "true" + }, + { + "answerText": "错蝝", + "isCorrect": "false" + } + ] + }, + { + "questionText": "äēēåˇĨæ™ēčƒŊįŋģ蝑į‰ĩæļ‰åˆ°å°†ä¸€ä¸Ēä¸Ēå•č¯čŊŦæĸä¸ē寚åē”įš„č¯‘æ–‡", + "answerOptions": [ + { + "answerText": "æ­ŖįĄŽ", + "isCorrect": "false" + }, + { + "answerText": "错蝝", + "isCorrect": "true" + } + ] + } + ] + }, + { + "id": 48, + "title": "įŦŦ24č¯ž - æ”¯æŒå¤šį§č¯­č¨€īŧšč¯žåŽæĩ‹énj", + "quiz": [ + { + "questionText": "æœē器įŋģ蝑厞įģčĸĢį ”įŠļä熿ŽĨčŋ‘īŧš", + "answerOptions": [ + { + "answerText": "70åš´", + "isCorrect": "true" + }, + { + "answerText": "17åš´", + "isCorrect": "false" + }, + { + "answerText": "7åš´", + "isCorrect": "false" + } + ] + }, + { + "questionText": "äēēåˇĨæ™ēčƒŊ蝭荀įŋģ蝑噍čĸĢåĢ做īŧš", + "answerOptions": [ + { + "answerText": "å‚ģį“œįŋģ蝑噍", + "isCorrect": "false" + }, + { + "answerText": "įĨžįģįŋģ蝑者īŧˆNeural translatorsīŧ‰", + "isCorrect": "true" + }, + { + "answerText": "äģ€äšˆäšŸä¸åĢ - äēēåˇĨæ™ēčƒŊ不čƒŊᔍäŊœįŋģ蝑", + "isCorrect": "false" + } + ] + }, + { + "questionText": "垎čŊ¯æ”¯æŒįŋģ蝑å“Ēį§å¤–æ˜Ÿč¯­č¨€īŧš", + "answerOptions": [ + { + "answerText": "æ¸Šåˇžč¯", + "isCorrect": "false" + }, + { + "answerText": "å¤–æ˜Ÿč¯­", + "isCorrect": "false" + }, + { + "answerText": "å…‹æž—č´Ąč¯­", + "isCorrect": "true" + } + ] + } + ] + } + ] + } +] \ No newline at end of file diff --git a/slides/lesson-1.pdf b/slides/lesson-1.pdf new file mode 100644 index 00000000..e6a2e94c Binary files /dev/null and b/slides/lesson-1.pdf differ diff --git a/slides/lesson-2.pdf b/slides/lesson-2.pdf new file mode 100644 index 00000000..ba3e46a1 Binary files /dev/null and b/slides/lesson-2.pdf differ diff --git a/slides/lesson-3.pdf b/slides/lesson-3.pdf new file mode 100644 index 00000000..11699edb Binary files /dev/null and b/slides/lesson-3.pdf differ diff --git a/slides/lesson-4.pdf b/slides/lesson-4.pdf new file mode 100644 index 00000000..c0d70d7a Binary files /dev/null and b/slides/lesson-4.pdf differ diff --git a/translations/README.bn.md b/translations/README.bn.md index e4da16a1..b23cdea1 100644 --- a/translations/README.bn.md +++ b/translations/README.bn.md @@ -75,30 +75,30 @@ | | āĻĒā§āϰāĻœā§‡āĻ•ā§āϟ | āĻ•āύāϏ⧇āĻĒā§āϟ | āĻļāĻŋāĻ–āύāĻĢāϞ | āϞ⧇āϏāύ/āĻĒāĻžāĻ ā§āϝ | | :-: | :----------: | :-------------: | ------------------- | :-----------: | -| 01 | [IoT āϝāĻžāĻ¤ā§āϰāĻžāϰ āϏ⧂āϚāύāĻž](./1-getting-started) | IoT āĻĒāϰāĻŋāϚāĻŋāϤāĻŋ | āĻĒā§āϰāĻĨāĻŽ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϏ⧇āϟāφāĻĒ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧāχ āφāχāĻ“āϟāĻŋ āĻāϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āύ⧀āϤāĻŋāϗ⧁āϞāĻŋ āĻāĻŦāĻ‚ āφāχāĻ“āϟāĻŋ āϏāĻ˛ā§āϝ⧁āĻļāύ⧇āϰ āĻŦ⧇āϏāĻŋāĻ• āĻŦāĻŋāώ⧟āϗ⧁āϞ⧋ āϝ⧇āĻŽāύāσ āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāωāĻĄ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āĻŦāĻŋāώ⧟āϗ⧁āϞ⧋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [IoT āĻĒāϰāĻŋāϚāĻŋāϤāĻŋ](../1-getting-started/lessons/1-introduction-to-iot/translations/README.bn.md) | -| 02 | [IoT āϝāĻžāĻ¤ā§āϰāĻžāϰ āϏ⧂āϚāύāĻž](./1-getting-started) | IoT āĻāϰ āφāϰ⧋ āĻ—āĻ­ā§€āϰ⧇| āφāχāĻ“āϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻāĻŦāĻ‚ āϏāĻŋāĻ™ā§āϗ⧇āϞ-āĻŦā§‹āĻ°ā§āĻĄ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [IoT āĻāϰ āφāϰ⧋ āĻ—āĻ­ā§€āϰ⧇](../1-getting-started/lessons/2-deeper-dive/translations/README.bn.md) | -| 03 | [IoT āϝāĻžāĻ¤ā§āϰāĻžāϰ āϏ⧂āϚāύāĻž](./1-getting-started) | āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ⧇āϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āϜāĻ—āϤ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ—| 'āύāĻžāχāϟāϞāĻžāχāϟ' āĻĒā§āϰāĻœā§‡āĻ•ā§āϟāϟāĻŋ āĻ•āϰāĻžāϰ āϏāĻžāĻĨ⧇āχ āϏāĻŽāĻžāĻ¨ā§āϤāϰāĻžāϞ⧇ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āϜāĻ—āϤ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϜāĻžāύāĻžāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ⧇āϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āϜāĻ—āϤ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ—](../1-getting-started/lessons/3-sensors-and-actuators/translations/README.bn.md) | -| 04 | [IoT āϝāĻžāĻ¤ā§āϰāĻžāϰ āϏ⧂āϚāύāĻž](./1-getting-started) | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϕ⧇ āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž | āĻāĻŽāĻ•āĻŋāωāϟāĻŋāϟāĻŋ āĻŦā§āϰ⧋āĻ•āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āύāĻžāχāϟāϞāĻžāχāϟāϟāĻŋ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇ āĻŦāĻžāĻ°ā§āϤāĻžāϗ⧁āϞāĻŋ āĻĒā§āϰ⧇āϰāĻŖ āĻāĻŦāĻ‚ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāϤ⧇ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋāϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϏ⧇āχ āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϕ⧇ āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤāĻ•āϰāĻŖ ](../1-getting-started/lessons/4-connect-internet/translations/README.bn.md) | -| 05 | [āĻĢāĻžāĻ°ā§āĻŽ](./2-farm) | āφāχāĻ“āϟāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āωāĻĻā§āĻ­āĻŋāĻĻ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĻā§āĻŦāĻžāϰāĻž āĻ—ā§ƒāĻšāĻŋāϤ āϤāĻžāĻĒāĻŽāĻžāĻ¤ā§āϰāĻžāϰ āĻĄā§‡āϟāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āωāĻĻā§āĻ­āĻŋāĻĻ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ āĻĻ⧇āĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āϤāĻž āĻļ⧇āĻ–āĻž | [āφāχāĻ“āϟāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āωāĻĻā§āĻ­āĻŋāĻĻ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ](../2-farm/lessons/1-predict-plant-growth/translations/README.bn.md) | -| 06 | [āĻĢāĻžāĻ°ā§āĻŽ](./2-farm) | āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āύāĻŋāĻ°ā§āϪ⧟ | āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āϤāĻž āĻ•āϰāϤ⧇ āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āϏ⧇āĻ¨ā§āϏāϰāϟāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•ā§āϝāĻžāϞāĻŋāĻŦā§āϰ⧇āϟ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϤāĻž āĻļ⧇āĻ–āĻž | [āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āύāĻŋāĻ°ā§āϪ⧟](../2-farm/lessons/2-detect-soil-moisture/translations/README.bn.md) | -| 07 | [āĻĢāĻžāĻ°ā§āĻŽ](./2-farm) | āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟ āϏ⧇āϚāĻ•āĻžāĻ°ā§āϝ | āϰāĻŋāϞ⧇ āĻāĻŦāĻ‚ āĻāĻŽāĻ•āĻŋāωāϟāĻŋāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽā§Ÿā§‡ āϏ⧇āϚ āĻĻā§‡ā§ŸāĻž āϝāĻžā§Ÿ āϏ⧇ āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟ āϏ⧇āϚāĻ•āĻžāĻ°ā§āϝ](../2-farm/lessons/3-automated-plant-watering/translations/README.bn.md) | -| 08 | [āĻĢāĻžāĻ°ā§āĻŽ](./2-farm) | āωāĻĻā§āĻ­āĻŋāĻĻāϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž | āĻ•ā§āϞāĻžāωāĻĄ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāωāĻĄ-āĻšā§‹āĻ¸ā§āϟ āĻ•āϰāĻž āφāχāĻ“āϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ āĻāĻŦāĻ‚ āϕ⧀āĻ­āĻžāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻā§āĻ­āĻŋāĻĻāϟāĻŋāϕ⧇ āĻĒāĻžāĻŦāϞāĻŋāĻ• āĻāĻŽāĻ•āĻŋāωāϟāĻŋāϟāĻŋ āĻŦā§āϰ⧋āĻ•āĻžāϰ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϤāĻž āĻļ⧇āĻ–āĻž | [āωāĻĻā§āĻ­āĻŋāĻĻāϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž](../2-farm/lessons/4-migrate-your-plant-to-the-cloud/translations/README.bn.md) | -| 09 | [āĻĢāĻžāĻ°ā§āĻŽ](./2-farm) | āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞāϜāĻŋāĻ•āϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ | āĻ•ā§āϞāĻžāωāĻĄā§‡ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞāϜāĻŋāĻ• āϞāĻŋāĻ–āϤ⧇ āĻšāĻŦ⧇ āϝāĻžāϤ⧇ āϤāĻž āφāχāĻ“āϟāĻŋ āĻŽā§āϝāĻžāϏ⧇āĻœā§‡āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋ⧟āĻž āϜāĻžāύāĻžāϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻž āĻļ⧇āĻ–āĻž| [āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞāϜāĻŋāĻ•āϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ](../2-farm/lessons/5-migrate-application-to-the-cloud/translations/README.bn.md) | -| 10 | [āĻĢāĻžāĻ°ā§āĻŽ](./2-farm) | Keep your plant secure | āφāχāĻ“āϟāĻŋ āϤ⧇ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϜāĻžāύāĻž āĻāĻŦāĻ‚ Key āĻ“ Certificate āĻāϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻā§āĻ­āĻŋāĻĻāϟāĻŋāϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āϰāĻžāĻ–āĻž āϝāĻžāϝāĻŧ āϤāĻž āĻļ⧇āĻ–āĻž | [Keep your plant secure](./2-farm/lessons/6-keep-your-plant-secure/README.md) | -| 11 | [āĻĒāϰāĻŋāĻŦāĻšāύ](./3-transport) | Location tracking | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϜāĻŋāĻĒāĻŋāĻāϏ āϞ⧋āϕ⧇āĻļāύ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻļ⧇āĻ–āĻž | [Location tracking](./3-transport/lessons/1-location-tracking/README.md) | -| 12 | [āĻĒāϰāĻŋāĻŦāĻšāύ](./3-transport) | Store location data | āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϏāĻŽā§Ÿā§‡ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻŦāĻž āϚāĻŋāĻ¤ā§āϰāĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻĄā§‡āϟāĻž āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ (Visualization) āĻāϰ āϜāĻ¨ā§āϝ āφāχāĻ“āϟāĻŋ āĻĄā§‡āϟāĻž āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰāĻž āϝāĻžā§Ÿ āϤāĻž āϜāĻžāύāĻž | [Store location data](./3-transport/lessons/2-store-location-data/README.md) | -| 13 | [āĻĒāϰāĻŋāĻŦāĻšāύ](./3-transport) | Visualize location data |āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ⧇ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ⧇āϰ āĻĄā§‡āϟāĻž āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰāϗ⧁āϞāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ ⧍āϟāĻŋ āĻŽāĻžāĻ¤ā§āϰāĻžāϝāĻŧ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻ¤ā§āϰāĻŋāĻŽāĻžāĻ¤ā§āϰāĻŋāĻ• āĻŦāĻŋāĻļā§āĻŦ⧇āϰ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧇ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [Visualize location data](./3-transport/lessons/3-visualize-location-data/README.md) | -| 14 | [āĻĒāϰāĻŋāĻŦāĻšāύ](./3-transport) | Geofences | Geofences āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϜāĻžāύāĻž āĻāĻŦāĻ‚ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻžāĻĒā§āϞāĻžāχ āĻšā§‡āχāύ⧇āϰ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒāĻ°ā§āϝāĻžā§Ÿā§‡āϰ āĻŦāĻžāĻšāύāϗ⧁āϞ⧋ āϝāĻ–āύ āĻ—āĻ¨ā§āϤāĻŦā§āϝ⧇āϰ āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋ āĻĒ⧌āρāĻ›āĻžā§Ÿ āϤāĻ–āύ āĻāϞāĻžāĻ°ā§āϟ āĻĻā§‡ā§ŸāĻž āϝāĻžā§Ÿ āϤāĻž āĻļ⧇āĻ–āĻž | [Geofences](./3-transport/lessons/4-geofences/README.md) | -| 15 | [āĻ‰ā§ŽāĻĒāĻžāĻĻāύ](./4-manufacturing) | Train a fruit quality detector | āĻ•ā§āϞāĻžāωāĻĄā§‡āϰ āĻ›āĻŦāĻŋ āĻļā§āϰ⧇āĻŖāĻŋāĻŦāĻĻā§āϧāĻ•āϰāĻŖ āĻŽāĻĄā§‡āϞāϕ⧇ (Image Classifier) āĻĢāϞ⧇āϰ āĻŽāĻžāύ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϜāĻžāύāĻž | [Train a fruit quality detector](./4-manufacturing/lessons/1-train-fruit-detector/README.md) | -| 16 | [āĻ‰ā§ŽāĻĒāĻžāĻĻāύ](./4-manufacturing) | Check fruit quality from an IoT device | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻĢāϞ⧇āϰ āϗ⧁āĻŖāĻ—āϤ āĻŽāĻžāύ āϏāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ | [Check fruit quality from an IoT device](./4-manufacturing/lessons/2-check-fruit-from-device/README.md) | -| 17 | [āĻ‰ā§ŽāĻĒāĻžāĻĻāύ](./4-manufacturing) | Run your fruit detector on the edge | āĻĢāϞ⧇āϰ āϗ⧁āĻŖāĻ—āϤ āĻŽāĻžāύ āϏāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀āϕ⧇ Edge āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ | [Run your fruit detector on the edge](./4-manufacturing/lessons/3-run-fruit-detector-edge/README.md) | -| 18 | [āĻ‰ā§ŽāĻĒāĻžāĻĻāύ](./4-manufacturing) | Trigger fruit quality detection from a sensor | āϏ⧇āĻ¨ā§āϏāϰ āĻĨ⧇āϕ⧇ āĻĢāϞ⧇āϰ āϗ⧁āĻŖāĻžāϗ⧁āĻŖ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāĻž āĻļ⧇āĻ–āĻž| [Trigger fruit quality detection from a sensor](./4-manufacturing/lessons/4-trigger-fruit-detector/README.md) | -| 19 | [āϖ⧁āϚāϰāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](./5-retail) | Train a stock detector | āϕ⧋āύāĻ“ āĻĻā§‹āĻ•āĻžāύ⧇ āĻ¸ā§āϟāĻ• āĻ—āĻŖāύāĻž āĻ•āϰāϤ⧇ āĻ¸ā§āϟāĻ• āĻĄāĻŋāĻŸā§‡āĻ•ā§āϟāϰāϕ⧇ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āϤāĻž āĻļ⧇āĻ–āĻž | [Train a stock detector](./5-retail/lessons/1-train-stock-detector/README.md) | -| 20 | [āϖ⧁āϚāϰāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](./5-retail) | Check stock from an IoT device | āϕ⧋āύ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āĻŽāĻĄā§‡āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻ¸ā§āϟāĻ• āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻļ⧇āĻ–āĻž | [Check stock from an IoT device](./5-retail/lessons/2-check-stock-device/README.md) | -| 21 | [āϖ⧁āϚāϰāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](./6-consumer) | Recognize speech with an IoT device | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻŦāĻ•ā§āϤāĻŦā§āϝ (speech) āϏāύāĻžāĻ•ā§āϤ āĻ•āϰ⧇ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϟāĻžāχāĻŽāĻžāϰ āϤ⧈āϰ⧀ āĻ•āϰāĻž | [Recognize speech with an IoT device](./6-consumer/lessons/1-speech-recognition/README.md) | -| 22 | [āĻ­ā§‹āĻ•ā§āϤāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](./6-consumer) | Understand language | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻĨāĻž āĻŦā§‹āĻāĻžāϤ⧇ āĻšā§Ÿ āϤāĻž āĻļ⧇āĻ–āĻž | [Understand language](./6-consumer/lessons/2-language-understanding/README.md) | -| 23 | [āĻ­ā§‹āĻ•ā§āϤāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](./6-consumer) | Set a timer and provide spoken feedback | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āϟāĻžāχāĻŽāĻžāϰ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϟāĻžāχāĻŽāĻžāϰ āĻ•āĻ–āύ āϏ⧇āϟ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϤāĻž āĻ•āĻ–āύ āĻļ⧇āώ āĻšāϝāĻŧ āϏ⧇ āĻŦāĻŋāώāϝāĻŧ⧇ āĻ•āĻĨāĻŋāϤ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϝ⧇āύ āϏ⧇āχ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϜāĻžāύāĻžāϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻž āĻļ⧇āĻ–āĻž | [Set a timer and provide spoken feedback](./6-consumer/lessons/3-spoken-feedback/README.md) | -| 24 | [āĻ­ā§‹āĻ•ā§āϤāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](./6-consumer) | Support multiple languages | āϕ⧀āĻ­āĻžāĻŦ⧇ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻĻā§‡ā§ŸāĻž āĻāĻŦāĻ‚ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϟāĻžāχāĻŽāĻžāϰ āĻĨ⧇āϕ⧇ āφāϏāĻž āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āωāĻ­ā§Ÿā§‡āχ āĻāĻ•āĻžāϧāĻŋāĻ• āĻ­āĻžāώāĻž āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāĻžāύ⧋ āϝāĻžāϝāĻŧ āϤāĻž āĻļ⧇āĻ–āĻž | [Support multiple languages](./6-consumer/lessons/4-multiple-language-support/README.md) | +| 01 | [IoT āϝāĻžāĻ¤ā§āϰāĻžāϰ āϏ⧂āϚāύāĻž](../1-getting-started) | IoT āĻĒāϰāĻŋāϚāĻŋāϤāĻŋ | āĻĒā§āϰāĻĨāĻŽ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϏ⧇āϟāφāĻĒ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧāχ āφāχāĻ“āϟāĻŋ āĻāϰ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āύ⧀āϤāĻŋāϗ⧁āϞāĻŋ āĻāĻŦāĻ‚ āφāχāĻ“āϟāĻŋ āϏāĻ˛ā§āϝ⧁āĻļāύ⧇āϰ āĻŦ⧇āϏāĻŋāĻ• āĻŦāĻŋāώ⧟āϗ⧁āϞ⧋ āϝ⧇āĻŽāύāσ āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāωāĻĄ āϏāĻžāĻ°ā§āĻ­āĻŋāϏ āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āĻŦāĻŋāώ⧟āϗ⧁āϞ⧋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [IoT āĻĒāϰāĻŋāϚāĻŋāϤāĻŋ](../1-getting-started/lessons/1-introduction-to-iot/translations/README.bn.md) | +| 02 | [IoT āϝāĻžāĻ¤ā§āϰāĻžāϰ āϏ⧂āϚāύāĻž](../1-getting-started) | IoT āĻāϰ āφāϰ⧋ āĻ—āĻ­ā§€āϰ⧇| āφāχāĻ“āϟāĻŋ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āϰ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋāϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻŽāĻžāχāĻ•ā§āϰ⧋āĻ•āĻ¨ā§āĻŸā§āϰ⧋āϞāĻžāϰ āĻāĻŦāĻ‚ āϏāĻŋāĻ™ā§āϗ⧇āϞ-āĻŦā§‹āĻ°ā§āĻĄ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻžāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [IoT āĻāϰ āφāϰ⧋ āĻ—āĻ­ā§€āϰ⧇](../1-getting-started/lessons/2-deeper-dive/translations/README.bn.md) | +| 03 | [IoT āϝāĻžāĻ¤ā§āϰāĻžāϰ āϏ⧂āϚāύāĻž](../1-getting-started) | āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ⧇āϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āϜāĻ—āϤ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ—| 'āύāĻžāχāϟāϞāĻžāχāϟ' āĻĒā§āϰāĻœā§‡āĻ•ā§āϟāϟāĻŋ āĻ•āϰāĻžāϰ āϏāĻžāĻĨ⧇āχ āϏāĻŽāĻžāĻ¨ā§āϤāϰāĻžāϞ⧇ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āϜāĻ—āϤ āĻĨ⧇āϕ⧇ āĻĄā§‡āϟāĻž āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϜāĻžāύāĻžāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [āϏ⧇āĻ¨ā§āϏāϰ āĻāĻŦāĻ‚ āĻ…ā§āϝāĻžāĻ•āĻšā§ā§Ÿā§‡āϟāϰ⧇āϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āĻŦāĻžāĻšā§āϝāĻŋāĻ• āϜāĻ—āϤ⧇āϰ āϏāĻžāĻĨ⧇ āϝ⧋āĻ—āĻžāϝ⧋āĻ—](../1-getting-started/lessons/3-sensors-and-actuators/translations/README.bn.md) | +| 04 | [IoT āϝāĻžāĻ¤ā§āϰāĻžāϰ āϏ⧂āϚāύāĻž](../1-getting-started) | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϕ⧇ āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž | āĻāĻŽāĻ•āĻŋāωāϟāĻŋāϟāĻŋ āĻŦā§āϰ⧋āĻ•āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āύāĻžāχāϟāϞāĻžāχāϟāϟāĻŋ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰ⧇ āĻŦāĻžāĻ°ā§āϤāĻžāϗ⧁āϞāĻŋ āĻĒā§āϰ⧇āϰāĻŖ āĻāĻŦāĻ‚ āĻ—ā§āϰāĻšāĻŖ āĻ•āϰāϤ⧇ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϟāĻŋāϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϏ⧇āχ āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϕ⧇ āχāĻ¨ā§āϟāĻžāϰāύ⧇āĻŸā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤāĻ•āϰāĻŖ ](../1-getting-started/lessons/4-connect-internet/translations/README.bn.md) | +| 05 | [āĻĢāĻžāĻ°ā§āĻŽ](../2-farm) | āφāχāĻ“āϟāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āωāĻĻā§āĻ­āĻŋāĻĻ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĻā§āĻŦāĻžāϰāĻž āĻ—ā§ƒāĻšāĻŋāϤ āϤāĻžāĻĒāĻŽāĻžāĻ¤ā§āϰāĻžāϰ āĻĄā§‡āϟāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āωāĻĻā§āĻ­āĻŋāĻĻ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ āĻĻ⧇āĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧ āϤāĻž āĻļ⧇āĻ–āĻž | [āφāχāĻ“āϟāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āωāĻĻā§āĻ­āĻŋāĻĻ āĻŦ⧃āĻĻā§āϧāĻŋāϰ āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāϏ](../2-farm/lessons/1-predict-plant-growth/translations/README.bn.md) | +| 06 | [āĻĢāĻžāĻ°ā§āĻŽ](../2-farm) | āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āύāĻŋāĻ°ā§āϪ⧟ | āϕ⧀āĻ­āĻžāĻŦ⧇ āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ‚ āϤāĻž āĻ•āϰāϤ⧇ āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āϏ⧇āĻ¨ā§āϏāϰāϟāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•ā§āϝāĻžāϞāĻŋāĻŦā§āϰ⧇āϟ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϤāĻž āĻļ⧇āĻ–āĻž | [āĻŽāĻžāϟāĻŋāϰ āφāĻ°ā§āĻĻā§āϰāϤāĻž āύāĻŋāĻ°ā§āϪ⧟](../2-farm/lessons/2-detect-soil-moisture/translations/README.bn.md) | +| 07 | [āĻĢāĻžāĻ°ā§āĻŽ](../2-farm) | āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟ āϏ⧇āϚāĻ•āĻžāĻ°ā§āϝ | āϰāĻŋāϞ⧇ āĻāĻŦāĻ‚ āĻāĻŽāĻ•āĻŋāωāϟāĻŋāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āĻāĻŦāĻ‚ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āϏāĻŽā§Ÿā§‡ āϏ⧇āϚ āĻĻā§‡ā§ŸāĻž āϝāĻžā§Ÿ āϏ⧇ āϏāĻ‚āĻ•ā§āϰāĻžāĻ¨ā§āϤ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟ āϏ⧇āϚāĻ•āĻžāĻ°ā§āϝ](../2-farm/lessons/3-automated-plant-watering/translations/README.bn.md) | +| 08 | [āĻĢāĻžāĻ°ā§āĻŽ](../2-farm) | āωāĻĻā§āĻ­āĻŋāĻĻāϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž | āĻ•ā§āϞāĻžāωāĻĄ āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāωāĻĄ-āĻšā§‹āĻ¸ā§āϟ āĻ•āϰāĻž āφāχāĻ“āϟāĻŋ āĻĒāϰāĻŋāώ⧇āĻŦāĻžāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ āĻāĻŦāĻ‚ āϕ⧀āĻ­āĻžāĻŦ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻā§āĻ­āĻŋāĻĻāϟāĻŋāϕ⧇ āĻĒāĻžāĻŦāϞāĻŋāĻ• āĻāĻŽāĻ•āĻŋāωāϟāĻŋāϟāĻŋ āĻŦā§āϰ⧋āĻ•āĻžāϰ⧇āϰ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϤāĻž āĻļ⧇āĻ–āĻž | [āωāĻĻā§āĻ­āĻŋāĻĻāϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āϏāĻ‚āϝ⧁āĻ•ā§āϤ āĻ•āϰāĻž](../2-farm/lessons/4-migrate-your-plant-to-the-cloud/translations/README.bn.md) | +| 09 | [āĻĢāĻžāĻ°ā§āĻŽ](../2-farm) | āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞāϜāĻŋāĻ•āϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ | āĻ•ā§āϞāĻžāωāĻĄā§‡ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞāϜāĻŋāĻ• āϞāĻŋāĻ–āϤ⧇ āĻšāĻŦ⧇ āϝāĻžāϤ⧇ āϤāĻž āφāχāĻ“āϟāĻŋ āĻŽā§āϝāĻžāϏ⧇āĻœā§‡āϰ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋ⧟āĻž āϜāĻžāύāĻžāϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻž āĻļ⧇āĻ–āĻž| [āĻ…ā§āϝāĻžāĻĒā§āϞāĻŋāϕ⧇āĻļāύ āϞāϜāĻŋāĻ•āϕ⧇ āĻ•ā§āϞāĻžāωāĻĄā§‡ āĻ¸ā§āĻĨāĻžāύāĻžāĻ¨ā§āϤāϰ](../2-farm/lessons/5-migrate-application-to-the-cloud/translations/README.bn.md) | +| 10 | [āĻĢāĻžāĻ°ā§āĻŽ](../2-farm) | āωāĻĻā§āĻ­āĻŋāĻĻ⧇āϰ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤāĻ•āϰāĻŖ | āφāχāĻ“āϟāĻŋ āϤ⧇ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϜāĻžāύāĻž āĻāĻŦāĻ‚ Key āĻ“ Certificate āĻāϰ āϏāĻžāĻšāĻžāĻ¯ā§āϝ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āωāĻĻā§āĻ­āĻŋāĻĻāϟāĻŋāϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āϏ⧁āϰāĻ•ā§āώāĻŋāϤ āϰāĻžāĻ–āĻž āϝāĻžāϝāĻŧ āϤāĻž āĻļ⧇āĻ–āĻž | [āωāĻĻā§āĻ­āĻŋāĻĻ⧇āϰ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž āύāĻŋāĻļā§āϚāĻŋāϤāĻ•āϰāĻŖ](../2-farm/lessons/6-keep-your-plant-secure/translations/README.bn.md) | +| 11 | [āĻĒāϰāĻŋāĻŦāĻšāύ](../3-transport) | Location tracking | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϜāĻŋāĻĒāĻŋāĻāϏ āϞ⧋āϕ⧇āĻļāύ āĻŸā§āĻ°ā§āϝāĻžāĻ•āĻŋāĻ‚ āĻļ⧇āĻ–āĻž | [Location tracking](../3-transport/lessons/1-location-tracking/README.md) | +| 12 | [āĻĒāϰāĻŋāĻŦāĻšāύ](../3-transport) | Store location data | āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϏāĻŽā§Ÿā§‡ āĻŦāĻŋāĻļā§āϞ⧇āώāĻŖ āĻŦāĻž āϚāĻŋāĻ¤ā§āϰāĻ­āĻŋāĻ¤ā§āϤāĻŋāĻ• āĻĄā§‡āϟāĻž āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ (Visualization) āĻāϰ āϜāĻ¨ā§āϝ āφāχāĻ“āϟāĻŋ āĻĄā§‡āϟāĻž āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ¸ā§āĻŸā§‹āϰ āĻ•āϰāĻž āϝāĻžā§Ÿ āϤāĻž āϜāĻžāύāĻž | [Store location data](../3-transport/lessons/2-store-location-data/README.md) | +| 13 | [āĻĒāϰāĻŋāĻŦāĻšāύ](../3-transport) | Visualize location data |āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰ⧇ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāύ⧇āϰ āĻĄā§‡āϟāĻž āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻž āĻāĻŦāĻ‚ āĻŽāĻžāύāϚāĻŋāĻ¤ā§āϰāϗ⧁āϞāĻŋ āϕ⧀āĻ­āĻžāĻŦ⧇ ⧍āϟāĻŋ āĻŽāĻžāĻ¤ā§āϰāĻžāϝāĻŧ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻ¤ā§āϰāĻŋāĻŽāĻžāĻ¤ā§āϰāĻŋāĻ• āĻŦāĻŋāĻļā§āĻŦ⧇āϰ āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧇ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻœā§āĻžāĻžāύ āĻ…āĻ°ā§āϜāύ | [Visualize location data](../3-transport/lessons/3-visualize-location-data/README.md) | +| 14 | [āĻĒāϰāĻŋāĻŦāĻšāύ](../3-transport) | Geofences | Geofences āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϜāĻžāύāĻž āĻāĻŦāĻ‚ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻžāĻĒā§āϞāĻžāχ āĻšā§‡āχāύ⧇āϰ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āύ āĻĒāĻ°ā§āϝāĻžā§Ÿā§‡āϰ āĻŦāĻžāĻšāύāϗ⧁āϞ⧋ āϝāĻ–āύ āĻ—āĻ¨ā§āϤāĻŦā§āϝ⧇āϰ āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋ āĻĒ⧌āρāĻ›āĻžā§Ÿ āϤāĻ–āύ āĻāϞāĻžāĻ°ā§āϟ āĻĻā§‡ā§ŸāĻž āϝāĻžā§Ÿ āϤāĻž āĻļ⧇āĻ–āĻž | [Geofences](../3-transport/lessons/4-geofences/README.md) | +| 15 | [āĻ‰ā§ŽāĻĒāĻžāĻĻāύ](../4-manufacturing) | Train a fruit quality detector | āĻ•ā§āϞāĻžāωāĻĄā§‡āϰ āĻ›āĻŦāĻŋ āĻļā§āϰ⧇āĻŖāĻŋāĻŦāĻĻā§āϧāĻ•āϰāĻŖ āĻŽāĻĄā§‡āϞāϕ⧇ (Image Classifier) āĻĢāϞ⧇āϰ āĻŽāĻžāύ āϏāύāĻžāĻ•ā§āϤ āĻ•āϰāϤ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŋāϤ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇ āϏ⧇ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āϜāĻžāύāĻž | [Train a fruit quality detector](../4-manufacturing/lessons/1-train-fruit-detector/README.md) | +| 16 | [āĻ‰ā§ŽāĻĒāĻžāĻĻāύ](../4-manufacturing) | Check fruit quality from an IoT device | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āĻĢāϞ⧇āϰ āϗ⧁āĻŖāĻ—āϤ āĻŽāĻžāύ āϏāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀ āĻŦā§āϝāĻŦāĻšāĻžāϰ | [Check fruit quality from an IoT device](../4-manufacturing/lessons/2-check-fruit-from-device/README.md) | +| 17 | [āĻ‰ā§ŽāĻĒāĻžāĻĻāύ](../4-manufacturing) | Run your fruit detector on the edge | āĻĢāϞ⧇āϰ āϗ⧁āĻŖāĻ—āϤ āĻŽāĻžāύ āϏāύāĻžāĻ•ā§āϤāĻ•āĻžāϰ⧀āϕ⧇ Edge āĻšāĻŋāϏ⧇āĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ | [Run your fruit detector on the edge](../4-manufacturing/lessons/3-run-fruit-detector-edge/README.md) | +| 18 | [āĻ‰ā§ŽāĻĒāĻžāĻĻāύ](../4-manufacturing) | Trigger fruit quality detection from a sensor | āϏ⧇āĻ¨ā§āϏāϰ āĻĨ⧇āϕ⧇ āĻĢāϞ⧇āϰ āϗ⧁āĻŖāĻžāϗ⧁āĻŖ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āύāĻŋ⧟āĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰāĻž āĻļ⧇āĻ–āĻž| [Trigger fruit quality detection from a sensor](../4-manufacturing/lessons/4-trigger-fruit-detector/README.md) | +| 19 | [āϖ⧁āϚāϰāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](../5-retail) | Train a stock detector | āϕ⧋āύāĻ“ āĻĻā§‹āĻ•āĻžāύ⧇ āĻ¸ā§āϟāĻ• āĻ—āĻŖāύāĻž āĻ•āϰāϤ⧇ āĻ¸ā§āϟāĻ• āĻĄāĻŋāĻŸā§‡āĻ•ā§āϟāϰāϕ⧇ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžāϝāĻŧ āϤāĻž āĻļ⧇āĻ–āĻž | [Train a stock detector](../5-retail/lessons/1-train-stock-detector/README.md) | +| 20 | [āϖ⧁āϚāϰāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](../5-retail) | Check stock from an IoT device | āϕ⧋āύ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϏāύāĻžāĻ•ā§āϤāĻ•āϰāĻŖ āĻŽāĻĄā§‡āϞ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻ¸ā§āϟāĻ• āĻĒāĻ°ā§āϝāĻŦ⧇āĻ•ā§āώāĻŖ āĻ•āϰāĻž āĻļ⧇āĻ–āĻž | [Check stock from an IoT device](../5-retail/lessons/2-check-stock-device/README.md) | +| 21 | [āϖ⧁āϚāϰāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](../6-consumer) | Recognize speech with an IoT device | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āĻĨ⧇āϕ⧇ āĻŦāĻ•ā§āϤāĻŦā§āϝ (speech) āϏāύāĻžāĻ•ā§āϤ āĻ•āϰ⧇ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϟāĻžāχāĻŽāĻžāϰ āϤ⧈āϰ⧀ āĻ•āϰāĻž | [Recognize speech with an IoT device](../6-consumer/lessons/1-speech-recognition/README.md) | +| 22 | [āĻ­ā§‹āĻ•ā§āϤāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](../6-consumer) | Understand language | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏāϕ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻ•āĻĨāĻž āĻŦā§‹āĻāĻžāϤ⧇ āĻšā§Ÿ āϤāĻž āĻļ⧇āĻ–āĻž | [Understand language](../6-consumer/lessons/2-language-understanding/README.md) | +| 23 | [āĻ­ā§‹āĻ•ā§āϤāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](../6-consumer) | Set a timer and provide spoken feedback | āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āϕ⧀āĻ­āĻžāĻŦ⧇ āϟāĻžāχāĻŽāĻžāϰ āϏ⧇āϟ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϟāĻžāχāĻŽāĻžāϰ āĻ•āĻ–āύ āϏ⧇āϟ āĻšāϝāĻŧ āĻāĻŦāĻ‚ āϤāĻž āĻ•āĻ–āύ āĻļ⧇āώ āĻšāϝāĻŧ āϏ⧇ āĻŦāĻŋāώāϝāĻŧ⧇ āĻ•āĻĨāĻŋāϤ āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āϝ⧇āύ āϏ⧇āχ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ āϜāĻžāύāĻžāϤ⧇ āĻĒāĻžāϰ⧇ āϤāĻž āĻļ⧇āĻ–āĻž | [Set a timer and provide spoken feedback](../6-consumer/lessons/3-spoken-feedback/README.md) | +| 24 | [āĻ­ā§‹āĻ•ā§āϤāĻžāĻĒāĻ°ā§āϝāĻžā§Ÿ](../6-consumer) | Support multiple languages | āϕ⧀āĻ­āĻžāĻŦ⧇ āφāχāĻ“āϟāĻŋ āĻĄāĻŋāĻ­āĻžāχāϏ⧇ āύāĻŋāĻ°ā§āĻĻ⧇āĻļ āĻĻā§‡ā§ŸāĻž āĻāĻŦāĻ‚ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āϟāĻžāχāĻŽāĻžāϰ āĻĨ⧇āϕ⧇ āφāϏāĻž āĻĒā§āϰāϤāĻŋāĻ•ā§āϰāĻŋāϝāĻŧāĻž āωāĻ­ā§Ÿā§‡āχ āĻāĻ•āĻžāϧāĻŋāĻ• āĻ­āĻžāώāĻž āϏāĻžāĻĒā§‹āĻ°ā§āϟ āĻ•āϰāĻžāύ⧋ āϝāĻžāϝāĻŧ āϤāĻž āĻļ⧇āĻ–āĻž | [Support multiple languages](../6-consumer/lessons/4-multiple-language-support/README.md) | ## āĻ…āĻĢāϞāĻžāχāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ @@ -126,4 +126,4 @@ npm run convert ## āϚāĻŋāĻ¤ā§āϰ⧇āϰ Attributions -āĻāχ āĻĒāĻžāĻ ā§āϝāĻ•ā§āϰāĻŽāϟāĻŋāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻ›āĻŦāĻŋāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āϏāĻ•āϞ āĻāĻŸā§āϰāĻŋāĻŦāĻŋāωāϟ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžāĻŦ⧇ [Attributions](./attributions.md) āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϟāĻŋāϤ⧇ āĨ¤ +āĻāχ āĻĒāĻžāĻ ā§āϝāĻ•ā§āϰāĻŽāϟāĻŋāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻ›āĻŦāĻŋāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āϏāĻ•āϞ āĻāĻŸā§āϰāĻŋāĻŦāĻŋāωāϟ āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžāĻŦ⧇ [Attributions](../attributions.md) āĻĢā§‹āĻ˛ā§āĻĄāĻžāϰāϟāĻŋāϤ⧇ āĨ¤ diff --git a/translations/README.tr.md b/translations/README.tr.md index 0b66160d..cfda4ec7 100644 --- a/translations/README.tr.md +++ b/translations/README.tr.md @@ -13,28 +13,26 @@ [![Chinese](https://img.shields.io/badge/-Chinese-yellow)](README.zh-cn.md) # Yeni Başlayanlar için IOT + Microsoft'tan Azure Cloud Advocates size IOT temelleri hakkÄąnda 12 haftalÄąk 24 dersten oluşan programÄą zevkle sunar. Her ders Ãļn-quiz, dersi tamamlamanÄąz için talimatlar, bir çÃļzÃŧm, bir Ãļdev ve ders sonrasÄą quiz içerir. Proje tabanlÄą pedogojimiz Ãļğrenirken bir şeyler oluşturmanÄąza izin verecek. Bu, ispanlanmÄąÅŸtÄąr ki yeni becerileri adeta size "yapÄąÅŸtÄąracak". Projeler, yemeğimizin çiftlikten sofralara olan yolculuğuyla ilgili. Buna; tarÄąm, taÅŸÄąmacÄąlÄąk, işleme, satÄąÅŸ, mÃŧşteriler gibi IOT cihazlarÄą için tÃŧm popÃŧler endÃŧstri alanlarÄą dahildir. - -![Girişi, çiftçiliği, taÅŸÄąmacÄąlığı, işlemeyi, satÄąÅŸÄą ve pişirmeyi kapsayan 24 dersin yol haritasÄą](sketchnotes/Roadmap.jpg) - +![Girişi, çiftçiliği, taÅŸÄąmacÄąlığı, işlemeyi, satÄąÅŸÄą ve pişirmeyi kapsayan 24 dersin yol haritasÄą](../sketchnotes/Roadmap.jpg) > [Nitya Narasimhan](https://github.com/nitya) 'dan taslak notu. Daha bÃŧyÃŧk hali için resme tÄąklayÄąn - **YazarlarÄąmÄąza en kalbi duygularla teşekkÃŧr ederiz [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), ve taslak notu için [Nitya Narasimhan](https://github.com/nitya) 'a** **[Microsoft Learn Student Ambassadors](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn) ekibimize de teşekkÃŧr edriz. Dersleri gÃļzden geçirenler ve çeşitli dillere çevirenler - [Aditya Garg](https://github.com/AdityaGarg00), [Anurag Sharma](https://github.com/Anurag-0-1-A), [Arpita Das](https://github.com/Arpiiitaaa), [Aryan Jain](https://www.linkedin.com/in/aryan-jain-47a4a1145/), [Bhavesh Suneja](https://github.com/EliteWarrior315), [Faith Hunja](https://faithhunja.github.io/), [Lateefah Bello](https://www.linkedin.com/in/lateefah-bello/), [Manvi Jha](https://github.com/Severus-Matthew), [Mireille Tan](https://www.linkedin.com/in/mireille-tan-a4834819a/), [Mohammad Iftekher (Iftu) Ebne Jalal](https://github.com/Iftu119), [Mohammad Zulfikar](https://github.com/mohzulfikar), [Priyanshu Srivastav](https://www.linkedin.com/in/priyanshu-srivastav-b067241ba), [Thanmai Gowducheruvu](https://github.com/innovation-platform), and [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).** TakÄąmla tnÄąÅŸÄąn! -[![TanÄątÄąm videosu](./images/iot-for-beginners.png)](https://youtu.be/-wippUJRi5k) +[![TanÄątÄąm videosu](../images/iot-for-beginners.png)](https://youtu.be/-wippUJRi5k) > đŸŽĨ Proje hakkÄąndaki video için yukarÄądaki resme tÄąklayÄąn! -> **Öğretmenler**, için bu dersleri nasÄąl kullancaklarÄąna dair [bazÄą Ãļneriler](for-teachers.md). Eğer kendi derslerinizi oluşturmak istiyorsanÄąz [ders taslağı](lesson-template/README.md) ekledik. +> **Öğretmenler**, için bu dersleri nasÄąl kullancaklarÄąna dair [bazÄą Ãļneriler](../for-teachers.md). Eğer kendi derslerinizi oluşturmak istiyorsanÄąz [ders taslağı](../lesson-template/README.md) ekledik. > **Öğrenciler**,bu dersleri kendiniz için kullanmak istiyorsanÄąz tÃŧm repo'yu fork'layÄąn ve tÃŧm egzersizleri bitirin. Ön-quizlerle başlayÄąn, sonra bÃļlÃŧmÃŧ okuyun ve kalan etkinlikleri bitirin. ÇÃļzÃŧm için kodu kopyalamaktansa kendiniz projeler oluşturun ve anlayÄąn, ama çÃļzÃŧm kodlarÄą her proje tabanlÄą ders içerisinde /sollutions klasÃļrÃŧnÃŧn içindedir. Başka bir fikir de arkadaşlarÄąnÄązla çalÄąÅŸma gruplarÄą oluşturmak ve beraber gitmektir. Daha fazla çalÄąÅŸma için [Microsoft Learn](https://docs.microsoft.com/users/jimbobbennett/collections/ke2ehd351jopwr?WT.mc_id=academic-17441-jabenn). @@ -56,9 +54,9 @@ Her proje Ãļğrencilerde ve hobicilerde bulunan gerçek donanÄąmlara dayanÄąr. H ## Hardware -We have two choices of IoT hardware to use for the projects depending on personal preference, programming language knowledge or preferences, learning goals and availability. We have also provided a 'virtual hardware' version for those who don't have access to hardware, or want to learn more before committing to a purchase. You can read more and find a 'shopping list' on the [hardware page](./hardware.md), including links to buy complete kits from our friends at Seeed Studio. +We have two choices of IoT hardware to use for the projects depending on personal preference, programming language knowledge or preferences, learning goals and availability. We have also provided a 'virtual hardware' version for those who don't have access to hardware, or want to learn more before committing to a purchase. You can read more and find a 'shopping list' on the [hardware page](../hardware.md), including links to buy complete kits from our friends at Seeed Studio. -> 💁 Find our [Code of Conduct](CODE_OF_CONDUCT.md), [Contributing](CONTRIBUTING.md), and [Translation](TRANSLATIONS.md) guidelines. We welcome your constructive feedback! +> 💁 Find our [Code of Conduct](../CODE_OF_CONDUCT.md), [Contributing](../CONTRIBUTING.md), and [Translation](../TRANSLATIONS.md) guidelines. We welcome your constructive feedback! ## Her ders şunlarÄą içerir: @@ -79,33 +77,34 @@ We have two choices of IoT hardware to use for the projects depending on persona | | Proje AdÄą | Öğretilen Kavramlar | Hedeflenen Konular | BağlantÄąlÄą Ders | | :-: | :----------: | :-------------: | ------------------- | :-----------: | -| 01 | [BaşlangÄąÃ§](./1-getting-started) | Nesnelerin internetine giriş |İlk IoT cihazÄąnÄązÄą yaparken, IoT'nin temel ilkelerini, sensÃļrler ve bulut hizmetleri gibi IoT çÃļzÃŧmlerinin temellerini Ãļğrenin. | [Nesnelerin internetine giriş](./1-getting-started/lessons/1-introduction-to-iot/README.md) | -| 02 | [BaşlangÄąÃ§](./1-getting-started) | IOT'ye daha derin bir dalÄąÅŸ | IoT sistemlerinin bileşenleri hakkÄąnda daha fazlasÄąnÄą Ãļğrenin hem de mikro işlemcileri ve tek-kart bilgisayarlarÄą | [IOT'ye daha derin bir dalÄąÅŸ](./1-getting-started/lessons/2-deeper-dive/README.md) | -| 03 | [BaşlangÄąÃ§](./1-getting-started) | SensÃļrler ve aktÃŧatÃļrler ile gerçek dÃŧnyayla etkileşin | Gece lambasÄą inşa ederken sensÃļrlerin fiziksel dÃŧnyadan veri toplamalarÄąnÄą ve aktÃŧatÃļrler in tepki vermelerini Ãļğrenin L | [SensÃļrler ve aktÃŧatÃļrler ile gerçek dÃŧnyayla etkileşin](./1-getting-started/lessons/3-sensors-and-actuators/README.md) | -| 04 | [BaşlangÄąÃ§](./1-getting-started) | Devrenizi internete bağlayÄąn | Devrelerin internete nasÄąl bağlandığınÄą ve internetten nasÄąl mesaj aldÄąklarÄąnÄą gece lambanÄązÄą MQTT'ye bağlayarak Ãļğrenin. | [Devrenizi internete bağlayÄąn](./1-getting-started/lessons/4-connect-internet/README.md) | -| 05 | [Çiftlik](./2-farm) | Bitkinin bÃŧyÃŧmesini tahmin edin | IoT devresiyle toplanan sÄącaklÄąk verisinin bitki bÃŧyÃŧmesini tahmin etmede nasÄąl kullanÄąldığınÄą Ãļğrenin | [Bitkinin bÃŧyÃŧmesini tahmin edin](./2-farm/lessons/1-predict-plant-growth/README.md) | -| 06 | [Çiftlik](./2-farm) | Toprak nemini algÄąlayÄąn | Toprak neminin nasÄąl tespit edildiğini ve toprak nem sensÃļrÃŧnÃŧn nasÄąl kalibre edildiğini Ãļğrenin. | [Toprak nemini algÄąlayÄąn](./2-farm/lessons/2-detect-soil-moisture/README.md) | -| 07 | [Çiftlik](./2-farm) | Otomatik Bitki Sulama| SulamanÄąn nasÄąl otomatikleştirildiğini bir rÃļle ve MQTT kullanarak Ãļğrenin | [Otomatik Bitki Sulama](./2-farm/lessons/3-automated-plant-watering/README.md) | -| 08 | [Çiftlik](./2-farm) | Bitkinizi buluta taÅŸÄąyÄąn | Bulut tabanlÄą IOT servislerini ve MQTT yerine bunlarÄą kullanmayÄą Ãļğrenin | [Bitkinizi buluta taÅŸÄąyÄąn](./2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md) | -| 09 | [Çiftlik](./2-farm) | Uygulama mantığınÄą buluta taÅŸÄąyÄąn | IOT mesajlarÄąnÄą bulutta cevaplayan ugulama mantığı nasÄąl yazÄąlÄąr | [Uygulama mantığınÄą buluta taÅŸÄąyÄąn](./2-farm/lessons/5-migrate-application-to-the-cloud/README.md) | -| 10 | [Çiftlik](./2-farm) | Bitkinizi gÃŧvende tutun | IoT'nin gÃŧvenliğini ve bitkinizi anahtarlarla ve sertifikalarla gÃŧvende tutmayÄą Ãļğrenin | [Bitkinizi gÃŧvende tutun](./2-farm/lessons/6-keep-your-plant-secure/README.md) | -| 11 | [Nakliyat](./3-transport) | Konum takibi | GPS ile IoT cihazlarÄąnÄą takip etmeyi Ãļğrenin. | [Konum takibi](./3-transport/lessons/1-location-tracking/README.md) | -| 12 | [Nakliyat](./3-transport) | Konum bilgilerini depolayÄąn | IoT verilerinin sonradan gÃļrselleştirilme ve analiz için nasÄąl saklandığınÄą Ãļğrenin | [Konum bilgilerini depolayÄąn](./3-transport/lessons/2-store-location-data/README.md) | -| 13 | [Nakliyat](./3-transport) | Konum verilerini gÃļrselleştirin | Konum verisini harita Ãŧzerinde gÃļrselleştirmeyi ve haritalarÄąn 3 boyutlu dÃŧnyamÄązÄą nasÄąl 2 boyutlu gÃļsterdiğini Ãļğrenin | [Konum verilerini gÃļrselleştirin](./3-transport/lessons/3-visualize-location-data/README.md) | -| 14 | [Nakliyat](./3-transport) | Coğrafi SÄąnÄąrlar | Coğrafi sÄąnÄąrlarÄą, tedarik zincirindeki araçlarÄą hedefe yaklaştÄąklarÄąnda uyarmak için coğrafi sÄąnÄąrlarÄą nasÄąl kullanacağınÄązÄą Ãļğrenin. | [Coğrafi SÄąnÄąrlar](./3-transport/lessons/4-geofences/README.md) | -| 15 | [Üretim](./4-manufacturing) | Meyve kalite kontrolcÃŧsÃŧnÃŧ eğitin | Meyvelerin kalitesini kontrol etmek için buluttaki bir resim sÄąnÄąflandÄąrma algoritmasÄąnÄą eğitmeyi Ãļğrenin. | [Meyve kalite algÄąlayÄącÄąsÄąnÄą eğitin](./4-manufacturing/lessons/1-train-fruit-detector/README.md) | -| 16 | [Üretim](./4-manufacturing) | IoT devresinden meyvelerin kalitesini kontrol edin | Meyve kalitesini IoT cihazÄąnÄązdan nasÄąl kontrol edeceğinizi Ãļğrenin | [IoT devresinden meyvelerin kalitesini kontrol edin](./4-manufacturing/lessons/2-check-fruit-from-device/README.md) | -| 17 | [Üretim](./4-manufacturing) |Meyve dedektÃļrÃŧnÃŧzÃŧ bir kÃļşede çalÄąÅŸtÄąrÄąn| Meyve dedektÃļrÃŧnÃŧzÃŧ ve IoT devrelerini bir kÃļşede nasÄąl çalÄąÅŸtÄąracağınÄązÄą Ãļğrenin. | [Meyve dedektÃļrÃŧnÃŧzÃŧ bir kÃļşede çalÄąÅŸtÄąrÄąn](./4-manufacturing/lessons/3-run-fruit-detector-edge/README.md) | -| 18 | [Üretim](./4-manufacturing) | Bir sensÃļrden meyve kalitesini algÄąlamayÄą tetikleyin | Bir sensÃļrden meyve kalitesinin algÄąlanmasÄąnÄą nasÄąl tetikleyebileceğinizi Ãļğrenin. | [Bir sensÃļrden meyve kalitesini algÄąlamayÄą tetikleyin](./4-manufacturing/lessons/4-trigger-fruit-detector/README.md) | -| 19 | [Perakende](./5-retail) | Stok dedektÃļrÃŧnÃŧ eğitin | Marketinizdeki stoğu saymasÄą için nesne tanÄąyan dedektÃļrÃŧn nasÄąl eğitildiğini Ãļğrenin | [Stok dedektÃļrÃŧnÃŧ eğitin](./5-retail/lessons/1-train-stock-detector/README.md) | -| 20 | [Perakende](./5-retail) | StoklarÄą IoT cihazÄąnÄąz ile kontrol edin | StoklarÄą nesne tanÄąyan IoT cihazÄąnÄąz ile kontrol etmeyi Ãļğrenin | [CStoklarÄą IoT cihazÄąnÄąz ile kontrol edin](./5-retail/lessons/2-check-stock-device/README.md) | -| 21 | [TÃŧketici](./6-consumer) | IoT cihazÄąnÄąz ile konuşma tanÄąyÄąn | AkÄąllÄą bir zamanlayÄącÄą oluşturmak için IoT cihazÄąnÄązla konuşma tanÄąyacağınÄązÄą Ãļğrenin. | [IoT cihazÄąnÄąz ile konuşma tanÄąyÄąn ](./6-consumer/lessons/1-speech-recognition/README.md) | -| 22 | [TÃŧketici](./6-consumer) | Dili anlayÄąn | IoT cihazÄąnÄązÄąn konuşulan cÃŧmleleri nasÄąl anladığınÄą Ãļğrenin | [Dili anlayÄąn](./6-consumer/lessons/2-language-understanding/README.md) | -| 23 | [TÃŧketici](./6-consumer) | Bir zamanlayÄącÄą kurun ve konuşturun | IoT cihazlarÄą için nasÄąl zamanlayÄącÄą oluşturmayÄą ve zamanlayÄącÄą kurulup çalÄąÅŸtÄąktan sonra IoT cihazlarÄąna konuşarak geri bildirim verdirmeyi Ãļğrenin.| [Bir zamanlayÄącÄą kurun ve konuşturun](./6-consumer/lessons/3-spoken-feedback/README.md) | -| 24 | [TÃŧketici](./6-consumer) | Çoklu dil desteği | Hem konuşulan hem de geri bildirim için zamanlayÄącÄąnÄąza nasÄąl çoklu dil desteği sunulduğunu Ãļğrenin | [Çoklu dil desteği](./6-consumer/lessons/4-multiple-language-support/README.md) | +| 01 | [BaşlangÄąÃ§](../1-getting-started) | Nesnelerin internetine giriş |İlk IoT cihazÄąnÄązÄą yaparken, IoT'nin temel ilkelerini, sensÃļrler ve bulut hizmetleri gibi IoT çÃļzÃŧmlerinin temellerini Ãļğrenin. | [Nesnelerin internetine giriş](../1-getting-started/lessons/1-introduction-to-iot/README.md) | +| 02 | [BaşlangÄąÃ§](../1-getting-started) | IOT'ye daha derin bir dalÄąÅŸ | IoT sistemlerinin bileşenleri hakkÄąnda daha fazlasÄąnÄą Ãļğrenin hem de mikro işlemcileri ve tek-kart bilgisayarlarÄą | [IOT'ye daha derin bir dalÄąÅŸ](../1-getting-started/lessons/2-deeper-dive/README.md) | +| 03 | [BaşlangÄąÃ§](../1-getting-started) | SensÃļrler ve aktÃŧatÃļrler ile gerçek dÃŧnyayla etkileşin | Gece lambasÄą inşa ederken sensÃļrlerin fiziksel dÃŧnyadan veri toplamalarÄąnÄą ve aktÃŧatÃļrler in tepki vermelerini Ãļğrenin L | [SensÃļrler ve aktÃŧatÃļrler ile gerçek dÃŧnyayla etkileşin](../1-getting-started/lessons/3-sensors-and-actuators/README.md) | +| 04 | [BaşlangÄąÃ§](../1-getting-started) | Devrenizi internete bağlayÄąn | Devrelerin internete nasÄąl bağlandığınÄą ve internetten nasÄąl mesaj aldÄąklarÄąnÄą gece lambanÄązÄą MQTT'ye bağlayarak Ãļğrenin. | [Devrenizi internete bağlayÄąn](../1-getting-started/lessons/4-connect-internet/README.md) | +| 05 | [Çiftlik](../2-farm) | Bitkinin bÃŧyÃŧmesini tahmin edin | IoT devresiyle toplanan sÄącaklÄąk verisinin bitki bÃŧyÃŧmesini tahmin etmede nasÄąl kullanÄąldığınÄą Ãļğrenin | [Bitkinin bÃŧyÃŧmesini tahmin edin](../2-farm/lessons/1-predict-plant-growth/README.md) | +| 06 | [Çiftlik](../2-farm) | Toprak nemini algÄąlayÄąn | Toprak neminin nasÄąl tespit edildiğini ve toprak nem sensÃļrÃŧnÃŧn nasÄąl kalibre edildiğini Ãļğrenin. | [Toprak nemini algÄąlayÄąn](../2-farm/lessons/2-detect-soil-moisture/README.md) | +| 07 | [Çiftlik](../2-farm) | Otomatik Bitki Sulama| SulamanÄąn nasÄąl otomatikleştirildiğini bir rÃļle ve MQTT kullanarak Ãļğrenin | [Otomatik Bitki Sulama](../2-farm/lessons/3-automated-plant-watering/README.md) | +| 08 | [Çiftlik](../2-farm) | Bitkinizi buluta taÅŸÄąyÄąn | Bulut tabanlÄą IOT servislerini ve MQTT yerine bunlarÄą kullanmayÄą Ãļğrenin | [Bitkinizi buluta taÅŸÄąyÄąn](../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md) | +| 09 | [Çiftlik](../2-farm) | Uygulama mantığınÄą buluta taÅŸÄąyÄąn | IOT mesajlarÄąnÄą bulutta cevaplayan ugulama mantığı nasÄąl yazÄąlÄąr | [Uygulama mantığınÄą buluta taÅŸÄąyÄąn](../2-farm/lessons/5-migrate-application-to-the-cloud/README.md) | +| 10 | [Çiftlik](../2-farm) | Bitkinizi gÃŧvende tutun | IoT'nin gÃŧvenliğini ve bitkinizi anahtarlarla ve sertifikalarla gÃŧvende tutmayÄą Ãļğrenin | [Bitkinizi gÃŧvende tutun](../2-farm/lessons/6-keep-your-plant-secure/README.md) | +| 11 | [Nakliyat](../3-transport) | Konum takibi | GPS ile IoT cihazlarÄąnÄą takip etmeyi Ãļğrenin. | [Konum takibi](../3-transport/lessons/1-location-tracking/README.md) | +| 12 | [Nakliyat](../3-transport) | Konum bilgilerini depolayÄąn | IoT verilerinin sonradan gÃļrselleştirilme ve analiz için nasÄąl saklandığınÄą Ãļğrenin | [Konum bilgilerini depolayÄąn](../3-transport/lessons/2-store-location-data/README.md) | +| 13 | [Nakliyat](../3-transport) | Konum verilerini gÃļrselleştirin | Konum verisini harita Ãŧzerinde gÃļrselleştirmeyi ve haritalarÄąn 3 boyutlu dÃŧnyamÄązÄą nasÄąl 2 boyutlu gÃļsterdiğini Ãļğrenin | [Konum verilerini gÃļrselleştirin](../3-transport/lessons/3-visualize-location-data/README.md) | +| 14 | [Nakliyat](../3-transport) | Coğrafi SÄąnÄąrlar | Coğrafi sÄąnÄąrlarÄą, tedarik zincirindeki araçlarÄą hedefe yaklaştÄąklarÄąnda uyarmak için coğrafi sÄąnÄąrlarÄą nasÄąl kullanacağınÄązÄą Ãļğrenin. | [Coğrafi SÄąnÄąrlar](../3-transport/lessons/4-geofences/README.md) | +| 15 | [Üretim](../4-manufacturing) | Meyve kalite kontrolcÃŧsÃŧnÃŧ eğitin | Meyvelerin kalitesini kontrol etmek için buluttaki bir resim sÄąnÄąflandÄąrma algoritmasÄąnÄą eğitmeyi Ãļğrenin. | [Meyve kalite algÄąlayÄącÄąsÄąnÄą eğitin](../4-manufacturing/lessons/1-train-fruit-detector/README.md) | +| 16 | [Üretim](../4-manufacturing) | IoT devresinden meyvelerin kalitesini kontrol edin | Meyve kalitesini IoT cihazÄąnÄązdan nasÄąl kontrol edeceğinizi Ãļğrenin | [IoT devresinden meyvelerin kalitesini kontrol edin](../4-manufacturing/lessons/2-check-fruit-from-device/README.md) | +| 17 | [Üretim](../4-manufacturing) |Meyve dedektÃļrÃŧnÃŧzÃŧ bir kÃļşede çalÄąÅŸtÄąrÄąn| Meyve dedektÃļrÃŧnÃŧzÃŧ ve IoT devrelerini bir kÃļşede nasÄąl çalÄąÅŸtÄąracağınÄązÄą Ãļğrenin. | [Meyve dedektÃļrÃŧnÃŧzÃŧ bir kÃļşede çalÄąÅŸtÄąrÄąn](../4-manufacturing/lessons/3-run-fruit-detector-edge/README.md) | +| 18 | [Üretim](../4-manufacturing) | Bir sensÃļrden meyve kalitesini algÄąlamayÄą tetikleyin | Bir sensÃļrden meyve kalitesinin algÄąlanmasÄąnÄą nasÄąl tetikleyebileceğinizi Ãļğrenin. | [Bir sensÃļrden meyve kalitesini algÄąlamayÄą tetikleyin](../4-manufacturing/lessons/4-trigger-fruit-detector/README.md) | +| 19 | [Perakende](../5-retail) | Stok dedektÃļrÃŧnÃŧ eğitin | Marketinizdeki stoğu saymasÄą için nesne tanÄąyan dedektÃļrÃŧn nasÄąl eğitildiğini Ãļğrenin | [Stok dedektÃļrÃŧnÃŧ eğitin](../5-retail/lessons/1-train-stock-detector/README.md) | +| 20 | [Perakende](../5-retail) | StoklarÄą IoT cihazÄąnÄąz ile kontrol edin | StoklarÄą nesne tanÄąyan IoT cihazÄąnÄąz ile kontrol etmeyi Ãļğrenin | [CStoklarÄą IoT cihazÄąnÄąz ile kontrol edin](../5-retail/lessons/2-check-stock-device/README.md) | +| 21 | [TÃŧketici](../6-consumer) | IoT cihazÄąnÄąz ile konuşma tanÄąyÄąn | AkÄąllÄą bir zamanlayÄącÄą oluşturmak için IoT cihazÄąnÄązla konuşma tanÄąyacağınÄązÄą Ãļğrenin. | [IoT cihazÄąnÄąz ile konuşma tanÄąyÄąn ](../6-consumer/lessons/1-speech-recognition/README.md) | +| 22 | [TÃŧketici](../6-consumer) | Dili anlayÄąn | IoT cihazÄąnÄązÄąn konuşulan cÃŧmleleri nasÄąl anladığınÄą Ãļğrenin | [Dili anlayÄąn](../6-consumer/lessons/2-language-understanding/README.md) | +| 23 | [TÃŧketici](../6-consumer) | Bir zamanlayÄącÄą kurun ve konuşturun | IoT cihazlarÄą için nasÄąl zamanlayÄącÄą oluşturmayÄą ve zamanlayÄącÄą kurulup çalÄąÅŸtÄąktan sonra IoT cihazlarÄąna konuşarak geri bildirim verdirmeyi Ãļğrenin.| [Bir zamanlayÄącÄą kurun ve konuşturun](../6-consumer/lessons/3-spoken-feedback/README.md) | +| 24 | [TÃŧketici](../6-consumer) | Çoklu dil desteği | Hem konuşulan hem de geri bildirim için zamanlayÄącÄąnÄąza nasÄąl çoklu dil desteği sunulduğunu Ãļğrenin | [Çoklu dil desteği](../6-consumer/lessons/4-multiple-language-support/README.md) | ## Çevirim dÄąÅŸÄą erişim - Bu belgeleri çevirim dÄąÅŸÄą olarak [Docsify](https://docsify.js.org/#/) kullanarak çalÄąÅŸtÄąrabilirsiniz. Bu repo'yu forklayÄąn [Docsify'Äą kurun](https://docsify.js.org/#/quickstart) ve bu repo'nun ana klasÃļrÃŧnde `docsify serve` yazÄąn. Website sizin yerelinizde: `localhost:3000`. + +Bu belgeleri çevirim dÄąÅŸÄą olarak [Docsify](https://docsify.js.org/#/) kullanarak çalÄąÅŸtÄąrabilirsiniz. Bu repo'yu forklayÄąn [Docsify'Äą kurun](https://docsify.js.org/#/quickstart) ve bu repo'nun ana klasÃļrÃŧnde `docsify serve` yazÄąn. Website sizin yerelinizde: `localhost:3000`. ### PDF @@ -118,7 +117,7 @@ npm run convert ## YardÄąm AranÄąyor! -Bir çeviriyle katkÄąda bulunmak ister miydiniz? LÃŧtfen [çeviri rehberimizi](TRANSLATIONS.md) okuyun ve [çeviri issue'lerinden birine](https://github.com/microsoft/IoT-For-Beginners/issues?q=is%3Aissue+is%3Aopen+label%3Atranslation) yazÄąnÄąz. Eğer yeni bir dile çevirmek istiyorsanÄąz lÃŧtfen yeni bir issue oluşturun. +Bir çeviriyle katkÄąda bulunmak ister miydiniz? LÃŧtfen [çeviri rehberimizi](../TRANSLATIONS.md) okuyun ve [çeviri issue'lerinden birine](https://github.com/microsoft/IoT-For-Beginners/issues?q=is%3Aissue+is%3Aopen+label%3Atranslation) yazÄąnÄąz. Eğer yeni bir dile çevirmek istiyorsanÄąz lÃŧtfen yeni bir issue oluşturun. ## Diğer Dersler @@ -129,4 +128,4 @@ TakÄąmÄąmÄąz başka derler de yapÄąyor: ## Resim atÄąflarÄą -Bu derslerde kullanÄąlan tÃŧm atÄąflarÄą ihtiyaç halinde [buradan bulabilirsiniz](./attributions.md). +Bu derslerde kullanÄąlan tÃŧm atÄąflarÄą ihtiyaç halinde [buradan bulabilirsiniz](../attributions.md). diff --git a/translations/README.zh-cn.md b/translations/README.zh-cn.md index 063b3f1b..15679afc 100644 --- a/translations/README.zh-cn.md +++ b/translations/README.zh-cn.md @@ -27,11 +27,11 @@ Microsoft įš„ Azure Cloud 大äŊŋ垈éĢ˜å…´æäž›å…ŗäēŽ IoT åŸēįĄ€ä¸€ä¸Ē12ä¸Ē星 **䚟感č°ĸ帎我äģŦåŽĄæŸĨäģĨ及įŋģ蝑čŋ™ä¸Ēč¯žį¨‹įš„ä¸€įģ„ [Microsoft Learn å­Ļį”Ÿå¤§äŊŋ](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn) īŧš[Aditya Garg](https://github.com/AdityaGarg00), [Anurag Sharma](https://github.com/Anurag-0-1-A), [Arpita Das](https://github.com/Arpiiitaaa), [Aryan Jain](https://www.linkedin.com/in/aryan-jain-47a4a1145/), [Bhavesh Suneja](https://github.com/EliteWarrior315), [Faith Hunja](https://faithhunja.github.io/), [Lateefah Bello](https://www.linkedin.com/in/lateefah-bello/), [Manvi Jha](https://github.com/Severus-Matthew), [Mireille Tan](https://www.linkedin.com/in/mireille-tan-a4834819a/), [Mohammad Iftekher (Iftu) Ebne Jalal](https://github.com/Iftu119), [Mohammad Zulfikar](https://github.com/mohzulfikar), [Priyanshu Srivastav](https://www.linkedin.com/in/priyanshu-srivastav-b067241ba), [Thanmai Gowducheruvu](https://github.com/innovation-platform), 和 [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).** -> **č€å¸ˆäģŦ**īŧŒæˆ‘äģŦä¸ēčŋ™ä¸Ēč¯žį¨‹įš„į”¨æŗ• [提䞛äē†ä¸€ä盿„č§](../for-teachers.md)。åĻ‚æžœäŊ æƒŗč‡Ēåˇąåˆ›åģēč¯žį¨‹īŧŒé‚Ŗæˆ‘äģŦ䚟提䞛äē†ä¸€ä¸Ē[č¯žį¨‹æ¨Ąæŋ](lesson-template/README.md). +> **č€å¸ˆäģŦ**īŧŒæˆ‘äģŦä¸ēčŋ™ä¸Ēč¯žį¨‹įš„į”¨æŗ• [提䞛äē†ä¸€ä盿„č§](../for-teachers.md)。åĻ‚æžœäŊ æƒŗč‡Ēåˇąåˆ›åģēč¯žį¨‹īŧŒé‚Ŗæˆ‘äģŦ䚟提䞛äē†ä¸€ä¸Ē[č¯žį¨‹æ¨Ąæŋ](../lesson-template/README.md). > **å­Ļį”ŸäģŦ**īŧŒ ä¸ēäē†č‡Ēåˇąå­Ļäš čŋ™ä¸Ēč¯žį¨‹īŧŒč¯ˇå¤åˆģ整ä¸ĒéĄšį›Žåē“īŧŒå†č‡ĒåˇąåŽŒæˆįģƒäš īŧŒäģŽč¯žå‰įŸĨ蝆æĩ‹énjåŧ€å§‹īŧŒå†é˜…č¯ģ莲åē§īŧŒį„ļ后厌成削äŊ™įš„æ´ģåŠ¨ã€‚å°č¯•é€ščŋ‡į†č§Ŗč¯žį¨‹įš„内厚æĨåŽŒæˆéĄšį›ŽīŧŒč€Œä¸čρäģ…äģ…æŠŠäģŖį į­”æĄˆæŠ„ä¸‹æĨīŧ›į„ļ而īŧŒåœ¨æ¯ä¸ĒéĄšį›Žč¯žį¨‹é‡ŒīŧŒäŊ éƒŊčƒŊäģŽ /solutions 文äģļ多čŽŋé—Žé‚Ŗäē›į­”æĄˆäģŖį ã€‚åĻ外一ä¸ĒåŠžæŗ•æ˜¯čˇŸæœ‹å‹æˆįĢ‹å­Ļ䚠小įģ„īŧŒį„ļ后一čĩˇåˆ†æžå†…åŽšã€‚æƒŗčŋ›ä¸€æ­Ĩį ”įŠļīŧŒæˆ‘äģŦéŧ“åŠąäŊ æŸĨ一æŸĨ[Microsoft Learn](https://docs.microsoft.com/users/jimbobbennett/collections/ke2ehd351jopwr?WT.mc_id=academic-17441-jabenn)。 -[![åŽŖäŧ į‰‡](./images/iot-for-beginners.png)](https://youtube.com/watch?v=bccEMm8gRuc "Promo video") +[![åŽŖäŧ į‰‡](../images/iot-for-beginners.png)](https://youtube.com/watch?v=bccEMm8gRuc "Promo video") > đŸŽĨ į‚šå‡ģäģĨä¸Šįš„å›žį‰‡æĨįœ‹čŋ™ä¸ĒéĄšį›Žįš„åŽŖäŧ į‰‡īŧ diff --git a/translations/hardware.bn.md b/translations/hardware.bn.md index 887d368e..96f4c2b3 100644 --- a/translations/hardware.bn.md +++ b/translations/hardware.bn.md @@ -12,7 +12,7 @@ IoT āĻļāĻŦā§āĻĻ⧇ **T** āĻāϰ āĻĒā§‚āĻ°ā§āĻŖāϰ⧂āĻĒ āĻšāϞ⧋ **Things** ## āĻ•ā§āϰ⧟āϤāĻžāϞāĻŋāĻ•āĻž -![The Seeed studios logo](./images/seeed-logo.png) +![The Seeed studios logo](../images/seeed-logo.png) Seeed Studios āĻĨ⧇āϕ⧇ āϏāĻšāĻœā§‡āχ kit āĻ•ā§āϰāϝāĻŧ āĻ•āϰāĻž āϝāĻžāĻŦ⧇ : @@ -20,19 +20,19 @@ Seeed Studios āĻĨ⧇āϕ⧇ āϏāĻšāĻœā§‡āχ kit āĻ•ā§āϰāϝāĻŧ āĻ•āϰāĻž āϝāĻž **[IoT for beginners with Seeed and Microsoft - Wio Terminal Starter Kit](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Wio-Terminal-Starter-Kit-p-5006.html)** -[![The Wio Terminal hardware kit](./images/wio-hardware-kit.png)](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Wio-Terminal-Starter-Kit-p-5006.html) +[![The Wio Terminal hardware kit](../images/wio-hardware-kit.png)](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Wio-Terminal-Starter-Kit-p-5006.html) ### āϰāĻžāĻ¸ā§āĻĒāĻŦ⧇āϰāĻŋ āĻĒāĻžāχ **[IoT for beginners with Seeed and Microsoft - Raspberry Pi 4 Starter Kit](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit.html)** -[![The Raspberry Pi Terminal hardware kit](./images/pi-hardware-kit.png)](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit.html) +[![The Raspberry Pi Terminal hardware kit](../images/pi-hardware-kit.png)](https://www.seeedstudio.com/IoT-for-beginners-with-Seeed-and-Microsoft-Raspberry-Pi-Starter-Kit.html) ## āφāϰāĻĄā§āχāύ⧋ āφāϰāĻĄā§āχāύ⧋ āĻāϰ āϏāĻŦ āϕ⧋āĻĄ C++ āĻ­āĻžāώāĻžā§Ÿ āĻ•āϰāĻž āĻšā§ŸāĨ¤ āĻ…ā§āϝāĻžāϏāĻžāχāύāĻŽā§‡āĻ¨ā§āϟ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāϤ⧇ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āωāĻĒāĻžāĻĻāĻžāύāϗ⧁āϞāĻŋāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāĻŦ⧇: -### āφāϰāĻĄā§āχāύ⧋ āĻšāĻžāĻ°ā§āĻĄāĻ“āϝāĻŧā§āϝāĻžāϰ +### āφāϰāĻĄā§āχāύ⧋ āĻšāĻžāĻ°ā§āĻĄāĻ“āϝāĻŧā§āϝāĻžāϰ * [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) * *āϐāĻšā§āĻ›āĻŋāĻ•* - USB-C āĻ•ā§āϝāĻžāĻŦāϞ āĻ…āĻĨāĻŦāĻž USB-A āĻĨ⧇āϕ⧇ USB-C āĻāĻĄāĻžāĻĒā§āϟāĻžāϰ - āωāχāĻ“ āϟāĻžāĻ°ā§āĻŽāĻŋāύāĻžāϞ⧇ āĻāĻ•āϟāĻŋ āχāωāĻāϏāĻŦāĻŋ-āϏāĻŋ āĻĒā§‹āĻ°ā§āϟ āϰāϝāĻŧ⧇āϛ⧇ āĻāĻŦāĻ‚ āĻāϟāĻŋāϤ⧇ āχāωāĻāϏāĻŦāĻŋ-āϏāĻŋ āĻĨ⧇āϕ⧇ āχāωāĻāϏāĻŦāĻŋ-āĻ āĻ•ā§āϝāĻžāĻŦāϞ āĻĨāĻžāϕ⧇āĨ¤ āϝāĻĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āϰ āĻĒāĻŋāϏāĻŋ āĻŦāĻž āĻŽā§āϝāĻžāĻ• āĻ āϕ⧇āĻŦāϞ āχāωāĻāϏāĻŦāĻŋ-āϏāĻŋ āĻĒā§‹āĻ°ā§āϟ āĻĨāĻžāϕ⧇ āϤāĻŦ⧇ āĻāĻ•āϟāĻŋ āχāωāĻāϏāĻŦāĻŋ-āϏāĻŋ āĻŦāĻž āχāωāĻāϏāĻŦāĻŋ-āĻ āĻĨ⧇āϕ⧇ āχāωāĻāϏāĻŦāĻŋ-āϏāĻŋ āĻ…ā§āϝāĻžāĻĄāĻžāĻĒā§āϟāĻžāϰ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻšāĻŦ⧇āĨ¤