diff --git a/asset-manifest.json b/asset-manifest.json index 41e3ea0..020bbf8 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,7 +1,7 @@ { "files": { "main.css": "/cht-tech-radar-contributors/static/css/main.2624eacc.css", - "main.js": "/cht-tech-radar-contributors/static/js/main.c619b525.js", + "main.js": "/cht-tech-radar-contributors/static/js/main.552302b5.js", "static/media/overview.svg": "/cht-tech-radar-contributors/static/media/overview.2e91b190e821b00544b6.svg", "static/media/question.svg": "/cht-tech-radar-contributors/static/media/question.f49af21b0654459dca13.svg", "static/media/search.svg": "/cht-tech-radar-contributors/static/media/search.679b98f82ae5196a396b.svg", @@ -17,6 +17,6 @@ }, "entrypoints": [ "static/css/main.2624eacc.css", - "static/js/main.c619b525.js" + "static/js/main.552302b5.js" ] } \ No newline at end of file diff --git a/help-and-about-tech-radar.html b/help-and-about-tech-radar.html index 7ac5d9a..db0bd61 100644 --- a/help-and-about-tech-radar.html +++ b/help-and-about-tech-radar.html @@ -1 +1 @@ -CHT Technology Radar for Contributors
\ No newline at end of file +CHT Technology Radar for Contributors
\ No newline at end of file diff --git a/index.html b/index.html index 7ac5d9a..db0bd61 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -CHT Technology Radar for Contributors
\ No newline at end of file +CHT Technology Radar for Contributors
\ No newline at end of file diff --git a/languages-and-frameworks.html b/languages-and-frameworks.html index 7ac5d9a..db0bd61 100644 --- a/languages-and-frameworks.html +++ b/languages-and-frameworks.html @@ -1 +1 @@ -CHT Technology Radar for Contributors
\ No newline at end of file +CHT Technology Radar for Contributors
\ No newline at end of file diff --git a/languages-and-frameworks/angular.html b/languages-and-frameworks/angular.html index f88225f..e62ba56 100644 --- a/languages-and-frameworks/angular.html +++ b/languages-and-frameworks/angular.html @@ -1,4 +1,4 @@ -Angular | CHT Technology Radar for Contributors

Angular

Angular is a TypeScript-based, free and open-source single-page web application framework. +Angular | CHT Technology Radar for Contributors

Angular

Angular is a TypeScript-based, free and open-source single-page web application framework. It is used for building the CHT webapp.

Angular is a complete rewrite from the same team that built AngularJS.

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the diff --git a/languages-and-frameworks/angularjs.html b/languages-and-frameworks/angularjs.html index ccb6f93..8fe1c98 100644 --- a/languages-and-frameworks/angularjs.html +++ b/languages-and-frameworks/angularjs.html @@ -1,4 +1,4 @@ -AngularJS | CHT Technology Radar for Contributors

AngularJS

AngularJS is an obsolete version of Angular.

+AngularJS | CHT Technology Radar for Contributors

AngularJS

AngularJS is an obsolete version of Angular.

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the version 3.11. The upgrade drastically reduces the memory used on the phone. diff --git a/languages-and-frameworks/bash.html b/languages-and-frameworks/bash.html index a3283ce..5bf7529 100644 --- a/languages-and-frameworks/bash.html +++ b/languages-and-frameworks/bash.html @@ -1,3 +1,3 @@ -Bash | CHT Technology Radar for Contributors

Bash

Bash is a Unix-shell and command language used for scripting. +Bash | CHT Technology Radar for Contributors

Bash

Bash is a Unix-shell and command language used for scripting. JavaScript is preferred due to being more testable and cross-platform compatible.

\ No newline at end of file diff --git a/languages-and-frameworks/chaijs.html b/languages-and-frameworks/chaijs.html new file mode 100644 index 0000000..7d19832 --- /dev/null +++ b/languages-and-frameworks/chaijs.html @@ -0,0 +1,3 @@ +Chai.js | CHT Technology Radar for Contributors

Chai.js

Chai.js is a BDD (Behavior-driven development) / TDD (Test-driven development) assertion library for node and the browser that can be paired with any JavaScript testing framework.

+

Chai.js is used for unit testing in CHT Core.

+
\ No newline at end of file diff --git a/languages-and-frameworks/enketo.html b/languages-and-frameworks/enketo.html index 069f5d2..52fcb99 100644 --- a/languages-and-frameworks/enketo.html +++ b/languages-and-frameworks/enketo.html @@ -1,2 +1,2 @@ -Enketo | CHT Technology Radar for Contributors

Enketo

Enketo is a 100% free and open-source JavaScript library used for rendering xforms as HTML with CSS and JS.

+Enketo | CHT Technology Radar for Contributors

Enketo

Enketo is a 100% free and open-source JavaScript library used for rendering xforms as HTML with CSS and JS.

\ No newline at end of file diff --git a/languages-and-frameworks/expressjs.html b/languages-and-frameworks/expressjs.html new file mode 100644 index 0000000..9c85936 --- /dev/null +++ b/languages-and-frameworks/expressjs.html @@ -0,0 +1,3 @@ +Express.js | CHT Technology Radar for Contributors

Express.js

Express.js is a back-end web application framework for building RESTful APIs with Node.js. It is free and open-source software under the MIT License.

+

Express.js is used for building CHT Core API.

+
\ No newline at end of file diff --git a/languages-and-frameworks/javascript.html b/languages-and-frameworks/javascript.html index 0fec434..3ffca42 100644 --- a/languages-and-frameworks/javascript.html +++ b/languages-and-frameworks/javascript.html @@ -1,2 +1,2 @@ -JavaScript | CHT Technology Radar for Contributors

JavaScript

JavaScript is the primary programming language used in the CHT.

+JavaScript | CHT Technology Radar for Contributors

JavaScript

JavaScript is the primary programming language used in the CHT.

\ No newline at end of file diff --git a/languages-and-frameworks/jest.html b/languages-and-frameworks/jest.html index c3f22c0..3a0ac9e 100644 --- a/languages-and-frameworks/jest.html +++ b/languages-and-frameworks/jest.html @@ -1,4 +1,4 @@ -Jest | CHT Technology Radar for Contributors

Jest

Jest is an open-source JS-based testing framework maintained by Facebook. +Jest | CHT Technology Radar for Contributors

Jest

Jest is an open-source JS-based testing framework maintained by Facebook. It is designed to be easy to use and provides a comprehensive set of tools for writing end-to-end, integration, and unit tests for JavaScript applications. It is a complete and ready to set up JavaScript testing solution.

In the CHT, Jest is used to test cht-interoperability.

diff --git a/languages-and-frameworks/lua.html b/languages-and-frameworks/lua.html index c3c2867..c09452b 100644 --- a/languages-and-frameworks/lua.html +++ b/languages-and-frameworks/lua.html @@ -1,2 +1,2 @@ -lua | CHT Technology Radar for Contributors

lua

Lua is used in HAProxy to mask credentials from being logged in the audit log. Because HAProxy is being assessed, this may be removed soon.

+lua | CHT Technology Radar for Contributors

lua

Lua is used in HAProxy to mask credentials from being logged in the audit log. Because HAProxy is being assessed, this may be removed soon.

\ No newline at end of file diff --git a/languages-and-frameworks/mochajs.html b/languages-and-frameworks/mochajs.html index c1c3cc7..7137ec5 100644 --- a/languages-and-frameworks/mochajs.html +++ b/languages-and-frameworks/mochajs.html @@ -1,3 +1,3 @@ -Mocha | CHT Technology Radar for Contributors

Mocha

Mocha is a JavaScript test framework running on Node.js and in the browser.

+Mocha | CHT Technology Radar for Contributors

Mocha

Mocha is a JavaScript test framework running on Node.js and in the browser.

In the CHT, Mocha is used to run the unit tests.

\ No newline at end of file diff --git a/languages-and-frameworks/nodejs.html b/languages-and-frameworks/nodejs.html index 2a0b9f3..66b610b 100644 --- a/languages-and-frameworks/nodejs.html +++ b/languages-and-frameworks/nodejs.html @@ -1,3 +1,3 @@ -node.js | CHT Technology Radar for Contributors

node.js

Node.js is an open-source, no-browser JavaScript execution runtime.

+node.js | CHT Technology Radar for Contributors

node.js

Node.js is an open-source, no-browser JavaScript execution runtime.

In the context of the CHT, it is used for services on the server like API and Sentinel as well as scripting.

\ No newline at end of file diff --git a/languages-and-frameworks/pouchdb.html b/languages-and-frameworks/pouchdb.html index 9568435..e89c72b 100644 --- a/languages-and-frameworks/pouchdb.html +++ b/languages-and-frameworks/pouchdb.html @@ -1,4 +1,4 @@ -PouchDB | CHT Technology Radar for Contributors

PouchDB

PouchDB is an open-source JavaScript database inspired by Apache CouchDB that is designed to run within the browser.

+PouchDB | CHT Technology Radar for Contributors

PouchDB

PouchDB is an open-source JavaScript database inspired by Apache CouchDB that is designed to run within the browser.

PouchDB is used for storing data on the phone in the CHT webapp to enable it to work offline seamlessly. It is also used as a library for querying CouchDB from api, sentinel, and the admin app.

\ No newline at end of file diff --git a/languages-and-frameworks/protractor.html b/languages-and-frameworks/protractor.html index 875bb1e..5de1fb8 100644 --- a/languages-and-frameworks/protractor.html +++ b/languages-and-frameworks/protractor.html @@ -1,4 +1,4 @@ -Protractor | CHT Technology Radar for Contributors

Protractor

Protractor is an end-to-end test framework for Angular and AngularJS applications.

+Protractor | CHT Technology Radar for Contributors

Protractor

Protractor is an end-to-end test framework for Angular and AngularJS applications.

Currently deprecated in the context of the CHT. All the end-to-end tests were rewritten to WebDriverIO.

The primary motivation to migrate from Protractor to WebDriverIO is that the Angular team announced in April, 2021 that Protractor will no longer be supported.

diff --git a/languages-and-frameworks/python.html b/languages-and-frameworks/python.html index 1d90e2a..aa1eaa2 100644 --- a/languages-and-frameworks/python.html +++ b/languages-and-frameworks/python.html @@ -1,3 +1,3 @@ -Python | CHT Technology Radar for Contributors

Python

Python is a programming language used currently only to convert xls forms to xforms in +Python | CHT Technology Radar for Contributors

Python

Python is a programming language used currently only to convert xls forms to xforms in cht-conf.

\ No newline at end of file diff --git a/languages-and-frameworks/sinonjs.html b/languages-and-frameworks/sinonjs.html new file mode 100644 index 0000000..d238cb4 --- /dev/null +++ b/languages-and-frameworks/sinonjs.html @@ -0,0 +1,3 @@ +Sinon.JS | CHT Technology Radar for Contributors

Sinon.JS

Sinon.JS is a JavaScript library that provides standalone test spies, stubs, and mocks.

+

Sinon.JS is used for unit testing in CHT Core.

+
\ No newline at end of file diff --git a/languages-and-frameworks/typescript.html b/languages-and-frameworks/typescript.html index aabb7b5..675b346 100644 --- a/languages-and-frameworks/typescript.html +++ b/languages-and-frameworks/typescript.html @@ -1,3 +1,3 @@ -TypeScript | CHT Technology Radar for Contributors

TypeScript

TypeScript is a language that gets transpiled to native JavaScript code.

+TypeScript | CHT Technology Radar for Contributors

TypeScript

TypeScript is a language that gets transpiled to native JavaScript code.

It is used a lot in CHT webapp with the potential to use it more widely.

\ No newline at end of file diff --git a/languages-and-frameworks/webdriverio.html b/languages-and-frameworks/webdriverio.html index 849654b..6f2bc79 100644 --- a/languages-and-frameworks/webdriverio.html +++ b/languages-and-frameworks/webdriverio.html @@ -1,4 +1,4 @@ -WebDriverIO | CHT Technology Radar for Contributors

WebDriverIO

WebDriverIO is UI testing framework used for end-to-end testing in web applications.

+WebDriverIO | CHT Technology Radar for Contributors

WebDriverIO

WebDriverIO is UI testing framework used for end-to-end testing in web applications.

In the CHT Core Framework, WebDriverIO is used to run the e2e tests.

WebDriverIO was influenced by a lot of Protractor's design decisions which is why it was the closest framework to migrate over.

Advantages

diff --git a/methods-and-patterns.html b/methods-and-patterns.html index 7ac5d9a..db0bd61 100644 --- a/methods-and-patterns.html +++ b/methods-and-patterns.html @@ -1 +1 @@ -CHT Technology Radar for Contributors
\ No newline at end of file +CHT Technology Radar for Contributors
\ No newline at end of file diff --git a/methods-and-patterns/continuous-discovery.html b/methods-and-patterns/continuous-discovery.html index 79760ce..01fbed5 100644 --- a/methods-and-patterns/continuous-discovery.html +++ b/methods-and-patterns/continuous-discovery.html @@ -1,2 +1,2 @@ -Continuous Discovery | CHT Technology Radar for Contributors

Continuous Discovery

Continuous Discovery is the product development process used to build the CHT.

+Continuous Discovery | CHT Technology Radar for Contributors

Continuous Discovery

Continuous Discovery is the product development process used to build the CHT.

\ No newline at end of file diff --git a/methods-and-patterns/continuous-integration.html b/methods-and-patterns/continuous-integration.html index c6961f4..cd7fd3c 100644 --- a/methods-and-patterns/continuous-integration.html +++ b/methods-and-patterns/continuous-integration.html @@ -1,3 +1,3 @@ -Continuous Integration | CHT Technology Radar for Contributors

Continuous Integration

Continuous Integration (CI) is a software development practice where developers regularly merge their code changes into a central repository, after which automated builds and tests are run.

+Continuous Integration | CHT Technology Radar for Contributors

Continuous Integration

Continuous Integration (CI) is a software development practice where developers regularly merge their code changes into a central repository, after which automated builds and tests are run.

The CHT has a fully automated end-to-end testing suite which is executed in CI and must pass before any code change is merged to the main branch.

\ No newline at end of file diff --git a/methods-and-patterns/pwa.html b/methods-and-patterns/pwa.html index 92d38f6..b3eac06 100644 --- a/methods-and-patterns/pwa.html +++ b/methods-and-patterns/pwa.html @@ -1,4 +1,4 @@ -PWA | CHT Technology Radar for Contributors

PWA

A progressive web application (PWA) is a type of application software delivered through the web, built using common web technologies including HTML, CSS, and JavaScript. +PWA | CHT Technology Radar for Contributors

PWA

A progressive web application (PWA) is a type of application software delivered through the web, built using common web technologies including HTML, CSS, and JavaScript. It is intended to work on any platform with a standards-compliant browser, including desktop and mobile devices.

The PWA is followed for CHT webapp to allow offline first capability.

\ No newline at end of file diff --git a/methods-and-patterns/quality-assistance.html b/methods-and-patterns/quality-assistance.html index b4849e0..c14b71b 100644 --- a/methods-and-patterns/quality-assistance.html +++ b/methods-and-patterns/quality-assistance.html @@ -1,2 +1,2 @@ -Quality Assistance | CHT Technology Radar for Contributors

Quality Assistance

Quality Assistance is the process used for ensuring the quality of the CHT.

+Quality Assistance | CHT Technology Radar for Contributors

Quality Assistance

Quality Assistance is the process used for ensuring the quality of the CHT.

\ No newline at end of file diff --git a/overview.html b/overview.html index 7ac5d9a..db0bd61 100644 --- a/overview.html +++ b/overview.html @@ -1 +1 @@ -CHT Technology Radar for Contributors
\ No newline at end of file +CHT Technology Radar for Contributors
\ No newline at end of file diff --git a/platforms-and-aoe-services.html b/platforms-and-aoe-services.html index 7ac5d9a..db0bd61 100644 --- a/platforms-and-aoe-services.html +++ b/platforms-and-aoe-services.html @@ -1 +1 @@ -CHT Technology Radar for Contributors
\ No newline at end of file +CHT Technology Radar for Contributors
\ No newline at end of file diff --git a/platforms-and-aoe-services/amazon-eks.html b/platforms-and-aoe-services/amazon-eks.html index 58da70a..fe83a99 100644 --- a/platforms-and-aoe-services/amazon-eks.html +++ b/platforms-and-aoe-services/amazon-eks.html @@ -1,3 +1,3 @@ -Amazon EKS | CHT Technology Radar for Contributors

Amazon EKS

Amazon Elastic Kubernetes Service (Amazon EKS) is a managed service that makes it easy to run Kubernetes on AWS. +Amazon EKS | CHT Technology Radar for Contributors

Amazon EKS

Amazon Elastic Kubernetes Service (Amazon EKS) is a managed service that makes it easy to run Kubernetes on AWS. It is currently used for Medic hosted CHT deployments.

\ No newline at end of file diff --git a/platforms-and-aoe-services/android-dev.html b/platforms-and-aoe-services/android-dev.html index a715b5c..c3ba7a3 100644 --- a/platforms-and-aoe-services/android-dev.html +++ b/platforms-and-aoe-services/android-dev.html @@ -1,3 +1,3 @@ -Android Development | CHT Technology Radar for Contributors

Android Development

An APK file (Android Package Kit file format) is the file format for applications used on the Android operating system (OS).

+Android Development | CHT Technology Radar for Contributors

Android Development

An APK file (Android Package Kit file format) is the file format for applications used on the Android operating system (OS).

Android APKs are created to wrap the CHT webapp in a native app.

\ No newline at end of file diff --git a/platforms-and-aoe-services/aws.html b/platforms-and-aoe-services/aws.html index b19ded1..3cdf3c2 100644 --- a/platforms-and-aoe-services/aws.html +++ b/platforms-and-aoe-services/aws.html @@ -1,2 +1,2 @@ -AWS | CHT Technology Radar for Contributors

AWS

AWS (Amazon Web Services) is a cloud provider used for Medic hosted services.

+AWS | CHT Technology Radar for Contributors

AWS

AWS (Amazon Web Services) is a cloud provider used for Medic hosted services.

\ No newline at end of file diff --git a/platforms-and-aoe-services/github.html b/platforms-and-aoe-services/github.html index e76103c..9fc1272 100644 --- a/platforms-and-aoe-services/github.html +++ b/platforms-and-aoe-services/github.html @@ -1,3 +1,3 @@ -GitHub | CHT Technology Radar for Contributors

GitHub

GitHub is a code hosting platform for version control and collaboration.

+GitHub | CHT Technology Radar for Contributors

GitHub

GitHub is a code hosting platform for version control and collaboration.

The CHT code is hosted in GitHub.

\ No newline at end of file diff --git a/platforms-and-aoe-services/helm.html b/platforms-and-aoe-services/helm.html index 502400a..adc3e29 100644 --- a/platforms-and-aoe-services/helm.html +++ b/platforms-and-aoe-services/helm.html @@ -1,3 +1,3 @@ -Helm | CHT Technology Radar for Contributors

Helm

Helm is a package manager for Kubernetes. It simplifies the deployment of applications into a Kubernetes cluster and provides additional features such as versioning and rollbacks.

+Helm | CHT Technology Radar for Contributors

Helm

Helm is a package manager for Kubernetes. It simplifies the deployment of applications into a Kubernetes cluster and provides additional features such as versioning and rollbacks.

We are assessing Helm for managing deployments within Kubernetes, which makes templating Kubernetes configuration files easy (also known as Helm charts).

\ No newline at end of file diff --git a/rd.json b/rd.json index e61c992..1d1e51b 100644 --- a/rd.json +++ b/rd.json @@ -1 +1 @@ -{"items":[{"flag":"new","featured":true,"revisions":[{"name":"amazon-eks","release":"2023-09-13","title":"Amazon EKS","ring":"adopt","quadrant":"platforms-and-aoe-services","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/amazon-eks.md","body":"

Amazon Elastic Kubernetes Service (Amazon EKS) is a managed service that makes it easy to run Kubernetes on AWS.\nIt is currently used for Medic hosted CHT deployments.

\n"}],"name":"amazon-eks","title":"Amazon EKS","ring":"adopt","quadrant":"platforms-and-aoe-services","body":"

Amazon Elastic Kubernetes Service (Amazon EKS) is a managed service that makes it easy to run Kubernetes on AWS.\nIt is currently used for Medic hosted CHT deployments.

\n","info":"","angleFraction":0.8370938867544957,"radiusFraction":0.182459815135241,"release":"2023-09-13","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/amazon-eks.md"},{"flag":"default","featured":true,"revisions":[{"name":"android-dev","release":"2023-09-12","title":"Android Development","ring":"adopt","quadrant":"platforms-and-aoe-services","tags":["app-development"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/android-dev.md","body":"

An APK file (Android Package Kit file format) is the file format for applications used on the Android operating system (OS).

\n

Android APKs are created to wrap the CHT webapp in a native app.

\n"}],"name":"android-dev","title":"Android Development","ring":"adopt","quadrant":"platforms-and-aoe-services","body":"

An APK file (Android Package Kit file format) is the file format for applications used on the Android operating system (OS).

\n

Android APKs are created to wrap the CHT webapp in a native app.

\n","info":"","angleFraction":0.6607638862069498,"radiusFraction":0.9679579039451602,"release":"2023-09-12","tags":["app-development"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/android-dev.md"},{"flag":"default","featured":true,"revisions":[{"name":"angular","release":"2023-09-12","title":"Angular","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/angular.md","body":"

Angular is a TypeScript-based, free and open-source single-page web application framework. \nIt is used for building the CHT webapp.

\n

Angular is a complete rewrite from the same team that built AngularJS.

\n

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the \nCHT version 3.11.\nThe upgrade drastically reduces the memory used on the phone.\nIt makes development of the Core Framework easier and more reliable and also makes it easier to keep on the latest version of Angular which means we can keep up to date and on a supported version.

\n"}],"name":"angular","title":"Angular","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Angular is a TypeScript-based, free and open-source single-page web application framework. \nIt is used for building the CHT webapp.

\n

Angular is a complete rewrite from the same team that built AngularJS.

\n

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the \nCHT version 3.11.\nThe upgrade drastically reduces the memory used on the phone.\nIt makes development of the Core Framework easier and more reliable and also makes it easier to keep on the latest version of Angular which means we can keep up to date and on a supported version.

\n","info":"","angleFraction":0.4416520818994605,"radiusFraction":0.6468612119878949,"release":"2023-09-12","tags":["framework","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/angular.md"},{"flag":"default","featured":true,"revisions":[{"name":"angularjs","release":"2023-09-12","title":"AngularJS","ring":"stop","quadrant":"languages-and-frameworks","tags":["framework","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/angularjs.md","body":"

AngularJS is an obsolete version of Angular.

\n

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the \nversion 3.11. \nThe upgrade drastically reduces the memory used on the phone. \nIt makes development of the Core Framework easier and more reliable and also makes it easier to keep on the latest version of Angular which means we can keep up to date and on a supported version.

\n

Currently, it is only used in the CHT admin app. Deprecated: rewrite to Angular.

\n"}],"name":"angularjs","title":"AngularJS","ring":"stop","quadrant":"languages-and-frameworks","body":"

AngularJS is an obsolete version of Angular.

\n

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the \nversion 3.11. \nThe upgrade drastically reduces the memory used on the phone. \nIt makes development of the Core Framework easier and more reliable and also makes it easier to keep on the latest version of Angular which means we can keep up to date and on a supported version.

\n

Currently, it is only used in the CHT admin app. Deprecated: rewrite to Angular.

\n","info":"","angleFraction":0.26260394961496547,"radiusFraction":0.7290795277917153,"release":"2023-09-12","tags":["framework","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/angularjs.md"},{"flag":"default","featured":true,"revisions":[{"name":"aws","release":"2023-09-12","title":"AWS","ring":"adopt","quadrant":"platforms-and-aoe-services","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/aws.md","body":"

AWS (Amazon Web Services) is a cloud provider used for Medic hosted services.

\n"}],"name":"aws","title":"AWS","ring":"adopt","quadrant":"platforms-and-aoe-services","body":"

AWS (Amazon Web Services) is a cloud provider used for Medic hosted services.

\n","info":"","angleFraction":0.23572501809203295,"radiusFraction":0.3419354937320511,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/aws.md"},{"flag":"default","featured":true,"revisions":[{"name":"bash","release":"2023-09-12","title":"Bash","ring":"stop","quadrant":"languages-and-frameworks","tags":["language","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/bash.md","body":"

Bash is a Unix-shell and command language used for scripting. \nJavaScript is preferred due to being more testable and cross-platform compatible.

\n"}],"name":"bash","title":"Bash","ring":"stop","quadrant":"languages-and-frameworks","body":"

Bash is a Unix-shell and command language used for scripting. \nJavaScript is preferred due to being more testable and cross-platform compatible.

\n","info":"","angleFraction":0.8144211450939922,"radiusFraction":0.6344174321814031,"release":"2023-09-12","tags":["language","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/bash.md"},{"flag":"default","featured":true,"revisions":[{"name":"continuous-discovery","release":"2023-09-12","title":"Continuous Discovery","ring":"adopt","quadrant":"methods-and-patterns","tags":["product-development"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/continuous-discovery.md","body":"

Continuous Discovery is the product development process used to build the CHT.

\n"}],"name":"continuous-discovery","title":"Continuous Discovery","ring":"adopt","quadrant":"methods-and-patterns","body":"

Continuous Discovery is the product development process used to build the CHT.

\n","info":"","angleFraction":0.6883613775362647,"radiusFraction":0.32111290115631363,"release":"2023-09-12","tags":["product-development"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/continuous-discovery.md"},{"flag":"default","featured":true,"revisions":[{"name":"continuous-integration","release":"2023-09-12","title":"Continuous Integration","ring":"adopt","quadrant":"methods-and-patterns","tags":["devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/continuous-integration.md","body":"

Continuous Integration (CI) is a software development practice where developers regularly merge their code changes into a central repository, after which automated builds and tests are run.

\n

The CHT has a fully automated end-to-end testing suite which is executed in CI and must pass before any code change is merged to the main branch.

\n"}],"name":"continuous-integration","title":"Continuous Integration","ring":"adopt","quadrant":"methods-and-patterns","body":"

Continuous Integration (CI) is a software development practice where developers regularly merge their code changes into a central repository, after which automated builds and tests are run.

\n

The CHT has a fully automated end-to-end testing suite which is executed in CI and must pass before any code change is merged to the main branch.

\n","info":"","angleFraction":0.5520457547948523,"radiusFraction":0.36059028057457554,"release":"2023-09-12","tags":["devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/continuous-integration.md"},{"flag":"default","featured":true,"revisions":[{"name":"couch2pg","release":"2023-09-12","title":"couch2pg","ring":"stop","quadrant":"tools","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/couch2pg.md","body":"

couch2pg is library and cli for one-way replicating CouchDB databases to PostgreSQL 9.4+.

\n

It is currently in maintenance. Look into cht-sync and cht-pipeline instead.

\n"}],"name":"couch2pg","title":"couch2pg","ring":"stop","quadrant":"tools","body":"

couch2pg is library and cli for one-way replicating CouchDB databases to PostgreSQL 9.4+.

\n

It is currently in maintenance. Look into cht-sync and cht-pipeline instead.

\n","info":"","angleFraction":0.05951307626887803,"radiusFraction":0.19879870190888305,"release":"2023-09-12","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/couch2pg.md"},{"flag":"default","featured":true,"revisions":[{"name":"couchdb","release":"2023-09-12","title":"CouchDB","ring":"adopt","quadrant":"tools","tags":["database"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/couchdb.md","body":"

Apache CouchDB is an open-source document-oriented NoSQL database. \nIt uses multiple formats and protocols to store, transfer, and process its data. It uses JSON to store data, JavaScript as its query language using MapReduce, and HTTP for an API.

\n

CouchDB is the primary database for the CHT. The CHT has a range of CouchDB databases for storing different types of data.

\n"}],"name":"couchdb","title":"CouchDB","ring":"adopt","quadrant":"tools","body":"

Apache CouchDB is an open-source document-oriented NoSQL database. \nIt uses multiple formats and protocols to store, transfer, and process its data. It uses JSON to store data, JavaScript as its query language using MapReduce, and HTTP for an API.

\n

CouchDB is the primary database for the CHT. The CHT has a range of CouchDB databases for storing different types of data.

\n","info":"","angleFraction":0.11758937116621726,"radiusFraction":0.738651820411987,"release":"2023-09-12","tags":["database"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/couchdb.md"},{"flag":"default","featured":true,"revisions":[{"name":"dbt","release":"2023-09-12","title":"dbt","ring":"assess","quadrant":"tools","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/dbt.md","body":"

dbt is an open-source tool and a commercial SaaS product that provides simple and effective transformation capabilities for data analysts.

\n

dbt uses SQL to model simple batch transformations, while it provides command-line tooling that encourages good engineering practices such as versioning, automated testing and deployment; essentially it implements SQL-based transformation modeling as code.\nIt currently supports multiple data sources, including Postgres.

\n

It the CHT context, dbt runs data tests and migrations for cht-sync.

\n"}],"name":"dbt","title":"dbt","ring":"assess","quadrant":"tools","body":"

dbt is an open-source tool and a commercial SaaS product that provides simple and effective transformation capabilities for data analysts.

\n

dbt uses SQL to model simple batch transformations, while it provides command-line tooling that encourages good engineering practices such as versioning, automated testing and deployment; essentially it implements SQL-based transformation modeling as code.\nIt currently supports multiple data sources, including Postgres.

\n

It the CHT context, dbt runs data tests and migrations for cht-sync.

\n","info":"","angleFraction":0.07366629776065037,"radiusFraction":0.3286696653238175,"release":"2023-09-12","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/dbt.md"},{"flag":"default","featured":true,"revisions":[{"name":"docker","release":"2023-09-12","title":"Docker","ring":"adopt","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/docker.md","body":"

Docker is currently the most-used solution for creating and managing container-based infrastructures and deployments.

\n

Docker is a platform to build container images, distribute them and run them as an isolated process (using Linux kernel cgroups, network namespaces and custom mounts).

\n

It is used extensively for containerizing CHT products.

\n"}],"name":"docker","title":"Docker","ring":"adopt","quadrant":"tools","body":"

Docker is currently the most-used solution for creating and managing container-based infrastructures and deployments.

\n

Docker is a platform to build container images, distribute them and run them as an isolated process (using Linux kernel cgroups, network namespaces and custom mounts).

\n

It is used extensively for containerizing CHT products.

\n","info":"","angleFraction":0.9391089335861733,"radiusFraction":0.8915338816314176,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/docker.md"},{"flag":"default","featured":true,"revisions":[{"name":"dot","release":"2023-09-12","title":"DOT","ring":"trial","quadrant":"tools","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/dot.md","body":"

Data Observation Toolkit (DOT) can be used to monitor data in order to flag problems with data integrity and scenarios that might need attention. \nTypical tests include checks for missing/duplicate and inconsistent data, outliers, and domain-specific signals such as a missed follow-up medical treatment after initial diagnosis.

\n

DOT includes a simple user interface for configuring the powerful DBT and Great Expectations libraries, as well as a database for storing and classifying data monitoring results.

\n"}],"name":"dot","title":"DOT","ring":"trial","quadrant":"tools","body":"

Data Observation Toolkit (DOT) can be used to monitor data in order to flag problems with data integrity and scenarios that might need attention. \nTypical tests include checks for missing/duplicate and inconsistent data, outliers, and domain-specific signals such as a missed follow-up medical treatment after initial diagnosis.

\n

DOT includes a simple user interface for configuring the powerful DBT and Great Expectations libraries, as well as a database for storing and classifying data monitoring results.

\n","info":"","angleFraction":0.11126017950556322,"radiusFraction":0.3988204739752741,"release":"2023-09-12","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/dot.md"},{"flag":"default","featured":true,"revisions":[{"name":"enketo","release":"2023-09-12","title":"Enketo","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/enketo.md","body":"

Enketo is a 100% free and open-source JavaScript library used for rendering xforms as HTML with CSS and JS.

\n"}],"name":"enketo","title":"Enketo","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Enketo is a 100% free and open-source JavaScript library used for rendering xforms as HTML with CSS and JS.

\n","info":"","angleFraction":0.36958433920469447,"radiusFraction":0.07546987190641685,"release":"2023-09-12","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/enketo.md"},{"flag":"default","featured":true,"revisions":[{"name":"git","release":"2023-09-12","title":"git","ring":"adopt","quadrant":"tools","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/git.md","body":"

Git is a free and open-source distributed version control system.

\n"}],"name":"git","title":"git","ring":"adopt","quadrant":"tools","body":"

Git is a free and open-source distributed version control system.

\n","info":"","angleFraction":0.8411197190277149,"radiusFraction":0.04393921012088797,"release":"2023-09-12","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/git.md"},{"flag":"default","featured":true,"revisions":[{"name":"github","release":"2023-09-12","title":"GitHub","ring":"adopt","quadrant":"platforms-and-aoe-services","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/github.md","body":"

GitHub is a code hosting platform for version control and collaboration.

\n

The CHT code is hosted in GitHub.

\n"}],"name":"github","title":"GitHub","ring":"adopt","quadrant":"platforms-and-aoe-services","body":"

GitHub is a code hosting platform for version control and collaboration.

\n

The CHT code is hosted in GitHub.

\n","info":"","angleFraction":0.007799102126296642,"radiusFraction":0.9036208421324583,"release":"2023-09-12","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/github.md"},{"flag":"default","featured":true,"revisions":[{"name":"github-actions","release":"2023-09-12","title":"GitHub Actions","ring":"adopt","quadrant":"tools","tags":["devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/github-actions.md","body":"

GitHub Actions is used extensively for Continuous Integration (CI) across CHT products including testing and releasing.

\n"}],"name":"github-actions","title":"GitHub Actions","ring":"adopt","quadrant":"tools","body":"

GitHub Actions is used extensively for Continuous Integration (CI) across CHT products including testing and releasing.

\n","info":"","angleFraction":0.48977978576725323,"radiusFraction":0.8782413706830621,"release":"2023-09-12","tags":["devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/github-actions.md"},{"flag":"changed","featured":true,"revisions":[{"name":"grafana","release":"2023-09-13","title":"Grafana","ring":"adopt","quadrant":"tools","tags":["monitoring","alerting","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/grafana.md","body":"

Grafana is an open-source dashboard visualization and alerting software. \nIt is an industry standard for this task, and it is written in Go and NodeJS.\nIt provides a vast choice of different graph types that can be easily combined into dashboards for displaying any kind of numerical or time-based data.

\n

There is a free repository of pre-existing dashboards which greatly reduce the time to create new dashboards and alerts. \nIt can send alerts via email, Slack, SMS and many more.

\n

In the CHT, Grafana is usually used in conjunction with Prometheus for visualizing both application and infrastructure metrics via the CHT Watchdog.

\n

You can find more details about using Grafana with the CHT Watchdog in the related documentation.\n.

\n"},{"name":"grafana","release":"2023-09-12","title":"Grafana","ring":"assess","quadrant":"tools","tags":["monitoring","alerting"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/grafana.md","body":"

Grafana is being evaluated for CHT Watchdog.

\n"}],"name":"grafana","title":"Grafana","ring":"adopt","quadrant":"tools","body":"

Grafana is an open-source dashboard visualization and alerting software. \nIt is an industry standard for this task, and it is written in Go and NodeJS.\nIt provides a vast choice of different graph types that can be easily combined into dashboards for displaying any kind of numerical or time-based data.

\n

There is a free repository of pre-existing dashboards which greatly reduce the time to create new dashboards and alerts. \nIt can send alerts via email, Slack, SMS and many more.

\n

In the CHT, Grafana is usually used in conjunction with Prometheus for visualizing both application and infrastructure metrics via the CHT Watchdog.

\n

You can find more details about using Grafana with the CHT Watchdog in the related documentation.\n.

\n","info":"","angleFraction":0.04906128819056854,"radiusFraction":0.7159698440615083,"release":"2023-09-13","tags":["monitoring","alerting","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/grafana.md"},{"flag":"default","featured":false,"revisions":[{"name":"grunt","release":"2023-09-12","title":"Grunt","ring":"stop","quadrant":"tools","tags":["tool"],"featured":false,"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/grunt.md","body":"

Grunt was designed as a task-based command line build tool for JavaScript projects. Grunt is primarily used to automate tasks that need to be performed routinely.

\n

Deprecated: Use native JavaScript instead.

\n"}],"name":"grunt","title":"Grunt","ring":"stop","quadrant":"tools","body":"

Grunt was designed as a task-based command line build tool for JavaScript projects. Grunt is primarily used to automate tasks that need to be performed routinely.

\n

Deprecated: Use native JavaScript instead.

\n","info":"","angleFraction":0.8539935803737846,"radiusFraction":0.6612264833248329,"release":"2023-09-12","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/grunt.md"},{"flag":"default","featured":true,"revisions":[{"name":"haproxy","release":"2023-09-12","title":"HAProxy","ring":"assess","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/haproxy.md","body":"

HAProxy is a free reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications.

\n

It is used for audit logging and load balancing CouchDB cluster. Due for re-evaluation.

\n"}],"name":"haproxy","title":"HAProxy","ring":"assess","quadrant":"tools","body":"

HAProxy is a free reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications.

\n

It is used for audit logging and load balancing CouchDB cluster. Due for re-evaluation.

\n","info":"","angleFraction":0.023756082078139507,"radiusFraction":0.18226772639091693,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/haproxy.md"},{"flag":"new","featured":true,"revisions":[{"name":"helm","release":"2023-09-13","title":"Helm","ring":"assess","quadrant":"platforms-and-aoe-services","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/helm.md","body":"

Helm is a package manager for Kubernetes. It simplifies the deployment of applications into a Kubernetes cluster and provides additional features such as versioning and rollbacks.

\n

We are assessing Helm for managing deployments within Kubernetes, which makes templating Kubernetes configuration files easy (also known as Helm charts).

\n"}],"name":"helm","title":"Helm","ring":"assess","quadrant":"platforms-and-aoe-services","body":"

Helm is a package manager for Kubernetes. It simplifies the deployment of applications into a Kubernetes cluster and provides additional features such as versioning and rollbacks.

\n

We are assessing Helm for managing deployments within Kubernetes, which makes templating Kubernetes configuration files easy (also known as Helm charts).

\n","info":"","angleFraction":0.06844364548236759,"radiusFraction":0.7617322188758922,"release":"2023-09-13","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/helm.md"},{"flag":"default","featured":true,"revisions":[{"name":"javascript","release":"2023-09-12","title":"JavaScript","ring":"adopt","quadrant":"languages-and-frameworks","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/javascript.md","body":"

JavaScript is the primary programming language used in the CHT.

\n"}],"name":"javascript","title":"JavaScript","ring":"adopt","quadrant":"languages-and-frameworks","body":"

JavaScript is the primary programming language used in the CHT.

\n","info":"","angleFraction":0.09276989056190921,"radiusFraction":0.9281598127220174,"release":"2023-09-12","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/javascript.md"},{"flag":"new","featured":true,"revisions":[{"name":"jest","release":"2023-09-13","title":"Jest","ring":"assess","quadrant":"languages-and-frameworks","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/jest.md","body":"

Jest is an open-source JS-based testing framework maintained by Facebook. \nIt is designed to be easy to use and provides a comprehensive set of tools for writing end-to-end, integration, and unit tests for JavaScript applications. \nIt is a complete and ready to set up JavaScript testing solution.

\n

In the CHT, Jest is used to test cht-interoperability.

\n

Advantages

\n
    \n
  • Easy to use: Jest is intuitive and easy to set up, making it ideal for beginners and experienced developers.
  • \n
  • Extensive test coverage: Jest provides a complete set of tools for writing unit, integration, and end-to-end tests.
  • \n
  • Integration with other frameworks: Jest integrates well with projects that use React, but can also be used with other JavaScript frameworks (​​Babel, TypeScript, Node, React, Angular, Vue and more).
  • \n
  • Fast and efficient: Jest uses parallel test execution and other techniques to speed up test execution time.
  • \n
  • Provides testing support for asynchronous code.
  • \n
  • It is maintained and well-documented, making it easy to learn.
  • \n
  • Code Coverage: Jest provides built-in code coverage reports to help developers identify areas not covered by tests.
  • \n
\n

Drawbacks

\n
    \n
  • Compared to Jasmine and other frameworks, not many libraries and toolings are supported by Jest.
  • \n
  • People not comfortable with the Jest framework have asserted that the learning curve is pretty hard.
  • \n
  • Leveraging auto-mocking can make tests slow. This is because the more dependencies a module has, the more work needs to be done by Jest to mock it, which comes at the cost of performance.
  • \n
  • Snapshot testing with Jest is not so feasible for larger snapshot files containing thousands of lines.
  • \n
  • Its debugging capabilities need improvement.
  • \n
\n

Market - Current Adoption

\n

Jest has over 10 million dependent repos on GitHub.\nProminent companies that reportedly adopt Jest in their tech stack are: Facebook, Airbnb, Spotify, The New York Times, Travel Perk, Twitter, Instagram, etc.\nStateofjs collects data from thousands of front-end developers in its annual surveys. \nHere’s their most recent ranking of most popular JS testing frameworks, sorted by their usage and Jest is at the top 3.

\n"}],"name":"jest","title":"Jest","ring":"assess","quadrant":"languages-and-frameworks","body":"

Jest is an open-source JS-based testing framework maintained by Facebook. \nIt is designed to be easy to use and provides a comprehensive set of tools for writing end-to-end, integration, and unit tests for JavaScript applications. \nIt is a complete and ready to set up JavaScript testing solution.

\n

In the CHT, Jest is used to test cht-interoperability.

\n

Advantages

\n
    \n
  • Easy to use: Jest is intuitive and easy to set up, making it ideal for beginners and experienced developers.
  • \n
  • Extensive test coverage: Jest provides a complete set of tools for writing unit, integration, and end-to-end tests.
  • \n
  • Integration with other frameworks: Jest integrates well with projects that use React, but can also be used with other JavaScript frameworks (​​Babel, TypeScript, Node, React, Angular, Vue and more).
  • \n
  • Fast and efficient: Jest uses parallel test execution and other techniques to speed up test execution time.
  • \n
  • Provides testing support for asynchronous code.
  • \n
  • It is maintained and well-documented, making it easy to learn.
  • \n
  • Code Coverage: Jest provides built-in code coverage reports to help developers identify areas not covered by tests.
  • \n
\n

Drawbacks

\n
    \n
  • Compared to Jasmine and other frameworks, not many libraries and toolings are supported by Jest.
  • \n
  • People not comfortable with the Jest framework have asserted that the learning curve is pretty hard.
  • \n
  • Leveraging auto-mocking can make tests slow. This is because the more dependencies a module has, the more work needs to be done by Jest to mock it, which comes at the cost of performance.
  • \n
  • Snapshot testing with Jest is not so feasible for larger snapshot files containing thousands of lines.
  • \n
  • Its debugging capabilities need improvement.
  • \n
\n

Market - Current Adoption

\n

Jest has over 10 million dependent repos on GitHub.\nProminent companies that reportedly adopt Jest in their tech stack are: Facebook, Airbnb, Spotify, The New York Times, Travel Perk, Twitter, Instagram, etc.\nStateofjs collects data from thousands of front-end developers in its annual surveys. \nHere’s their most recent ranking of most popular JS testing frameworks, sorted by their usage and Jest is at the top 3.

\n","info":"","angleFraction":0.04130635787078707,"radiusFraction":0.26857931042119954,"release":"2023-09-13","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/jest.md"},{"flag":"changed","featured":true,"revisions":[{"name":"k3d","release":"2023-09-13","title":"k3d","ring":"adopt","quadrant":"tools","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/k3d.md","body":"

k3d is a lightweight wrapper to run k3s (Rancher Lab’s minimal Kubernetes distribution) in docker.

\n

k3d makes it very easy to create single- and multi-node k3s clusters in Docker, e.g. for local development on Kubernetes.

\n"},{"name":"k3d","release":"2023-09-12","title":"k3d","ring":"assess","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/k3d.md","body":"

k3d is an orchestration tool which may be suitable for self-hosting. Under investigation.

\n"}],"name":"k3d","title":"k3d","ring":"adopt","quadrant":"tools","body":"

k3d is a lightweight wrapper to run k3s (Rancher Lab’s minimal Kubernetes distribution) in docker.

\n

k3d makes it very easy to create single- and multi-node k3s clusters in Docker, e.g. for local development on Kubernetes.

\n","info":"","angleFraction":0.6001636253204923,"radiusFraction":0.20679453053155195,"release":"2023-09-13","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/k3d.md"},{"flag":"new","featured":true,"revisions":[{"name":"k3s","release":"2023-09-13","title":"k3s","ring":"adopt","quadrant":"tools","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/k3s.md","body":"

k3s is a highly available, certified Kubernetes distribution designed for production workloads in unattended, resource-constrained, remote locations or inside IoT appliances.

\n"}],"name":"k3s","title":"k3s","ring":"adopt","quadrant":"tools","body":"

k3s is a highly available, certified Kubernetes distribution designed for production workloads in unattended, resource-constrained, remote locations or inside IoT appliances.

\n","info":"","angleFraction":0.6963380556872096,"radiusFraction":0.4721604056491242,"release":"2023-09-13","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/k3s.md"},{"flag":"changed","featured":true,"revisions":[{"name":"klipfolio","release":"2023-09-13","title":"Klipfolio","ring":"stop","quadrant":"tools","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/klipfolio.md","body":"

We recommend using Superset for building dashboards with the CHT, as it is an open-source tool.

\n

Read more about Data Flows for Analytics with the CHT in the CHT documentation.

\n"},{"name":"klipfolio","release":"2023-09-12","title":"Klipfolio","ring":"adopt","quadrant":"tools","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/klipfolio.md","body":"

Klipfolio is a paid third-party SAAS option for building dashboards.

\n"}],"name":"klipfolio","title":"Klipfolio","ring":"stop","quadrant":"tools","body":"

We recommend using Superset for building dashboards with the CHT, as it is an open-source tool.

\n

Read more about Data Flows for Analytics with the CHT in the CHT documentation.

\n","info":"","angleFraction":0.8195524795924605,"radiusFraction":0.11323463626251229,"release":"2023-09-13","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/klipfolio.md"},{"flag":"changed","featured":true,"revisions":[{"name":"kubernetes","release":"2023-09-13","title":"Kubernetes","ring":"adopt","quadrant":"tools","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/kubernetes.md","body":"

Kubernetes, also known as k8s, is an open-source system for automating deployment, scaling, and management of containerized applications.

\n

Kubernetes has developed into the quasi-standard for container orchestration: Nearly every cloud provider provides managed Kubernetes, and even Docker Enterprise uses Kubernetes.

\n"},{"name":"kubernetes","release":"2023-09-12","title":"Kubernetes","ring":"assess","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/kubernetes.md","body":"

Kubernetes platform is used for hosting the CHT. For self hosting partners we recommend lightweight implementations like k3d. For cloud deployments, use a Platform as a Service offering like Amazon EKS.

\n"}],"name":"kubernetes","title":"Kubernetes","ring":"adopt","quadrant":"tools","body":"

Kubernetes, also known as k8s, is an open-source system for automating deployment, scaling, and management of containerized applications.

\n

Kubernetes has developed into the quasi-standard for container orchestration: Nearly every cloud provider provides managed Kubernetes, and even Docker Enterprise uses Kubernetes.

\n","info":"","angleFraction":0.12377331527611224,"radiusFraction":0.8188069848369988,"release":"2023-09-13","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/kubernetes.md"},{"flag":"default","featured":true,"revisions":[{"name":"lua","release":"2023-09-12","title":"lua","ring":"assess","quadrant":"languages-and-frameworks","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/lua.md","body":"

Lua is used in HAProxy to mask credentials from being logged in the audit log. Because HAProxy is being assessed, this may be removed soon.

\n"}],"name":"lua","title":"lua","ring":"assess","quadrant":"languages-and-frameworks","body":"

Lua is used in HAProxy to mask credentials from being logged in the audit log. Because HAProxy is being assessed, this may be removed soon.

\n","info":"","angleFraction":0.524723682739731,"radiusFraction":0.4888055524414243,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/lua.md"},{"flag":"default","featured":true,"revisions":[{"name":"mochajs","release":"2023-09-12","title":"Mocha","ring":"adopt","quadrant":"languages-and-frameworks","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/mochajs.md","body":"

Mocha is a JavaScript test framework running on Node.js and in the browser.

\n

In the CHT, Mocha is used to run the unit tests.

\n"}],"name":"mochajs","title":"Mocha","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Mocha is a JavaScript test framework running on Node.js and in the browser.

\n

In the CHT, Mocha is used to run the unit tests.

\n","info":"","angleFraction":0.18051455414451412,"radiusFraction":0.7458066856368761,"release":"2023-09-12","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/mochajs.md"},{"flag":"default","featured":true,"revisions":[{"name":"nginx","release":"2023-09-12","title":"Nginx","ring":"adopt","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/nginx.md","body":"

Nginx is an open-source web server software used for reverse proxy, load balancing, and caching.

\n

It provides SSL termination for self-hosted CHT deployments.

\n"}],"name":"nginx","title":"Nginx","ring":"adopt","quadrant":"tools","body":"

Nginx is an open-source web server software used for reverse proxy, load balancing, and caching.

\n

It provides SSL termination for self-hosted CHT deployments.

\n","info":"","angleFraction":0.6866081054883486,"radiusFraction":0.8853367509105323,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/nginx.md"},{"flag":"default","featured":true,"revisions":[{"name":"nodejs","release":"2023-09-12","title":"node.js","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/nodejs.md","body":"

Node.js is an open-source, no-browser JavaScript execution runtime.

\n

In the context of the CHT, it is used for services on the server like API and Sentinel as well as scripting.

\n"}],"name":"nodejs","title":"node.js","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Node.js is an open-source, no-browser JavaScript execution runtime.

\n

In the context of the CHT, it is used for services on the server like API and Sentinel as well as scripting.

\n","info":"","angleFraction":0.49386122219851414,"radiusFraction":0.9726206530853658,"release":"2023-09-12","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/nodejs.md"},{"flag":"default","featured":true,"revisions":[{"name":"npm","release":"2023-09-12","title":"npm","ring":"adopt","quadrant":"tools","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/npm.md","body":"

npm is a library and registry for JavaScript software packages.

\n

It is used widely for CHT products.

\n"}],"name":"npm","title":"npm","ring":"adopt","quadrant":"tools","body":"

npm is a library and registry for JavaScript software packages.

\n

It is used widely for CHT products.

\n","info":"","angleFraction":0.9097264327348071,"radiusFraction":0.40564256523480524,"release":"2023-09-12","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/npm.md"},{"flag":"default","featured":true,"revisions":[{"name":"postgres","release":"2023-09-12","title":"Postgres","ring":"adopt","quadrant":"tools","tags":["database"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/postgres.md","body":"

Postgres is primarily used as a data warehouse for analytics queries.

\n"}],"name":"postgres","title":"Postgres","ring":"adopt","quadrant":"tools","body":"

Postgres is primarily used as a data warehouse for analytics queries.

\n","info":"","angleFraction":0.33859656452455056,"radiusFraction":0.8175998778175582,"release":"2023-09-12","tags":["database"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/postgres.md"},{"flag":"default","featured":true,"revisions":[{"name":"pouchdb","release":"2023-09-12","title":"PouchDB","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/pouchdb.md","body":"

PouchDB is an open-source JavaScript database inspired by Apache CouchDB that is designed to run within the browser.

\n

PouchDB is used for storing data on the phone in the CHT webapp to enable it to work offline seamlessly. \nIt is also used as a library for querying CouchDB from api, sentinel, and the admin app.

\n"}],"name":"pouchdb","title":"PouchDB","ring":"adopt","quadrant":"languages-and-frameworks","body":"

PouchDB is an open-source JavaScript database inspired by Apache CouchDB that is designed to run within the browser.

\n

PouchDB is used for storing data on the phone in the CHT webapp to enable it to work offline seamlessly. \nIt is also used as a library for querying CouchDB from api, sentinel, and the admin app.

\n","info":"","angleFraction":0.22650346071913519,"radiusFraction":0.5878730410708219,"release":"2023-09-12","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/pouchdb.md"},{"flag":"changed","featured":true,"revisions":[{"name":"prometheus","release":"2023-09-13","title":"Prometheus","ring":"adopt","quadrant":"tools","tags":["monitoring","alerting","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/prometheus.md","body":"

Prometheus is an open-source Time Series Database (TSDB) that was developed explicitly to do detailed longitudinal monitoring. \nIt also aggregates metrics and can automatically cull older data to save on CPU and disk space.

\n

Compared to other monitoring systems it stands out in its simple, still powerful and fully code-based configuration and the equally powerful service discovery mechanism.

\n

Prometheus integrates very well with Grafana which is the tool of choice for dashboard visualization in the CHT Watchdog.

\n

You can find more details about using Prometheus with the CHT Watchdog in the related documentation.

\n"},{"name":"prometheus","release":"2023-09-12","title":"Prometheus","ring":"assess","quadrant":"tools","tags":["monitoring","alerting"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/prometheus.md","body":"

Being evaluated for CHT Watchdog.

\n"}],"name":"prometheus","title":"Prometheus","ring":"adopt","quadrant":"tools","body":"

Prometheus is an open-source Time Series Database (TSDB) that was developed explicitly to do detailed longitudinal monitoring. \nIt also aggregates metrics and can automatically cull older data to save on CPU and disk space.

\n

Compared to other monitoring systems it stands out in its simple, still powerful and fully code-based configuration and the equally powerful service discovery mechanism.

\n

Prometheus integrates very well with Grafana which is the tool of choice for dashboard visualization in the CHT Watchdog.

\n

You can find more details about using Prometheus with the CHT Watchdog in the related documentation.

\n","info":"","angleFraction":0.8166199319760963,"radiusFraction":0.36822522860343354,"release":"2023-09-13","tags":["monitoring","alerting","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/prometheus.md"},{"flag":"default","featured":true,"revisions":[{"name":"protractor","release":"2023-09-12","title":"Protractor","ring":"stop","quadrant":"languages-and-frameworks","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/protractor.md","body":"

Protractor is an end-to-end test framework for Angular and AngularJS applications.

\n

Currently deprecated in the context of the CHT. All the end-to-end tests were rewritten to WebDriverIO.

\n

The primary motivation to migrate from Protractor to WebDriverIO is that the Angular team \nannounced in April, 2021 that Protractor will no longer be supported.

\n"}],"name":"protractor","title":"Protractor","ring":"stop","quadrant":"languages-and-frameworks","body":"

Protractor is an end-to-end test framework for Angular and AngularJS applications.

\n

Currently deprecated in the context of the CHT. All the end-to-end tests were rewritten to WebDriverIO.

\n

The primary motivation to migrate from Protractor to WebDriverIO is that the Angular team \nannounced in April, 2021 that Protractor will no longer be supported.

\n","info":"","angleFraction":0.22553714689007665,"radiusFraction":0.5083160278591334,"release":"2023-09-12","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/protractor.md"},{"flag":"default","featured":true,"revisions":[{"name":"pwa","release":"2023-09-12","title":"PWA","ring":"adopt","quadrant":"methods-and-patterns","tags":["technique"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/pwa.md","body":"

A progressive web application (PWA) is a type of application software delivered through the web, built using common web technologies including HTML, CSS, and JavaScript. \nIt is intended to work on any platform with a standards-compliant browser, including desktop and mobile devices.

\n

The PWA is followed for CHT webapp to allow offline first capability.

\n"}],"name":"pwa","title":"PWA","ring":"adopt","quadrant":"methods-and-patterns","body":"

A progressive web application (PWA) is a type of application software delivered through the web, built using common web technologies including HTML, CSS, and JavaScript. \nIt is intended to work on any platform with a standards-compliant browser, including desktop and mobile devices.

\n

The PWA is followed for CHT webapp to allow offline first capability.

\n","info":"","angleFraction":0.5224193025790862,"radiusFraction":0.06298259222023761,"release":"2023-09-12","tags":["technique"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/pwa.md"},{"flag":"default","featured":true,"revisions":[{"name":"python","release":"2023-09-12","title":"Python","ring":"stop","quadrant":"languages-and-frameworks","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/python.md","body":"

Python is a programming language used currently only to convert xls forms to xforms in \ncht-conf.

\n"}],"name":"python","title":"Python","ring":"stop","quadrant":"languages-and-frameworks","body":"

Python is a programming language used currently only to convert xls forms to xforms in \ncht-conf.

\n","info":"","angleFraction":0.15220507389362758,"radiusFraction":0.05889108496591344,"release":"2023-09-12","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/python.md"},{"flag":"default","featured":true,"revisions":[{"name":"quality-assistance","release":"2023-09-12","title":"Quality Assistance","ring":"adopt","quadrant":"methods-and-patterns","tags":["product-development","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/quality-assistance.md","body":"

Quality Assistance is the process used for ensuring the quality of the CHT.

\n"}],"name":"quality-assistance","title":"Quality Assistance","ring":"adopt","quadrant":"methods-and-patterns","body":"

Quality Assistance is the process used for ensuring the quality of the CHT.

\n","info":"","angleFraction":0.7793197549853959,"radiusFraction":0.3042171622860994,"release":"2023-09-12","tags":["product-development","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/quality-assistance.md"},{"flag":"new","featured":true,"revisions":[{"name":"sonarcloud","release":"2023-09-13","title":"SonarCloud","ring":"adopt","quadrant":"tools","tags":["ci/cd","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/sonarcloud.md","body":"

Sonar static analysis supports development by providing feedback on code quality and security issues.

\n

SonarCloud is the cloud-based solution of Sonar. \nIt can be enabled on any public GitHub repository in the Medic organization and must pass on all new code.

\n

You can find more details about using SonarCloud with the CHT\nin the related documentation.

\n"}],"name":"sonarcloud","title":"SonarCloud","ring":"adopt","quadrant":"tools","body":"

Sonar static analysis supports development by providing feedback on code quality and security issues.

\n

SonarCloud is the cloud-based solution of Sonar. \nIt can be enabled on any public GitHub repository in the Medic organization and must pass on all new code.

\n

You can find more details about using SonarCloud with the CHT\nin the related documentation.

\n","info":"","angleFraction":0.896077893662649,"radiusFraction":0.862164408456672,"release":"2023-09-13","tags":["ci/cd","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/sonarcloud.md"},{"flag":"default","featured":true,"revisions":[{"name":"superset","release":"2023-09-12","title":"Superset","ring":"adopt","quadrant":"tools","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/superset.md","body":"

Superset is an open-source data exploration and visualization platform.

\n

In the context of the CHT, Superset is used for health care analytics.

\n"}],"name":"superset","title":"Superset","ring":"adopt","quadrant":"tools","body":"

Superset is an open-source data exploration and visualization platform.

\n

In the context of the CHT, Superset is used for health care analytics.

\n","info":"","angleFraction":0.47351049787525357,"radiusFraction":0.551505294617072,"release":"2023-09-12","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/superset.md"},{"flag":"default","featured":true,"revisions":[{"name":"typescript","release":"2023-09-12","title":"TypeScript","ring":"adopt","quadrant":"languages-and-frameworks","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/typescript.md","body":"

TypeScript is a language that gets transpiled to native JavaScript code.

\n

It is used a lot in CHT webapp with the potential to use it more widely.

\n"}],"name":"typescript","title":"TypeScript","ring":"adopt","quadrant":"languages-and-frameworks","body":"

TypeScript is a language that gets transpiled to native JavaScript code.

\n

It is used a lot in CHT webapp with the potential to use it more widely.

\n","info":"","angleFraction":0.18514071194945125,"radiusFraction":0.2568584548048005,"release":"2023-09-12","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/typescript.md"},{"flag":"default","featured":true,"revisions":[{"name":"webdriverio","release":"2023-09-12","title":"WebDriverIO","ring":"adopt","quadrant":"languages-and-frameworks","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/webdriverio.md","body":"

WebDriverIO is UI testing framework used for end-to-end testing in web applications.

\n

In the CHT Core Framework, WebDriverIO is used to run the e2e tests.

\n

WebDriverIO was influenced by a lot of Protractor's design decisions which is why it was the closest framework to migrate over.

\n

Advantages

\n
    \n
  • Open source
  • \n
  • Numerous integrations to tools
  • \n
  • Fast and easy location of page elements
  • \n
  • Good documentation
  • \n
\n

Drawbacks

\n
    \n
  • Integrations with reports (specifically allure) frameworks is not straightforward.
  • \n
\n

The migration from Protractor was finalized in July 2023.

\n"}],"name":"webdriverio","title":"WebDriverIO","ring":"adopt","quadrant":"languages-and-frameworks","body":"

WebDriverIO is UI testing framework used for end-to-end testing in web applications.

\n

In the CHT Core Framework, WebDriverIO is used to run the e2e tests.

\n

WebDriverIO was influenced by a lot of Protractor's design decisions which is why it was the closest framework to migrate over.

\n

Advantages

\n
    \n
  • Open source
  • \n
  • Numerous integrations to tools
  • \n
  • Fast and easy location of page elements
  • \n
  • Good documentation
  • \n
\n

Drawbacks

\n
    \n
  • Integrations with reports (specifically allure) frameworks is not straightforward.
  • \n
\n

The migration from Protractor was finalized in July 2023.

\n","info":"","angleFraction":0.5409453980961059,"radiusFraction":0.14681398039078997,"release":"2023-09-12","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/webdriverio.md"}],"releases":["2023-09-12","2023-09-13"]} \ No newline at end of file +{"items":[{"flag":"default","featured":true,"revisions":[{"name":"amazon-eks","release":"2023-09-13","title":"Amazon EKS","ring":"adopt","quadrant":"platforms-and-aoe-services","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/amazon-eks.md","body":"

Amazon Elastic Kubernetes Service (Amazon EKS) is a managed service that makes it easy to run Kubernetes on AWS.\nIt is currently used for Medic hosted CHT deployments.

\n"}],"name":"amazon-eks","title":"Amazon EKS","ring":"adopt","quadrant":"platforms-and-aoe-services","body":"

Amazon Elastic Kubernetes Service (Amazon EKS) is a managed service that makes it easy to run Kubernetes on AWS.\nIt is currently used for Medic hosted CHT deployments.

\n","info":"","angleFraction":0.28033586661122456,"radiusFraction":0.789758398321692,"release":"2023-09-13","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/amazon-eks.md"},{"flag":"default","featured":true,"revisions":[{"name":"android-dev","release":"2023-09-12","title":"Android Development","ring":"adopt","quadrant":"platforms-and-aoe-services","tags":["app-development"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/android-dev.md","body":"

An APK file (Android Package Kit file format) is the file format for applications used on the Android operating system (OS).

\n

Android APKs are created to wrap the CHT webapp in a native app.

\n"}],"name":"android-dev","title":"Android Development","ring":"adopt","quadrant":"platforms-and-aoe-services","body":"

An APK file (Android Package Kit file format) is the file format for applications used on the Android operating system (OS).

\n

Android APKs are created to wrap the CHT webapp in a native app.

\n","info":"","angleFraction":0.6549221839385315,"radiusFraction":0.25636239570459796,"release":"2023-09-12","tags":["app-development"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/android-dev.md"},{"flag":"default","featured":true,"revisions":[{"name":"angular","release":"2023-09-12","title":"Angular","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/angular.md","body":"

Angular is a TypeScript-based, free and open-source single-page web application framework. \nIt is used for building the CHT webapp.

\n

Angular is a complete rewrite from the same team that built AngularJS.

\n

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the \nCHT version 3.11.\nThe upgrade drastically reduces the memory used on the phone.\nIt makes development of the Core Framework easier and more reliable and also makes it easier to keep on the latest version of Angular which means we can keep up to date and on a supported version.

\n"}],"name":"angular","title":"Angular","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Angular is a TypeScript-based, free and open-source single-page web application framework. \nIt is used for building the CHT webapp.

\n

Angular is a complete rewrite from the same team that built AngularJS.

\n

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the \nCHT version 3.11.\nThe upgrade drastically reduces the memory used on the phone.\nIt makes development of the Core Framework easier and more reliable and also makes it easier to keep on the latest version of Angular which means we can keep up to date and on a supported version.

\n","info":"","angleFraction":0.156478858564705,"radiusFraction":0.9304921066405356,"release":"2023-09-12","tags":["framework","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/angular.md"},{"flag":"default","featured":true,"revisions":[{"name":"angularjs","release":"2023-09-12","title":"AngularJS","ring":"stop","quadrant":"languages-and-frameworks","tags":["framework","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/angularjs.md","body":"

AngularJS is an obsolete version of Angular.

\n

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the \nversion 3.11. \nThe upgrade drastically reduces the memory used on the phone. \nIt makes development of the Core Framework easier and more reliable and also makes it easier to keep on the latest version of Angular which means we can keep up to date and on a supported version.

\n

Currently, it is only used in the CHT admin app. Deprecated: rewrite to Angular.

\n"}],"name":"angularjs","title":"AngularJS","ring":"stop","quadrant":"languages-and-frameworks","body":"

AngularJS is an obsolete version of Angular.

\n

The CHT UI framework was upgraded from the deprecated AngularJS v1.6 to Angular in the \nversion 3.11. \nThe upgrade drastically reduces the memory used on the phone. \nIt makes development of the Core Framework easier and more reliable and also makes it easier to keep on the latest version of Angular which means we can keep up to date and on a supported version.

\n

Currently, it is only used in the CHT admin app. Deprecated: rewrite to Angular.

\n","info":"","angleFraction":0.012735101148310113,"radiusFraction":0.06730186766963975,"release":"2023-09-12","tags":["framework","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/angularjs.md"},{"flag":"default","featured":true,"revisions":[{"name":"aws","release":"2023-09-12","title":"AWS","ring":"adopt","quadrant":"platforms-and-aoe-services","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/aws.md","body":"

AWS (Amazon Web Services) is a cloud provider used for Medic hosted services.

\n"}],"name":"aws","title":"AWS","ring":"adopt","quadrant":"platforms-and-aoe-services","body":"

AWS (Amazon Web Services) is a cloud provider used for Medic hosted services.

\n","info":"","angleFraction":0.073814153957523,"radiusFraction":0.827684380224722,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/aws.md"},{"flag":"default","featured":true,"revisions":[{"name":"bash","release":"2023-09-12","title":"Bash","ring":"stop","quadrant":"languages-and-frameworks","tags":["language","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/bash.md","body":"

Bash is a Unix-shell and command language used for scripting. \nJavaScript is preferred due to being more testable and cross-platform compatible.

\n"}],"name":"bash","title":"Bash","ring":"stop","quadrant":"languages-and-frameworks","body":"

Bash is a Unix-shell and command language used for scripting. \nJavaScript is preferred due to being more testable and cross-platform compatible.

\n","info":"","angleFraction":0.10867939648672564,"radiusFraction":0.6715682017874569,"release":"2023-09-12","tags":["language","coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/bash.md"},{"flag":"new","featured":true,"revisions":[{"name":"chaijs","release":"2024-03-15","title":"Chai.js","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2024-03-15/chaijs.md","body":"

Chai.js is a BDD (Behavior-driven development) / TDD (Test-driven development) assertion library for node and the browser that can be paired with any JavaScript testing framework.

\n

Chai.js is used for unit testing in CHT Core.

\n"}],"name":"chaijs","title":"Chai.js","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Chai.js is a BDD (Behavior-driven development) / TDD (Test-driven development) assertion library for node and the browser that can be paired with any JavaScript testing framework.

\n

Chai.js is used for unit testing in CHT Core.

\n","info":"","angleFraction":0.8438551871195994,"radiusFraction":0.21948337739734636,"release":"2024-03-15","tags":["framework","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2024-03-15/chaijs.md"},{"flag":"default","featured":true,"revisions":[{"name":"continuous-discovery","release":"2023-09-12","title":"Continuous Discovery","ring":"adopt","quadrant":"methods-and-patterns","tags":["product-development"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/continuous-discovery.md","body":"

Continuous Discovery is the product development process used to build the CHT.

\n"}],"name":"continuous-discovery","title":"Continuous Discovery","ring":"adopt","quadrant":"methods-and-patterns","body":"

Continuous Discovery is the product development process used to build the CHT.

\n","info":"","angleFraction":0.9079230243013536,"radiusFraction":0.5824881599320415,"release":"2023-09-12","tags":["product-development"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/continuous-discovery.md"},{"flag":"default","featured":true,"revisions":[{"name":"continuous-integration","release":"2023-09-12","title":"Continuous Integration","ring":"adopt","quadrant":"methods-and-patterns","tags":["devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/continuous-integration.md","body":"

Continuous Integration (CI) is a software development practice where developers regularly merge their code changes into a central repository, after which automated builds and tests are run.

\n

The CHT has a fully automated end-to-end testing suite which is executed in CI and must pass before any code change is merged to the main branch.

\n"}],"name":"continuous-integration","title":"Continuous Integration","ring":"adopt","quadrant":"methods-and-patterns","body":"

Continuous Integration (CI) is a software development practice where developers regularly merge their code changes into a central repository, after which automated builds and tests are run.

\n

The CHT has a fully automated end-to-end testing suite which is executed in CI and must pass before any code change is merged to the main branch.

\n","info":"","angleFraction":0.3189747542351131,"radiusFraction":0.8782508542659282,"release":"2023-09-12","tags":["devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/continuous-integration.md"},{"flag":"default","featured":true,"revisions":[{"name":"couch2pg","release":"2023-09-12","title":"couch2pg","ring":"stop","quadrant":"tools","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/couch2pg.md","body":"

couch2pg is library and cli for one-way replicating CouchDB databases to PostgreSQL 9.4+.

\n

It is currently in maintenance. Look into cht-sync and cht-pipeline instead.

\n"}],"name":"couch2pg","title":"couch2pg","ring":"stop","quadrant":"tools","body":"

couch2pg is library and cli for one-way replicating CouchDB databases to PostgreSQL 9.4+.

\n

It is currently in maintenance. Look into cht-sync and cht-pipeline instead.

\n","info":"","angleFraction":0.8252935866975144,"radiusFraction":0.42594604128983193,"release":"2023-09-12","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/couch2pg.md"},{"flag":"default","featured":true,"revisions":[{"name":"couchdb","release":"2023-09-12","title":"CouchDB","ring":"adopt","quadrant":"tools","tags":["database"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/couchdb.md","body":"

Apache CouchDB is an open-source document-oriented NoSQL database. \nIt uses multiple formats and protocols to store, transfer, and process its data. It uses JSON to store data, JavaScript as its query language using MapReduce, and HTTP for an API.

\n

CouchDB is the primary database for the CHT. The CHT has a range of CouchDB databases for storing different types of data.

\n"}],"name":"couchdb","title":"CouchDB","ring":"adopt","quadrant":"tools","body":"

Apache CouchDB is an open-source document-oriented NoSQL database. \nIt uses multiple formats and protocols to store, transfer, and process its data. It uses JSON to store data, JavaScript as its query language using MapReduce, and HTTP for an API.

\n

CouchDB is the primary database for the CHT. The CHT has a range of CouchDB databases for storing different types of data.

\n","info":"","angleFraction":0.58927072984546,"radiusFraction":0.10875688494660718,"release":"2023-09-12","tags":["database"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/couchdb.md"},{"flag":"default","featured":true,"revisions":[{"name":"dbt","release":"2023-09-12","title":"dbt","ring":"assess","quadrant":"tools","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/dbt.md","body":"

dbt is an open-source tool and a commercial SaaS product that provides simple and effective transformation capabilities for data analysts.

\n

dbt uses SQL to model simple batch transformations, while it provides command-line tooling that encourages good engineering practices such as versioning, automated testing and deployment; essentially it implements SQL-based transformation modeling as code.\nIt currently supports multiple data sources, including Postgres.

\n

It the CHT context, dbt runs data tests and migrations for cht-sync.

\n"}],"name":"dbt","title":"dbt","ring":"assess","quadrant":"tools","body":"

dbt is an open-source tool and a commercial SaaS product that provides simple and effective transformation capabilities for data analysts.

\n

dbt uses SQL to model simple batch transformations, while it provides command-line tooling that encourages good engineering practices such as versioning, automated testing and deployment; essentially it implements SQL-based transformation modeling as code.\nIt currently supports multiple data sources, including Postgres.

\n

It the CHT context, dbt runs data tests and migrations for cht-sync.

\n","info":"","angleFraction":0.053158581530653226,"radiusFraction":0.8112832130809289,"release":"2023-09-12","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/dbt.md"},{"flag":"default","featured":true,"revisions":[{"name":"docker","release":"2023-09-12","title":"Docker","ring":"adopt","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/docker.md","body":"

Docker is currently the most-used solution for creating and managing container-based infrastructures and deployments.

\n

Docker is a platform to build container images, distribute them and run them as an isolated process (using Linux kernel cgroups, network namespaces and custom mounts).

\n

It is used extensively for containerizing CHT products.

\n"}],"name":"docker","title":"Docker","ring":"adopt","quadrant":"tools","body":"

Docker is currently the most-used solution for creating and managing container-based infrastructures and deployments.

\n

Docker is a platform to build container images, distribute them and run them as an isolated process (using Linux kernel cgroups, network namespaces and custom mounts).

\n

It is used extensively for containerizing CHT products.

\n","info":"","angleFraction":0.6617583535900398,"radiusFraction":0.48698343078011463,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/docker.md"},{"flag":"default","featured":true,"revisions":[{"name":"dot","release":"2023-09-12","title":"DOT","ring":"trial","quadrant":"tools","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/dot.md","body":"

Data Observation Toolkit (DOT) can be used to monitor data in order to flag problems with data integrity and scenarios that might need attention. \nTypical tests include checks for missing/duplicate and inconsistent data, outliers, and domain-specific signals such as a missed follow-up medical treatment after initial diagnosis.

\n

DOT includes a simple user interface for configuring the powerful DBT and Great Expectations libraries, as well as a database for storing and classifying data monitoring results.

\n"}],"name":"dot","title":"DOT","ring":"trial","quadrant":"tools","body":"

Data Observation Toolkit (DOT) can be used to monitor data in order to flag problems with data integrity and scenarios that might need attention. \nTypical tests include checks for missing/duplicate and inconsistent data, outliers, and domain-specific signals such as a missed follow-up medical treatment after initial diagnosis.

\n

DOT includes a simple user interface for configuring the powerful DBT and Great Expectations libraries, as well as a database for storing and classifying data monitoring results.

\n","info":"","angleFraction":0.8641825956173366,"radiusFraction":0.6908902010466063,"release":"2023-09-12","tags":["data"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/dot.md"},{"flag":"default","featured":true,"revisions":[{"name":"enketo","release":"2023-09-12","title":"Enketo","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/enketo.md","body":"

Enketo is a 100% free and open-source JavaScript library used for rendering xforms as HTML with CSS and JS.

\n"}],"name":"enketo","title":"Enketo","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Enketo is a 100% free and open-source JavaScript library used for rendering xforms as HTML with CSS and JS.

\n","info":"","angleFraction":0.21895400709823498,"radiusFraction":0.5658558719021218,"release":"2023-09-12","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/enketo.md"},{"flag":"new","featured":true,"revisions":[{"name":"expressjs","release":"2024-03-15","title":"Express.js","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2024-03-15/expressjs.md","body":"

Express.js is a back-end web application framework for building RESTful APIs with Node.js. It is free and open-source software under the MIT License.

\n

Express.js is used for building CHT Core API.

\n"}],"name":"expressjs","title":"Express.js","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Express.js is a back-end web application framework for building RESTful APIs with Node.js. It is free and open-source software under the MIT License.

\n

Express.js is used for building CHT Core API.

\n","info":"","angleFraction":0.41666895645236735,"radiusFraction":0.5751076646277635,"release":"2024-03-15","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2024-03-15/expressjs.md"},{"flag":"default","featured":true,"revisions":[{"name":"git","release":"2023-09-12","title":"git","ring":"adopt","quadrant":"tools","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/git.md","body":"

Git is a free and open-source distributed version control system.

\n"}],"name":"git","title":"git","ring":"adopt","quadrant":"tools","body":"

Git is a free and open-source distributed version control system.

\n","info":"","angleFraction":0.989271323003823,"radiusFraction":0.11499600900306839,"release":"2023-09-12","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/git.md"},{"flag":"default","featured":true,"revisions":[{"name":"github","release":"2023-09-12","title":"GitHub","ring":"adopt","quadrant":"platforms-and-aoe-services","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/github.md","body":"

GitHub is a code hosting platform for version control and collaboration.

\n

The CHT code is hosted in GitHub.

\n"}],"name":"github","title":"GitHub","ring":"adopt","quadrant":"platforms-and-aoe-services","body":"

GitHub is a code hosting platform for version control and collaboration.

\n

The CHT code is hosted in GitHub.

\n","info":"","angleFraction":0.6857952867170343,"radiusFraction":0.04132650535268945,"release":"2023-09-12","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/github.md"},{"flag":"default","featured":true,"revisions":[{"name":"github-actions","release":"2023-09-12","title":"GitHub Actions","ring":"adopt","quadrant":"tools","tags":["devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/github-actions.md","body":"

GitHub Actions is used extensively for Continuous Integration (CI) across CHT products including testing and releasing.

\n"}],"name":"github-actions","title":"GitHub Actions","ring":"adopt","quadrant":"tools","body":"

GitHub Actions is used extensively for Continuous Integration (CI) across CHT products including testing and releasing.

\n","info":"","angleFraction":0.01936291380119992,"radiusFraction":0.4980030539331546,"release":"2023-09-12","tags":["devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/github-actions.md"},{"flag":"default","featured":true,"revisions":[{"name":"grafana","release":"2023-09-13","title":"Grafana","ring":"adopt","quadrant":"tools","tags":["monitoring","alerting","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/grafana.md","body":"

Grafana is an open-source dashboard visualization and alerting software. \nIt is an industry standard for this task, and it is written in Go and NodeJS.\nIt provides a vast choice of different graph types that can be easily combined into dashboards for displaying any kind of numerical or time-based data.

\n

There is a free repository of pre-existing dashboards which greatly reduce the time to create new dashboards and alerts. \nIt can send alerts via email, Slack, SMS and many more.

\n

In the CHT, Grafana is usually used in conjunction with Prometheus for visualizing both application and infrastructure metrics via the CHT Watchdog.

\n

You can find more details about using Grafana with the CHT Watchdog in the related documentation.\n.

\n"},{"name":"grafana","release":"2023-09-12","title":"Grafana","ring":"assess","quadrant":"tools","tags":["monitoring","alerting"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/grafana.md","body":"

Grafana is being evaluated for CHT Watchdog.

\n"}],"name":"grafana","title":"Grafana","ring":"adopt","quadrant":"tools","body":"

Grafana is an open-source dashboard visualization and alerting software. \nIt is an industry standard for this task, and it is written in Go and NodeJS.\nIt provides a vast choice of different graph types that can be easily combined into dashboards for displaying any kind of numerical or time-based data.

\n

There is a free repository of pre-existing dashboards which greatly reduce the time to create new dashboards and alerts. \nIt can send alerts via email, Slack, SMS and many more.

\n

In the CHT, Grafana is usually used in conjunction with Prometheus for visualizing both application and infrastructure metrics via the CHT Watchdog.

\n

You can find more details about using Grafana with the CHT Watchdog in the related documentation.\n.

\n","info":"","angleFraction":0.39755794441237735,"radiusFraction":0.4954466901393433,"release":"2023-09-13","tags":["monitoring","alerting","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/grafana.md"},{"flag":"default","featured":false,"revisions":[{"name":"grunt","release":"2023-09-12","title":"Grunt","ring":"stop","quadrant":"tools","tags":["tool"],"featured":false,"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/grunt.md","body":"

Grunt was designed as a task-based command line build tool for JavaScript projects. Grunt is primarily used to automate tasks that need to be performed routinely.

\n

Deprecated: Use native JavaScript instead. Last available on: CHT 4.3.

\n"}],"name":"grunt","title":"Grunt","ring":"stop","quadrant":"tools","body":"

Grunt was designed as a task-based command line build tool for JavaScript projects. Grunt is primarily used to automate tasks that need to be performed routinely.

\n

Deprecated: Use native JavaScript instead. Last available on: CHT 4.3.

\n","info":"","angleFraction":0.27155367964454435,"radiusFraction":0.42380861527584224,"release":"2023-09-12","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/grunt.md"},{"flag":"default","featured":true,"revisions":[{"name":"haproxy","release":"2023-09-12","title":"HAProxy","ring":"assess","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/haproxy.md","body":"

HAProxy is a free reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications.

\n

It is used for audit logging and load balancing CouchDB cluster. Due for re-evaluation.

\n"}],"name":"haproxy","title":"HAProxy","ring":"assess","quadrant":"tools","body":"

HAProxy is a free reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications.

\n

It is used for audit logging and load balancing CouchDB cluster. Due for re-evaluation.

\n","info":"","angleFraction":0.9616851656662198,"radiusFraction":0.42898904886570133,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/haproxy.md"},{"flag":"default","featured":true,"revisions":[{"name":"helm","release":"2023-09-13","title":"Helm","ring":"assess","quadrant":"platforms-and-aoe-services","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/helm.md","body":"

Helm is a package manager for Kubernetes. It simplifies the deployment of applications into a Kubernetes cluster and provides additional features such as versioning and rollbacks.

\n

We are assessing Helm for managing deployments within Kubernetes, which makes templating Kubernetes configuration files easy (also known as Helm charts).

\n"}],"name":"helm","title":"Helm","ring":"assess","quadrant":"platforms-and-aoe-services","body":"

Helm is a package manager for Kubernetes. It simplifies the deployment of applications into a Kubernetes cluster and provides additional features such as versioning and rollbacks.

\n

We are assessing Helm for managing deployments within Kubernetes, which makes templating Kubernetes configuration files easy (also known as Helm charts).

\n","info":"","angleFraction":0.6315648761955597,"radiusFraction":0.9291988044795652,"release":"2023-09-13","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/helm.md"},{"flag":"default","featured":true,"revisions":[{"name":"javascript","release":"2023-09-12","title":"JavaScript","ring":"adopt","quadrant":"languages-and-frameworks","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/javascript.md","body":"

JavaScript is the primary programming language used in the CHT.

\n"}],"name":"javascript","title":"JavaScript","ring":"adopt","quadrant":"languages-and-frameworks","body":"

JavaScript is the primary programming language used in the CHT.

\n","info":"","angleFraction":0.8614201878163157,"radiusFraction":0.2006592163999057,"release":"2023-09-12","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/javascript.md"},{"flag":"default","featured":true,"revisions":[{"name":"jest","release":"2023-09-13","title":"Jest","ring":"assess","quadrant":"languages-and-frameworks","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/jest.md","body":"

Jest is an open-source JS-based testing framework maintained by Facebook. \nIt is designed to be easy to use and provides a comprehensive set of tools for writing end-to-end, integration, and unit tests for JavaScript applications. \nIt is a complete and ready to set up JavaScript testing solution.

\n

In the CHT, Jest is used to test cht-interoperability.

\n

Advantages

\n
    \n
  • Easy to use: Jest is intuitive and easy to set up, making it ideal for beginners and experienced developers.
  • \n
  • Extensive test coverage: Jest provides a complete set of tools for writing unit, integration, and end-to-end tests.
  • \n
  • Integration with other frameworks: Jest integrates well with projects that use React, but can also be used with other JavaScript frameworks (​​Babel, TypeScript, Node, React, Angular, Vue and more).
  • \n
  • Fast and efficient: Jest uses parallel test execution and other techniques to speed up test execution time.
  • \n
  • Provides testing support for asynchronous code.
  • \n
  • It is maintained and well-documented, making it easy to learn.
  • \n
  • Code Coverage: Jest provides built-in code coverage reports to help developers identify areas not covered by tests.
  • \n
\n

Drawbacks

\n
    \n
  • Compared to Jasmine and other frameworks, not many libraries and toolings are supported by Jest.
  • \n
  • People not comfortable with the Jest framework have asserted that the learning curve is pretty hard.
  • \n
  • Leveraging auto-mocking can make tests slow. This is because the more dependencies a module has, the more work needs to be done by Jest to mock it, which comes at the cost of performance.
  • \n
  • Snapshot testing with Jest is not so feasible for larger snapshot files containing thousands of lines.
  • \n
  • Its debugging capabilities need improvement.
  • \n
\n

Market - Current Adoption

\n

Jest has over 10 million dependent repos on GitHub.\nProminent companies that reportedly adopt Jest in their tech stack are: Facebook, Airbnb, Spotify, The New York Times, Travel Perk, Twitter, Instagram, etc.\nStateofjs collects data from thousands of front-end developers in its annual surveys. \nHere’s their most recent ranking of most popular JS testing frameworks, sorted by their usage and Jest is at the top 3.

\n"}],"name":"jest","title":"Jest","ring":"assess","quadrant":"languages-and-frameworks","body":"

Jest is an open-source JS-based testing framework maintained by Facebook. \nIt is designed to be easy to use and provides a comprehensive set of tools for writing end-to-end, integration, and unit tests for JavaScript applications. \nIt is a complete and ready to set up JavaScript testing solution.

\n

In the CHT, Jest is used to test cht-interoperability.

\n

Advantages

\n
    \n
  • Easy to use: Jest is intuitive and easy to set up, making it ideal for beginners and experienced developers.
  • \n
  • Extensive test coverage: Jest provides a complete set of tools for writing unit, integration, and end-to-end tests.
  • \n
  • Integration with other frameworks: Jest integrates well with projects that use React, but can also be used with other JavaScript frameworks (​​Babel, TypeScript, Node, React, Angular, Vue and more).
  • \n
  • Fast and efficient: Jest uses parallel test execution and other techniques to speed up test execution time.
  • \n
  • Provides testing support for asynchronous code.
  • \n
  • It is maintained and well-documented, making it easy to learn.
  • \n
  • Code Coverage: Jest provides built-in code coverage reports to help developers identify areas not covered by tests.
  • \n
\n

Drawbacks

\n
    \n
  • Compared to Jasmine and other frameworks, not many libraries and toolings are supported by Jest.
  • \n
  • People not comfortable with the Jest framework have asserted that the learning curve is pretty hard.
  • \n
  • Leveraging auto-mocking can make tests slow. This is because the more dependencies a module has, the more work needs to be done by Jest to mock it, which comes at the cost of performance.
  • \n
  • Snapshot testing with Jest is not so feasible for larger snapshot files containing thousands of lines.
  • \n
  • Its debugging capabilities need improvement.
  • \n
\n

Market - Current Adoption

\n

Jest has over 10 million dependent repos on GitHub.\nProminent companies that reportedly adopt Jest in their tech stack are: Facebook, Airbnb, Spotify, The New York Times, Travel Perk, Twitter, Instagram, etc.\nStateofjs collects data from thousands of front-end developers in its annual surveys. \nHere’s their most recent ranking of most popular JS testing frameworks, sorted by their usage and Jest is at the top 3.

\n","info":"","angleFraction":0.13103990907660212,"radiusFraction":0.8621263582610639,"release":"2023-09-13","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/jest.md"},{"flag":"default","featured":true,"revisions":[{"name":"k3d","release":"2023-09-13","title":"k3d","ring":"adopt","quadrant":"tools","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/k3d.md","body":"

k3d is a lightweight wrapper to run k3s (Rancher Lab’s minimal Kubernetes distribution) in docker.

\n

k3d makes it very easy to create single- and multi-node k3s clusters in Docker, e.g. for local development on Kubernetes.

\n"},{"name":"k3d","release":"2023-09-12","title":"k3d","ring":"assess","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/k3d.md","body":"

k3d is an orchestration tool which may be suitable for self-hosting. Under investigation.

\n"}],"name":"k3d","title":"k3d","ring":"adopt","quadrant":"tools","body":"

k3d is a lightweight wrapper to run k3s (Rancher Lab’s minimal Kubernetes distribution) in docker.

\n

k3d makes it very easy to create single- and multi-node k3s clusters in Docker, e.g. for local development on Kubernetes.

\n","info":"","angleFraction":0.04733298894663318,"radiusFraction":0.05309619886939032,"release":"2023-09-13","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/k3d.md"},{"flag":"default","featured":true,"revisions":[{"name":"k3s","release":"2023-09-13","title":"k3s","ring":"adopt","quadrant":"tools","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/k3s.md","body":"

k3s is a highly available, certified Kubernetes distribution designed for production workloads in unattended, resource-constrained, remote locations or inside IoT appliances.

\n"}],"name":"k3s","title":"k3s","ring":"adopt","quadrant":"tools","body":"

k3s is a highly available, certified Kubernetes distribution designed for production workloads in unattended, resource-constrained, remote locations or inside IoT appliances.

\n","info":"","angleFraction":0.6507878730298193,"radiusFraction":0.7425484378941443,"release":"2023-09-13","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/k3s.md"},{"flag":"default","featured":true,"revisions":[{"name":"klipfolio","release":"2023-09-13","title":"Klipfolio","ring":"stop","quadrant":"tools","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/klipfolio.md","body":"

We recommend using Superset for building dashboards with the CHT, as it is an open-source tool.

\n

Read more about Data Flows for Analytics with the CHT in the CHT documentation.

\n"},{"name":"klipfolio","release":"2023-09-12","title":"Klipfolio","ring":"adopt","quadrant":"tools","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/klipfolio.md","body":"

Klipfolio is a paid third-party SAAS option for building dashboards.

\n"}],"name":"klipfolio","title":"Klipfolio","ring":"stop","quadrant":"tools","body":"

We recommend using Superset for building dashboards with the CHT, as it is an open-source tool.

\n

Read more about Data Flows for Analytics with the CHT in the CHT documentation.

\n","info":"","angleFraction":0.19825437072990582,"radiusFraction":0.6867886262589629,"release":"2023-09-13","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/klipfolio.md"},{"flag":"default","featured":true,"revisions":[{"name":"kubernetes","release":"2023-09-13","title":"Kubernetes","ring":"adopt","quadrant":"tools","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/kubernetes.md","body":"

Kubernetes, also known as k8s, is an open-source system for automating deployment, scaling, and management of containerized applications.

\n

Kubernetes has developed into the quasi-standard for container orchestration: Nearly every cloud provider provides managed Kubernetes, and even Docker Enterprise uses Kubernetes.

\n"},{"name":"kubernetes","release":"2023-09-12","title":"Kubernetes","ring":"assess","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/kubernetes.md","body":"

Kubernetes platform is used for hosting the CHT. For self hosting partners we recommend lightweight implementations like k3d. For cloud deployments, use a Platform as a Service offering like Amazon EKS.

\n"}],"name":"kubernetes","title":"Kubernetes","ring":"adopt","quadrant":"tools","body":"

Kubernetes, also known as k8s, is an open-source system for automating deployment, scaling, and management of containerized applications.

\n

Kubernetes has developed into the quasi-standard for container orchestration: Nearly every cloud provider provides managed Kubernetes, and even Docker Enterprise uses Kubernetes.

\n","info":"","angleFraction":0.17664023496337578,"radiusFraction":0.49940883982374906,"release":"2023-09-13","tags":["infrastructure","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/kubernetes.md"},{"flag":"default","featured":true,"revisions":[{"name":"lua","release":"2023-09-12","title":"lua","ring":"assess","quadrant":"languages-and-frameworks","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/lua.md","body":"

Lua is used in HAProxy to mask credentials from being logged in the audit log. Because HAProxy is being assessed, this may be removed soon.

\n"}],"name":"lua","title":"lua","ring":"assess","quadrant":"languages-and-frameworks","body":"

Lua is used in HAProxy to mask credentials from being logged in the audit log. Because HAProxy is being assessed, this may be removed soon.

\n","info":"","angleFraction":0.24021845293435118,"radiusFraction":0.9908739025968103,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/lua.md"},{"flag":"default","featured":true,"revisions":[{"name":"mochajs","release":"2023-09-12","title":"Mocha","ring":"adopt","quadrant":"languages-and-frameworks","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/mochajs.md","body":"

Mocha is a JavaScript test framework running on Node.js and in the browser.

\n

In the CHT, Mocha is used to run the unit tests.

\n"}],"name":"mochajs","title":"Mocha","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Mocha is a JavaScript test framework running on Node.js and in the browser.

\n

In the CHT, Mocha is used to run the unit tests.

\n","info":"","angleFraction":0.023087951002555007,"radiusFraction":0.9883424068184528,"release":"2023-09-12","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/mochajs.md"},{"flag":"default","featured":true,"revisions":[{"name":"nginx","release":"2023-09-12","title":"Nginx","ring":"adopt","quadrant":"tools","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/nginx.md","body":"

Nginx is an open-source web server software used for reverse proxy, load balancing, and caching.

\n

It provides SSL termination for self-hosted CHT deployments.

\n"}],"name":"nginx","title":"Nginx","ring":"adopt","quadrant":"tools","body":"

Nginx is an open-source web server software used for reverse proxy, load balancing, and caching.

\n

It provides SSL termination for self-hosted CHT deployments.

\n","info":"","angleFraction":0.300528610128997,"radiusFraction":0.8689611477877246,"release":"2023-09-12","tags":["infrastructure"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/nginx.md"},{"flag":"default","featured":true,"revisions":[{"name":"nodejs","release":"2023-09-12","title":"node.js","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/nodejs.md","body":"

Node.js is an open-source, no-browser JavaScript execution runtime.

\n

In the context of the CHT, it is used for services on the server like API and Sentinel as well as scripting.

\n"}],"name":"nodejs","title":"node.js","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Node.js is an open-source, no-browser JavaScript execution runtime.

\n

In the context of the CHT, it is used for services on the server like API and Sentinel as well as scripting.

\n","info":"","angleFraction":0.37634658197063087,"radiusFraction":0.9526783590243231,"release":"2023-09-12","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/nodejs.md"},{"flag":"default","featured":true,"revisions":[{"name":"npm","release":"2023-09-12","title":"npm","ring":"adopt","quadrant":"tools","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/npm.md","body":"

npm is a library and registry for JavaScript software packages.

\n

It is used widely for CHT products.

\n"}],"name":"npm","title":"npm","ring":"adopt","quadrant":"tools","body":"

npm is a library and registry for JavaScript software packages.

\n

It is used widely for CHT products.

\n","info":"","angleFraction":0.2762089767773914,"radiusFraction":0.8384645450621326,"release":"2023-09-12","tags":["tool"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/npm.md"},{"flag":"default","featured":true,"revisions":[{"name":"postgres","release":"2023-09-12","title":"Postgres","ring":"adopt","quadrant":"tools","tags":["database"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/postgres.md","body":"

Postgres is primarily used as a data warehouse for analytics queries.

\n"}],"name":"postgres","title":"Postgres","ring":"adopt","quadrant":"tools","body":"

Postgres is primarily used as a data warehouse for analytics queries.

\n","info":"","angleFraction":0.7723371189342172,"radiusFraction":0.09348225825672674,"release":"2023-09-12","tags":["database"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/postgres.md"},{"flag":"default","featured":true,"revisions":[{"name":"pouchdb","release":"2023-09-12","title":"PouchDB","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/pouchdb.md","body":"

PouchDB is an open-source JavaScript database inspired by Apache CouchDB that is designed to run within the browser.

\n

PouchDB is used for storing data on the phone in the CHT webapp to enable it to work offline seamlessly. \nIt is also used as a library for querying CouchDB from api, sentinel, and the admin app.

\n"}],"name":"pouchdb","title":"PouchDB","ring":"adopt","quadrant":"languages-and-frameworks","body":"

PouchDB is an open-source JavaScript database inspired by Apache CouchDB that is designed to run within the browser.

\n

PouchDB is used for storing data on the phone in the CHT webapp to enable it to work offline seamlessly. \nIt is also used as a library for querying CouchDB from api, sentinel, and the admin app.

\n","info":"","angleFraction":0.19678162048825443,"radiusFraction":0.3265125109327578,"release":"2023-09-12","tags":["framework"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/pouchdb.md"},{"flag":"default","featured":true,"revisions":[{"name":"prometheus","release":"2023-09-13","title":"Prometheus","ring":"adopt","quadrant":"tools","tags":["monitoring","alerting","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/prometheus.md","body":"

Prometheus is an open-source Time Series Database (TSDB) that was developed explicitly to do detailed longitudinal monitoring. \nIt also aggregates metrics and can automatically cull older data to save on CPU and disk space.

\n

Compared to other monitoring systems it stands out in its simple, still powerful and fully code-based configuration and the equally powerful service discovery mechanism.

\n

Prometheus integrates very well with Grafana which is the tool of choice for dashboard visualization in the CHT Watchdog.

\n

You can find more details about using Prometheus with the CHT Watchdog in the related documentation.

\n"},{"name":"prometheus","release":"2023-09-12","title":"Prometheus","ring":"assess","quadrant":"tools","tags":["monitoring","alerting"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/prometheus.md","body":"

Being evaluated for CHT Watchdog.

\n"}],"name":"prometheus","title":"Prometheus","ring":"adopt","quadrant":"tools","body":"

Prometheus is an open-source Time Series Database (TSDB) that was developed explicitly to do detailed longitudinal monitoring. \nIt also aggregates metrics and can automatically cull older data to save on CPU and disk space.

\n

Compared to other monitoring systems it stands out in its simple, still powerful and fully code-based configuration and the equally powerful service discovery mechanism.

\n

Prometheus integrates very well with Grafana which is the tool of choice for dashboard visualization in the CHT Watchdog.

\n

You can find more details about using Prometheus with the CHT Watchdog in the related documentation.

\n","info":"","angleFraction":0.04117708443062229,"radiusFraction":0.9415945597297499,"release":"2023-09-13","tags":["monitoring","alerting","devops"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/prometheus.md"},{"flag":"default","featured":true,"revisions":[{"name":"protractor","release":"2023-09-12","title":"Protractor","ring":"stop","quadrant":"languages-and-frameworks","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/protractor.md","body":"

Protractor is an end-to-end test framework for Angular and AngularJS applications.

\n

Currently deprecated in the context of the CHT. All the end-to-end tests were rewritten to WebDriverIO.

\n

The primary motivation to migrate from Protractor to WebDriverIO is that the Angular team \nannounced in April, 2021 that Protractor will no longer be supported.

\n"}],"name":"protractor","title":"Protractor","ring":"stop","quadrant":"languages-and-frameworks","body":"

Protractor is an end-to-end test framework for Angular and AngularJS applications.

\n

Currently deprecated in the context of the CHT. All the end-to-end tests were rewritten to WebDriverIO.

\n

The primary motivation to migrate from Protractor to WebDriverIO is that the Angular team \nannounced in April, 2021 that Protractor will no longer be supported.

\n","info":"","angleFraction":0.9505904954264139,"radiusFraction":0.49059277761771125,"release":"2023-09-12","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/protractor.md"},{"flag":"default","featured":true,"revisions":[{"name":"pwa","release":"2023-09-12","title":"PWA","ring":"adopt","quadrant":"methods-and-patterns","tags":["technique"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/pwa.md","body":"

A progressive web application (PWA) is a type of application software delivered through the web, built using common web technologies including HTML, CSS, and JavaScript. \nIt is intended to work on any platform with a standards-compliant browser, including desktop and mobile devices.

\n

The PWA is followed for CHT webapp to allow offline first capability.

\n"}],"name":"pwa","title":"PWA","ring":"adopt","quadrant":"methods-and-patterns","body":"

A progressive web application (PWA) is a type of application software delivered through the web, built using common web technologies including HTML, CSS, and JavaScript. \nIt is intended to work on any platform with a standards-compliant browser, including desktop and mobile devices.

\n

The PWA is followed for CHT webapp to allow offline first capability.

\n","info":"","angleFraction":0.5268978371587922,"radiusFraction":0.28194104827896926,"release":"2023-09-12","tags":["technique"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/pwa.md"},{"flag":"default","featured":true,"revisions":[{"name":"python","release":"2023-09-12","title":"Python","ring":"stop","quadrant":"languages-and-frameworks","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/python.md","body":"

Python is a programming language used currently only to convert xls forms to xforms in \ncht-conf.

\n"}],"name":"python","title":"Python","ring":"stop","quadrant":"languages-and-frameworks","body":"

Python is a programming language used currently only to convert xls forms to xforms in \ncht-conf.

\n","info":"","angleFraction":0.5200134868799957,"radiusFraction":0.5778199876053185,"release":"2023-09-12","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/python.md"},{"flag":"default","featured":true,"revisions":[{"name":"quality-assistance","release":"2023-09-12","title":"Quality Assistance","ring":"adopt","quadrant":"methods-and-patterns","tags":["product-development","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/quality-assistance.md","body":"

Quality Assistance is the process used for ensuring the quality of the CHT.

\n"}],"name":"quality-assistance","title":"Quality Assistance","ring":"adopt","quadrant":"methods-and-patterns","body":"

Quality Assistance is the process used for ensuring the quality of the CHT.

\n","info":"","angleFraction":0.6953322463429588,"radiusFraction":0.45432023221483675,"release":"2023-09-12","tags":["product-development","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/quality-assistance.md"},{"flag":"new","featured":true,"revisions":[{"name":"sinonjs","release":"2024-03-15","title":"Sinon.JS","ring":"adopt","quadrant":"languages-and-frameworks","tags":["framework","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2024-03-15/sinonjs.md","body":"

Sinon.JS is a JavaScript library that provides standalone test spies, stubs, and mocks.

\n

Sinon.JS is used for unit testing in CHT Core.

\n"}],"name":"sinonjs","title":"Sinon.JS","ring":"adopt","quadrant":"languages-and-frameworks","body":"

Sinon.JS is a JavaScript library that provides standalone test spies, stubs, and mocks.

\n

Sinon.JS is used for unit testing in CHT Core.

\n","info":"","angleFraction":0.7327961037088568,"radiusFraction":0.4805163534507375,"release":"2024-03-15","tags":["framework","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2024-03-15/sinonjs.md"},{"flag":"default","featured":true,"revisions":[{"name":"sonarcloud","release":"2023-09-13","title":"SonarCloud","ring":"adopt","quadrant":"tools","tags":["ci/cd","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/sonarcloud.md","body":"

Sonar static analysis supports development by providing feedback on code quality and security issues.

\n

SonarCloud is the cloud-based solution of Sonar. \nIt can be enabled on any public GitHub repository in the Medic organization and must pass on all new code.

\n

You can find more details about using SonarCloud with the CHT\nin the related documentation.

\n"}],"name":"sonarcloud","title":"SonarCloud","ring":"adopt","quadrant":"tools","body":"

Sonar static analysis supports development by providing feedback on code quality and security issues.

\n

SonarCloud is the cloud-based solution of Sonar. \nIt can be enabled on any public GitHub repository in the Medic organization and must pass on all new code.

\n

You can find more details about using SonarCloud with the CHT\nin the related documentation.

\n","info":"","angleFraction":0.3919860705874616,"radiusFraction":0.8896655112328504,"release":"2023-09-13","tags":["ci/cd","quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-13/sonarcloud.md"},{"flag":"default","featured":true,"revisions":[{"name":"superset","release":"2023-09-12","title":"Superset","ring":"adopt","quadrant":"tools","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/superset.md","body":"

Superset is an open-source data exploration and visualization platform.

\n

In the context of the CHT, Superset is used for health care analytics.

\n"}],"name":"superset","title":"Superset","ring":"adopt","quadrant":"tools","body":"

Superset is an open-source data exploration and visualization platform.

\n

In the context of the CHT, Superset is used for health care analytics.

\n","info":"","angleFraction":0.2374585841415151,"radiusFraction":0.640400400132668,"release":"2023-09-12","tags":["dashboard","analytics"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/superset.md"},{"flag":"default","featured":true,"revisions":[{"name":"typescript","release":"2023-09-12","title":"TypeScript","ring":"adopt","quadrant":"languages-and-frameworks","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/typescript.md","body":"

TypeScript is a language that gets transpiled to native JavaScript code.

\n

It is used a lot in CHT webapp with the potential to use it more widely.

\n"}],"name":"typescript","title":"TypeScript","ring":"adopt","quadrant":"languages-and-frameworks","body":"

TypeScript is a language that gets transpiled to native JavaScript code.

\n

It is used a lot in CHT webapp with the potential to use it more widely.

\n","info":"","angleFraction":0.05877847234483147,"radiusFraction":0.10532852543796789,"release":"2023-09-12","tags":["coding"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/typescript.md"},{"flag":"default","featured":true,"revisions":[{"name":"webdriverio","release":"2023-09-12","title":"WebDriverIO","ring":"adopt","quadrant":"languages-and-frameworks","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/webdriverio.md","body":"

WebDriverIO is UI testing framework used for end-to-end testing in web applications.

\n

In the CHT Core Framework, WebDriverIO is used to run the e2e tests.

\n

WebDriverIO was influenced by a lot of Protractor's design decisions which is why it was the closest framework to migrate over.

\n

Advantages

\n
    \n
  • Open source
  • \n
  • Numerous integrations to tools
  • \n
  • Fast and easy location of page elements
  • \n
  • Good documentation
  • \n
\n

Drawbacks

\n
    \n
  • Integrations with reports (specifically allure) frameworks is not straightforward.
  • \n
\n

The migration from Protractor was finalized in July 2023.

\n"}],"name":"webdriverio","title":"WebDriverIO","ring":"adopt","quadrant":"languages-and-frameworks","body":"

WebDriverIO is UI testing framework used for end-to-end testing in web applications.

\n

In the CHT Core Framework, WebDriverIO is used to run the e2e tests.

\n

WebDriverIO was influenced by a lot of Protractor's design decisions which is why it was the closest framework to migrate over.

\n

Advantages

\n
    \n
  • Open source
  • \n
  • Numerous integrations to tools
  • \n
  • Fast and easy location of page elements
  • \n
  • Good documentation
  • \n
\n

Drawbacks

\n
    \n
  • Integrations with reports (specifically allure) frameworks is not straightforward.
  • \n
\n

The migration from Protractor was finalized in July 2023.

\n","info":"","angleFraction":0.8948846985257952,"radiusFraction":0.07686804807604086,"release":"2023-09-12","tags":["quality"],"fileName":"/Users/andra/Documents/GitHub/cht-tech-radar/radar/2023-09-12/webdriverio.md"}],"releases":["2023-09-12","2023-09-13","2024-03-15"]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index d0551fb..ab86eb6 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,222 +2,237 @@ /cht-tech-radar-contributors/index.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/platforms-and-aoe-services/amazon-eks.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/platforms-and-aoe-services/android-dev.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/angular.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/angularjs.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/platforms-and-aoe-services/aws.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/bash.html - 2024-01-26 + 2024-03-11 + weekly + + + /cht-tech-radar-contributors/languages-and-frameworks/chaijs.html + 2024-03-11 weekly /cht-tech-radar-contributors/methods-and-patterns/continuous-discovery.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/methods-and-patterns/continuous-integration.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/couch2pg.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/couchdb.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/dbt.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/docker.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/dot.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/enketo.html - 2024-01-26 + 2024-03-11 + weekly + + + /cht-tech-radar-contributors/languages-and-frameworks/expressjs.html + 2024-03-11 weekly /cht-tech-radar-contributors/tools/git.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/platforms-and-aoe-services/github.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/github-actions.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/grafana.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/grunt.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/haproxy.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/platforms-and-aoe-services/helm.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/javascript.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/jest.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/k3d.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/k3s.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/klipfolio.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/kubernetes.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/lua.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/mochajs.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/nginx.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/nodejs.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/npm.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/postgres.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/pouchdb.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/prometheus.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/protractor.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/methods-and-patterns/pwa.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/python.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/methods-and-patterns/quality-assistance.html - 2024-01-26 + 2024-03-11 + weekly + + + /cht-tech-radar-contributors/languages-and-frameworks/sinonjs.html + 2024-03-11 weekly /cht-tech-radar-contributors/tools/sonarcloud.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/tools/superset.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/typescript.html - 2024-01-26 + 2024-03-11 weekly /cht-tech-radar-contributors/languages-and-frameworks/webdriverio.html - 2024-01-26 + 2024-03-11 weekly \ No newline at end of file diff --git a/static/js/main.552302b5.js b/static/js/main.552302b5.js new file mode 100644 index 0000000..d7c24db --- /dev/null +++ b/static/js/main.552302b5.js @@ -0,0 +1,2 @@ +/*! For license information please see main.552302b5.js.LICENSE.txt */ +!function(){var e={5230:function(e){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,s=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){l=!0,a=e},f:function(){try{s||null==n.return||n.return()}finally{if(l)throw a}}}},e.exports.__esModule=!0,e.exports.default=e.exports},1001:function(e,t,n){var r=n(3336),i=n(1903),o=n(4097);e.exports=function(e){var t=i();return function(){var n,i=r(e);if(t){var a=r(this).constructor;n=Reflect.construct(i,arguments,a)}else n=i.apply(this,arguments);return o(this,n)}},e.exports.__esModule=!0,e.exports.default=e.exports},3674:function(e){e.exports=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},e.exports.__esModule=!0,e.exports.default=e.exports},9282:function(e,t,n){var r=n(834);function i(){return"undefined"!==typeof Reflect&&Reflect.get?(e.exports=i=Reflect.get,e.exports.__esModule=!0,e.exports.default=e.exports):(e.exports=i=function(e,t,n){var i=r(e,t);if(i){var o=Object.getOwnPropertyDescriptor(i,t);return o.get?o.get.call(arguments.length<3?e:n):o.value}},e.exports.__esModule=!0,e.exports.default=e.exports),i.apply(this,arguments)}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},3336:function(e){function t(n){return e.exports=t=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},6406:function(e,t,n){var r=n(9480);e.exports=function(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&r(e,t)},e.exports.__esModule=!0,e.exports.default=e.exports},4213:function(e){e.exports=function(e){return-1!==Function.toString.call(e).indexOf("[native code]")},e.exports.__esModule=!0,e.exports.default=e.exports},1903:function(e){e.exports=function(){if("undefined"===typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"===typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}},e.exports.__esModule=!0,e.exports.default=e.exports},1238:function(e){e.exports=function(e){if("undefined"!==typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)},e.exports.__esModule=!0,e.exports.default=e.exports},5958:function(e){e.exports=function(e,t){var n=null==e?null:"undefined"!==typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,i,o=[],a=!0,s=!1;try{for(n=n.call(e);!(a=(r=n.next()).done)&&(o.push(r.value),!t||o.length!==t);a=!0);}catch(l){s=!0,i=l}finally{try{a||null==n.return||n.return()}finally{if(s)throw i}}return o}},e.exports.__esModule=!0,e.exports.default=e.exports},8092:function(e){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.__esModule=!0,e.exports.default=e.exports},8819:function(e){e.exports=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.__esModule=!0,e.exports.default=e.exports},3137:function(e,t,n){var r=n(3674);function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}e.exports=function(e){for(var t=1;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o},e.exports.__esModule=!0,e.exports.default=e.exports},6421:function(e){e.exports=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i},e.exports.__esModule=!0,e.exports.default=e.exports},4097:function(e,t,n){var r=n(829).default,i=n(5825);e.exports=function(e,t){if(t&&("object"===r(t)||"function"===typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return i(e)},e.exports.__esModule=!0,e.exports.default=e.exports},1170:function(e,t,n){var r=n(829).default;function i(){"use strict";e.exports=i=function(){return t},e.exports.__esModule=!0,e.exports.default=e.exports;var t={},n=Object.prototype,o=n.hasOwnProperty,a="function"==typeof Symbol?Symbol:{},s=a.iterator||"@@iterator",l=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(N){c=function(e,t,n){return e[t]=n}}function f(e,t,n,r){var i=t&&t.prototype instanceof p?t:p,o=Object.create(i.prototype),a=new O(r||[]);return o._invoke=function(e,t,n){var r="suspendedStart";return function(i,o){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw o;return T()}for(n.method=i,n.arg=o;;){var a=n.delegate;if(a){var s=k(a,n);if(s){if(s===h)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var l=d(e,t,n);if("normal"===l.type){if(r=n.done?"completed":"suspendedYield",l.arg===h)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(r="completed",n.method="throw",n.arg=l.arg)}}}(e,n,a),o}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(N){return{type:"throw",arg:N}}}t.wrap=f;var h={};function p(){}function m(){}function v(){}var g={};c(g,s,(function(){return this}));var y=Object.getPrototypeOf,b=y&&y(y(C([])));b&&b!==n&&o.call(b,s)&&(g=b);var w=v.prototype=p.prototype=Object.create(g);function x(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function _(e,t){function n(i,a,s,l){var u=d(e[i],e,a);if("throw"!==u.type){var c=u.arg,f=c.value;return f&&"object"==r(f)&&o.call(f,"__await")?t.resolve(f.__await).then((function(e){n("next",e,s,l)}),(function(e){n("throw",e,s,l)})):t.resolve(f).then((function(e){c.value=e,s(c)}),(function(e){return n("throw",e,s,l)}))}l(u.arg)}var i;this._invoke=function(e,r){function o(){return new t((function(t,i){n(e,r,t,i)}))}return i=i?i.then(o,o):o()}}function k(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,k(e,t),"throw"===t.method))return h;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var r=d(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,h;var i=r.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,h):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,h)}function S(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function E(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function O(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(S,this),this.reset(!0)}function C(e){if(e){var t=e[s];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,r=function t(){for(;++n=0;--r){var i=this.tryEntries[r],a=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var s=o.call(i,"catchLoc"),l=o.call(i,"finallyLoc");if(s&&l){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&o.call(r,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),E(n),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;E(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:C(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),h}},t}e.exports=i,e.exports.__esModule=!0,e.exports.default=e.exports},9480:function(e){function t(n,r){return e.exports=t=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n,r)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},8120:function(e,t,n){var r=n(4042),i=n(5958),o=n(665),a=n(8092);e.exports=function(e,t){return r(e)||i(e,t)||o(e,t)||a()},e.exports.__esModule=!0,e.exports.default=e.exports},834:function(e,t,n){var r=n(3336);e.exports=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=r(e)););return e},e.exports.__esModule=!0,e.exports.default=e.exports},4183:function(e,t,n){var r=n(7359),i=n(1238),o=n(665),a=n(8819);e.exports=function(e){return r(e)||i(e)||o(e)||a()},e.exports.__esModule=!0,e.exports.default=e.exports},829:function(e){function t(n){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(n)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},665:function(e,t,n){var r=n(5230);e.exports=function(e,t){if(e){if("string"===typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}},e.exports.__esModule=!0,e.exports.default=e.exports},4060:function(e,t,n){var r=n(3336),i=n(9480),o=n(4213),a=n(7754);function s(t){var n="function"===typeof Map?new Map:void 0;return e.exports=s=function(e){if(null===e||!o(e))return e;if("function"!==typeof e)throw new TypeError("Super expression must either be null or a function");if("undefined"!==typeof n){if(n.has(e))return n.get(e);n.set(e,t)}function t(){return a(e,arguments,r(this).constructor)}return t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),i(t,e)},e.exports.__esModule=!0,e.exports.default=e.exports,s(t)}e.exports=s,e.exports.__esModule=!0,e.exports.default=e.exports},2317:function(e,t){var n;!function(){"use strict";var r={}.hasOwnProperty;function i(){for(var e=[],t=0;t>>0;for(t=0;t0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+r}var R=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,I=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,F={},U={};function q(e,t,n,r){var i=r;"string"===typeof r&&(i=function(){return this[r]()}),e&&(U[e]=i),t&&(U[t[0]]=function(){return D(i.apply(this,arguments),t[1],t[2])}),n&&(U[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function z(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function B(e){var t,n,r=e.match(R);for(t=0,n=r.length;t=0&&I.test(e);)e=e.replace(I,r),I.lastIndex=0,n-=1;return e}var Y={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function W(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(R).map((function(e){return"MMMM"===e||"MM"===e||"DD"===e||"dddd"===e?e.slice(1):e})).join(""),this._longDateFormat[e])}var G="Invalid date";function $(){return this._invalidDate}var Q="%d",X=/\d{1,2}/;function Z(e){return this._ordinal.replace("%d",e)}var K={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function J(e,t,n,r){var i=this._relativeTime[n];return N(i)?i(e,t,n,r):i.replace(/%d/i,e)}function ee(e,t){var n=this._relativeTime[e>0?"future":"past"];return N(n)?n(t):n.replace(/%s/i,t)}var te={};function ne(e,t){var n=e.toLowerCase();te[n]=te[n+"s"]=te[t]=e}function re(e){return"string"===typeof e?te[e]||te[e.toLowerCase()]:void 0}function ie(e){var t,n,r={};for(n in e)s(e,n)&&(t=re(n))&&(r[t]=e[n]);return r}var oe={};function ae(e,t){oe[e]=t}function se(e){var t,n=[];for(t in e)s(e,t)&&n.push({unit:t,priority:oe[t]});return n.sort((function(e,t){return e.priority-t.priority})),n}function le(e){return e%4===0&&e%100!==0||e%400===0}function ue(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function ce(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=ue(t)),n}function fe(e,t){return function(n){return null!=n?(he(this,e,n),r.updateOffset(this,t),this):de(this,e)}}function de(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function he(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&le(e.year())&&1===e.month()&&29===e.date()?(n=ce(n),e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Je(n,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function pe(e){return N(this[e=re(e)])?this[e]():this}function me(e,t){if("object"===typeof e){var n,r=se(e=ie(e)),i=r.length;for(n=0;n68?1900:2e3)};var vt=fe("FullYear",!0);function gt(){return le(this.year())}function yt(e,t,n,r,i,o,a){var s;return e<100&&e>=0?(s=new Date(e+400,t,n,r,i,o,a),isFinite(s.getFullYear())&&s.setFullYear(e)):s=new Date(e,t,n,r,i,o,a),s}function bt(e){var t,n;return e<100&&e>=0?((n=Array.prototype.slice.call(arguments))[0]=e+400,t=new Date(Date.UTC.apply(null,n)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function wt(e,t,n){var r=7+t-n;return-(7+bt(e,0,r).getUTCDay()-t)%7+r-1}function xt(e,t,n,r,i){var o,a,s=1+7*(t-1)+(7+n-r)%7+wt(e,r,i);return s<=0?a=mt(o=e-1)+s:s>mt(e)?(o=e+1,a=s-mt(e)):(o=e,a=s),{year:o,dayOfYear:a}}function _t(e,t,n){var r,i,o=wt(e.year(),t,n),a=Math.floor((e.dayOfYear()-o-1)/7)+1;return a<1?r=a+kt(i=e.year()-1,t,n):a>kt(e.year(),t,n)?(r=a-kt(e.year(),t,n),i=e.year()+1):(i=e.year(),r=a),{week:r,year:i}}function kt(e,t,n){var r=wt(e,t,n),i=wt(e+1,t,n);return(mt(e)-r+i)/7}function St(e){return _t(e,this._week.dow,this._week.doy).week}q("w",["ww",2],"wo","week"),q("W",["WW",2],"Wo","isoWeek"),ne("week","w"),ne("isoWeek","W"),ae("week",5),ae("isoWeek",5),Le("w",_e),Le("ww",_e,ye),Le("W",_e),Le("WW",_e,ye),qe(["w","ww","W","WW"],(function(e,t,n,r){t[r.substr(0,1)]=ce(e)}));var Et={dow:0,doy:6};function Ot(){return this._week.dow}function Ct(){return this._week.doy}function Tt(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")}function Nt(e){var t=_t(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")}function Mt(e,t){return"string"!==typeof e?e:isNaN(e)?"number"===typeof(e=t.weekdaysParse(e))?e:null:parseInt(e,10)}function At(e,t){return"string"===typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function jt(e,t){return e.slice(t,7).concat(e.slice(0,t))}q("d",0,"do","day"),q("dd",0,0,(function(e){return this.localeData().weekdaysMin(this,e)})),q("ddd",0,0,(function(e){return this.localeData().weekdaysShort(this,e)})),q("dddd",0,0,(function(e){return this.localeData().weekdays(this,e)})),q("e",0,0,"weekday"),q("E",0,0,"isoWeekday"),ne("day","d"),ne("weekday","e"),ne("isoWeekday","E"),ae("day",11),ae("weekday",11),ae("isoWeekday",11),Le("d",_e),Le("e",_e),Le("E",_e),Le("dd",(function(e,t){return t.weekdaysMinRegex(e)})),Le("ddd",(function(e,t){return t.weekdaysShortRegex(e)})),Le("dddd",(function(e,t){return t.weekdaysRegex(e)})),qe(["dd","ddd","dddd"],(function(e,t,n,r){var i=n._locale.weekdaysParse(e,r,n._strict);null!=i?t.d=i:v(n).invalidWeekday=e})),qe(["d","e","E"],(function(e,t,n,r){t[r]=ce(e)}));var Pt="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Lt="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Dt="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Rt=Pe,It=Pe,Ft=Pe;function Ut(e,t){var n=o(this._weekdays)?this._weekdays:this._weekdays[e&&!0!==e&&this._weekdays.isFormat.test(t)?"format":"standalone"];return!0===e?jt(n,this._week.dow):e?n[e.day()]:n}function qt(e){return!0===e?jt(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function zt(e){return!0===e?jt(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function Bt(e,t,n){var r,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)o=p([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(o,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Be.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Be.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Be.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=Be.call(this._weekdaysParse,a))||-1!==(i=Be.call(this._shortWeekdaysParse,a))||-1!==(i=Be.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Be.call(this._shortWeekdaysParse,a))||-1!==(i=Be.call(this._weekdaysParse,a))||-1!==(i=Be.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Be.call(this._minWeekdaysParse,a))||-1!==(i=Be.call(this._weekdaysParse,a))||-1!==(i=Be.call(this._shortWeekdaysParse,a))?i:null}function Ht(e,t,n){var r,i,o;if(this._weekdaysParseExact)return Bt.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(i=p([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[r]=new RegExp(o.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[r].test(e))return r;if(n&&"ddd"===t&&this._shortWeekdaysParse[r].test(e))return r;if(n&&"dd"===t&&this._minWeekdaysParse[r].test(e))return r;if(!n&&this._weekdaysParse[r].test(e))return r}}function Vt(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=Mt(e,this.localeData()),this.add(e-t,"d")):t}function Yt(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")}function Wt(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=At(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7}function Gt(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||Xt.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(s(this,"_weekdaysRegex")||(this._weekdaysRegex=Rt),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function $t(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||Xt.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(s(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=It),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Qt(e){return this._weekdaysParseExact?(s(this,"_weekdaysRegex")||Xt.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(s(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ft),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Xt(){function e(e,t){return t.length-e.length}var t,n,r,i,o,a=[],s=[],l=[],u=[];for(t=0;t<7;t++)n=p([2e3,1]).day(t),r=Ie(this.weekdaysMin(n,"")),i=Ie(this.weekdaysShort(n,"")),o=Ie(this.weekdays(n,"")),a.push(r),s.push(i),l.push(o),u.push(r),u.push(i),u.push(o);a.sort(e),s.sort(e),l.sort(e),u.sort(e),this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Zt(){return this.hours()%12||12}function Kt(){return this.hours()||24}function Jt(e,t){q(e,0,0,(function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)}))}function en(e,t){return t._meridiemParse}function tn(e){return"p"===(e+"").toLowerCase().charAt(0)}q("H",["HH",2],0,"hour"),q("h",["hh",2],0,Zt),q("k",["kk",2],0,Kt),q("hmm",0,0,(function(){return""+Zt.apply(this)+D(this.minutes(),2)})),q("hmmss",0,0,(function(){return""+Zt.apply(this)+D(this.minutes(),2)+D(this.seconds(),2)})),q("Hmm",0,0,(function(){return""+this.hours()+D(this.minutes(),2)})),q("Hmmss",0,0,(function(){return""+this.hours()+D(this.minutes(),2)+D(this.seconds(),2)})),Jt("a",!0),Jt("A",!1),ne("hour","h"),ae("hour",13),Le("a",en),Le("A",en),Le("H",_e),Le("h",_e),Le("k",_e),Le("HH",_e,ye),Le("hh",_e,ye),Le("kk",_e,ye),Le("hmm",ke),Le("hmmss",Se),Le("Hmm",ke),Le("Hmmss",Se),Ue(["H","HH"],We),Ue(["k","kk"],(function(e,t,n){var r=ce(e);t[We]=24===r?0:r})),Ue(["a","A"],(function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e})),Ue(["h","hh"],(function(e,t,n){t[We]=ce(e),v(n).bigHour=!0})),Ue("hmm",(function(e,t,n){var r=e.length-2;t[We]=ce(e.substr(0,r)),t[Ge]=ce(e.substr(r)),v(n).bigHour=!0})),Ue("hmmss",(function(e,t,n){var r=e.length-4,i=e.length-2;t[We]=ce(e.substr(0,r)),t[Ge]=ce(e.substr(r,2)),t[$e]=ce(e.substr(i)),v(n).bigHour=!0})),Ue("Hmm",(function(e,t,n){var r=e.length-2;t[We]=ce(e.substr(0,r)),t[Ge]=ce(e.substr(r))})),Ue("Hmmss",(function(e,t,n){var r=e.length-4,i=e.length-2;t[We]=ce(e.substr(0,r)),t[Ge]=ce(e.substr(r,2)),t[$e]=ce(e.substr(i))}));var nn=/[ap]\.?m?\.?/i,rn=fe("Hours",!0);function on(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}var an,sn={calendar:P,longDateFormat:Y,invalidDate:G,ordinal:Q,dayOfMonthOrdinalParse:X,relativeTime:K,months:et,monthsShort:tt,week:Et,weekdays:Pt,weekdaysMin:Dt,weekdaysShort:Lt,meridiemParse:nn},ln={},un={};function cn(e,t){var n,r=Math.min(e.length,t.length);for(n=0;n0;){if(r=pn(i.slice(0,t).join("-")))return r;if(n&&n.length>=t&&cn(i,n)>=t-1)break;t--}o++}return an}function hn(e){return null!=e.match("^[^/\\\\]*$")}function pn(t){var n=null;if(void 0===ln[t]&&e&&e.exports&&hn(t))try{n=an._abbr,Object(function(){var e=new Error("Cannot find module 'undefined'");throw e.code="MODULE_NOT_FOUND",e}()),mn(n)}catch(r){ln[t]=null}return ln[t]}function mn(e,t){var n;return e&&((n=u(t)?yn(e):vn(e,t))?an=n:"undefined"!==typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),an._abbr}function vn(e,t){if(null!==t){var n,r=sn;if(t.abbr=e,null!=ln[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=ln[e]._config;else if(null!=t.parentLocale)if(null!=ln[t.parentLocale])r=ln[t.parentLocale]._config;else{if(null==(n=pn(t.parentLocale)))return un[t.parentLocale]||(un[t.parentLocale]=[]),un[t.parentLocale].push({name:e,config:t}),null;r=n._config}return ln[e]=new j(A(r,t)),un[e]&&un[e].forEach((function(e){vn(e.name,e.config)})),mn(e),ln[e]}return delete ln[e],null}function gn(e,t){if(null!=t){var n,r,i=sn;null!=ln[e]&&null!=ln[e].parentLocale?ln[e].set(A(ln[e]._config,t)):(null!=(r=pn(e))&&(i=r._config),t=A(i,t),null==r&&(t.abbr=e),(n=new j(t)).parentLocale=ln[e],ln[e]=n),mn(e)}else null!=ln[e]&&(null!=ln[e].parentLocale?(ln[e]=ln[e].parentLocale,e===mn()&&mn(e)):null!=ln[e]&&delete ln[e]);return ln[e]}function yn(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return an;if(!o(e)){if(t=pn(e))return t;e=[e]}return dn(e)}function bn(){return O(ln)}function wn(e){var t,n=e._a;return n&&-2===v(e).overflow&&(t=n[Ve]<0||n[Ve]>11?Ve:n[Ye]<1||n[Ye]>Je(n[He],n[Ve])?Ye:n[We]<0||n[We]>24||24===n[We]&&(0!==n[Ge]||0!==n[$e]||0!==n[Qe])?We:n[Ge]<0||n[Ge]>59?Ge:n[$e]<0||n[$e]>59?$e:n[Qe]<0||n[Qe]>999?Qe:-1,v(e)._overflowDayOfYear&&(tYe)&&(t=Ye),v(e)._overflowWeeks&&-1===t&&(t=Xe),v(e)._overflowWeekday&&-1===t&&(t=Ze),v(e).overflow=t),e}var xn=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_n=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,kn=/Z|[+-]\d\d(?::?\d\d)?/,Sn=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],En=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],On=/^\/?Date\((-?\d+)/i,Cn=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Tn={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Nn(e){var t,n,r,i,o,a,s=e._i,l=xn.exec(s)||_n.exec(s),u=Sn.length,c=En.length;if(l){for(v(e).iso=!0,t=0,n=u;tmt(o)||0===e._dayOfYear)&&(v(e)._overflowDayOfYear=!0),n=bt(o,0,e._dayOfYear),e._a[Ve]=n.getUTCMonth(),e._a[Ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=r[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[We]&&0===e._a[Ge]&&0===e._a[$e]&&0===e._a[Qe]&&(e._nextDay=!0,e._a[We]=0),e._d=(e._useUTC?bt:yt).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[We]=24),e._w&&"undefined"!==typeof e._w.d&&e._w.d!==i&&(v(e).weekdayMismatch=!0)}}function qn(e){var t,n,r,i,o,a,s,l,u;null!=(t=e._w).GG||null!=t.W||null!=t.E?(o=1,a=4,n=In(t.GG,e._a[He],_t(Qn(),1,4).year),r=In(t.W,1),((i=In(t.E,1))<1||i>7)&&(l=!0)):(o=e._locale._week.dow,a=e._locale._week.doy,u=_t(Qn(),o,a),n=In(t.gg,e._a[He],u.year),r=In(t.w,u.week),null!=t.d?((i=t.d)<0||i>6)&&(l=!0):null!=t.e?(i=t.e+o,(t.e<0||t.e>6)&&(l=!0)):i=o),r<1||r>kt(n,o,a)?v(e)._overflowWeeks=!0:null!=l?v(e)._overflowWeekday=!0:(s=xt(n,r,i,o,a),e._a[He]=s.year,e._dayOfYear=s.dayOfYear)}function zn(e){if(e._f!==r.ISO_8601)if(e._f!==r.RFC_2822){e._a=[],v(e).empty=!0;var t,n,i,o,a,s,l,u=""+e._i,c=u.length,f=0;for(l=(i=V(e._f,e._locale).match(R)||[]).length,t=0;t0&&v(e).unusedInput.push(a),u=u.slice(u.indexOf(n)+n.length),f+=n.length),U[o]?(n?v(e).empty=!1:v(e).unusedTokens.push(o),ze(o,n,e)):e._strict&&!n&&v(e).unusedTokens.push(o);v(e).charsLeftOver=c-f,u.length>0&&v(e).unusedInput.push(u),e._a[We]<=12&&!0===v(e).bigHour&&e._a[We]>0&&(v(e).bigHour=void 0),v(e).parsedDateParts=e._a.slice(0),v(e).meridiem=e._meridiem,e._a[We]=Bn(e._locale,e._a[We],e._meridiem),null!==(s=v(e).era)&&(e._a[He]=e._locale.erasConvertYear(s,e._a[He])),Un(e),wn(e)}else Dn(e);else Nn(e)}function Bn(e,t,n){var r;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((r=e.isPM(n))&&t<12&&(t+=12),r||12!==t||(t=0),t):t}function Hn(e){var t,n,r,i,o,a,s=!1,l=e._f.length;if(0===l)return v(e).invalidFormat=!0,void(e._d=new Date(NaN));for(i=0;ithis?this:e:y()}));function Kn(e,t){var n,r;if(1===t.length&&o(t[0])&&(t=t[0]),!t.length)return Qn();for(n=t[0],r=1;rthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function _r(){if(!u(this._isDSTShifted))return this._isDSTShifted;var e,t={};return x(t,this),(t=Wn(t))._a?(e=t._isUTC?p(t._a):Qn(t._a),this._isDSTShifted=this.isValid()&&ur(t._a,e.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function kr(){return!!this.isValid()&&!this._isUTC}function Sr(){return!!this.isValid()&&this._isUTC}function Er(){return!!this.isValid()&&this._isUTC&&0===this._offset}r.updateOffset=function(){};var Or=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,Cr=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Tr(e,t){var n,r,i,o=e,a=null;return sr(e)?o={ms:e._milliseconds,d:e._days,M:e._months}:c(e)||!isNaN(+e)?(o={},t?o[t]=+e:o.milliseconds=+e):(a=Or.exec(e))?(n="-"===a[1]?-1:1,o={y:0,d:ce(a[Ye])*n,h:ce(a[We])*n,m:ce(a[Ge])*n,s:ce(a[$e])*n,ms:ce(lr(1e3*a[Qe]))*n}):(a=Cr.exec(e))?(n="-"===a[1]?-1:1,o={y:Nr(a[2],n),M:Nr(a[3],n),w:Nr(a[4],n),d:Nr(a[5],n),h:Nr(a[6],n),m:Nr(a[7],n),s:Nr(a[8],n)}):null==o?o={}:"object"===typeof o&&("from"in o||"to"in o)&&(i=Ar(Qn(o.from),Qn(o.to)),(o={}).ms=i.milliseconds,o.M=i.months),r=new ar(o),sr(e)&&s(e,"_locale")&&(r._locale=e._locale),sr(e)&&s(e,"_isValid")&&(r._isValid=e._isValid),r}function Nr(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Mr(e,t){var n={};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function Ar(e,t){var n;return e.isValid()&&t.isValid()?(t=hr(t,e),e.isBefore(t)?n=Mr(e,t):((n=Mr(t,e)).milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function jr(e,t){return function(n,r){var i;return null===r||isNaN(+r)||(T(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),i=n,n=r,r=i),Pr(this,Tr(n,r),e),this}}function Pr(e,t,n,i){var o=t._milliseconds,a=lr(t._days),s=lr(t._months);e.isValid()&&(i=null==i||i,s&&ut(e,de(e,"Month")+s*n),a&&he(e,"Date",de(e,"Date")+a*n),o&&e._d.setTime(e._d.valueOf()+o*n),i&&r.updateOffset(e,a||s))}Tr.fn=ar.prototype,Tr.invalid=or;var Lr=jr(1,"add"),Dr=jr(-1,"subtract");function Rr(e){return"string"===typeof e||e instanceof String}function Ir(e){return k(e)||f(e)||Rr(e)||c(e)||Ur(e)||Fr(e)||null===e||void 0===e}function Fr(e){var t,n,r=a(e)&&!l(e),i=!1,o=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],u=o.length;for(t=0;tn.valueOf():n.valueOf()9999?H(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):N(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",H(n,"Z")):H(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function ei(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e,t,n,r,i="moment",o="";return this.isLocal()||(i=0===this.utcOffset()?"moment.utc":"moment.parseZone",o="Z"),e="["+i+'("]',t=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n="-MM-DD[T]HH:mm:ss.SSS",r=o+'[")]',this.format(e+t+n+r)}function ti(e){e||(e=this.isUtc()?r.defaultFormatUtc:r.defaultFormat);var t=H(this,e);return this.localeData().postformat(t)}function ni(e,t){return this.isValid()&&(k(e)&&e.isValid()||Qn(e).isValid())?Tr({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function ri(e){return this.from(Qn(),e)}function ii(e,t){return this.isValid()&&(k(e)&&e.isValid()||Qn(e).isValid())?Tr({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function oi(e){return this.to(Qn(),e)}function ai(e){var t;return void 0===e?this._locale._abbr:(null!=(t=yn(e))&&(this._locale=t),this)}r.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",r.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var si=E("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",(function(e){return void 0===e?this.localeData():this.locale(e)}));function li(){return this._locale}var ui=1e3,ci=60*ui,fi=60*ci,di=3506328*fi;function hi(e,t){return(e%t+t)%t}function pi(e,t,n){return e<100&&e>=0?new Date(e+400,t,n)-di:new Date(e,t,n).valueOf()}function mi(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-di:Date.UTC(e,t,n)}function vi(e){var t,n;if(void 0===(e=re(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?mi:pi,e){case"year":t=n(this.year(),0,1);break;case"quarter":t=n(this.year(),this.month()-this.month()%3,1);break;case"month":t=n(this.year(),this.month(),1);break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=n(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=hi(t+(this._isUTC?0:this.utcOffset()*ci),fi);break;case"minute":t=this._d.valueOf(),t-=hi(t,ci);break;case"second":t=this._d.valueOf(),t-=hi(t,ui)}return this._d.setTime(t),r.updateOffset(this,!0),this}function gi(e){var t,n;if(void 0===(e=re(e))||"millisecond"===e||!this.isValid())return this;switch(n=this._isUTC?mi:pi,e){case"year":t=n(this.year()+1,0,1)-1;break;case"quarter":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=n(this.year(),this.month()+1,1)-1;break;case"week":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=n(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=fi-hi(t+(this._isUTC?0:this.utcOffset()*ci),fi)-1;break;case"minute":t=this._d.valueOf(),t+=ci-hi(t,ci)-1;break;case"second":t=this._d.valueOf(),t+=ui-hi(t,ui)-1}return this._d.setTime(t),r.updateOffset(this,!0),this}function yi(){return this._d.valueOf()-6e4*(this._offset||0)}function bi(){return Math.floor(this.valueOf()/1e3)}function wi(){return new Date(this.valueOf())}function xi(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function _i(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function ki(){return this.isValid()?this.toISOString():null}function Si(){return g(this)}function Ei(){return h({},v(this))}function Oi(){return v(this).overflow}function Ci(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ti(e,t){var n,i,o,a=this._eras||yn("en")._eras;for(n=0,i=a.length;n=0)return l[r]}function Mi(e,t){var n=e.since<=e.until?1:-1;return void 0===t?r(e.since).year():r(e.since).year()+(t-e.offset)*n}function Ai(){var e,t,n,r=this.localeData().eras();for(e=0,t=r.length;e(o=kt(e,r,i))&&(t=o),Zi.call(this,e,t,n,r,i))}function Zi(e,t,n,r,i){var o=xt(e,t,n,r,i),a=bt(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function Ki(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)}q("N",0,0,"eraAbbr"),q("NN",0,0,"eraAbbr"),q("NNN",0,0,"eraAbbr"),q("NNNN",0,0,"eraName"),q("NNNNN",0,0,"eraNarrow"),q("y",["y",1],"yo","eraYear"),q("y",["yy",2],0,"eraYear"),q("y",["yyy",3],0,"eraYear"),q("y",["yyyy",4],0,"eraYear"),Le("N",Fi),Le("NN",Fi),Le("NNN",Fi),Le("NNNN",Ui),Le("NNNNN",qi),Ue(["N","NN","NNN","NNNN","NNNNN"],(function(e,t,n,r){var i=n._locale.erasParse(e,r,n._strict);i?v(n).era=i:v(n).invalidEra=e})),Le("y",Te),Le("yy",Te),Le("yyy",Te),Le("yyyy",Te),Le("yo",zi),Ue(["y","yy","yyy","yyyy"],He),Ue(["yo"],(function(e,t,n,r){var i;n._locale._eraYearOrdinalRegex&&(i=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[He]=n._locale.eraYearOrdinalParse(e,i):t[He]=parseInt(e,10)})),q(0,["gg",2],0,(function(){return this.weekYear()%100})),q(0,["GG",2],0,(function(){return this.isoWeekYear()%100})),Hi("gggg","weekYear"),Hi("ggggg","weekYear"),Hi("GGGG","isoWeekYear"),Hi("GGGGG","isoWeekYear"),ne("weekYear","gg"),ne("isoWeekYear","GG"),ae("weekYear",1),ae("isoWeekYear",1),Le("G",Ne),Le("g",Ne),Le("GG",_e,ye),Le("gg",_e,ye),Le("GGGG",Oe,we),Le("gggg",Oe,we),Le("GGGGG",Ce,xe),Le("ggggg",Ce,xe),qe(["gggg","ggggg","GGGG","GGGGG"],(function(e,t,n,r){t[r.substr(0,2)]=ce(e)})),qe(["gg","GG"],(function(e,t,n,i){t[i]=r.parseTwoDigitYear(e)})),q("Q",0,"Qo","quarter"),ne("quarter","Q"),ae("quarter",7),Le("Q",ge),Ue("Q",(function(e,t){t[Ve]=3*(ce(e)-1)})),q("D",["DD",2],"Do","date"),ne("date","D"),ae("date",9),Le("D",_e),Le("DD",_e,ye),Le("Do",(function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient})),Ue(["D","DD"],Ye),Ue("Do",(function(e,t){t[Ye]=ce(e.match(_e)[0])}));var Ji=fe("Date",!0);function eo(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")}q("DDD",["DDDD",3],"DDDo","dayOfYear"),ne("dayOfYear","DDD"),ae("dayOfYear",4),Le("DDD",Ee),Le("DDDD",be),Ue(["DDD","DDDD"],(function(e,t,n){n._dayOfYear=ce(e)})),q("m",["mm",2],0,"minute"),ne("minute","m"),ae("minute",14),Le("m",_e),Le("mm",_e,ye),Ue(["m","mm"],Ge);var to=fe("Minutes",!1);q("s",["ss",2],0,"second"),ne("second","s"),ae("second",15),Le("s",_e),Le("ss",_e,ye),Ue(["s","ss"],$e);var no,ro,io=fe("Seconds",!1);for(q("S",0,0,(function(){return~~(this.millisecond()/100)})),q(0,["SS",2],0,(function(){return~~(this.millisecond()/10)})),q(0,["SSS",3],0,"millisecond"),q(0,["SSSS",4],0,(function(){return 10*this.millisecond()})),q(0,["SSSSS",5],0,(function(){return 100*this.millisecond()})),q(0,["SSSSSS",6],0,(function(){return 1e3*this.millisecond()})),q(0,["SSSSSSS",7],0,(function(){return 1e4*this.millisecond()})),q(0,["SSSSSSSS",8],0,(function(){return 1e5*this.millisecond()})),q(0,["SSSSSSSSS",9],0,(function(){return 1e6*this.millisecond()})),ne("millisecond","ms"),ae("millisecond",16),Le("S",Ee,ge),Le("SS",Ee,ye),Le("SSS",Ee,be),no="SSSS";no.length<=9;no+="S")Le(no,Te);function oo(e,t){t[Qe]=ce(1e3*("0."+e))}for(no="S";no.length<=9;no+="S")Ue(no,oo);function ao(){return this._isUTC?"UTC":""}function so(){return this._isUTC?"Coordinated Universal Time":""}ro=fe("Milliseconds",!1),q("z",0,0,"zoneAbbr"),q("zz",0,0,"zoneName");var lo=_.prototype;function uo(e){return Qn(1e3*e)}function co(){return Qn.apply(null,arguments).parseZone()}function fo(e){return e}lo.add=Lr,lo.calendar=Br,lo.clone=Hr,lo.diff=Xr,lo.endOf=gi,lo.format=ti,lo.from=ni,lo.fromNow=ri,lo.to=ii,lo.toNow=oi,lo.get=pe,lo.invalidAt=Oi,lo.isAfter=Vr,lo.isBefore=Yr,lo.isBetween=Wr,lo.isSame=Gr,lo.isSameOrAfter=$r,lo.isSameOrBefore=Qr,lo.isValid=Si,lo.lang=si,lo.locale=ai,lo.localeData=li,lo.max=Zn,lo.min=Xn,lo.parsingFlags=Ei,lo.set=me,lo.startOf=vi,lo.subtract=Dr,lo.toArray=xi,lo.toObject=_i,lo.toDate=wi,lo.toISOString=Jr,lo.inspect=ei,"undefined"!==typeof Symbol&&null!=Symbol.for&&(lo[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),lo.toJSON=ki,lo.toString=Kr,lo.unix=bi,lo.valueOf=yi,lo.creationData=Ci,lo.eraName=Ai,lo.eraNarrow=ji,lo.eraAbbr=Pi,lo.eraYear=Li,lo.year=vt,lo.isLeapYear=gt,lo.weekYear=Vi,lo.isoWeekYear=Yi,lo.quarter=lo.quarters=Ki,lo.month=ct,lo.daysInMonth=ft,lo.week=lo.weeks=Tt,lo.isoWeek=lo.isoWeeks=Nt,lo.weeksInYear=$i,lo.weeksInWeekYear=Qi,lo.isoWeeksInYear=Wi,lo.isoWeeksInISOWeekYear=Gi,lo.date=Ji,lo.day=lo.days=Vt,lo.weekday=Yt,lo.isoWeekday=Wt,lo.dayOfYear=eo,lo.hour=lo.hours=rn,lo.minute=lo.minutes=to,lo.second=lo.seconds=io,lo.millisecond=lo.milliseconds=ro,lo.utcOffset=mr,lo.utc=gr,lo.local=yr,lo.parseZone=br,lo.hasAlignedHourOffset=wr,lo.isDST=xr,lo.isLocal=kr,lo.isUtcOffset=Sr,lo.isUtc=Er,lo.isUTC=Er,lo.zoneAbbr=ao,lo.zoneName=so,lo.dates=E("dates accessor is deprecated. Use date instead.",Ji),lo.months=E("months accessor is deprecated. Use month instead",ct),lo.years=E("years accessor is deprecated. Use year instead",vt),lo.zone=E("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",vr),lo.isDSTShifted=E("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",_r);var ho=j.prototype;function po(e,t,n,r){var i=yn(),o=p().set(r,t);return i[n](o,e)}function mo(e,t,n){if(c(e)&&(t=e,e=void 0),e=e||"",null!=t)return po(e,t,n,"month");var r,i=[];for(r=0;r<12;r++)i[r]=po(e,r,n,"month");return i}function vo(e,t,n,r){"boolean"===typeof e?(c(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,c(t)&&(n=t,t=void 0),t=t||"");var i,o=yn(),a=e?o._week.dow:0,s=[];if(null!=n)return po(t,(n+a)%7,r,"day");for(i=0;i<7;i++)s[i]=po(t,(i+a)%7,r,"day");return s}function go(e,t){return mo(e,t,"months")}function yo(e,t){return mo(e,t,"monthsShort")}function bo(e,t,n){return vo(e,t,n,"weekdays")}function wo(e,t,n){return vo(e,t,n,"weekdaysShort")}function xo(e,t,n){return vo(e,t,n,"weekdaysMin")}ho.calendar=L,ho.longDateFormat=W,ho.invalidDate=$,ho.ordinal=Z,ho.preparse=fo,ho.postformat=fo,ho.relativeTime=J,ho.pastFuture=ee,ho.set=M,ho.eras=Ti,ho.erasParse=Ni,ho.erasConvertYear=Mi,ho.erasAbbrRegex=Ri,ho.erasNameRegex=Di,ho.erasNarrowRegex=Ii,ho.months=ot,ho.monthsShort=at,ho.monthsParse=lt,ho.monthsRegex=ht,ho.monthsShortRegex=dt,ho.week=St,ho.firstDayOfYear=Ct,ho.firstDayOfWeek=Ot,ho.weekdays=Ut,ho.weekdaysMin=zt,ho.weekdaysShort=qt,ho.weekdaysParse=Ht,ho.weekdaysRegex=Gt,ho.weekdaysShortRegex=$t,ho.weekdaysMinRegex=Qt,ho.isPM=tn,ho.meridiem=on,mn("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===ce(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),r.lang=E("moment.lang is deprecated. Use moment.locale instead.",mn),r.langData=E("moment.langData is deprecated. Use moment.localeData instead.",yn);var _o=Math.abs;function ko(){var e=this._data;return this._milliseconds=_o(this._milliseconds),this._days=_o(this._days),this._months=_o(this._months),e.milliseconds=_o(e.milliseconds),e.seconds=_o(e.seconds),e.minutes=_o(e.minutes),e.hours=_o(e.hours),e.months=_o(e.months),e.years=_o(e.years),this}function So(e,t,n,r){var i=Tr(t,n);return e._milliseconds+=r*i._milliseconds,e._days+=r*i._days,e._months+=r*i._months,e._bubble()}function Eo(e,t){return So(this,e,t,1)}function Oo(e,t){return So(this,e,t,-1)}function Co(e){return e<0?Math.floor(e):Math.ceil(e)}function To(){var e,t,n,r,i,o=this._milliseconds,a=this._days,s=this._months,l=this._data;return o>=0&&a>=0&&s>=0||o<=0&&a<=0&&s<=0||(o+=864e5*Co(Mo(s)+a),a=0,s=0),l.milliseconds=o%1e3,e=ue(o/1e3),l.seconds=e%60,t=ue(e/60),l.minutes=t%60,n=ue(t/60),l.hours=n%24,a+=ue(n/24),s+=i=ue(No(a)),a-=Co(Mo(i)),r=ue(s/12),s%=12,l.days=a,l.months=s,l.years=r,this}function No(e){return 4800*e/146097}function Mo(e){return 146097*e/4800}function Ao(e){if(!this.isValid())return NaN;var t,n,r=this._milliseconds;if("month"===(e=re(e))||"quarter"===e||"year"===e)switch(t=this._days+r/864e5,n=this._months+No(t),e){case"month":return n;case"quarter":return n/3;case"year":return n/12}else switch(t=this._days+Math.round(Mo(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return 24*t+r/36e5;case"minute":return 1440*t+r/6e4;case"second":return 86400*t+r/1e3;case"millisecond":return Math.floor(864e5*t)+r;default:throw new Error("Unknown unit "+e)}}function jo(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*ce(this._months/12):NaN}function Po(e){return function(){return this.as(e)}}var Lo=Po("ms"),Do=Po("s"),Ro=Po("m"),Io=Po("h"),Fo=Po("d"),Uo=Po("w"),qo=Po("M"),zo=Po("Q"),Bo=Po("y");function Ho(){return Tr(this)}function Vo(e){return e=re(e),this.isValid()?this[e+"s"]():NaN}function Yo(e){return function(){return this.isValid()?this._data[e]:NaN}}var Wo=Yo("milliseconds"),Go=Yo("seconds"),$o=Yo("minutes"),Qo=Yo("hours"),Xo=Yo("days"),Zo=Yo("months"),Ko=Yo("years");function Jo(){return ue(this.days()/7)}var ea=Math.round,ta={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function na(e,t,n,r,i){return i.relativeTime(t||1,!!n,e,r)}function ra(e,t,n,r){var i=Tr(e).abs(),o=ea(i.as("s")),a=ea(i.as("m")),s=ea(i.as("h")),l=ea(i.as("d")),u=ea(i.as("M")),c=ea(i.as("w")),f=ea(i.as("y")),d=o<=n.ss&&["s",o]||o0,d[4]=r,na.apply(null,d)}function ia(e){return void 0===e?ea:"function"===typeof e&&(ea=e,!0)}function oa(e,t){return void 0!==ta[e]&&(void 0===t?ta[e]:(ta[e]=t,"s"===e&&(ta.ss=t-1),!0))}function aa(e,t){if(!this.isValid())return this.localeData().invalidDate();var n,r,i=!1,o=ta;return"object"===typeof e&&(t=e,e=!1),"boolean"===typeof e&&(i=e),"object"===typeof t&&(o=Object.assign({},ta,t),null!=t.s&&null==t.ss&&(o.ss=t.s-1)),r=ra(this,!i,o,n=this.localeData()),i&&(r=n.pastFuture(+this,r)),n.postformat(r)}var sa=Math.abs;function la(e){return(e>0)-(e<0)||+e}function ua(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,r,i,o,a,s,l=sa(this._milliseconds)/1e3,u=sa(this._days),c=sa(this._months),f=this.asSeconds();return f?(e=ue(l/60),t=ue(e/60),l%=60,e%=60,n=ue(c/12),c%=12,r=l?l.toFixed(3).replace(/\.?0+$/,""):"",i=f<0?"-":"",o=la(this._months)!==la(f)?"-":"",a=la(this._days)!==la(f)?"-":"",s=la(this._milliseconds)!==la(f)?"-":"",i+"P"+(n?o+n+"Y":"")+(c?o+c+"M":"")+(u?a+u+"D":"")+(t||e||l?"T":"")+(t?s+t+"H":"")+(e?s+e+"M":"")+(l?s+r+"S":"")):"P0D"}var ca=ar.prototype;return ca.isValid=ir,ca.abs=ko,ca.add=Eo,ca.subtract=Oo,ca.as=Ao,ca.asMilliseconds=Lo,ca.asSeconds=Do,ca.asMinutes=Ro,ca.asHours=Io,ca.asDays=Fo,ca.asWeeks=Uo,ca.asMonths=qo,ca.asQuarters=zo,ca.asYears=Bo,ca.valueOf=jo,ca._bubble=To,ca.clone=Ho,ca.get=Vo,ca.milliseconds=Wo,ca.seconds=Go,ca.minutes=$o,ca.hours=Qo,ca.days=Xo,ca.weeks=Jo,ca.months=Zo,ca.years=Ko,ca.humanize=aa,ca.toISOString=ua,ca.toString=ua,ca.toJSON=ua,ca.locale=ai,ca.localeData=li,ca.toIsoString=E("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",ua),ca.lang=si,q("X",0,0,"unix"),q("x",0,0,"valueOf"),Le("x",Ne),Le("X",je),Ue("X",(function(e,t,n){n._d=new Date(1e3*parseFloat(e))})),Ue("x",(function(e,t,n){n._d=new Date(ce(e))})),r.version="2.29.4",i(Qn),r.fn=lo,r.min=Jn,r.max=er,r.now=tr,r.utc=p,r.unix=uo,r.months=go,r.isDate=f,r.locale=mn,r.invalid=y,r.duration=Tr,r.isMoment=k,r.weekdays=bo,r.parseZone=co,r.localeData=yn,r.isDuration=sr,r.monthsShort=yo,r.weekdaysMin=xo,r.defineLocale=vn,r.updateLocale=gn,r.locales=bn,r.weekdaysShort=wo,r.normalizeUnits=re,r.relativeTimeRounding=ia,r.relativeTimeThreshold=oa,r.calendarFormat=zr,r.prototype=lo,r.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},r}()},2267:function(e,t){var n,r,i;r=[],void 0===(i="function"===typeof(n=function(){return function(e){function t(e){return" "===e||"\t"===e||"\n"===e||"\f"===e||"\r"===e}function n(t){var n,r=t.exec(e.substring(m));if(r)return n=r[0],m+=n.length,n}for(var r,i,o,a,s,l=e.length,u=/^[ \t\n\r\u000c]+/,c=/^[, \t\n\r\u000c]+/,f=/^[^ \t\n\r\u000c]+/,d=/[,]+$/,h=/^\d+$/,p=/^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,m=0,v=[];;){if(n(c),m>=l)return v;r=n(f),i=[],","===r.slice(-1)?(r=r.replace(d,""),y()):g()}function g(){for(n(u),o="",a="in descriptor";;){if(s=e.charAt(m),"in descriptor"===a)if(t(s))o&&(i.push(o),o="",a="after descriptor");else{if(","===s)return m+=1,o&&i.push(o),void y();if("("===s)o+=s,a="in parens";else{if(""===s)return o&&i.push(o),void y();o+=s}}else if("in parens"===a)if(")"===s)o+=s,a="in descriptor";else{if(""===s)return i.push(o),void y();o+=s}else if("after descriptor"===a)if(t(s));else{if(""===s)return void y();a="in descriptor",m-=1}m+=1}}function y(){var t,n,o,a,s,l,u,c,f,d=!1,m={};for(a=0;a=e&&(this.indexes[n]=t-1);return this.markDirty(),this}},{key:"removeAll",value:function(){var e,t=h(this.proxyOf.nodes);try{for(t.s();!(e=t.n()).done;){e.value.parent=void 0}}catch(n){t.e(n)}finally{t.f()}return this.proxyOf.nodes=[],this.markDirty(),this}},{key:"replaceValues",value:function(e,t,n){return n||(n=t,t={}),this.walkDecls((function(r){t.props&&!t.props.includes(r.prop)||t.fast&&!r.value.includes(t.fast)||(r.value=r.value.replace(e,n))})),this.markDirty(),this}},{key:"every",value:function(e){return this.nodes.every(e)}},{key:"some",value:function(e){return this.nodes.some(e)}},{key:"index",value:function(e){return"number"===typeof e?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}},{key:"first",get:function(){if(this.proxyOf.nodes)return this.proxyOf.nodes[0]}},{key:"last",get:function(){if(this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}},{key:"normalize",value:function(e,t){var a=this;if("string"===typeof e)e=b(r(e).nodes);else if(Array.isArray(e)){e=e.slice(0);var s,l=h(e);try{for(l.s();!(s=l.n()).done;){var u=s.value;u.parent&&u.parent.removeChild(u,"ignore")}}catch(x){l.e(x)}finally{l.f()}}else if("root"===e.type&&"document"!==this.type){e=e.nodes.slice(0);var c,f=h(e);try{for(f.s();!(c=f.n()).done;){var d=c.value;d.parent&&d.parent.removeChild(d,"ignore")}}catch(x){f.e(x)}finally{f.f()}}else if(e.type)e=[e];else if(e.prop){if("undefined"===typeof e.value)throw new Error("Value field is missed in node creation");"string"!==typeof e.value&&(e.value=String(e.value)),e=[new g(e)]}else if(e.selector)e=[new i(e)];else if(e.name)e=[new o(e)];else{if(!e.text)throw new Error("Unknown node type in node creation");e=[new y(e)]}var p=e.map((function(e){return e[v]||n.rebuild(e),(e=e.proxyOf).parent&&e.parent.removeChild(e),e[m]&&w(e),"undefined"===typeof e.raws.before&&t&&"undefined"!==typeof t.raws.before&&(e.raws.before=t.raws.before.replace(/\S/g,"")),e.parent=a.proxyOf,e}));return p}},{key:"getProxyProcessor",value:function(){return{set:function(e,t,n){return e[t]===n||(e[t]=n,"name"!==t&&"params"!==t&&"selector"!==t||e.markDirty()),!0},get:function(e,t){return"proxyOf"===t?e:e[t]?"each"===t||"string"===typeof t&&t.startsWith("walk")?function(){for(var n=arguments.length,r=new Array(n),i=0;i1?t-1:0),i=1;i","undefined"!==typeof this.line&&(this.message+=":"+this.line+":"+this.column),this.message+=": "+this.reason}},{key:"showSourceCode",value:function(e){var t=this;if(!this.source)return"";var n=this.source;null==e&&(e=u.isColorSupported),c&&e&&(n=c(n));var r,i,o=n.split(/\r?\n/),a=Math.max(this.line-3,0),s=Math.min(this.line+2,o.length),l=String(s).length;if(e){var f=u.createColors(!0),d=f.bold,h=f.red,p=f.gray;r=function(e){return d(h(e))},i=function(e){return p(e)}}else r=i=function(e){return e};return o.slice(a,s).map((function(e,n){var o=a+1+n,s=" "+(" "+o).slice(-l)+" | ";if(o===t.line){var u=i(s.replace(/\d/g," "))+e.slice(0,t.column-1).replace(/[^\t]/g," ");return r(">")+i(s)+e+"\n "+u+r("^")}return" "+i(s)+e})).join("\n")}},{key:"toString",value:function(){var e=this.showSourceCode();return e&&(e="\n\n"+e+"\n"),this.name+": "+this.message+e}}]),n}(l(Error));e.exports=f,f.default=f},671:function(e,t,n){"use strict";var r=n(3137).default,i=n(3937).default,o=n(1788).default,a=n(6406).default,s=n(1001).default,l=function(e){a(n,e);var t=s(n);function n(e){var o;return i(this,n),e&&"undefined"!==typeof e.value&&"string"!==typeof e.value&&(e=r(r({},e),{},{value:String(e.value)})),(o=t.call(this,e)).type="decl",o}return o(n,[{key:"variable",get:function(){return this.prop.startsWith("--")||"$"===this.prop[0]}}]),n}(n(9735));e.exports=l,l.default=l},6675:function(e,t,n){"use strict";var r,i,o=n(3137).default,a=n(3937).default,s=n(1788).default,l=n(6406).default,u=n(1001).default,c=function(e){l(n,e);var t=u(n);function n(e){var r;return a(this,n),(r=t.call(this,o({type:"document"},e))).nodes||(r.nodes=[]),r}return s(n,[{key:"toResult",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new r(new i,this,e);return t.stringify()}}]),n}(n(8539));c.registerLazyResult=function(e){r=e},c.registerProcessor=function(e){i=e},e.exports=c,c.default=c},5385:function(e,t,n){"use strict";var r=n(3137).default,i=n(6913).default,o=n(5956).default,a=["inputs"],s=["inputId"],l=n(671),u=n(386),c=n(6811),f=n(8662),d=n(5341),h=n(1847),p=n(5605);function m(e,t){if(Array.isArray(e))return e.map((function(e){return m(e)}));var n=e.inputs,v=o(e,a);if(n){t=[];var g,y=i(n);try{for(y.s();!(g=y.n()).done;){var b=g.value,w=r(r({},b),{},{__proto__:d.prototype});w.map&&(w.map=r(r({},w.map),{},{__proto__:u.prototype})),t.push(w)}}catch(S){y.e(S)}finally{y.f()}}if(v.nodes&&(v.nodes=e.nodes.map((function(e){return m(e,t)}))),v.source){var x=v.source,_=x.inputId,k=o(x,s);v.source=k,null!=_&&(v.source.input=t[_])}if("root"===v.type)return new h(v);if("decl"===v.type)return new l(v);if("rule"===v.type)return new p(v);if("comment"===v.type)return new c(v);if("atrule"===v.type)return new f(v);throw new Error("Unknown node type: "+e.type)}e.exports=m,m.default=m},5341:function(e,t,n){"use strict";var r=n(3137).default,i=n(3937).default,o=n(1788).default,a=n(9806),s=a.SourceMapConsumer,l=a.SourceMapGenerator,u=n(9299),c=u.fileURLToPath,f=u.pathToFileURL,d=n(5728),h=d.resolve,p=d.isAbsolute,m=n(516).nanoid,v=n(2500),g=n(3291),y=n(386),b=Symbol("fromOffsetCache"),w=Boolean(s&&l),x=Boolean(h&&p),_=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i(this,e),null===t||"undefined"===typeof t||"object"===typeof t&&!t.toString)throw new Error("PostCSS received ".concat(t," instead of CSS string"));if(this.css=t.toString(),"\ufeff"===this.css[0]||"\ufffe"===this.css[0]?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,n.from&&(!x||/^\w+:\/\//.test(n.from)||p(n.from)?this.file=n.from:this.file=h(n.from)),x&&w){var r=new y(this.css,n);if(r.text){this.map=r;var o=r.consumer().file;!this.file&&o&&(this.file=this.mapResolve(o))}}this.file||(this.id=""),this.map&&(this.map.file=this.from)}return o(e,[{key:"fromOffset",value:function(e){var t;if(this[b])t=this[b];else{var n=this.css.split("\n");t=new Array(n.length);for(var r=0,i=0,o=n.length;i=t[t.length-1])a=t.length-1;else for(var s,l=t.length-2;a>1)])l=s-1;else{if(!(e>=t[s+1])){a=s;break}a=s+1}return{line:a+1,col:e-t[a]+1}}},{key:"error",value:function(e,t,n){var r,i,o,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(t&&"object"===typeof t){var s=t,l=n;if("number"===typeof t.offset){var u=this.fromOffset(s.offset);t=u.line,n=u.col}else t=s.line,n=s.column;if("number"===typeof l.offset){var c=this.fromOffset(l.offset);i=c.line,o=c.col}else i=l.line,o=l.column}else if(!n){var d=this.fromOffset(t);t=d.line,n=d.col}var h=this.origin(t,n,i,o);return(r=h?new g(e,void 0===h.endLine?h.line:{line:h.line,column:h.column},void 0===h.endLine?h.column:{line:h.endLine,column:h.endColumn},h.source,h.file,a.plugin):new g(e,void 0===i?t:{line:t,column:n},void 0===i?n:{line:i,column:o},this.css,this.file,a.plugin)).input={line:t,column:n,endLine:i,endColumn:o,source:this.css},this.file&&(f&&(r.input.url=f(this.file).toString()),r.input.file=this.file),r}},{key:"origin",value:function(e,t,n,r){if(!this.map)return!1;var i,o,a=this.map.consumer(),s=a.originalPositionFor({line:e,column:t});if(!s.source)return!1;"number"===typeof n&&(i=a.originalPositionFor({line:n,column:r}));var l={url:(o=p(s.source)?f(s.source):new URL(s.source,this.map.consumer().sourceRoot||f(this.map.mapFile))).toString(),line:s.line,column:s.column,endLine:i&&i.line,endColumn:i&&i.column};if("file:"===o.protocol){if(!c)throw new Error("file: protocol is not available in this PostCSS build");l.file=c(o)}var u=a.sourceContentFor(s.source);return u&&(l.source=u),l}},{key:"mapResolve",value:function(e){return/^\w+:\/\//.test(e)?e:h(this.map.consumer().sourceRoot||this.map.root||".",e)}},{key:"from",get:function(){return this.file||this.id}},{key:"toJSON",value:function(){for(var e={},t=0,n=["hasBOM","css","file","id"];t0)){e.next=37;break}if(!k(u=this.visitTick(l))){e.next=35;break}return e.prev=26,e.next=29,u;case 29:e.next=35;break;case 31:throw e.prev=31,e.t1=e.catch(26),c=l[l.length-1].node,this.handleError(e.t1,c);case 35:e.next=23;break;case 37:e.next=20;break;case 39:if(!this.listeners.OnceExit){e.next=56;break}d=a(this.listeners.OnceExit),e.prev=41,p=r().mark((function e(){var t,n,i,a;return r().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t=o(h.value,2),n=t[0],i=t[1],m.result.lastPlugin=n,e.prev=2,"document"!==s.type){e.next=9;break}return a=s.nodes.map((function(e){return i(e,m.helpers)})),e.next=7,Promise.all(a);case 7:e.next=11;break;case 9:return e.next=11,i(s,m.helpers);case 11:e.next=16;break;case 13:throw e.prev=13,e.t0=e.catch(2),m.handleError(e.t0);case 16:case"end":return e.stop()}}),e,null,[[2,13]])})),d.s();case 44:if((h=d.n()).done){e.next=48;break}return e.delegateYield(p(),"t2",46);case 46:e.next=44;break;case 48:e.next=53;break;case 50:e.prev=50,e.t3=e.catch(41),d.e(e.t3);case 53:return e.prev=53,d.f(),e.finish(53);case 56:return this.processed=!0,e.abrupt("return",this.stringify());case 58:case"end":return e.stop()}}),e,this,[[6,11],[26,31],[41,50,53,56]])})));return function(){return e.apply(this,arguments)}}()},{key:"prepareVisitors",value:function(){var e=this;this.listeners={};var t,n=function(t,n,r){e.listeners[n]||(e.listeners[n]=[]),e.listeners[n].push([t,r])},r=a(this.plugins);try{for(r.s();!(t=r.n()).done;){var i=t.value;if("object"===typeof i)for(var o in i){if(!x[o]&&/^[A-Z]/.test(o))throw new Error("Unknown event ".concat(o," in ").concat(i.postcssPlugin,". ")+"Try to update PostCSS (".concat(this.processor.version," now)."));if(!_[o])if("object"===typeof i[o])for(var s in i[o])n(i,"*"===s?o:o+"-"+s.toLowerCase(),i[o][s]);else"function"===typeof i[o]&&n(i,o,i[o])}}}catch(l){r.e(l)}finally{r.f()}this.hasListener=Object.keys(this.listeners).length>0}},{key:"visitTick",value:function(e){var t=e[e.length-1],n=t.node,r=t.visitors;if("root"===n.type||"document"===n.type||n.parent){if(r.length>0&&t.visitorIndex0&&(l-=1):0===l&&t.includes(d)&&(s=!0),s?(""!==a&&o.push(a.trim()),a="",s=!1):a+=d}}catch(h){f.e(h)}finally{f.f()}return(n||""!==a)&&o.push(a.trim()),o},space:function(e){return i.split(e,[" ","\n","\t"])},comma:function(e){return i.split(e,[","],!0)}};e.exports=i,i.default=i},1901:function(e,t,n){"use strict";var r=n(6913).default,i=n(3937).default,o=n(1788).default,a=n(9806),s=a.SourceMapConsumer,l=a.SourceMapGenerator,u=n(5728),c=u.dirname,f=u.resolve,d=u.relative,h=u.sep,p=n(9299).pathToFileURL,m=n(5341),v=Boolean(s&&l),g=Boolean(c&&f&&d&&h),y=function(){function e(t,n,r,o){i(this,e),this.stringify=t,this.mapOpts=r.map||{},this.root=n,this.opts=r,this.css=o}return o(e,[{key:"isMap",value:function(){return"undefined"!==typeof this.opts.map?!!this.opts.map:this.previous().length>0}},{key:"previous",value:function(){var e=this;if(!this.previousMaps)if(this.previousMaps=[],this.root)this.root.walk((function(t){if(t.source&&t.source.input.map){var n=t.source.input.map;e.previousMaps.includes(n)||e.previousMaps.push(n)}}));else{var t=new m(this.css,this.opts);t.map&&this.previousMaps.push(t.map)}return this.previousMaps}},{key:"isInline",value:function(){if("undefined"!==typeof this.mapOpts.inline)return this.mapOpts.inline;var e=this.mapOpts.annotation;return("undefined"===typeof e||!0===e)&&(!this.previous().length||this.previous().some((function(e){return e.inline})))}},{key:"isSourcesContent",value:function(){return"undefined"!==typeof this.mapOpts.sourcesContent?this.mapOpts.sourcesContent:!this.previous().length||this.previous().some((function(e){return e.withContent()}))}},{key:"clearAnnotation",value:function(){if(!1!==this.mapOpts.annotation)if(this.root)for(var e,t=this.root.nodes.length-1;t>=0;t--)"comment"===(e=this.root.nodes[t]).type&&0===e.text.indexOf("# sourceMappingURL=")&&this.root.removeChild(t);else this.css&&(this.css=this.css.replace(/(\n)?\/\*#[\S\s]*?\*\/$/gm,""))}},{key:"setSourcesContent",value:function(){var e=this,t={};if(this.root)this.root.walk((function(n){if(n.source){var r=n.source.input.from;r&&!t[r]&&(t[r]=!0,e.map.setSourceContent(e.toUrl(e.path(r)),n.source.input.css))}}));else if(this.css){var n=this.opts.from?this.toUrl(this.path(this.opts.from)):"";this.map.setSourceContent(n,this.css)}}},{key:"applyPrevMaps",value:function(){var e,t=r(this.previous());try{for(t.s();!(e=t.n()).done;){var n=e.value,i=this.toUrl(this.path(n.file)),o=n.root||c(n.file),a=void 0;!1===this.mapOpts.sourcesContent?(a=new s(n.text)).sourcesContent&&(a.sourcesContent=a.sourcesContent.map((function(){return null}))):a=n.consumer(),this.map.applySourceMap(a,i,this.toUrl(this.path(o)))}}catch(l){t.e(l)}finally{t.f()}}},{key:"isAnnotation",value:function(){return!!this.isInline()||("undefined"!==typeof this.mapOpts.annotation?this.mapOpts.annotation:!this.previous().length||this.previous().some((function(e){return e.annotation})))}},{key:"toBase64",value:function(e){return Buffer?Buffer.from(e).toString("base64"):window.btoa(unescape(encodeURIComponent(e)))}},{key:"addAnnotation",value:function(){var e;e=this.isInline()?"data:application/json;base64,"+this.toBase64(this.map.toString()):"string"===typeof this.mapOpts.annotation?this.mapOpts.annotation:"function"===typeof this.mapOpts.annotation?this.mapOpts.annotation(this.opts.to,this.root):this.outputFile()+".map";var t="\n";this.css.includes("\r\n")&&(t="\r\n"),this.css+=t+"/*# sourceMappingURL="+e+" */"}},{key:"outputFile",value:function(){return this.opts.to?this.path(this.opts.to):this.opts.from?this.path(this.opts.from):"to.css"}},{key:"generateMap",value:function(){if(this.root)this.generateString();else if(1===this.previous().length){var e=this.previous()[0].consumer();e.file=this.outputFile(),this.map=l.fromSourceMap(e)}else this.map=new l({file:this.outputFile()}),this.map.addMapping({source:this.opts.from?this.toUrl(this.path(this.opts.from)):"",generated:{line:1,column:0},original:{line:1,column:0}});return this.isSourcesContent()&&this.setSourcesContent(),this.root&&this.previous().length>0&&this.applyPrevMaps(),this.isAnnotation()&&this.addAnnotation(),this.isInline()?[this.css]:[this.css,this.map]}},{key:"path",value:function(e){if(0===e.indexOf("<"))return e;if(/^\w+:\/\//.test(e))return e;if(this.mapOpts.absolute)return e;var t=this.opts.to?c(this.opts.to):".";return"string"===typeof this.mapOpts.annotation&&(t=c(f(t,this.mapOpts.annotation))),e=d(t,e)}},{key:"toUrl",value:function(e){return"\\"===h&&(e=e.replace(/\\/g,"/")),encodeURI(e).replace(/[#?]/g,encodeURIComponent)}},{key:"sourcePath",value:function(e){if(this.mapOpts.from)return this.toUrl(this.mapOpts.from);if(this.mapOpts.absolute){if(p)return p(e.source.input.from).toString();throw new Error("`map.absolute` option is not available in this PostCSS build")}return this.toUrl(this.path(e.source.input.from))}},{key:"generateString",value:function(){var e=this;this.css="",this.map=new l({file:this.outputFile()});var t,n,r=1,i=1,o="",a={source:"",generated:{line:0,column:0},original:{line:0,column:0}};this.stringify(this.root,(function(s,l,u){if(e.css+=s,l&&"end"!==u&&(a.generated.line=r,a.generated.column=i-1,l.source&&l.source.start?(a.source=e.sourcePath(l),a.original.line=l.source.start.line,a.original.column=l.source.start.column-1,e.map.addMapping(a)):(a.source=o,a.original.line=1,a.original.column=0,e.map.addMapping(a))),(t=s.match(/\n/g))?(r+=t.length,n=s.lastIndexOf("\n"),i=s.length-n):i+=s.length,l&&"start"!==u){var c=l.parent||{raws:{}};("decl"!==l.type||l!==c.last||c.raws.semicolon)&&(l.source&&l.source.end?(a.source=e.sourcePath(l),a.original.line=l.source.end.line,a.original.column=l.source.end.column-1,a.generated.line=r,a.generated.column=i-2,e.map.addMapping(a)):(a.source=o,a.original.line=1,a.original.column=0,a.generated.line=r,a.generated.column=i-1,e.map.addMapping(a)))}}))}},{key:"generate",value:function(){if(this.clearAnnotation(),g&&v&&this.isMap())return this.generateMap();var e="";return this.stringify(this.root,(function(t){e+=t})),[e]}}]),e}();e.exports=y},2707:function(e,t,n){"use strict";var r=n(8120).default,i=n(3937).default,o=n(1788).default,a=n(1901),s=n(4964),l=(n(1653),n(3418)),u=n(7707),c=function(e){function t(e,n,o){var l;i(this,t),n=n.toString(),this.stringified=!1,this._processor=e,this._css=n,this._opts=o,this._map=void 0;var c=s;this.result=new u(this._processor,l,this._opts),this.result.css=n;var f=this;Object.defineProperty(this.result,"root",{get:function(){return f.root}});var d=new a(c,l,this._opts,n);if(d.isMap()){var h=d.generate(),p=r(h,2),m=p[0],v=p[1];m&&(this.result.css=m),v&&(this.result.map=v)}}return o(t,[{key:e,get:function(){return"NoWorkResult"}},{key:"processor",get:function(){return this.result.processor}},{key:"opts",get:function(){return this.result.opts}},{key:"css",get:function(){return this.result.css}},{key:"content",get:function(){return this.result.css}},{key:"map",get:function(){return this.result.map}},{key:"root",get:function(){if(this._root)return this._root;var e,t=l;try{e=t(this._css,this._opts)}catch(n){this.error=n}if(this.error)throw this.error;return this._root=e,e}},{key:"messages",get:function(){return[]}},{key:"warnings",value:function(){return[]}},{key:"toString",value:function(){return this._css}},{key:"then",value:function(e,t){return this.async().then(e,t)}},{key:"catch",value:function(e){return this.async().catch(e)}},{key:"finally",value:function(e){return this.async().then(e,e)}},{key:"async",value:function(){return this.error?Promise.reject(this.error):Promise.resolve(this.result)}},{key:"sync",value:function(){if(this.error)throw this.error;return this.result}}]),t}(Symbol.toStringTag);e.exports=c,c.default=c},9735:function(e,t,n){"use strict";var r=n(4183).default,i=n(6913).default,o=n(3937).default,a=n(1788).default,s=n(5662),l=s.isClean,u=s.my,c=n(3291),f=n(3882),d=n(4964);function h(e,t){var n=new e.constructor;for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&"proxyCache"!==r){var i=e[r],o=typeof i;"parent"===r&&"object"===o?t&&(n[r]=t):"source"===r?n[r]=i:Array.isArray(i)?n[r]=i.map((function(e){return h(e,n)})):("object"===o&&null!==i&&(i=h(i)),n[r]=i)}return n}var p=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(var n in o(this,e),this.raws={},this[l]=!1,this[u]=!0,t)if("nodes"===n){this.nodes=[];var r,a=i(t[n]);try{for(a.s();!(r=a.n()).done;){var s=r.value;"function"===typeof s.clone?this.append(s.clone()):this.append(s)}}catch(c){a.e(c)}finally{a.f()}}else this[n]=t[n]}return a(e,[{key:"error",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(this.source){var n=this.rangeBy(t),r=n.start,i=n.end;return this.source.input.error(e,{line:r.line,column:r.column},{line:i.line,column:i.column},t)}return new c(e)}},{key:"warn",value:function(e,t,n){var r={node:this};for(var i in n)r[i]=n[i];return e.warn(t,r)}},{key:"remove",value:function(){return this.parent&&this.parent.removeChild(this),this.parent=void 0,this}},{key:"toString",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:d;e.stringify&&(e=e.stringify);var t="";return e(this,(function(e){t+=e})),t}},{key:"assign",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};for(var t in e)this[t]=e[t];return this}},{key:"clone",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=h(this);for(var n in e)t[n]=e[n];return t}},{key:"cloneBefore",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.clone(e);return this.parent.insertBefore(this,t),t}},{key:"cloneAfter",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=this.clone(e);return this.parent.insertAfter(this,t),t}},{key:"replaceWith",value:function(){if(this.parent){for(var e=this,t=!1,n=arguments.length,r=new Array(n),i=0;i0&&this.unclosedBracket(i),t&&r){if(!a)for(;s.length&&("space"===(l=s[s.length-1][0])||"comment"===l);)this.tokenizer.back(s.pop());this.decl(s,a)}else this.unknownWord(s)}},{key:"rule",value:function(e){e.pop();var t=new d;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,"selector",e),this.current=t}},{key:"decl",value:function(e,t){var n=new s;this.init(n,e[0][2]);var r,i=e[e.length-1];for(";"===i[0]&&(this.semicolon=!0,e.pop()),n.source.end=this.getPosition(i[3]||i[2]||function(e){for(var t=e.length-1;t>=0;t--){var n=e[t],r=n[3]||n[2];if(r)return r}}(e));"word"!==e[0][0];)1===e.length&&this.unknownWord(e),n.raws.before+=e.shift()[1];for(n.source.start=this.getPosition(e[0][2]),n.prop="";e.length;){var o=e[0][0];if(":"===o||"space"===o||"comment"===o)break;n.prop+=e.shift()[1]}for(n.raws.between="";e.length;){if(":"===(r=e.shift())[0]){n.raws.between+=r[1];break}"word"===r[0]&&/\w/.test(r[1])&&this.unknownWord([r]),n.raws.between+=r[1]}"_"!==n.prop[0]&&"*"!==n.prop[0]||(n.raws.before+=n.prop[0],n.prop=n.prop.slice(1));for(var a,l=[];e.length&&("space"===(a=e[0][0])||"comment"===a);)l.push(e.shift());this.precheckMissedSemicolon(e);for(var u=e.length-1;u>=0;u--){if("!important"===(r=e[u])[1].toLowerCase()){n.important=!0;var c=this.stringFrom(e,u);" !important"!==(c=this.spacesFromEnd(e)+c)&&(n.raws.important=c);break}if("important"===r[1].toLowerCase()){for(var f=e.slice(0),d="",h=u;h>0;h--){var p=f[h][0];if(0===d.trim().indexOf("!")&&"space"!==p)break;d=f.pop()[1]+d}0===d.trim().indexOf("!")&&(n.important=!0,n.raws.important=d,e=f)}if("space"!==r[0]&&"comment"!==r[0])break}var m=e.some((function(e){return"space"!==e[0]&&"comment"!==e[0]}));m&&(n.raws.between+=l.map((function(e){return e[1]})).join(""),l=[]),this.raw(n,"value",l.concat(e),t),n.value.includes(":")&&!t&&this.checkMissedSemicolon(e)}},{key:"atrule",value:function(e){var t,n,r,i=new c;i.name=e[1].slice(1),""===i.name&&this.unnamedAtrule(i,e),this.init(i,e[2]);for(var o=!1,a=!1,s=[],l=[];!this.tokenizer.endOfFile();){if("("===(t=(e=this.tokenizer.nextToken())[0])||"["===t?l.push("("===t?")":"]"):"{"===t&&l.length>0?l.push("}"):t===l[l.length-1]&&l.pop(),0===l.length){if(";"===t){i.source.end=this.getPosition(e[2]),this.semicolon=!0;break}if("{"===t){a=!0;break}if("}"===t){if(s.length>0){for(n=s[r=s.length-1];n&&"space"===n[0];)n=s[--r];n&&(i.source.end=this.getPosition(n[3]||n[2]))}this.end(e);break}s.push(e)}else s.push(e);if(this.tokenizer.endOfFile()){o=!0;break}}i.raws.between=this.spacesAndCommentsFromEnd(s),s.length?(i.raws.afterName=this.spacesAndCommentsFromStart(s),this.raw(i,"params",s),o&&(e=s[s.length-1],i.source.end=this.getPosition(e[3]||e[2]),this.spaces=i.raws.between,i.raws.between="")):(i.raws.afterName="",i.params=""),a&&(i.nodes=[],this.current=i)}},{key:"end",value:function(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.spaces="",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current=this.current.parent):this.unexpectedClose(e)}},{key:"endFile",value:function(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||"")+this.spaces}},{key:"freeSemicolon",value:function(e){if(this.spaces+=e[1],this.current.nodes){var t=this.current.nodes[this.current.nodes.length-1];t&&"rule"===t.type&&!t.raws.ownSemicolon&&(t.raws.ownSemicolon=this.spaces,this.spaces="")}}},{key:"getPosition",value:function(e){var t=this.input.fromOffset(e);return{offset:e,line:t.line,column:t.col}}},{key:"init",value:function(e,t){this.current.push(e),e.source={start:this.getPosition(t),input:this.input},e.raws.before=this.spaces,this.spaces="","comment"!==e.type&&(this.semicolon=!1)}},{key:"raw",value:function(e,t,n,r){for(var i,o,a,s,l=n.length,u="",c=!0,f=0;f=0&&("space"===(n=e[i])[0]||2!==(r+=1));i--);throw this.input.error("Missed semicolon","word"===n[0]?n[3]+1:n[2])}}}]),e}();e.exports=p},950:function(e,t,n){"use strict";var r=n(3291),i=n(671),o=n(694),a=n(8539),s=n(5444),l=n(4964),u=n(5385),c=n(6675),f=n(2176),d=n(6811),h=n(8662),p=n(7707),m=n(5341),v=n(3418),g=n(8820),y=n(5605),b=n(1847),w=n(9735);function x(){for(var e=arguments.length,t=new Array(e),n=0;n0)}},{key:"startWith",value:function(e,t){return!!e&&e.substr(0,t.length)===t}},{key:"getAnnotationURL",value:function(e){return e.replace(/^\/\*\s*# sourceMappingURL=/,"").trim()}},{key:"loadAnnotation",value:function(e){var t=e.match(/\/\*\s*# sourceMappingURL=/gm);if(t){var n=e.lastIndexOf(t.pop()),r=e.indexOf("*/",n);n>-1&&r>-1&&(this.annotation=this.getAnnotationURL(e.substring(n,r)))}}},{key:"decodeInline",value:function(e){var t;if(/^data:application\/json;charset=utf-?8,/.test(e)||/^data:application\/json,/.test(e))return decodeURIComponent(e.substr(RegExp.lastMatch.length));if(/^data:application\/json;charset=utf-?8;base64,/.test(e)||/^data:application\/json;base64,/.test(e))return t=e.substr(RegExp.lastMatch.length),Buffer?Buffer.from(t,"base64").toString():window.atob(t);var n=e.match(/data:application\/json;([^,]+),/)[1];throw new Error("Unsupported source map encoding "+n)}},{key:"loadFile",value:function(e){if(this.root=d(e),u(e))return this.mapFile=e,c(e,"utf-8").toString().trim()}},{key:"loadMap",value:function(e,t){if(!1===t)return!1;if(t){if("string"===typeof t)return t;if("function"!==typeof t){if(t instanceof a)return s.fromSourceMap(t).toString();if(t instanceof s)return t.toString();if(this.isMap(t))return JSON.stringify(t);throw new Error("Unsupported previous source map format: "+t.toString())}var n=t(e);if(n){var r=this.loadFile(n);if(!r)throw new Error("Unable to load previous source map: "+n.toString());return r}}else{if(this.inline)return this.decodeInline(this.annotation);if(this.annotation){var i=this.annotation;return e&&(i=h(d(e),i)),this.loadFile(i)}}}},{key:"isMap",value:function(e){return"object"===typeof e&&("string"===typeof e.mappings||"string"===typeof e._mappings||Array.isArray(e.sections))}}]),e}();e.exports=p,p.default=p},5444:function(e,t,n){"use strict";var r=n(6913).default,i=n(3937).default,o=n(1788).default,a=n(2707),s=n(694),l=n(6675),u=n(1847),c=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];i(this,e),this.version="8.4.13",this.plugins=this.normalize(t)}return o(e,[{key:"use",value:function(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}},{key:"process",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return 0===this.plugins.length&&"undefined"===typeof t.parser&&"undefined"===typeof t.stringifier&&"undefined"===typeof t.syntax?new a(this,e,t):new s(this,e,t)}},{key:"normalize",value:function(e){var t,n=[],i=r(e);try{for(i.s();!(t=i.n()).done;){var o=t.value;if(!0===o.postcss?o=o():o.postcss&&(o=o.postcss),"object"===typeof o&&Array.isArray(o.plugins))n=n.concat(o.plugins);else if("object"===typeof o&&o.postcssPlugin)n.push(o);else if("function"===typeof o)n.push(o);else{if("object"!==typeof o||!o.parse&&!o.stringify)throw new Error(o+" is not a PostCSS plugin")}}}catch(a){i.e(a)}finally{i.f()}return n}}]),e}();e.exports=c,c.default=c,u.registerProcessor(c),l.registerProcessor(c)},7707:function(e,t,n){"use strict";var r=n(3937).default,i=n(1788).default,o=n(2176),a=function(){function e(t,n,i){r(this,e),this.processor=t,this.messages=[],this.root=n,this.opts=i,this.css=void 0,this.map=void 0}return i(e,[{key:"toString",value:function(){return this.css}},{key:"warn",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);var n=new o(e,t);return this.messages.push(n),n}},{key:"warnings",value:function(){return this.messages.filter((function(e){return"warning"===e.type}))}},{key:"content",get:function(){return this.css}}]),e}();e.exports=a,a.default=a},1847:function(e,t,n){"use strict";var r,i,o=n(6913).default,a=n(3937).default,s=n(1788).default,l=n(9282).default,u=n(3336).default,c=n(6406).default,f=n(1001).default,d=function(e){c(n,e);var t=f(n);function n(e){var r;return a(this,n),(r=t.call(this,e)).type="root",r.nodes||(r.nodes=[]),r}return s(n,[{key:"removeChild",value:function(e,t){var r=this.index(e);return!t&&0===r&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[r].raws.before),l(u(n.prototype),"removeChild",this).call(this,e)}},{key:"normalize",value:function(e,t,r){var i=l(u(n.prototype),"normalize",this).call(this,e);if(t)if("prepend"===r)this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t){var a,s=o(i);try{for(s.s();!(a=s.n()).done;){a.value.raws.before=t.raws.before}}catch(c){s.e(c)}finally{s.f()}}return i}},{key:"toResult",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new r(new i,this,e);return t.stringify()}}]),n}(n(8539));d.registerLazyResult=function(e){r=e},d.registerProcessor=function(e){i=e},e.exports=d,d.default=d},5605:function(e,t,n){"use strict";var r=n(3937).default,i=n(1788).default,o=n(6406).default,a=n(1001).default,s=n(8539),l=n(8820),u=function(e){o(n,e);var t=a(n);function n(e){var i;return r(this,n),(i=t.call(this,e)).type="rule",i.nodes||(i.nodes=[]),i}return i(n,[{key:"selectors",get:function(){return l.comma(this.selector)},set:function(e){var t=this.selector?this.selector.match(/,\s*/):null,n=t?t[0]:","+this.raw("between","beforeOpen");this.selector=e.join(n)}}]),n}(s);e.exports=u,u.default=u,s.registerRule(u)},3882:function(e,t,n){"use strict";var r=n(3937).default,i=n(1788).default,o={colon:": ",indent:" ",beforeDecl:"\n",beforeRule:"\n",beforeOpen:" ",beforeClose:"\n",beforeComment:"\n",after:"\n",emptyBody:"",commentLeft:" ",commentRight:" ",semicolon:!1};var a=function(){function e(t){r(this,e),this.builder=t}return i(e,[{key:"stringify",value:function(e,t){if(!this[e.type])throw new Error("Unknown AST node type "+e.type+". Maybe you need to change PostCSS stringifier.");this[e.type](e,t)}},{key:"document",value:function(e){this.body(e)}},{key:"root",value:function(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}},{key:"comment",value:function(e){var t=this.raw(e,"left","commentLeft"),n=this.raw(e,"right","commentRight");this.builder("/*"+t+e.text+n+"*/",e)}},{key:"decl",value:function(e,t){var n=this.raw(e,"between","colon"),r=e.prop+n+this.rawValue(e,"value");e.important&&(r+=e.raws.important||" !important"),t&&(r+=";"),this.builder(r,e)}},{key:"rule",value:function(e){this.block(e,this.rawValue(e,"selector")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,"end")}},{key:"atrule",value:function(e,t){var n="@"+e.name,r=e.params?this.rawValue(e,"params"):"";if("undefined"!==typeof e.raws.afterName?n+=e.raws.afterName:r&&(n+=" "),e.nodes)this.block(e,n+r);else{var i=(e.raws.between||"")+(t?";":"");this.builder(n+r+i,e)}}},{key:"body",value:function(e){for(var t=e.nodes.length-1;t>0&&"comment"===e.nodes[t].type;)t-=1;for(var n=this.raw(e,"semicolon"),r=0;r0&&"undefined"!==typeof e.raws.after)return(t=e.raws.after).includes("\n")&&(t=t.replace(/[^\n]+$/,"")),!1})),t&&(t=t.replace(/\S/g,"")),t}},{key:"rawBeforeOpen",value:function(e){var t;return e.walk((function(e){if("decl"!==e.type&&"undefined"!==typeof(t=e.raws.between))return!1})),t}},{key:"rawColon",value:function(e){var t;return e.walkDecls((function(e){if("undefined"!==typeof e.raws.between)return t=e.raws.between.replace(/[^\s:]/g,""),!1})),t}},{key:"beforeAfter",value:function(e,t){var n;n="decl"===e.type?this.raw(e,null,"beforeDecl"):"comment"===e.type?this.raw(e,null,"beforeComment"):"before"===t?this.raw(e,null,"beforeRule"):this.raw(e,null,"beforeClose");for(var r=e.parent,i=0;r&&"root"!==r.type;)i+=1,r=r.parent;if(n.includes("\n")){var o=this.raw(e,null,"indent");if(o.length)for(var a=0;a1&&void 0!==arguments[1]?arguments[1]:{},D=e.css.valueOf(),R=L.ignoreErrors,I=D.length,F=0,U=[],q=[];function z(){return F}function B(t){throw e.error("Unclosed "+t,F)}function H(){return 0===q.length&&F>=I}function V(e){if(q.length)return q.pop();if(!(F>=I)){var L=!!e&&e.ignoreUnclosed;switch(S=D.charCodeAt(F)){case o:case a:case l:case u:case s:E=F;do{E+=1,S=D.charCodeAt(E)}while(S===a||S===o||S===l||S===u||S===s);P=["space",D.slice(F,E)],F=E-1;break;case c:case f:case p:case m:case y:case v:case h:var z=String.fromCharCode(S);P=[z,z,F];break;case d:if(A=U.length?U.pop()[1]:"",j=D.charCodeAt(F+1),"url"===A&&j!==t&&j!==n&&j!==a&&j!==o&&j!==l&&j!==s&&j!==u){E=F;do{if(N=!1,-1===(E=D.indexOf(")",E+1))){if(R||L){E=F;break}B("bracket")}for(M=E;D.charCodeAt(M-1)===r;)M-=1,N=!N}while(N);P=["brackets",D.slice(F,E+1),F,E],F=E}else E=D.indexOf(")",F+1),C=D.slice(F,E+1),-1===E||_.test(C)?P=["(","(",F]:(P=["brackets",C,F,E],F=E);break;case t:case n:O=S===t?"'":'"',E=F;do{if(N=!1,-1===(E=D.indexOf(O,E+1))){if(R||L){E=F+1;break}B("string")}for(M=E;D.charCodeAt(M-1)===r;)M-=1,N=!N}while(N);P=["string",D.slice(F,E+1),F,E],F=E;break;case b:w.lastIndex=F+1,w.test(D),E=0===w.lastIndex?D.length-1:w.lastIndex-2,P=["at-word",D.slice(F,E+1),F,E],F=E;break;case r:for(E=F,T=!0;D.charCodeAt(E+1)===r;)E+=1,T=!T;if(S=D.charCodeAt(E+1),T&&S!==i&&S!==a&&S!==o&&S!==l&&S!==u&&S!==s&&(E+=1,k.test(D.charAt(E)))){for(;k.test(D.charAt(E+1));)E+=1;D.charCodeAt(E+1)===a&&(E+=1)}P=["word",D.slice(F,E+1),F,E],F=E;break;default:S===i&&D.charCodeAt(F+1)===g?(0===(E=D.indexOf("*/",F+2)+1)&&(R||L?E=D.length:B("comment")),P=["comment",D.slice(F,E+1),F,E],F=E):(x.lastIndex=F+1,x.test(D),E=0===x.lastIndex?D.length-1:x.lastIndex-2,P=["word",D.slice(F,E+1),F,E],U.push(P),F=E)}return F++,P}}function Y(e){q.push(e)}return{back:Y,nextToken:V,endOfFile:H,position:z}}},1653:function(e){"use strict";var t={};e.exports=function(e){t[e]||(t[e]=!0,"undefined"!==typeof console&&console.warn&&console.warn(e))}},2176:function(e,t,n){"use strict";var r=n(3937).default,i=n(1788).default,o=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(r(this,e),this.type="warning",this.text=t,n.node&&n.node.source){var i=n.node.rangeBy(n);this.line=i.start.line,this.column=i.start.column,this.endLine=i.end.line,this.endColumn=i.end.column}for(var o in n)this[o]=n[o]}return i(e,[{key:"toString",value:function(){return this.node?this.node.error(this.text,{plugin:this.plugin,index:this.index,word:this.word}).message:this.plugin?this.plugin+": "+this.text:this.text}}]),e}();e.exports=o,o.default=o},8453:function(e,t,n){"use strict";var r=n(7766);function i(){}function o(){}o.resetWarningCache=i,e.exports=function(){function e(e,t,n,i,o,a){if(a!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:i};return n.PropTypes=n,n}},2719:function(e,t,n){e.exports=n(8453)()},7766:function(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},853:function(e,t,n){"use strict";var r=n(5423),i=n(9541);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n