summary refs log tree commit diff
diff options
context:
space:
mode:
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>2021-11-18 18:01:51 +0000
committerGitHub <noreply@github.com>2021-11-18 18:01:51 +0000
commit93d09085ea8d9d348520b8a386c2f9b860a73dea (patch)
tree39dfd8ef1c2f8d9c128c99a64c58b6b7f610e24c
parent6ed7100e477ba02a0bbfbe90aad908418fcb96cb (diff)
parent91e24d05d70d791873b046072e690341b13aa26d (diff)
downloadnixpkgs-93d09085ea8d9d348520b8a386c2f9b860a73dea.tar
nixpkgs-93d09085ea8d9d348520b8a386c2f9b860a73dea.tar.gz
nixpkgs-93d09085ea8d9d348520b8a386c2f9b860a73dea.tar.bz2
nixpkgs-93d09085ea8d9d348520b8a386c2f9b860a73dea.tar.lz
nixpkgs-93d09085ea8d9d348520b8a386c2f9b860a73dea.tar.xz
nixpkgs-93d09085ea8d9d348520b8a386c2f9b860a73dea.tar.zst
nixpkgs-93d09085ea8d9d348520b8a386c2f9b860a73dea.zip
Merge staging-next into staging
-rw-r--r--maintainers/maintainer-list.nix28
-rw-r--r--nixos/modules/services/databases/hbase.nix38
-rw-r--r--nixos/modules/services/matrix/mjolnir.nix2
-rw-r--r--pkgs/applications/editors/lite-xl/default.nix65
-rw-r--r--pkgs/applications/misc/cloak/default.nix4
-rw-r--r--pkgs/applications/misc/osmscout-server/default.nix10
-rw-r--r--pkgs/applications/networking/cluster/tgswitch/default.nix21
-rw-r--r--pkgs/applications/networking/mailreaders/electron-mail/default.nix11
-rw-r--r--pkgs/applications/networking/mhost/default.nix4
-rw-r--r--pkgs/applications/networking/synology-drive/default.nix45
-rw-r--r--pkgs/applications/video/streamlink/default.nix25
-rw-r--r--pkgs/development/interpreters/erlang/R24.nix4
-rw-r--r--pkgs/development/libraries/agg/default.nix22
-rw-r--r--pkgs/development/libraries/iqueue/default.nix22
-rw-r--r--pkgs/development/libraries/proj/default.nix5
-rw-r--r--pkgs/development/libraries/stxxl/default.nix7
-rw-r--r--pkgs/development/python-modules/bimmer-connected/default.nix8
-rw-r--r--pkgs/development/python-modules/flask-wtf/default.nix4
-rw-r--r--pkgs/development/python-modules/gistyc/default.nix38
-rw-r--r--pkgs/development/python-modules/ihatemoney/default.nix7
-rw-r--r--pkgs/development/python-modules/pydyf/default.nix48
-rw-r--r--pkgs/development/python-modules/weasyprint/default.nix65
-rw-r--r--pkgs/development/python-modules/weasyprint/library-paths.patch59
-rw-r--r--pkgs/development/tools/rust/cargo-crev/default.nix8
-rw-r--r--pkgs/games/pacvim/default.nix11
-rw-r--r--pkgs/misc/emulators/retroarch/cores.nix884
-rw-r--r--pkgs/misc/emulators/retroarch/default.nix9
-rw-r--r--pkgs/misc/emulators/retroarch/hashes.json513
-rwxr-xr-xpkgs/misc/emulators/retroarch/update.py135
-rw-r--r--pkgs/misc/emulators/retroarch/wrapper.nix8
-rw-r--r--pkgs/servers/heisenbridge/default.nix7
-rw-r--r--pkgs/servers/mjolnir/default.nix4
-rw-r--r--pkgs/servers/mjolnir/node-deps.nix1718
-rw-r--r--pkgs/servers/nextcloud/default.nix4
-rw-r--r--pkgs/tools/filesystems/kio-fuse/default.nix31
-rw-r--r--pkgs/tools/misc/ibus-theme-tools/default.nix29
-rw-r--r--pkgs/tools/system/plan9port/default.nix3
-rw-r--r--pkgs/tools/text/tidy-viewer/default.nix6
-rw-r--r--pkgs/top-level/all-packages.nix26
-rw-r--r--pkgs/top-level/python-packages.nix4
40 files changed, 2956 insertions, 986 deletions
diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix
index 43743798abb..41018c41728 100644
--- a/maintainers/maintainer-list.nix
+++ b/maintainers/maintainer-list.nix
@@ -1564,6 +1564,16 @@
     githubId = 87764;
     name = "Ben Ford";
   };
+  boppyt = {
+    email = "boppy@nwcpz.com";
+    github = "boppyt";
+    githubId = 71049646;
+    name = "Zack A";
+    keys = [{
+      longkeyid = "rsa4096/0x6310C97DE31D1545";
+      fingerprint = "E8D7 5C19 9F65 269B 439D  F77B 6310 C97D E31D 1545";
+    }];
+  };
   borisbabic = {
     email = "boris.ivan.babic@gmail.com";
     github = "borisbabic";
@@ -4717,6 +4727,12 @@
     githubId = 896431;
     name = "Chris Hodapp";
   };
+  hollowman6 = {
+    email = "hollowman@hollowman.ml";
+    github = "HollowMan6";
+    githubId = 43995067;
+    name = "Songlin Jiang";
+  };
   holymonson = {
     email = "holymonson@gmail.com";
     github = "holymonson";
@@ -7839,6 +7855,12 @@
     githubId = 99988;
     name = "Maarten Hoogendoorn";
   };
+  MoritzBoehme = {
+    email = "mail@moritzboeh.me";
+    github = "MoritzBoehme";
+    githubId = 42215704;
+    name = "Moritz Böhme";
+  };
   MostAwesomeDude = {
     email = "cds@corbinsimpson.com";
     github = "MostAwesomeDude";
@@ -9985,6 +10007,12 @@
     githubId = 592876;
     name = "Robert W. Pearce";
   };
+  rprecenth = {
+    email = "rasmus@precenth.eu";
+    github = "Prillan";
+    githubId = 1675190;
+    name = "Rasmus Précenth";
+  };
   rprospero = {
     email = "rprospero+nix@gmail.com";
     github = "rprospero";
diff --git a/nixos/modules/services/databases/hbase.nix b/nixos/modules/services/databases/hbase.nix
index ff01a1bcd98..183c8a2f46d 100644
--- a/nixos/modules/services/databases/hbase.nix
+++ b/nixos/modules/services/databases/hbase.nix
@@ -5,18 +5,24 @@ with lib;
 let
   cfg = config.services.hbase;
 
-  configFile = pkgs.writeText "hbase-site.xml" ''
-    <configuration>
-      <property>
-        <name>hbase.rootdir</name>
-        <value>file://${cfg.dataDir}/hbase</value>
-      </property>
-      <property>
-        <name>hbase.zookeeper.property.dataDir</name>
-        <value>${cfg.dataDir}/zookeeper</value>
-      </property>
-    </configuration>
-  '';
+  defaultConfig = {
+    "hbase.rootdir" = "file://${cfg.dataDir}/hbase";
+    "hbase.zookeeper.property.dataDir" = "${cfg.dataDir}/zookeeper";
+  };
+
+  buildProperty = configAttr:
+    (builtins.concatStringsSep "\n"
+      (lib.mapAttrsToList
+        (name: value: ''
+          <property>
+            <name>${name}</name>
+            <value>${builtins.toString value}</value>
+          </property>
+        '')
+        configAttr));
+
+  configFile = pkgs.writeText "hbase-site.xml"
+    (buildProperty (defaultConfig // cfg.settings));
 
   configDir = pkgs.runCommand "hbase-config-dir" { preferLocalBuild = true; } ''
     mkdir -p $out
@@ -85,6 +91,14 @@ in {
         '';
       };
 
+      settings = mkOption {
+        type = with lib.types; attrsOf (oneOf [ str int bool ]);
+        default = defaultConfig;
+        description = ''
+          configurations in hbase-site.xml, see <link xlink:href="https://github.com/apache/hbase/blob/master/hbase-server/src/test/resources/hbase-site.xml"/> for details.
+        '';
+      };
+
     };
 
   };
diff --git a/nixos/modules/services/matrix/mjolnir.nix b/nixos/modules/services/matrix/mjolnir.nix
index 8a54f93d98d..278924b05cf 100644
--- a/nixos/modules/services/matrix/mjolnir.nix
+++ b/nixos/modules/services/matrix/mjolnir.nix
@@ -14,6 +14,8 @@ let
       else
         cfg.homeserverUrl;
 
+    rawHomeserverUrl = cfg.homeserverUrl;
+
     pantalaimon = {
       inherit (cfg.pantalaimon) username;
 
diff --git a/pkgs/applications/editors/lite-xl/default.nix b/pkgs/applications/editors/lite-xl/default.nix
new file mode 100644
index 00000000000..3b38004eddb
--- /dev/null
+++ b/pkgs/applications/editors/lite-xl/default.nix
@@ -0,0 +1,65 @@
+{ agg
+, fetchFromGitHub
+, fetchpatch
+, Foundation
+, freetype
+, lib
+, lua5_2
+, meson
+, ninja
+, pcre2
+, pkg-config
+, reproc
+, SDL2
+, stdenv
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lite-xl";
+  version = "2.0.1";
+
+  src = fetchFromGitHub {
+    owner = "lite-xl";
+    repo = "lite-xl";
+    rev = "v${version}";
+    sha256 = "sha256-+RbmT6H/5Ldhv3qOClxMjCSGMudbkGtkjo2SpGqExao=";
+  };
+
+  patches = [
+    # Fixes compatibility with Lua5.2, remove patch when PR merged
+    # https://github.com/lite-xl/lite-xl/pull/435
+    (fetchpatch {
+      name = "0001-replace-unpack-with-table.unpack.patch";
+      url = "https://github.com/lite-xl/lite-xl/commit/30ccde896d1ffe37cbd8990e9b8aaef275e18935.patch";
+      sha256 = "sha256-IAe3jIyD3OtZtu1V7MtPR4QzFKvU/aV/nLQ4U9nHyIQ=";
+    })
+    # Lets meson fallback to the system reproc if available.
+    # remove patch when 2.0.2 is proposed.
+    (fetchpatch {
+      name = "0002-use-dependency-fallbacks-use-system-reproc-if-available.patch";
+      url = "https://github.com/lite-xl/lite-xl/commit/973acb787aacb0164b2f4ae6fe335d250ba80a7b.patch";
+      sha256 = "sha256-GmgATsRlj1FePmw3+AoWEMZIo2eujHYewKQCx583qbU=";
+    })
+  ];
+
+  nativeBuildInputs = [ meson ninja pkg-config ];
+
+  buildInputs = [
+    agg
+    freetype
+    lua5_2
+    pcre2
+    reproc
+    SDL2
+  ] ++ lib.optionals stdenv.isDarwin [
+    Foundation
+  ];
+
+  meta = with lib; {
+    description = "A lightweight text editor written in Lua";
+    homepage = "https://github.com/lite-xl/lite-xl";
+    license = licenses.mit;
+    maintainers = with maintainers; [ boppyt ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/pkgs/applications/misc/cloak/default.nix b/pkgs/applications/misc/cloak/default.nix
index cb33aa595a4..7b250184126 100644
--- a/pkgs/applications/misc/cloak/default.nix
+++ b/pkgs/applications/misc/cloak/default.nix
@@ -1,4 +1,4 @@
-{ lib, rustPlatform, fetchFromGitHub }:
+{ lib, stdenv, rustPlatform, fetchFromGitHub, Security }:
 
 rustPlatform.buildRustPackage rec {
   pname = "cloak";
@@ -13,6 +13,8 @@ rustPlatform.buildRustPackage rec {
 
   cargoSha256 = "0af38wgwmsamnx63dwfm2nrkd8wmky3ai7zwy0knmifgkn4b7yyj";
 
+  buildInputs = lib.optionals stdenv.isDarwin [ Security ];
+
   meta = with lib; {
     homepage = "https://github.com/evansmurithi/cloak";
     description = "Command-line OTP authenticator application";
diff --git a/pkgs/applications/misc/osmscout-server/default.nix b/pkgs/applications/misc/osmscout-server/default.nix
index a3815dae00f..d6041554705 100644
--- a/pkgs/applications/misc/osmscout-server/default.nix
+++ b/pkgs/applications/misc/osmscout-server/default.nix
@@ -1,6 +1,6 @@
 { lib, mkDerivation, fetchFromGitHub, fetchpatch, pkg-config
 , qmake, qttools, kirigami2, qtquickcontrols2, qtlocation
-, libosmscout, mapnik, valhalla, libpostal, osrm-backend, protobuf
+, libosmscout, valhalla, libpostal, osrm-backend, protobuf
 , libmicrohttpd_0_9_70, sqlite, marisa, kyotocabinet, boost
 }:
 
@@ -41,7 +41,7 @@ mkDerivation rec {
   nativeBuildInputs = [ qmake pkg-config qttools ];
   buildInputs = [
     kirigami2 qtquickcontrols2 qtlocation
-    mapnik valhalla libosmscout osrm-backend libmicrohttpd_0_9_70
+    valhalla libosmscout osrm-backend libmicrohttpd_0_9_70
     libpostal sqlite marisa kyotocabinet boost protobuf date
   ];
 
@@ -52,8 +52,10 @@ mkDerivation rec {
     mv data/valhalla.json-3.1 data/valhalla.json
   '';
 
-  # Choose to build the kirigami UI variant
-  qmakeFlags = [ "SCOUT_FLAVOR=kirigami" ];
+  qmakeFlags = [
+    "SCOUT_FLAVOR=kirigami" # Choose to build the kirigami UI variant
+    "CONFIG+=disable_mapnik" # Disable the optional mapnik backend
+  ];
 
   meta = with lib; {
     description = "Maps server providing tiles, geocoder, and router";
diff --git a/pkgs/applications/networking/cluster/tgswitch/default.nix b/pkgs/applications/networking/cluster/tgswitch/default.nix
new file mode 100644
index 00000000000..9a1652f25d3
--- /dev/null
+++ b/pkgs/applications/networking/cluster/tgswitch/default.nix
@@ -0,0 +1,21 @@
+{ buildGoPackage, lib, fetchFromGitHub }:
+buildGoPackage rec {
+  pname = "tgswitch";
+  version = "0.5.378";
+
+  src = fetchFromGitHub {
+    owner = "warrensbox";
+    repo = "tgswitch";
+    rev = version;
+    sha256 = "0q2aqh75acbpkmvkws0rl3d5dzq3sisy637c0x6cnc88h34g3n3i";
+  };
+
+  goPackagePath = "github.com/warrensbox/tgswitch";
+
+  meta = with lib; {
+    description = "A command line tool to switch between different versions of terragrunt";
+    homepage = "https://github.com/warrensbox/tgswitch";
+    license = licenses.mit;
+    maintainers = with maintainers; [ psibi ];
+  };
+}
diff --git a/pkgs/applications/networking/mailreaders/electron-mail/default.nix b/pkgs/applications/networking/mailreaders/electron-mail/default.nix
index 1f7d663cf8e..b6dca7e70b6 100644
--- a/pkgs/applications/networking/mailreaders/electron-mail/default.nix
+++ b/pkgs/applications/networking/mailreaders/electron-mail/default.nix
@@ -1,13 +1,13 @@
-{ appimageTools, lib, fetchurl }:
+{ appimageTools, lib, fetchurl, libsecret }:
 
 let
   pname = "electron-mail";
-  version = "4.12.2";
+  version = "4.12.7";
   name = "ElectronMail-${version}";
 
   src = fetchurl {
     url = "https://github.com/vladimiry/ElectronMail/releases/download/v${version}/electron-mail-${version}-linux-x86_64.AppImage";
-    sha256 = "D+0qoIb0EwUVbgKOiKQpqoLDgm8l/UKDWm/BjhW4MYU=";
+    sha256 = "42d0b49a2feba628f4845940ffd9607739bd5fcdbe6ba37e15f993c511d21e46";
   };
 
   appimageContents = appimageTools.extract { inherit name src; };
@@ -16,13 +16,16 @@ in appimageTools.wrapType2 {
 
   extraInstallCommands = ''
     mv $out/bin/${name} $out/bin/${pname}
-
     install -m 444 -D ${appimageContents}/${pname}.desktop -t $out/share/applications
     substituteInPlace $out/share/applications/${pname}.desktop \
       --replace 'Exec=AppRun' 'Exec=${pname}'
     cp -r ${appimageContents}/usr/share/icons $out/share
   '';
 
+  extraPkgs = pkgs: with pkgs; [
+    libsecret
+  ];
+
   meta = with lib; {
     description = "ElectronMail is an Electron-based unofficial desktop client for ProtonMail";
     homepage = "https://github.com/vladimiry/ElectronMail";
diff --git a/pkgs/applications/networking/mhost/default.nix b/pkgs/applications/networking/mhost/default.nix
index f6aad5eaa08..beed066e65e 100644
--- a/pkgs/applications/networking/mhost/default.nix
+++ b/pkgs/applications/networking/mhost/default.nix
@@ -1,4 +1,4 @@
-{ fetchFromGitHub, rustPlatform, lib }:
+{ lib, stdenv, fetchFromGitHub, rustPlatform, Security }:
 
 rustPlatform.buildRustPackage rec {
   pname = "mhost";
@@ -13,6 +13,8 @@ rustPlatform.buildRustPackage rec {
 
   cargoSha256 = "0gqrya0bpdd67k2sxib7f4npnrx84d9r4hjq2sg2xz4j8pmgs018";
 
+  buildInputs = lib.optional stdenv.isDarwin Security;
+
   CARGO_CRATE_NAME = "mhost";
 
   doCheck = false;
diff --git a/pkgs/applications/networking/synology-drive/default.nix b/pkgs/applications/networking/synology-drive/default.nix
new file mode 100644
index 00000000000..20b0f1168cb
--- /dev/null
+++ b/pkgs/applications/networking/synology-drive/default.nix
@@ -0,0 +1,45 @@
+{ lib, mkDerivation, fetchurl, autoPatchelfHook, dpkg, glibc, gnome }:
+
+mkDerivation rec {
+  pname = "synology-drive";
+  subVersion = "12674";
+  version = "3.0.1-${subVersion}";
+
+  src = fetchurl {
+    url = "https://global.download.synology.com/download/Utility/SynologyDriveClient/${version}/Ubuntu/Installer/x86_64/synology-drive-client-${subVersion}.x86_64.deb";
+    sha256 = "1yyv6zgszsym22kf4jvlan7n9lw09fw24fyrh7c8pzbb2029gp8a";
+  };
+
+  nativeBuildInputs = [ autoPatchelfHook dpkg ];
+
+  buildInputs = [ glibc gnome.nautilus ];
+
+  unpackPhase = ''
+    mkdir -p $out
+    dpkg -x $src $out
+  '';
+
+  installPhase = ''
+    # synology-drive executable
+    cp -av $out/usr/* $out
+    rm -rf $out/usr
+
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    substituteInPlace $out/bin/synology-drive --replace /opt $out/opt
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.synology.com/";
+    description = "Synchronize files between client and Synology NAS.";
+    longDescription = ''
+      Drive for PC, the desktop utility of the DSM add-on package.
+      Drive, allows you to sync and share files owned by you or shared by others between a centralized Synology NAS and multiple client computers.
+    '';
+    license = licenses.unfree;
+    maintainers = with maintainers; [ MoritzBoehme ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/pkgs/applications/video/streamlink/default.nix b/pkgs/applications/video/streamlink/default.nix
index 4abc2b6546a..c82cfb47cc3 100644
--- a/pkgs/applications/video/streamlink/default.nix
+++ b/pkgs/applications/video/streamlink/default.nix
@@ -1,17 +1,16 @@
 { lib
 , python3Packages
-, rtmpdump
 , ffmpeg
 , fetchpatch
 }:
 
 python3Packages.buildPythonApplication rec {
   pname = "streamlink";
-  version = "2.4.0";
+  version = "3.0.1";
 
   src = python3Packages.fetchPypi {
     inherit pname version;
-    sha256 = "e95588e222d1a7bd51e3171cd4bce84fd6f646418537aff37993d40f597810af";
+    sha256 = "sha256-GDbUlu5tRL5mdT7KrIdmxCbeAtYL1xvZXyZFwiuvKXo=";
   };
 
   checkInputs = with python3Packages; [
@@ -22,26 +21,20 @@ python3Packages.buildPythonApplication rec {
   ];
 
   propagatedBuildInputs = (with python3Packages; [
+    isodate
+    lxml
+    pycountry
     pycryptodome
+    pysocks
     requests
-    iso-639
-    iso3166
     websocket-client
-    isodate
-    lxml
   ]) ++ [
-    rtmpdump
     ffmpeg
   ];
 
-  patches = [
-    # Patch failing tests to expect correct Accept-Encoding as generated by Requests
-    (fetchpatch {
-      url = "https://github.com/streamlink/streamlink/commit/ae747a113199c119bced4613d33edcc67a222bb9.patch";
-      includes = [ "tests/test_stream_json.py" ];
-      sha256 = "sha256-KEgyWdh5DNgNktmLSvKQowUQO9p9Q7zP4NbCQJPNgKw=";
-    })
-  ];
+  postPatch = ''
+    substituteInPlace setup.cfg --replace 'lxml >=4.6.4,<5.0' 'lxml'
+  '';
 
   meta = with lib; {
     homepage = "https://streamlink.github.io/";
diff --git a/pkgs/development/interpreters/erlang/R24.nix b/pkgs/development/interpreters/erlang/R24.nix
index 589a836967c..199189740c5 100644
--- a/pkgs/development/interpreters/erlang/R24.nix
+++ b/pkgs/development/interpreters/erlang/R24.nix
@@ -3,6 +3,6 @@
 # How to obtain `sha256`:
 # nix-prefetch-url --unpack https://github.com/erlang/otp/archive/OTP-${version}.tar.gz
 mkDerivation {
-  version = "24.1.4";
-  sha256 = "sha256-QE2VRayIswVrAOv9/bq+ebv3xxIL3fFMnfm5u1Wh8j4=";
+  version = "24.1.5";
+  sha256 = "sha256-MSPoJpbL9WeERqCSh9fiw9jhJGssqolxudyURpiypb0=";
 }
diff --git a/pkgs/development/libraries/agg/default.nix b/pkgs/development/libraries/agg/default.nix
index 39e27c909b5..e5ce7537f25 100644
--- a/pkgs/development/libraries/agg/default.nix
+++ b/pkgs/development/libraries/agg/default.nix
@@ -8,8 +8,18 @@ stdenv.mkDerivation rec {
     url = "https://www.antigrain.com/${pname}-${version}.tar.gz";
     sha256 = "07wii4i824vy9qsvjsgqxppgqmfdxq0xa87i5yk53fijriadq7mb";
   };
-  nativeBuildInputs = [ pkg-config ];
-  buildInputs = [ autoconf automake libtool freetype SDL libX11 ];
+  nativeBuildInputs = [
+    pkg-config
+    autoconf
+    automake
+    libtool
+  ];
+  buildInputs = [
+    freetype
+    SDL
+  ] ++ lib.optionals stdenv.isLinux [
+    libX11
+  ];
 
   postPatch = ''
     substituteInPlace include/agg_renderer_outline_aa.h \
@@ -22,7 +32,11 @@ stdenv.mkDerivation rec {
     sh autogen.sh
   '';
 
-  configureFlags = [ "--x-includes=${libX11.dev}/include" "--x-libraries=${libX11.out}/lib" "--enable-examples=no" ];
+  configureFlags = lib.optionals stdenv.isLinux [
+    "--x-includes=${lib.getDev libX11}/include"
+    "--x-libraries=${lib.getLib libX11}/lib"
+    "--enable-examples=no"
+  ];
 
   # libtool --tag=CXX --mode=link g++ -g -O2 libexamples.la ../src/platform/X11/libaggplatformX11.la ../src/libagg.la -o alpha_mask2 alpha_mask2.o
   # libtool: error: cannot find the library 'libexamples.la'
@@ -43,6 +57,6 @@ stdenv.mkDerivation rec {
 
     license = lib.licenses.gpl2Plus;
     homepage = "http://www.antigrain.com/";
-    platforms = lib.platforms.linux;
+    platforms = lib.platforms.unix;
   };
 }
diff --git a/pkgs/development/libraries/iqueue/default.nix b/pkgs/development/libraries/iqueue/default.nix
new file mode 100644
index 00000000000..04fd7202d1d
--- /dev/null
+++ b/pkgs/development/libraries/iqueue/default.nix
@@ -0,0 +1,22 @@
+{ lib, stdenv, fetchurl, pkg-config, libbsd, microsoft_gsl }:
+
+stdenv.mkDerivation rec {
+  pname = "iqueue";
+  version = "0.1.0";
+  src = fetchurl {
+    url = "https://github.com/twosigma/iqueue/releases/download/v${version}/iqueue-${version}.tar.gz";
+    sha256 = "0049fnr02k15gr21adav33swrwxrpbananilnrp63vp5zs5v9m4x";
+  };
+
+  doCheck = true;
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libbsd microsoft_gsl ];
+
+  meta = with lib; {
+    homepage = "https://github.com/twosigma/iqueue";
+    description = "Indexed queue";
+    license = licenses.asl20;
+    platforms = [ "x86_64-linux" ];
+    maintainers = [ maintainers.catern ];
+  };
+}
diff --git a/pkgs/development/libraries/proj/default.nix b/pkgs/development/libraries/proj/default.nix
index 134532308c8..7ab64cf59c5 100644
--- a/pkgs/development/libraries/proj/default.nix
+++ b/pkgs/development/libraries/proj/default.nix
@@ -42,6 +42,11 @@ stdenv.mkDerivation rec {
     "-DRUN_NETWORK_DEPENDENT_TESTS=OFF"
   ];
 
+  preCheck = ''
+    export HOME=$TMPDIR
+    export TMP=$TMPDIR
+  '';
+
   doCheck = true;
 
   meta = with lib; {
diff --git a/pkgs/development/libraries/stxxl/default.nix b/pkgs/development/libraries/stxxl/default.nix
index 5cc0e6037a2..391424ee2c9 100644
--- a/pkgs/development/libraries/stxxl/default.nix
+++ b/pkgs/development/libraries/stxxl/default.nix
@@ -2,7 +2,7 @@
 , stdenv
 , fetchFromGitHub
 , cmake
-, parallel ? true
+, parallelSupport ? (!stdenv.isDarwin)
 }:
 
 let
@@ -25,11 +25,12 @@ stdenv.mkDerivation rec {
   cmakeFlags = [
     "-DBUILD_SHARED_LIBS=ON"
     "-DBUILD_STATIC_LIBS=OFF"
-    (mkFlag parallel "USE_GNU_PARALLEL")
+    (mkFlag parallelSupport "USE_GNU_PARALLEL")
+    (mkFlag parallelSupport "USE_OPENMP")
   ];
 
   passthru = {
-    inherit parallel;
+    inherit parallelSupport;
   };
 
   meta = with lib; {
diff --git a/pkgs/development/python-modules/bimmer-connected/default.nix b/pkgs/development/python-modules/bimmer-connected/default.nix
index 337d6951faf..c91af48b9e9 100644
--- a/pkgs/development/python-modules/bimmer-connected/default.nix
+++ b/pkgs/development/python-modules/bimmer-connected/default.nix
@@ -5,20 +5,21 @@
 , pbr
 , requests
 , pytestCheckHook
+, requests-mock
 }:
 
 buildPythonPackage rec {
   pname = "bimmer-connected";
-  version = "0.7.22";
+  version = "0.8.0";
   format = "setuptools";
 
-  disabled = pythonOlder "3.5";
+  disabled = pythonOlder "3.6";
 
   src = fetchFromGitHub {
     owner = "bimmerconnected";
     repo = "bimmer_connected";
     rev = version;
-    sha256 = "sha256-tAkgOZvf9nyrAfFRxGkp7O/2oIAdBx+hNZbK9den+5c=";
+    sha256 = "sha256-sox24UpuIK5SP0IWVxa/NiyR5IrTzXe0SVTCd4FB6mo=";
   };
 
   nativeBuildInputs = [
@@ -33,6 +34,7 @@ buildPythonPackage rec {
 
   checkInputs = [
     pytestCheckHook
+    requests-mock
   ];
 
   meta = with lib; {
diff --git a/pkgs/development/python-modules/flask-wtf/default.nix b/pkgs/development/python-modules/flask-wtf/default.nix
index 36437ffafa9..2c7dd221e92 100644
--- a/pkgs/development/python-modules/flask-wtf/default.nix
+++ b/pkgs/development/python-modules/flask-wtf/default.nix
@@ -2,11 +2,11 @@
 
 buildPythonPackage rec {
   pname = "Flask-WTF";
-  version = "0.15.1";
+  version = "1.0.0";
 
   src = fetchPypi {
     inherit pname version;
-    sha256 = "ff177185f891302dc253437fe63081e7a46a4e99aca61dfe086fb23e54fff2dc";
+    sha256 = "872fbb17b5888bfc734edbdcf45bc08fb365ca39f69d25dc752465a455517b28";
   };
 
   propagatedBuildInputs = [ flask wtforms nose ];
diff --git a/pkgs/development/python-modules/gistyc/default.nix b/pkgs/development/python-modules/gistyc/default.nix
new file mode 100644
index 00000000000..2f49552df23
--- /dev/null
+++ b/pkgs/development/python-modules/gistyc/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, buildPythonPackage
+, fetchPypi
+, certifi
+, click
+, requests
+}:
+
+buildPythonPackage rec {
+  pname = "gistyc";
+  version = "1.3";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-WVK45U9e3qyZFi9wSRHNi9+1u4TetlZkYXAZN7LVqhE=";
+  };
+
+  propagatedBuildInputs = [
+    certifi
+    click
+    requests
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/ThomasAlbin/gistyc";
+    description = "A Python based GitHub GIST management tool";
+    longDescription = ''
+      gistyc is a Python-based library that enables developers to create, update
+      and delete their GitHub GISTs. CLI capabilities allow you to execute the
+      routines from the shell and can be integrated into your project's CI/CD
+      pipeline to automatically create or update your GISTs (e.g., via GitHub
+      actions). Files are separated in GIST sections depending on the separation
+      blocks.
+    '';
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/pkgs/development/python-modules/ihatemoney/default.nix b/pkgs/development/python-modules/ihatemoney/default.nix
index 5d768170d80..2c535ea79b5 100644
--- a/pkgs/development/python-modules/ihatemoney/default.nix
+++ b/pkgs/development/python-modules/ihatemoney/default.nix
@@ -132,6 +132,13 @@ buildPythonPackage rec {
     debts
   ];
 
+  # upstream performed the update without needing to patch the code
+  # the original patch does not apply, sadly
+  # https://github.com/spiral-project/ihatemoney/pull/912
+  postPatch = ''
+    substituteInPlace setup.cfg --replace "Flask-WTF>=0.14.3,<1" "Flask-WTF>=0.14.3,<2"
+  '';
+
   checkInputs = [
     flask_testing
     pytestCheckHook
diff --git a/pkgs/development/python-modules/pydyf/default.nix b/pkgs/development/python-modules/pydyf/default.nix
new file mode 100644
index 00000000000..d83034d2533
--- /dev/null
+++ b/pkgs/development/python-modules/pydyf/default.nix
@@ -0,0 +1,48 @@
+{ lib,
+  buildPythonPackage,
+  fetchPypi,
+  isPy3k,
+  pytestCheckHook,
+  coverage,
+  ghostscript,
+  pillow,
+  pytest,
+  pytest-cov,
+  pytest-flake8,
+  pytest-isort
+}:
+
+buildPythonPackage rec {
+  pname = "pydyf";
+  version = "0.1.2";
+  disabled = !isPy3k;
+
+  pytestFlagsArray = [
+    # setup.py is auto-generated and doesn't pass the flake8 check
+    "--ignore=setup.py"
+  ];
+
+  checkInputs = [
+    pytestCheckHook
+    coverage
+    ghostscript
+    pillow
+    pytest
+    pytest-cov
+    pytest-flake8
+    pytest-isort
+  ];
+
+  src = fetchPypi {
+    inherit version;
+    pname = "pydyf";
+    sha256 = "sha256-Hi9d5IF09QXeAlp9HnzwG73ZQiyoq5RReCvwDuF4YCw=";
+  };
+
+  meta = with lib; {
+    homepage = "https://doc.courtbouillon.org/pydyf/stable/";
+    description = "Low-level PDF generator written in Python and based on PDF specification 1.7";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ rprecenth ];
+  };
+}
diff --git a/pkgs/development/python-modules/weasyprint/default.nix b/pkgs/development/python-modules/weasyprint/default.nix
index ecc13b1d637..a3c8181cf7d 100644
--- a/pkgs/development/python-modules/weasyprint/default.nix
+++ b/pkgs/development/python-modules/weasyprint/default.nix
@@ -1,17 +1,24 @@
 { buildPythonPackage,
   fetchPypi,
   fetchpatch,
+  pytestCheckHook,
+  brotli,
   cairosvg,
+  fonttools,
+  pydyf,
   pyphen,
   cffi,
   cssselect,
   lxml,
   html5lib,
   tinycss,
+  zopfli,
   glib,
+  harfbuzz,
   pango,
   fontconfig,
   lib, stdenv,
+  ghostscript,
   pytest,
   pytest-runner,
   pytest-isort,
@@ -23,35 +30,48 @@
 
 buildPythonPackage rec {
   pname = "weasyprint";
-  version = "52";
+  version = "53.4";
   disabled = !isPy3k;
 
-  # excluded test needs the Ahem font
-  checkPhase = ''
-    runHook preCheck
-    pytest -k 'not test_font_stretch'
-    runHook postCheck
-  '';
+  pytestFlagsArray = [
+    # setup.py is auto-generated and doesn't pass the flake8 check
+    "--ignore=setup.py"
+    # ffi.py is patched by us and doesn't pass the flake8 check
+    "--ignore=weasyprint/text/ffi.py"
+  ];
 
-  # ignore failing flake8-test
-  prePatch = ''
-    substituteInPlace setup.cfg \
-        --replace '[tool:pytest]' '[tool:pytest]\nflake8-ignore = E501'
-  '';
+  disabledTests = [
+    # test_font_stretch needs the Ahem font (fails on macOS)
+    "test_font_stretch"
+  ];
 
-  checkInputs = [ pytest pytest-runner pytest-isort pytest-flake8 pytest-cov ];
+  checkInputs = [
+    pytestCheckHook
+    ghostscript
+    pytest
+    pytest-runner
+    pytest-isort
+    pytest-flake8
+    pytest-cov
+  ];
 
   FONTCONFIG_FILE = "${fontconfig.out}/etc/fonts/fonts.conf";
 
-  propagatedBuildInputs = [ cairosvg pyphen cffi cssselect lxml html5lib tinycss ];
+  propagatedBuildInputs = [
+    brotli
+    cairosvg
+    cffi
+    cssselect
+    fonttools
+    html5lib
+    lxml
+    pydyf
+    pyphen
+    tinycss
+    zopfli
+  ];
 
-  # 47043a1fd7e50a892b9836466f521df85d597c4.patch can be removed after next release of weasyprint, see:
-  # https://github.com/Kozea/WeasyPrint/issues/1333#issuecomment-818062970
   patches = [
-    (fetchpatch {
-      url = "https://github.com/Kozea/WeasyPrint/commit/47043a1fd7e50a892b9836466f521df85d597c44.patch";
-      sha256 = "0l9z0hrav3bcdajlg3vbzljq0lkw7hlj8ppzrq3v21hbj1il1nsb";
-    })
     (substituteAll {
       src = ./library-paths.patch;
       fontconfig = "${fontconfig.lib}/lib/libfontconfig${stdenv.hostPlatform.extensions.sharedLibrary}";
@@ -59,13 +79,14 @@ buildPythonPackage rec {
       gobject = "${glib.out}/lib/libgobject-2.0${stdenv.hostPlatform.extensions.sharedLibrary}";
       pango = "${pango.out}/lib/libpango-1.0${stdenv.hostPlatform.extensions.sharedLibrary}";
       pangocairo = "${pango.out}/lib/libpangocairo-1.0${stdenv.hostPlatform.extensions.sharedLibrary}";
+      harfbuzz = "${harfbuzz.out}/lib/libharfbuzz${stdenv.hostPlatform.extensions.sharedLibrary}";
     })
   ];
 
   src = fetchPypi {
     inherit version;
-    pname = "WeasyPrint";
-    sha256 = "0rwf43111ws74m8b1alkkxzz57g0np3vmd8as74adwnxslfcg4gs";
+    pname = "weasyprint";
+    sha256 = "sha256-EMyxfVXHMJa98e3T7+WMuFWwfkwwfZutTryaPxP/RYA=";
   };
 
   meta = with lib; {
diff --git a/pkgs/development/python-modules/weasyprint/library-paths.patch b/pkgs/development/python-modules/weasyprint/library-paths.patch
index c6eb87c9458..9a10990fd43 100644
--- a/pkgs/development/python-modules/weasyprint/library-paths.patch
+++ b/pkgs/development/python-modules/weasyprint/library-paths.patch
@@ -1,38 +1,31 @@
-diff --git a/weasyprint/fonts.py b/weasyprint/fonts.py
-index 79e3b5b..4438eb4 100644
---- a/weasyprint/fonts.py
-+++ b/weasyprint/fonts.py
-@@ -45,11 +45,8 @@ else:
-     # with OSError: dlopen() failed to load a library: cairo / cairo-2
-     # So let's hope we find the same file as cairo already did ;)
-     # Same applies to pangocairo requiring pangoft2
--    fontconfig = dlopen(ffi, 'fontconfig', 'libfontconfig',
--                        'libfontconfig-1.dll',
--                        'libfontconfig.so.1', 'libfontconfig-1.dylib')
--    pangoft2 = dlopen(ffi, 'pangoft2-1.0', 'libpangoft2-1.0-0',
--                      'libpangoft2-1.0.so.0', 'libpangoft2-1.0.dylib')
-+    fontconfig = dlopen(ffi, '@fontconfig@')
-+    pangoft2 = dlopen(ffi, '@pangoft2@')
- 
-     ffi.cdef('''
-         // FontConfig
-diff --git a/weasyprint/text.py b/weasyprint/text.py
-index 1dc5e4d..b070bad 100644
---- a/weasyprint/text.py
-+++ b/weasyprint/text.py
-@@ -255,12 +255,9 @@ def dlopen(ffi, *names):
+diff --git a/weasyprint/text/ffi.py b/weasyprint/text/ffi.py
+index 0734cbea..22e31a5e 100644
+--- a/weasyprint/text/ffi.py
++++ b/weasyprint/text/ffi.py
+@@ -387,21 +387,11 @@ def _dlopen(ffi, *names):
      return ffi.dlopen(names[0])  # pragma: no cover
  
  
--gobject = dlopen(ffi, 'gobject-2.0', 'libgobject-2.0-0', 'libgobject-2.0.so.0',
--                 'libgobject-2.0.dylib')
--pango = dlopen(ffi, 'pango-1.0', 'libpango-1.0-0', 'libpango-1.0.so.0',
--               'libpango-1.0.dylib')
--pangocairo = dlopen(ffi, 'pangocairo-1.0', 'libpangocairo-1.0-0',
--                    'libpangocairo-1.0.so.0', 'libpangocairo-1.0.dylib')
-+gobject = dlopen(ffi, '@gobject@')
-+pango = dlopen(ffi, '@pango@')
-+pangocairo = dlopen(ffi, '@pangocairo@')
+-gobject = _dlopen(
+-    ffi, 'gobject-2.0-0', 'gobject-2.0', 'libgobject-2.0-0',
+-    'libgobject-2.0.so.0', 'libgobject-2.0.dylib')
+-pango = _dlopen(
+-    ffi, 'pango-1.0-0', 'pango-1.0', 'libpango-1.0-0', 'libpango-1.0.so.0',
+-    'libpango-1.0.dylib')
+-harfbuzz = _dlopen(
+-    ffi, 'harfbuzz', 'harfbuzz-0.0', 'libharfbuzz-0',
+-    'libharfbuzz.so.0', 'libharfbuzz.so.0', 'libharfbuzz.0.dylib')
+-fontconfig = _dlopen(
+-    ffi, 'fontconfig-1', 'fontconfig', 'libfontconfig', 'libfontconfig-1.dll',
+-    'libfontconfig.so.1', 'libfontconfig-1.dylib')
+-pangoft2 = _dlopen(
+-    ffi, 'pangoft2-1.0-0', 'pangoft2-1.0', 'libpangoft2-1.0-0',
+-    'libpangoft2-1.0.so.0', 'libpangoft2-1.0.dylib')
++gobject = _dlopen(ffi, '@gobject@')
++pango = _dlopen(ffi, '@pango@')
++harfbuzz = _dlopen(ffi, '@harfbuzz@')
++fontconfig = _dlopen(ffi, '@fontconfig@')
++pangoft2 = _dlopen(ffi, '@pangoft2@')
  
  gobject.g_type_init()
- 
+
diff --git a/pkgs/development/tools/rust/cargo-crev/default.nix b/pkgs/development/tools/rust/cargo-crev/default.nix
index 9803cd531e7..d7287f59e65 100644
--- a/pkgs/development/tools/rust/cargo-crev/default.nix
+++ b/pkgs/development/tools/rust/cargo-crev/default.nix
@@ -13,16 +13,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "cargo-crev";
-  version = "0.20.1";
+  version = "0.21.3";
 
   src = fetchFromGitHub {
     owner = "crev-dev";
     repo = "cargo-crev";
-    rev = version;
-    sha256 = "sha256-j2dafXUI6rDEYboSAciMeNma/YaBYKuQZgMUGVU+oBQ=";
+    rev = "v${version}";
+    sha256 = "sha256-CwECZz+qS5+rgwudRutcKZsYxfMLcVbA/9SZASmF+k4=";
   };
 
-  cargoSha256 = "sha256-khrpS6QFpweKbTbR0YhAJTTrgDoZl9fzYPDs+JE1mtA=";
+  cargoSha256 = "sha256-7c6Hu6UacQuRsCHlGKr1TtN+XHVGr1sw+HEGWeT9SJA=";
 
   preCheck = ''
     export HOME=$(mktemp -d)
diff --git a/pkgs/games/pacvim/default.nix b/pkgs/games/pacvim/default.nix
index dc2c216b1bf..a4347550c1d 100644
--- a/pkgs/games/pacvim/default.nix
+++ b/pkgs/games/pacvim/default.nix
@@ -1,4 +1,4 @@
-{ lib, stdenv, fetchFromGitHub, ncurses }:
+{ lib, stdenv, fetchFromGitHub, fetchpatch, ncurses }:
 
 stdenv.mkDerivation {
   pname = "pacvim";
@@ -9,6 +9,15 @@ stdenv.mkDerivation {
     rev = "ca7c8833c22c5fe97974ba5247ef1fcc00cedb8e";
     sha256 = "1kq6j7xmsl5qfl1246lyglkb2rs9mnb2rhsdrp18965dpbj2mhx2";
   };
+  patches = [
+    # Fix pending upstream inclusion for ncurses-6.3 support:
+    #   https://github.com/jmoon018/PacVim/pull/53
+    (fetchpatch {
+      name = "ncurses-6.3.patch";
+      url = "https://github.com/jmoon018/PacVim/commit/760682824cdbb328af616ff43bf822ade23924f7.patch";
+      sha256 = "1y3928dc2nkfldqhpiqk0blbx7qj8ar35f1w7fb92qwxrj8p4i6g";
+    })
+  ];
 
   buildInputs = [ ncurses ];
   makeFlags = [ "PREFIX=$(out)" ];
diff --git a/pkgs/misc/emulators/retroarch/cores.nix b/pkgs/misc/emulators/retroarch/cores.nix
index 715f3342121..c7b94e29589 100644
--- a/pkgs/misc/emulators/retroarch/cores.nix
+++ b/pkgs/misc/emulators/retroarch/cores.nix
@@ -1,293 +1,257 @@
-{ lib, stdenv, fetchgit, fetchFromGitHub, fetchpatch, cmake, pkg-config, makeWrapper, python27, python3, retroarch
-, alsa-lib, fluidsynth, curl, hidapi, libGLU, gettext, portaudio, SDL, SDL2, libGL
-, ffmpeg, pcre, libevdev, libpng, libjpeg, libzip, udev, libvorbis, snappy, which, hexdump
-, sfml, xorg, zlib, nasm, libpcap, boost, icu, openssl
-, buildPackages }:
+{ lib
+, stdenv
+, SDL
+, alsa-lib
+, boost
+, buildPackages
+, cmake
+, curl
+, fetchFromGitHub
+, fetchpatch
+, ffmpeg
+, fluidsynth
+, gettext
+, hexdump
+, hidapi
+, icu
+, libGL
+, libGLU
+, libevdev
+, libjpeg
+, libpcap
+, libpng
+, libvorbis
+, libzip
+, makeWrapper
+, nasm
+, openssl
+, pcre
+, pkg-config
+, portaudio
+, python27
+, python3
+, retroarch
+, sfml
+, snappy
+, udev
+, which
+, xorg
+, zlib
+}:
 
 let
-
-  d2u = lib.replaceChars ["-"] ["_"];
-
-  mkLibRetroCore = { core, src, description, license, broken ? false, version ? "2020-03-06", ... }@a:
-  lib.makeOverridable stdenv.mkDerivation ((rec {
-
-    name = "libretro-${a.core}-${version}";
-    inherit version;
-    inherit (a) src;
-
-    buildInputs = [ zlib ] ++ a.extraBuildInputs or [];
-    nativeBuildInputs = [ makeWrapper ] ++ a.extraNativeBuildInputs or [];
-
-    makefile = "Makefile.libretro";
-    makeFlags = [
-      "platform=${{
-        linux = "unix";
-        darwin = "osx";
-        windows = "win";
-      }.${stdenv.hostPlatform.parsed.kernel.name} or stdenv.hostPlatform.parsed.kernel.name}"
-      "ARCH=${{
-        armv7l = "arm";
-        armv6l = "arm";
-        i686 = "x86";
-      }.${stdenv.hostPlatform.parsed.cpu.name} or stdenv.hostPlatform.parsed.cpu.name}"
-    ] ++ (a.makeFlags or []);
-
-    installPhase = ''
-      COREDIR="$out/lib/retroarch/cores"
-      mkdir -p $out/bin
-      mkdir -p $COREDIR
-      mv ${d2u a.core}_libretro${stdenv.hostPlatform.extensions.sharedLibrary} $COREDIR
-      makeWrapper ${retroarch}/bin/retroarch $out/bin/retroarch-${core} \
-        --add-flags "-L $COREDIR/${d2u core}_libretro${stdenv.hostPlatform.extensions.sharedLibrary} $@"
-    '';
-
-    passthru = {
-      inherit (a) core;
-      libretroCore = "/lib/retroarch/cores";
-    };
-
-    meta = with lib; {
-      inherit (a) description license;
-      broken = a.broken or false;
-      homepage = "https://www.libretro.com/";
-      maintainers = with maintainers; [ edwtjo hrdinka MP2E ];
-      platforms = platforms.unix;
-    };
-  }) // builtins.removeAttrs a ["core" "src" "description" "license" "makeFlags"]);
-
-  fetchRetro = { repo, rev, sha256 }:
-  fetchgit {
-    inherit rev sha256;
-    url = "https://github.com/libretro/${repo}.git";
-    fetchSubmodules = true;
-  };
-
-in with lib.licenses;
-
+  d2u = lib.replaceChars [ "-" ] [ "_" ];
+
+  hashesFile = builtins.fromJSON (builtins.readFile ./hashes.json);
+
+  getCoreSrc = core:
+    fetchFromGitHub (builtins.getAttr core hashesFile);
+
+  mkLibRetroCore =
+    { core
+    , description
+    , license
+    , src ? null
+    , broken ? false
+    , version ? "unstable-2021-11-16"
+    , ...
+    }@args:
+    lib.makeOverridable stdenv.mkDerivation (
+      let
+        finalSrc = if src == null then getCoreSrc core else src;
+      in
+      (rec {
+        pname = "libretro-${core}";
+        inherit version;
+        src = finalSrc;
+
+        buildInputs = [ zlib ] ++ args.extraBuildInputs or [ ];
+        nativeBuildInputs = [ makeWrapper ] ++ args.extraNativeBuildInputs or [ ];
+
+        makefile = "Makefile.libretro";
+        makeFlags = [
+          "platform=${{
+            linux = "unix";
+            darwin = "osx";
+            windows = "win";
+          }.${stdenv.hostPlatform.parsed.kernel.name} or stdenv.hostPlatform.parsed.kernel.name}"
+          "ARCH=${{
+            armv7l = "arm";
+            armv6l = "arm";
+            i686 = "x86";
+          }.${stdenv.hostPlatform.parsed.cpu.name} or stdenv.hostPlatform.parsed.cpu.name}"
+        ] ++ (args.makeFlags or [ ]);
+
+        installPhase = ''
+          COREDIR="$out/lib/retroarch/cores"
+          mkdir -p $out/bin
+          mkdir -p $COREDIR
+          mv ${d2u args.core}_libretro${stdenv.hostPlatform.extensions.sharedLibrary} $COREDIR
+          makeWrapper ${retroarch}/bin/retroarch $out/bin/retroarch-${core} \
+            --add-flags "-L $COREDIR/${d2u core}_libretro${stdenv.hostPlatform.extensions.sharedLibrary} $@"
+        '';
+
+        passthru = {
+          inherit core;
+          libretroCore = "/lib/retroarch/cores";
+        };
+
+        meta = with lib; {
+          inherit broken description license;
+          homepage = "https://www.libretro.com/";
+          maintainers = with maintainers; [ edwtjo hrdinka MP2E thiagokokada ];
+          platforms = platforms.unix;
+        };
+      }) // builtins.removeAttrs args [ "core" "src" "description" "license" "makeFlags" ]
+    );
+in
 {
-
-  atari800 = mkLibRetroCore rec {
+  atari800 = mkLibRetroCore {
     core = "atari800";
-    src = fetchRetro {
-      repo = "libretro-" + core;
-      rev = "f9bf53b864344b8bbe8d425ed2f3c628eb10519c";
-      sha256 = "0sgk93zs423pwiqzvj0x1gfwcn9gacnlrrdq53ps395k64lig6lk";
-    };
     description = "Port of Atari800 to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
     makeFlags = [ "GIT_VERSION=" ];
   };
 
   beetle-snes = mkLibRetroCore {
     core = "mednafen-snes";
-    src = fetchRetro {
-      repo = "beetle-bsnes-libretro";
-      rev = "de22d8420ea606f1b2f72afd4dda34619cf2cc20";
-      sha256 = "1nd4f8frmlhp1lyxz9zpxvwwz70x0i0rrp560cn9qlm1jzdv3xvf";
-    };
+    src = getCoreSrc "beetle-snes";
     description = "Port of Mednafen's SNES core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
   beetle-gba = mkLibRetroCore {
     core = "mednafen-gba";
-    src = fetchRetro {
-      repo = "beetle-gba-libretro";
-      rev = "135afdbb9591655a3e016b75abba07e481f6d406";
-      sha256 = "0fc0x24qn4y7pz3mp1mm1ain31aj9pznp1irr0k7hvazyklzy9g3";
-    };
+    src = getCoreSrc "beetle-gba";
     description = "Port of Mednafen's GameBoy Advance core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
   beetle-lynx = mkLibRetroCore {
     core = "mednafen-lynx";
-    src = fetchRetro {
-      repo = "beetle-lynx-libretro";
-      rev = "74dde204c0ec6c4bc4cd7821c14548387fbd9ce8";
-      sha256 = "05kwibjr30laalqzazswvmn9smm3mwqsz1i0z1s0pj7idfdhjfw0";
-    };
+    src = getCoreSrc "beetle-lynx";
     description = "Port of Mednafen's Lynx core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
   beetle-ngp = mkLibRetroCore {
     core = "mednafen-ngp";
-    src = fetchRetro {
-      repo = "beetle-ngp-libretro";
-      rev = "6f15532b6ad17a2d5eb9dc8241d6af62416e796b";
-      sha256 = "05r8mk9rc19nzs3gpfsjr6i7pm6xx3gn3b4xs8ab7v4vcmfg4cn2";
-    };
+    src = getCoreSrc "beetle-ngp";
     description = "Port of Mednafen's NeoGeo Pocket core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  beetle-pce-fast = let der = mkLibRetroCore {
+  beetle-pce-fast = mkLibRetroCore {
     core = "mednafen-pce-fast";
-    src = fetchRetro {
-      repo = "beetle-pce-fast-libretro";
-      rev = "40a42b7f43f029760c92bf0b2097e7d4b90ed29c";
-      sha256 = "1gr6wg4bd4chm4c39w0c1b5zfzr05zd7234vvlmr1imk0v6m0wj6";
-    };
+    src = getCoreSrc "beetle-pce-fast";
     description = "Port of Mednafen's PC Engine core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
-  }; in der.override {
-    name = "beetle-pce-fast-${der.version}";
   };
 
-  beetle-pcfx = mkLibRetroCore rec {
+  beetle-pcfx = mkLibRetroCore {
     core = "mednafen-pcfx";
-    src = fetchRetro {
-      repo = "beetle-pcfx-libretro";
-      rev = "7bba6699d6f903bd701b0aa525d845de8427fee6";
-      sha256 = "1lh7dh96fyi005fcg3xaf7r4ssgkq840p6anldlqy52vfwmglw3p";
-    };
+    src = getCoreSrc "beetle-pcfx";
     description = "Port of Mednafen's PCFX core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  beetle-psx = let der = (mkLibRetroCore {
+  beetle-psx = mkLibRetroCore {
     core = "mednafen-psx";
-    src = fetchRetro {
-      repo = "beetle-psx-libretro";
-      rev = "0f1e7e60827cad49ebba628abdc83ad97652ab89";
-      sha256 = "1j92jgddyl970v775d6gyb50l8md6yfym2fpqhfxcr4gj1b4ivwq";
-    };
+    src = getCoreSrc "beetle-psx";
     description = "Port of Mednafen's PSX Engine core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
     makeFlags = [ "HAVE_HW=0" "HAVE_LIGHTREC=1" ];
-  }); in der.override {
-    name = "beetle-psx-${der.version}";
   };
 
-  beetle-psx-hw = let der = (mkLibRetroCore {
+  beetle-psx-hw = mkLibRetroCore {
     core = "mednafen-psx-hw";
-    src = fetchRetro {
-      repo = "beetle-psx-libretro";
-      rev = "0f1e7e60827cad49ebba628abdc83ad97652ab89";
-      sha256 = "1j92jgddyl970v775d6gyb50l8md6yfym2fpqhfxcr4gj1b4ivwq";
-    };
+    src = getCoreSrc "beetle-psx";
     description = "Port of Mednafen's PSX Engine (with HW accel) core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     extraBuildInputs = [ libGL libGLU ];
     makefile = "Makefile";
     makeFlags = [ "HAVE_VULKAN=1" "HAVE_OPENGL=1" "HAVE_HW=1" "HAVE_LIGHTREC=1" ];
-  }); in der.override {
-    name = "beetle-psx-hw-${der.version}";
   };
 
-  beetle-saturn = let der = (mkLibRetroCore {
+  beetle-saturn = mkLibRetroCore {
     core = "mednafen-saturn";
-    src = fetchRetro {
-      repo = "beetle-saturn-libretro";
-      rev = "8a65943bb7bbc3183eeb0d57c4ac3e663f1bcc11";
-      sha256 = "1f0cd9wmvarsmf4jw0p6h3lbzs6515aja7krrwapja7i4xmgbrnh";
-    };
+    src = getCoreSrc "beetle-saturn";
     description = "Port of Mednafen's Saturn core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
     makeFlags = [ "HAVE_HW=0" ];
     meta.platforms = [ "x86_64-linux" "aarch64-linux" ];
-  }); in der.override {
-    name = "beetle-saturn-${der.version}";
   };
 
-  beetle-saturn-hw = let der = (mkLibRetroCore {
+  beetle-saturn-hw = mkLibRetroCore {
     core = "mednafen-saturn-hw";
-    src = fetchRetro {
-      repo = "beetle-saturn-libretro";
-      rev = "8a65943bb7bbc3183eeb0d57c4ac3e663f1bcc11";
-      sha256 = "1f0cd9wmvarsmf4jw0p6h3lbzs6515aja7krrwapja7i4xmgbrnh";
-    };
+    src = getCoreSrc "beetle-saturn";
     description = "Port of Mednafen's Saturn core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     extraBuildInputs = [ libGL libGLU ];
     makefile = "Makefile";
     makeFlags = [ "HAVE_OPENGL=1" "HAVE_HW=1" ];
     meta.platforms = [ "x86_64-linux" "aarch64-linux" ];
-  }); in der.override {
-    name = "beetle-saturn-${der.version}";
   };
 
-  beetle-supergrafx = mkLibRetroCore rec {
+  beetle-supergrafx = mkLibRetroCore {
     core = "mednafen-supergrafx";
-    src = fetchRetro {
-      repo = "beetle-supergrafx-libretro";
-      rev = "fadef23d59fa5ec17bc99e1e722cfd9e10535695";
-      sha256 = "15rm7p5q38qy3xpyvamhphjnna8h91fsbcqnl9vhzx9cmjg0wf54";
-    };
+    src = getCoreSrc "beetle-supergrafx";
     description = "Port of Mednafen's SuperGrafx core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  beetle-wswan = mkLibRetroCore rec {
+  beetle-wswan = mkLibRetroCore {
     core = "mednafen-wswan";
-    src = fetchRetro {
-      repo = "beetle-wswan-libretro";
-      rev = "5b03d1b09f70dc208387d3c8b59e12e1f0d2692f";
-      sha256 = "1sm6ww3y9m85lhp74dpxbs05yxdhhqqmj2022j9s0m235z29iygc";
-    };
+    src = getCoreSrc "beetle-wswan";
     description = "Port of Mednafen's WonderSwan core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  beetle-vb = mkLibRetroCore rec {
+  beetle-vb = mkLibRetroCore {
     core = "mednafen-vb";
-    src = fetchRetro {
-      repo = "beetle-vb-libretro";
-      rev = "9a4e604a7320a3c6ed30601989fe0bc417fa9ad3";
-      sha256 = "1gallwbqxn5qbmwxr1vxb41nncksai4rxc739a7vqvp65k5kl0qp";
-    };
+    src = getCoreSrc "beetle-vb";
     description = "Port of Mednafen's VirtualBoy core to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  bluemsx = mkLibRetroCore rec {
+  bluemsx = mkLibRetroCore {
     core = "bluemsx";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "7a1d40e750860580ab7cc21fbc244b5bc6db6586";
-      sha256 = "05hnkyr47djccspr8v438zimdfsgym7v0jn1hwpkqc4i5zf70981";
-    };
     description = "Port of BlueMSX to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
   };
 
-  bsnes-mercury = let bname = "bsnes-mercury"; in mkLibRetroCore {
-    core = bname + "-accuracy";
-    src = fetchRetro {
-      repo = bname;
-      rev = "4a382621da58ae6da850f1bb003ace8b5f67968c";
-      sha256 = "0z8psz24nx8497vpk2wya9vs451rzzw915lkw3qiq9bzlzg9r2wv";
-    };
+  bsnes-mercury = mkLibRetroCore {
+    core = "bsnes-mercury-accuracy";
+    src = getCoreSrc "bsnes-mercury";
     description = "Fork of bsnes with HLE DSP emulation restored";
-    license = gpl3;
+    license = lib.licenses.gpl3Only;
     makefile = "Makefile";
-    postBuild = "cd out";
+    makeFlags = [ "PROFILE=accuracy" ];
   };
 
-  citra = mkLibRetroCore rec {
+  citra = mkLibRetroCore {
     core = "citra";
-    src = fetchgit {
-      url = "https://github.com/libretro/citra.git";
-      rev = "84f31e95160b029e6d614053705054ed6a34bb38";
-      sha256 = "0gkgxpwrh0q098cpx56hprvmazi5qi448c23svwa8ar1myh8p248";
-      fetchSubmodules = true;
+    # `nix-prefetch-github` doesn't support `deepClone`, necessary for citra
+    # https://github.com/seppeljordan/nix-prefetch-github/issues/41
+    src = fetchFromGitHub {
+      inherit (hashesFile.citra) owner repo rev fetchSubmodules;
       deepClone = true;
+      sha256 = "sha256-bwnYkMvbtRF5bGZRYVtMWxnCu9P45qeX4+ntOj9eRds=";
     };
     description = "Port of Citra to libretro";
-    license = gpl2Plus;
+    license = lib.licenses.gpl2Plus;
     extraNativeBuildInputs = [ cmake pkg-config ];
     extraBuildInputs = [ libGLU libGL boost ];
     makefile = "Makefile";
@@ -302,52 +266,41 @@ in with lib.licenses;
     postBuild = "cd src/citra_libretro";
   };
 
-  desmume = mkLibRetroCore rec {
+  desmume = mkLibRetroCore {
     core = "desmume";
-    src = fetchRetro {
-      repo = core;
-      rev = "e8cf461f83eebb195f09e70090f57b07d1bcdd9f";
-      sha256 = "0rc8s5226wn39jqs5yxi30jc1snc0p106sfym7kgi98hy5na8yab";
-    };
     description = "libretro wrapper for desmume NDS emulator";
-    license = gpl2;
+    license = lib.licenses.gpl2Plus;
     extraBuildInputs = [ libpcap libGLU libGL xorg.libX11 ];
     preBuild = "cd desmume/src/frontend/libretro";
     makeFlags = lib.optional stdenv.hostPlatform.isAarch32 "platform=armv-unix"
-             ++ lib.optional (!stdenv.hostPlatform.isx86) "DESMUME_JIT=0";
+      ++ lib.optional (!stdenv.hostPlatform.isx86) "DESMUME_JIT=0";
   };
 
-  desmume2015 = mkLibRetroCore rec {
+  desmume2015 = mkLibRetroCore {
     core = "desmume2015";
-    src = fetchRetro {
-      repo = core;
-      rev = "93d5789d60f82436e20ccad05ce9cb43c6e3656e";
-      sha256 = "12nii2pbnqgh7f7jkphbwjpr2hiy2mzbwpas3xyhpf9wpy3qiasg";
-    };
     description = "libretro wrapper for desmume NDS emulator from 2015";
-    license = gpl2;
+    license = lib.licenses.gpl2Plus;
     extraBuildInputs = [ libpcap libGLU libGL xorg.libX11 ];
     makeFlags = lib.optional stdenv.hostPlatform.isAarch32 "platform=armv-unix"
-             ++ lib.optional (!stdenv.hostPlatform.isx86) "DESMUME_JIT=0";
+      ++ lib.optional (!stdenv.hostPlatform.isx86) "DESMUME_JIT=0";
     preBuild = "cd desmume";
   };
 
   dolphin = mkLibRetroCore {
     core = "dolphin";
-    version = "2021-11-01";
-    src = fetchRetro {
-      repo = "dolphin";
-      rev = "3370f7693be95c23ac779e5172ff52b7eb2861a7";
-      sha256 = "0ylxi25kbv0h2p24aid7z4i0w6drf7h92q02hjdl3h3gni98lk9i";
-    };
     description = "Port of Dolphin to libretro";
-    license = gpl2Plus;
+    license = lib.licenses.gpl2Plus;
 
     extraNativeBuildInputs = [ cmake curl pkg-config ];
     extraBuildInputs = [
-      libGLU libGL pcre sfml
-      gettext hidapi
-      libevdev udev
+      libGLU
+      libGL
+      pcre
+      sfml
+      gettext
+      hidapi
+      libevdev
+      udev
     ] ++ (with xorg; [ libSM libX11 libXi libpthreadstubs libxcb xcbutil libXext libXrandr libXinerama libXxf86vm ]);
     makefile = "Makefile";
     cmakeFlags = [
@@ -362,48 +315,29 @@ in with lib.licenses;
     dontUseCmakeBuildDir = true;
   };
 
-  dosbox = mkLibRetroCore rec {
+  dosbox = mkLibRetroCore {
     core = "dosbox";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "e4ed503b14ed59d5d745396ef1cc7d52cf912328";
-      sha256 = "13bx0ln9hwn6hy4sv0ivqmjgjbfq8svx15dsa24hwd8lkf0kakl4";
-    };
     description = "Port of DOSBox to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
   };
 
-  eightyone = mkLibRetroCore rec {
+  eightyone = mkLibRetroCore {
     core = "81";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "4352130bd2363954262a804b086f86b9d13d97f9";
-      sha256 = "057ynnv85imjqhgixrx7p28wn42v88vsm3fc1lp3mpcfi2bk266h";
-    };
+    src = getCoreSrc "eightyone";
     description = "Port of EightyOne to libretro";
-    license = gpl3;
+    license = lib.licenses.gpl3Only;
   };
 
-  fbalpha2012 = mkLibRetroCore rec {
+  fbalpha2012 = mkLibRetroCore {
     core = "fbalpha2012";
-    src = fetchRetro {
-      repo = core;
-      rev = "fa97cd2784a337f8ac774c2ce8a136aee69b5f43";
-      sha256 = "1i75k0r6838hl77bjjmzvan33ka5qjrdpirmclzj20g5j97lmas7";
-    };
     description = "Port of Final Burn Alpha ~2012 to libretro";
     license = "Non-commercial";
     makefile = "makefile.libretro";
     preBuild = "cd svn-current/trunk";
   };
 
-  fbneo = mkLibRetroCore rec {
+  fbneo = mkLibRetroCore {
     core = "fbneo";
-    src = fetchRetro {
-      repo = core;
-      rev = "cf43fdb1755f9f5c886266e86ba40d339bc8f5d7";
-      sha256 = "13g3c6mbwhcf0rp95ga4klszh8dab2d4ahh2vzzlmd57r69lf2lv";
-    };
     description = "Port of FBNeo to libretro";
     license = "Non-commercial";
     makefile = "Makefile";
@@ -414,123 +348,73 @@ in with lib.licenses;
     makeFlags = [ "USE_EXPERIMENTAL_FLAGS=1" ];
   };
 
-  fceumm = mkLibRetroCore rec {
+  fceumm = mkLibRetroCore {
     core = "fceumm";
-    src = fetchRetro {
-      repo = "libretro-" + core;
-      rev = "9ed22e5a9a1360a7f599a64283af9fe24b858e3d";
-      sha256 = "0rz6iy281jpybmsz5rh06k5xvmd9id9w2q2gd0qdv9a2ylwv7s2j";
-    };
     description = "FCEUmm libretro port";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
   };
 
-  flycast = mkLibRetroCore rec {
+  flycast = mkLibRetroCore {
     core = "flycast";
-    src = fetchRetro {
-      repo = core;
-      rev = "b12f3726d9093acb4e441b1cdcf6cd11403c8644";
-      sha256 = "0nczjhdqr7svq9aflczf7rwz64bih1wqy9q0gyglb55xlslf5jqc";
-    };
     description = "Flycast libretro port";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     extraBuildInputs = [ libGL libGLU ];
     makefile = "Makefile";
     makeFlags = lib.optional stdenv.hostPlatform.isAarch64 [ "platform=arm64" ];
     meta.platforms = [ "aarch64-linux" "x86_64-linux" ];
   };
 
-  fmsx = mkLibRetroCore rec {
+  fmsx = mkLibRetroCore {
     core = "fmsx";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "3de916bbf15062de1ab322432d38a1fee29d5e68";
-      sha256 = "1krr4lmdiv0d7bxk37fqz5y412znb5bmxapv9g7ci6fp87sr69jq";
-    };
     description = "FMSX libretro port";
     license = "Non-commercial";
     makefile = "Makefile";
   };
 
-  freeintv = mkLibRetroCore rec {
+  freeintv = mkLibRetroCore {
     core = "freeintv";
-    src = fetchRetro {
-      repo = core;
-      rev = "45030e10cc1a50cf7a80c5d921aa8cba0aeaca91";
-      sha256 = "10lngk3p012bgrg752426701hfzsiy359h8i0vzsa64pgyjbqlag";
-    };
     description = "FreeIntv libretro port";
-    license = gpl3;
+    license = lib.licenses.gpl3Only;
     makefile = "Makefile";
   };
 
-  gambatte = mkLibRetroCore rec {
+  gambatte = mkLibRetroCore {
     core = "gambatte";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "132f36e990dfc6effdafa6cf261373432464f9bf";
-      sha256 = "19w5k9yc1cl99c5hiqbp6j54g6z06xcblpvd3x6nmhxij81yqxy7";
-    };
     description = "Gambatte libretro port";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
   };
 
   genesis-plus-gx = mkLibRetroCore {
     core = "genesis-plus-gx";
-    src = fetchRetro {
-      repo = "Genesis-Plus-GX";
-      rev = "50551066f71f8a5ea782ea3747891fd6d24ebe67";
-      sha256 = "150lgdrv7idcq7jbd1jj7902rcsyixd7kfjs2m5xdinjvl22kihr";
-    };
     description = "Enhanced Genesis Plus libretro port";
     license = "Non-commercial";
   };
 
-  gpsp = mkLibRetroCore rec {
+  gpsp = mkLibRetroCore {
     core = "gpsp";
-    src = fetchRetro {
-      repo = core;
-      rev = "3f2f57c982ffead643957db5b26931df4913596f";
-      sha256 = "09fa1c623rmy1w9zx85r75viv8q1vknhbs8fn6xbss9rhpxhivwg";
-    };
     description = "Port of gpSP to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  gw = mkLibRetroCore rec {
+  gw = mkLibRetroCore {
     core = "gw";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "819b1dde560013003eeac86c2069c5be7af25c6d";
-      sha256 = "1jhgfys8hiipvbwq3gc48d7v6wq645d10rbr4w5m6px0fk6csshk";
-    };
     description = "Port of Game and Watch to libretro";
     license = lib.licenses.zlib;
     makefile = "Makefile";
   };
 
-  handy = mkLibRetroCore rec {
+  handy = mkLibRetroCore {
     core = "handy";
-    src = fetchRetro {
-      repo = "libretro-" + core;
-      rev = "c9fe65d1a2df454ee11404ac27bdc9be319dd9a2";
-      sha256 = "1l1gi8z68mv2cpdy7a6wvhd86q55khj3mv3drf43ak4kj2ij8cvq";
-    };
     description = "Port of Handy to libretro";
-    license = "Handy-License";
+    license = lib.licenses.zlib;
     makefile = "Makefile";
   };
 
-  hatari = mkLibRetroCore rec {
+  hatari = mkLibRetroCore {
     core = "hatari";
-    src = fetchRetro {
-      repo = core;
-      rev = "ec1b59c4b6c7ca7d0d23d60cfe2cb61911b11173";
-      sha256 = "1pm821s2cz93xr7qx7dv0imr44bi4pvdvlnjl486p83vff9yawfg";
-    };
     description = "Port of Hatari to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     extraBuildInputs = [ SDL zlib ];
     extraNativeBuildInputs = [ cmake which ];
     dontUseCmakeConfigure = true;
@@ -541,15 +425,10 @@ in with lib.licenses;
 
   mame = mkLibRetroCore {
     core = "mame";
-    src = fetchRetro {
-      repo = "mame";
-      rev = "ed987ad07964a938351ff3cc1ad42e02ffd2af6d";
-      sha256 = "0qc66mvraffx6ws972skx3wgblich17q6z42798qn13q1a264p4j";
-    };
     description = "Port of MAME to libretro";
-    license = gpl2Plus;
+    license = with lib.licenses; [ bsd3 gpl2Plus ];
 
-    extraBuildInputs = [ alsa-lib libGLU libGL portaudio python27 xorg.libX11 ];
+    extraBuildInputs = [ alsa-lib libGLU libGL portaudio python3 xorg.libX11 ];
     postPatch = ''
       # Prevent the failure during the parallel building of:
       # make -C 3rdparty/genie/build/gmake.linux -f genie.make obj/Release/src/host/lua-5.3.0/src/lgc.o
@@ -558,77 +437,47 @@ in with lib.licenses;
     makefile = "Makefile.libretro";
   };
 
-  mame2000 = mkLibRetroCore rec {
+  mame2000 = mkLibRetroCore {
     core = "mame2000";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "e5d4a934c60adc6d42a3f87319312aad89595a15";
-      sha256 = "1zn63yqyrsnsk196v5f3nm7cx41mvsm3icpis1yxbma2r3dk3f89";
-    };
     description = "Port of MAME ~2000 to libretro";
-    license = gpl2Plus;
+    license = "MAME";
     makefile = "Makefile";
     makeFlags = lib.optional (!stdenv.hostPlatform.isx86) "IS_X86=0";
   };
 
-  mame2003 = mkLibRetroCore rec {
+  mame2003 = mkLibRetroCore {
     core = "mame2003";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "82596014905ad38c80c9eb322ab08c625d1d92cd";
-      sha256 = "17dp2rz6p7q7nr0lajn3vhk9ghngxz16f7c6c87r6wgsy4y3xw0m";
-    };
     description = "Port of MAME ~2003 to libretro";
-    license = gpl2Plus;
+    license = "MAME";
     makefile = "Makefile";
   };
 
-  mame2003-plus = mkLibRetroCore rec {
+  mame2003-plus = mkLibRetroCore {
     core = "mame2003-plus";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "0134c428b75882aa474f78dbbf2c6ecde49b97b7";
-      sha256 = "0jln2ys6v9hrsrkhqd87jfslwvkca425f40mf7866g6b4pz56mwc";
-    };
     description = "Port of MAME ~2003+ to libretro";
-    license = gpl2Plus;
+    license = "MAME";
     makefile = "Makefile";
   };
 
-  mame2010 = mkLibRetroCore rec {
+  mame2010 = mkLibRetroCore {
     core = "mame2010";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "d3151837758eade73c85c28c20e7d2a8706f30c6";
-      sha256 = "0hj0yhc8zs32fkzn8j341ybhvrsknv0k6x0z2fv3l9ic7swgb93i";
-    };
     description = "Port of MAME ~2010 to libretro";
-    license = gpl2Plus;
+    license = "MAME";
     makefile = "Makefile";
     makeFlags = lib.optionals stdenv.hostPlatform.isAarch64 [ "PTR64=1" "ARM_ENABLED=1" "X86_SH2DRC=0" "FORCE_DRC_C_BACKEND=1" ];
   };
 
-  mame2015 = mkLibRetroCore rec {
+  mame2015 = mkLibRetroCore {
     core = "mame2015";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "37333ed6fda4c798a1d6b055fe4708f9f0dcf5a7";
-      sha256 = "1asldlj1ywgmhabbhaagagg5hn0359122al07802q3l57ns41l64";
-    };
     description = "Port of MAME ~2015 to libretro";
-    license = gpl2Plus;
+    license = "MAME";
     extraNativeBuildInputs = [ python27 ];
     extraBuildInputs = [ alsa-lib ];
     makefile = "Makefile";
   };
 
-  mame2016 = mkLibRetroCore rec {
+  mame2016 = mkLibRetroCore {
     core = "mame2016";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "02987af9b81a9c3294af8fb9d5a34f9826a2cf4d";
-      sha256 = "0gl7irmn5d8lk7kf484vgw6kb325fq4ghwsni3il4nm5n2a8yglh";
-    };
     patches = [
       (fetchpatch {
         name = "fix_mame_build_on_make-4.3.patch";
@@ -637,7 +486,7 @@ in with lib.licenses;
       })
     ];
     description = "Port of MAME ~2016 to libretro";
-    license = gpl2Plus;
+    license = with lib.licenses; [ bsd3 gpl2Plus ];
     extraNativeBuildInputs = [ python27 ];
     extraBuildInputs = [ alsa-lib ];
     postPatch = ''
@@ -647,136 +496,86 @@ in with lib.licenses;
     '';
   };
 
-  mesen = mkLibRetroCore rec {
+  mesen = mkLibRetroCore {
     core = "mesen";
-    src = fetchFromGitHub {
-      owner = "SourMesen";
-      repo = core;
-      rev = "cfc5bf6976f62ebd42ea30d5a803c138fc357509";
-      sha256 = "0ihlgvzvni1yqcyi5yxdvg36q20fsqd6n67zavwfb2ph09cqv7kz";
-    };
     description = "Port of Mesen to libretro";
-    license = gpl3;
+    license = lib.licenses.gpl3Only;
     makefile = "Makefile";
     preBuild = "cd Libretro";
   };
 
-  meteor = mkLibRetroCore rec {
+  meteor = mkLibRetroCore {
     core = "meteor";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "3d21e3b5a7596918bee0fcaca5752ae76624c05e";
-      sha256 = "0fghnxxbdrkdz6zswkd06w2r3dvr4ikvcp8jbr7nb9fc5yzn0avw";
-    };
     description = "Port of Meteor to libretro";
-    license = gpl3;
+    license = lib.licenses.gpl3Only;
     makefile = "Makefile";
     preBuild = "cd libretro";
   };
 
-  mgba = mkLibRetroCore rec {
+  mgba = mkLibRetroCore {
     core = "mgba";
-    src = fetchRetro {
-      repo = core;
-      rev = "f87f9ef6cb38537e07dcaedeb82aecac6537d42e";
-      sha256 = "0yixvnzgk7qvcfz12r5y8i85czqxbxx6bvl1c7yms8riqn9ssvb7";
-    };
     description = "Port of mGBA to libretro";
-    license = mpl20;
+    license = lib.licenses.mpl20;
   };
 
   mupen64plus = mkLibRetroCore {
     core = "mupen64plus-next";
-    src = fetchRetro {
-      repo = "mupen64plus-libretro-nx";
-      rev = "81a58df0263c90b10b7fc11b6deee04d47e3aa40";
-      sha256 = "1brqyrsdzdq53a68q7ph01q2bx5y4m8b3ymvpp25229imm88lgkn";
-    };
+    src = getCoreSrc "mupen64plus";
     description = "Libretro port of Mupen64 Plus, GL only";
-    license = gpl2;
+    license = lib.licenses.gpl3Only;
 
     extraBuildInputs = [ libGLU libGL libpng nasm xorg.libX11 ];
     makefile = "Makefile";
   };
 
-  neocd = mkLibRetroCore rec {
+  neocd = mkLibRetroCore {
     core = "neocd";
-    src = fetchRetro {
-      repo = core + "_libretro";
-      rev = "3825848fe7dd7e0ef859729eefcb29e2ea2956b7";
-      sha256 = "018vfmjsx62zk45yx3pwisp4j133yxjbm7fnwwr244gnyms57711";
-    };
     description = "NeoCD libretro port";
-    license = gpl3;
+    license = lib.licenses.lgpl3Only;
     makefile = "Makefile";
   };
 
-  nestopia = mkLibRetroCore rec {
+  nestopia = mkLibRetroCore {
     core = "nestopia";
-    src = fetchRetro {
-      repo = core;
-      rev = "70c53f08c0cc92e90d095d6558ab737ce20431ac";
-      sha256 = "1hlfqml66wy6fn40f1iiy892vq9y9fj20vv3ynd2s3b3qxhwfx73";
-    };
     description = "Nestopia libretro port";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
     preBuild = "cd libretro";
   };
 
   np2kai = mkLibRetroCore rec {
     core = "np2kai";
-    src = fetchFromGitHub rec {
-      owner = "AZO234";
-      repo = "NP2kai";
-      rev = "4a317747724669343e4c33ebdd34783fb7043221";
-      sha256 = "0kxysxhx6jyk82mx30ni0ydzmwdcbnlxlnarrlq018rsnwb4md72";
-    };
+    src = getCoreSrc core;
     description = "Neko Project II kai libretro port";
-    license = mit;
+    license = lib.licenses.mit;
     makefile = "Makefile.libretro";
-    preBuild = ''
-      cd sdl2
-      substituteInPlace ${makefile} \
-        --replace 'GIT_VERSION :=' 'GIT_VERSION ?='
-      export GIT_VERSION=${builtins.substring 0 7 src.rev}
-    '';
+    makeFlags = [
+      # See https://github.com/AZO234/NP2kai/tags
+      "NP2KAI_VERSION=rev.22"
+      "NP2KAI_HASH=${src.rev}"
+    ];
+    preBuild = "cd sdl";
   };
 
-  o2em = mkLibRetroCore rec {
+  o2em = mkLibRetroCore {
     core = "o2em";
-    src = fetchRetro {
-      repo = "libretro-" + core;
-      rev = "b23a796dd3490e979ff43710317df6d43bd661e1";
-      sha256 = "1pkbq7nig394zdjdic0mzdsvx8xhzamsh53xh2hzznipyj46b7z0";
-    };
     description = "Port of O2EM to libretro";
-    license = artistic1;
+    license = lib.licenses.artistic1;
     makefile = "Makefile";
   };
 
-  opera = mkLibRetroCore rec {
+  opera = mkLibRetroCore {
     core = "opera";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "27bc2653ed469072a6a95102a8212a35fbb1e590";
-      sha256 = "10cxjpsd35rb4fjc5ycs1h00gvshpn2mxxvwb6xzrfrzva0kjw1l";
-    };
     description = "Opera is a port of 4DO/libfreedo to libretro";
     license = "Non-commercial";
     makefile = "Makefile";
     makeFlags = [ "CC_PREFIX=${stdenv.cc.targetPrefix}" ];
   };
 
-  parallel-n64 = mkLibRetroCore rec {
+  parallel-n64 = mkLibRetroCore {
     core = "parallel-n64";
-    src = fetchRetro {
-      repo = core;
-      rev = "8fe07c62a364d0af1e22b7f75e839d42872dae7f";
-      sha256 = "0p3fpldw6w4n4l60bv55c17vhqwq4q39fp36h8iqmnj7c32c61kf";
-    };
     description = "Parallel Mupen64plus rewrite for libretro.";
-    license = gpl2;
+    license = lib.licenses.gpl3Only;
     extraBuildInputs = [ libGLU libGL libpng ];
     makefile = "Makefile";
     postPatch = lib.optionalString stdenv.hostPlatform.isAarch64 ''
@@ -785,44 +584,29 @@ in with lib.licenses;
     '';
   };
 
-  pcsx_rearmed = mkLibRetroCore rec {
+  pcsx_rearmed = mkLibRetroCore {
     core = "pcsx_rearmed";
-    src = fetchRetro {
-      repo = core;
-      rev = "8fda5dd0e28fe46621fb1ab57781c316143017da";
-      sha256 = "0k371d0xqzqwy8ishvxssgasm36q83qj7ksn2av110n879n4knwb";
-    };
     description = "Port of PCSX ReARMed with GNU lightning to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     dontConfigure = true;
   };
 
-  picodrive = mkLibRetroCore rec {
+  picodrive = mkLibRetroCore {
     core = "picodrive";
-    src = fetchRetro {
-      repo = core;
-      rev = "600894ec6eb657586a972a9ecd268f50907a279c";
-      sha256 = "1bxphwnq4b80ssmairy8sfc5cp4m6jyvrcjcj63q1vk7cs6qls7p";
-    };
     description = "Fast MegaDrive/MegaCD/32X emulator";
     license = "MAME";
 
     extraBuildInputs = [ libpng SDL ];
     SDL_CONFIG = "${SDL.dev}/bin/sdl-config";
     dontAddPrefix = true;
-    configurePlatforms = [];
+    configurePlatforms = [ ];
     makeFlags = lib.optional stdenv.hostPlatform.isAarch64 [ "platform=aarch64" ];
   };
 
   play = mkLibRetroCore {
     core = "play";
-    src = fetchRetro {
-      repo = "play-";
-      rev = "884ae3b96c631f235cd18b2643d1f318fa6951fb";
-      sha256 = "0m9pk20jh4y02visgzfw64bpbw93bzs15x3a3bnd19yivm34dbfc";
-    };
     description = "Port of Play! to libretro";
-    license = bsd2;
+    license = lib.licenses.bsd2;
     extraBuildInputs = [ boost ];
     extraNativeBuildInputs = [ cmake openssl curl icu libGL libGLU xorg.libX11 ];
     makefile = "Makefile";
@@ -832,22 +616,8 @@ in with lib.licenses;
 
   ppsspp = mkLibRetroCore {
     core = "ppsspp";
-    src = fetchFromGitHub {
-      owner = "hrydgard";
-      repo = "ppsspp";
-      rev = "v1.11";
-      fetchSubmodules = true;
-      sha256 = "sha256-vfp/vacIItlPP5dR7jzDT7oOUNFnjvvdR46yi79EJKU=";
-    };
-    patches = [
-      (fetchpatch {
-        name = "fix_ffmpeg_4.4.patch";  # to be removed with next release
-        url = "https://patch-diff.githubusercontent.com/raw/hrydgard/ppsspp/pull/14176.patch";
-        sha256 = "sha256-ecDoOydaLfL6+eFpahcO1TnRl866mZZVHlr6Qrib1mo=";
-      })
-    ];
     description = "ppsspp libretro port";
-    license = gpl2;
+    license = lib.licenses.gpl2Plus;
     extraNativeBuildInputs = [ cmake pkg-config python3 ];
     extraBuildInputs = [ libGLU libGL libzip ffmpeg snappy xorg.libX11 ];
     makefile = "Makefile";
@@ -855,114 +625,69 @@ in with lib.licenses;
     postBuild = "mv lib/ppsspp_libretro${stdenv.hostPlatform.extensions.sharedLibrary} ppsspp_libretro${stdenv.hostPlatform.extensions.sharedLibrary}";
   };
 
-  prboom = mkLibRetroCore rec {
+  prboom = mkLibRetroCore {
     core = "prboom";
-    src = fetchRetro {
-      repo = "libretro-" + core;
-      rev = "991016b3c7a9c8b0e49b2bc9c72f68c60800fc7b";
-      sha256 = "1abv9qgfvh3x84shgyl3y90bjz77mjj17vibag7bg6i8hgjikjgq";
-    };
     description = "Prboom libretro port";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  prosystem = mkLibRetroCore rec {
+  prosystem = mkLibRetroCore {
     core = "prosystem";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "6f7e34aea89db5ba2fbf674e5ff0ad6fc68a198e";
-      sha256 = "0pqkb0f51s8ma0l4m9xk2y85z2kh3fgay9g4g8fingbgqq1klvzs";
-    };
     description = "Port of ProSystem to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
   quicknes = mkLibRetroCore {
     core = "quicknes";
-    src = fetchRetro {
-      repo = "QuickNES_Core";
-      rev = "31654810b9ebf8b07f9c4dc27197af7714364ea7";
-      sha256 = "15fr5a9hv7wgndb0fpmr6ws969him41jidzir2ix9xkb0mmvcm86";
-    };
     description = "QuickNES libretro port";
-    license = lgpl21Plus;
+    license = lib.licenses.lgpl21Plus;
     makefile = "Makefile";
   };
 
-  sameboy = mkLibRetroCore rec {
+  sameboy = mkLibRetroCore {
     core = "sameboy";
-    src = fetchRetro {
-      repo = "sameboy";
-      rev = "c9e547c1063fd62c40a4b7a86e7db99dc9089051";
-      sha256 = "0bff6gicm24d7h270aqvgd8il6mi7j689nj5zl9ij0wc77hrrpmq";
-    };
     description = "SameBoy libretro port";
-    license = mit;
+    license = lib.licenses.mit;
     extraNativeBuildInputs = [ which hexdump ];
     preBuild = "cd libretro";
     makefile = "Makefile";
   };
 
-  scummvm = mkLibRetroCore rec {
+  scummvm = mkLibRetroCore {
     core = "scummvm";
-    src = fetchRetro {
-      repo = core;
-      rev = "de91bf9bcbf4449f91e2f50fde173496a2b52ee0";
-      sha256 = "06h9xaf2b1cjk85nbslpjj0fm9iy9b2lxr1wf3i09hgs4sh6x464";
-    };
     description = "Libretro port of ScummVM";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     extraBuildInputs = [ fluidsynth libjpeg libvorbis libGLU libGL SDL ];
     makefile = "Makefile";
     preConfigure = "cd backends/platform/libretro/build";
   };
 
-  smsplus-gx = mkLibRetroCore rec {
+  smsplus-gx = mkLibRetroCore {
     core = "smsplus";
-    src = fetchRetro {
-      repo = core + "-gx";
-      rev = "36c82768c03d889f1cf4b66369edac2297acba32";
-      sha256 = "1f9waikyp7kp2abb76wlv9hmf2jpc76zjmfqyc7wk2pc70ljm3l4";
-    };
+    src = getCoreSrc "smsplus-gx";
     description = "SMS Plus GX libretro port";
-    license = gpl2Plus;
+    license = lib.licenses.gpl2Plus;
   };
 
-  snes9x = mkLibRetroCore rec {
+  snes9x = mkLibRetroCore {
     core = "snes9x";
-    src = fetchFromGitHub {
-      owner = "snes9xgit";
-      repo = core;
-      rev = "bd9246ddd75a5e9f78d6189c8c57754d843630f7";
-      sha256 = "10fm7ah3aha9lf4k9hgw0dlhdvshzpig2d0ylcb12gf9zz0i22ns";
-    };
     description = "Port of SNES9x git to libretro";
     license = "Non-commercial";
     makefile = "Makefile";
     preBuild = "cd libretro";
   };
 
-  snes9x2002 = mkLibRetroCore rec {
+  snes9x2002 = mkLibRetroCore {
     core = "snes9x2002";
-    src = fetchRetro {
-      repo = core;
-      rev = "a869da7f22c63ee1cb316f79c6dd7691a369da3e";
-      sha256 = "11lcwscnxg6sk9as2xlr4nai051qhidbsymyis4nz3r4dmgzf8j8";
-    };
     description = "Optimized port/rewrite of SNES9x 1.39 to Libretro";
     license = "Non-commercial";
     makefile = "Makefile";
   };
 
-  snes9x2005 = mkLibRetroCore rec {
+  snes9x2005 = mkLibRetroCore {
     core = "snes9x2005";
-    src = fetchRetro {
-      repo = core;
-      rev = "c216559b9e0dc3d7f059dcf31b813402ad47fea5";
-      sha256 = "19b2rpj6i32c34ryvlna4yca84y5ypza78w4x9l17qlhp021h9pv";
-    };
     description = "Optimized port/rewrite of SNES9x 1.43 to Libretro";
     license = "Non-commercial";
     makefile = "Makefile";
@@ -970,66 +695,40 @@ in with lib.licenses;
     postBuild = "mv snes9x2005_plus_libretro${stdenv.hostPlatform.extensions.sharedLibrary} snes9x2005_libretro${stdenv.hostPlatform.extensions.sharedLibrary}";
   };
 
-  snes9x2010 = mkLibRetroCore rec {
+  snes9x2010 = mkLibRetroCore {
     core = "snes9x2010";
-    src = fetchRetro {
-      repo = core;
-      rev = "ba9f2240360f8db270fb6ba5465c79c317070560";
-      sha256 = "00y53sjrsp8sccpp1qqw88iawsz30g6d370cbqcxs4ya1r6awn5x";
-    };
     description = "Optimized port/rewrite of SNES9x 1.52+ to Libretro";
     license = "Non-commercial";
   };
 
-  stella = mkLibRetroCore rec {
+  stella = mkLibRetroCore {
     core = "stella";
-    src = fetchFromGitHub {
-      owner = "stella-emu";
-      repo = core;
-      rev = "506bb0bd0618e676b1959931dcc00a9d0f5f0f3d";
-      sha256 = "09nclx0ksixngnxkkjjcyhf3d0vl4ykm8fx7m307lvag8nxj7z03";
-    };
     description = "Port of Stella to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     extraBuildInputs = [ libpng pkg-config SDL ];
     makefile = "Makefile";
     preBuild = "cd src/libretro";
     dontConfigure = true;
   };
 
-  stella2014 = mkLibRetroCore rec {
+  stella2014 = mkLibRetroCore {
     core = "stella2014";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "fc87f2c78d3b177f4b9b19698557dce452ac3ce7";
-      sha256 = "0yqzavk1w0d0ngpls32c4wlihii97fz2g6zsgadhm48apwjvn3xx";
-    };
     description = "Port of Stella to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  tgbdual = mkLibRetroCore rec {
+  tgbdual = mkLibRetroCore {
     core = "tgbdual";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "9be31d373224cbf288db404afc785df41e61b213";
-      sha256 = "19m3f3hj3jyg711z1xq8qn1hgsr593krl6s6hi0r6vf8p5x0zbzw";
-    };
     description = "Port of TGBDual to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
   };
 
-  thepowdertoy = mkLibRetroCore rec {
+  thepowdertoy = mkLibRetroCore {
     core = "thepowdertoy";
-    src = fetchRetro {
-      repo = "ThePowderToy";
-      rev = "0ff547e89ae9d6475b0226db76832daf03eec937";
-      sha256 = "kDpmo/RPYRvROOX3AhsB5pIl0MfHbQmbyTMciLPDNew=";
-    };
     description = "Port of The Powder Toy to libretro";
-    license = gpl3Only;
+    license = lib.licenses.gpl3Only;
     extraNativeBuildInputs = [ cmake ];
     makefile = "Makefile";
     postBuild = "cd src/";
@@ -1037,14 +736,9 @@ in with lib.licenses;
 
   tic80 = mkLibRetroCore {
     core = "tic80";
-    src = fetchRetro {
-      repo = "tic-80";
-      rev = "f43bad908d5f05f2a66d5cd1d6f21b234d4abd2c";
-      sha256 = "0bp34r8qqyw52alws1z4ib9j7bs4d641q6nvqszd07snp9lpvwym";
-    };
     description = "Port of TIC-80 to libretro";
-    license = mit;
-    extraNativeBuildInputs = [ cmake pkg-config ];
+    license = lib.licenses.mit;
+    extraNativeBuildInputs = [ cmake pkg-config libGL libGLU ];
     makefile = "Makefile";
     cmakeFlags = [
       "-DBUILD_LIBRETRO=ON"
@@ -1057,66 +751,42 @@ in with lib.licenses;
     postBuild = "cd lib";
   };
 
-  vba-next = mkLibRetroCore rec {
+  vba-next = mkLibRetroCore {
     core = "vba-next";
-    src = fetchRetro {
-      repo = core;
-      rev = "019132daf41e33a9529036b8728891a221a8ce2e";
-      sha256 = "0hab4rhvvcg30jifd9h9jq5q2vqk2hz5i1q456w6v2d10hl1lf15";
-    };
     description = "VBA-M libretro port with modifications for speed";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
   };
 
-  vba-m = mkLibRetroCore rec {
+  vba-m = mkLibRetroCore {
     core = "vbam";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "7d88e045a2fe44e56b3f84846beec446b4c4b2d9";
-      sha256 = "04f8adg99a36qkqhij54vkw5z18m5ld33p78lbmv8cxk7k7g7yhy";
-    };
+    src = getCoreSrc "vba-m";
     description = "vanilla VBA-M libretro port";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
     preBuild = "cd src/libretro";
   };
 
-  vecx = mkLibRetroCore rec {
+  vecx = mkLibRetroCore {
     core = "vecx";
-    src = fetchRetro {
-      repo = "libretro-" + core;
-      rev = "321205271b1c6be5dbdb8d309097a5b5c2032dbd";
-      sha256 = "1w54394yhf2yqmq1b8wi5y7lvixc5hpjxpyiancrdbjd0af7pdvd";
-    };
     description = "Port of Vecx to libretro";
-    license = gpl3;
+    license = lib.licenses.gpl3Only;
+    extraBuildInputs = [ libGL libGLU ];
   };
 
-  virtualjaguar = mkLibRetroCore rec {
+  virtualjaguar = mkLibRetroCore {
     core = "virtualjaguar";
-    src = fetchRetro {
-      repo = core + "-libretro";
-      rev = "a162fb75926f5509f187e9bfc69958bced40b0a6";
-      sha256 = "06k8xpn5y9rzmi2lwfw0v9v9pz4wvmpalycc608bw9cl39lmz10h";
-    };
     description = "Port of VirtualJaguar to libretro";
-    license = gpl3;
+    license = lib.licenses.gpl3Only;
     makefile = "Makefile";
   };
 
-  yabause = mkLibRetroCore rec {
+  yabause = mkLibRetroCore {
     core = "yabause";
-    src = fetchRetro {
-      repo = core;
-      rev = "9be109f9032afa793d2a79b837c4cc232cea5929";
-      sha256 = "0aj862bs4dmnldy62wdssj5l63ibfkbzqvkxcqa3wyvdz4i367jc";
-    };
     description = "Port of Yabause to libretro";
-    license = gpl2;
+    license = lib.licenses.gpl2Only;
     makefile = "Makefile";
     # Disable SSE for non-x86. DYNAREC doesn't build on either Aarch64 or x86_64.
     makeFlags = lib.optional (!stdenv.hostPlatform.isx86) "HAVE_SSE=0";
     preBuild = "cd yabause/src/libretro";
   };
-
 }
diff --git a/pkgs/misc/emulators/retroarch/default.nix b/pkgs/misc/emulators/retroarch/default.nix
index f5db3d427f9..e4c09c3c8f6 100644
--- a/pkgs/misc/emulators/retroarch/default.nix
+++ b/pkgs/misc/emulators/retroarch/default.nix
@@ -22,12 +22,13 @@ with lib;
 
 stdenv.mkDerivation rec {
   pname = "retroarch-bare";
-  version = "1.8.5";
+  # FIXME: retroarch >=1.9.3 doesn't load the cores
+  version = "1.9.2";
 
   src = fetchFromGitHub {
     owner = "libretro";
     repo = "RetroArch";
-    sha256 = "1pg8j9wvwgrzsv4xdai6i6jgdcc922v0m42rbqxvbghbksrc8la3";
+    sha256 = "sha256-Dwv0hl+d99FbVMG4KnkjO1aYfAw0m4x+zvrbyb/wOX8=";
     rev = "v${version}";
   };
 
@@ -55,8 +56,8 @@ stdenv.mkDerivation rec {
   meta = {
     homepage = "https://libretro.com";
     description = "Multi-platform emulator frontend for libretro cores";
-    license = licenses.gpl3;
+    license = licenses.gpl3Plus;
     platforms = platforms.all;
-    maintainers = with maintainers; [ MP2E edwtjo matthewbauer kolbycrouch ];
+    maintainers = with maintainers; [ MP2E edwtjo matthewbauer kolbycrouch thiagokokada ];
   };
 }
diff --git a/pkgs/misc/emulators/retroarch/hashes.json b/pkgs/misc/emulators/retroarch/hashes.json
new file mode 100644
index 00000000000..a849a37bfab
--- /dev/null
+++ b/pkgs/misc/emulators/retroarch/hashes.json
@@ -0,0 +1,513 @@
+{
+    "atari800": {
+        "owner": "libretro",
+        "repo": "libretro-atari800",
+        "rev": "478a8ec99a7f8436a39d5ac193c5fe313233ee7b",
+        "sha256": "LJpRegJVR2+sS1UmTTpVest0rMrNDBMXmj/jRFVglWI=",
+        "fetchSubmodules": false
+    },
+    "beetle-snes": {
+        "owner": "libretro",
+        "repo": "beetle-bsnes-libretro",
+        "rev": "bc867656d7438aaffc6818b3b92350587bc78a47",
+        "sha256": "TyUCRGK+uyXowDjXW9/4m+zL8Vh/3GGsX1eznrTCbAg=",
+        "fetchSubmodules": false
+    },
+    "beetle-gba": {
+        "owner": "libretro",
+        "repo": "beetle-gba-libretro",
+        "rev": "38182572571a48cb58057cde64b915237c4e2d58",
+        "sha256": "4xnXWswozlcXBNI1lbGSNW/gAdIeLLO9Bf1SxOFLhSo=",
+        "fetchSubmodules": false
+    },
+    "beetle-lynx": {
+        "owner": "libretro",
+        "repo": "beetle-lynx-libretro",
+        "rev": "b84c79b2f185482f9cec2b10f33cbe1bc5732dd9",
+        "sha256": "pR3EsFN/Wf77gPoAnjf/nI0XlB2098qIrmbdjB4jmMQ=",
+        "fetchSubmodules": false
+    },
+    "beetle-ngp": {
+        "owner": "libretro",
+        "repo": "beetle-ngp-libretro",
+        "rev": "f969af2b52f20642aea7e800e3cfcce728f3aee9",
+        "sha256": "GIzLZ3iOJeHKdAowhM4S56iouaxX8v2XZgc/ZiCzCPk=",
+        "fetchSubmodules": false
+    },
+    "beetle-pce-fast": {
+        "owner": "libretro",
+        "repo": "beetle-pce-fast-libretro",
+        "rev": "81d4c9d07a76c89c32ad0e7450b69bde6403836f",
+        "sha256": "LhQbAEUMhoIF3VfwLbhtD7xxSddzdgwIHHnSabQPAvs=",
+        "fetchSubmodules": false
+    },
+    "beetle-pcfx": {
+        "owner": "libretro",
+        "repo": "beetle-pcfx-libretro",
+        "rev": "a1f1734509dd6acb11269f118d61f480ae8dbacf",
+        "sha256": "rvRDuYJLxb1TSwNXhp3ATJW0sQgWi8Cj4NR3hep/AJk=",
+        "fetchSubmodules": false
+    },
+    "beetle-psx": {
+        "owner": "libretro",
+        "repo": "beetle-psx-libretro",
+        "rev": "ccca81930a078c0efd77b00327d2ee212698f3b4",
+        "sha256": "Hy8Zrp0kTR+Mfbq0nVYerSarRCxZI+ykgDOscakDMiU=",
+        "fetchSubmodules": false
+    },
+    "beetle-saturn": {
+        "owner": "libretro",
+        "repo": "beetle-saturn-libretro",
+        "rev": "e1119e91a4e3f4b30971455aeb3c1a6f4cd05e59",
+        "sha256": "lKlNNAHK1ynFXY++Ya0m1Ax5YTZkd44eQjzuOLXfWa8=",
+        "fetchSubmodules": false
+    },
+    "beetle-supergrafx": {
+        "owner": "libretro",
+        "repo": "beetle-supergrafx-libretro",
+        "rev": "59062662d6e925ad512fcbb9c1a0db97d1592bc1",
+        "sha256": "kGyl5XJMFUALPAEZf4IynY6bmXWfqy0o65eO8zS0RTE=",
+        "fetchSubmodules": false
+    },
+    "beetle-wswan": {
+        "owner": "libretro",
+        "repo": "beetle-wswan-libretro",
+        "rev": "0c7faaf7f70b72ebb68e310530cd46a69e680d40",
+        "sha256": "UQyICcZe1DVotSFt0QVnGop+JG5NJwTBcGSZaFW0P0U=",
+        "fetchSubmodules": false
+    },
+    "beetle-vb": {
+        "owner": "libretro",
+        "repo": "beetle-vb-libretro",
+        "rev": "1bd0da71c8f6add253ad76e2b6e1357cd09fc304",
+        "sha256": "KguKbRK0uXE+brpF8HdRwi8Gt76AMa4wkh1MFvNCbN4=",
+        "fetchSubmodules": false
+    },
+    "bluemsx": {
+        "owner": "libretro",
+        "repo": "bluemsx-libretro",
+        "rev": "cfc1df4d026387883f21994bcce603c4a6be8730",
+        "sha256": "ix/AyYNer1R73ZJW1reXyj7geBr3ThrqXf5Ki5yrz9A=",
+        "fetchSubmodules": false
+    },
+    "bsnes-mercury": {
+        "owner": "libretro",
+        "repo": "bsnes-mercury",
+        "rev": "d232c6ea90552f5921fec33a06626f08d3e18b24",
+        "sha256": "fpl7hmqz+Ca+9ZeM6E1JSikbiu+NJUU8xXtyl6Dd9Gg=",
+        "fetchSubmodules": false
+    },
+    "citra": {
+        "owner": "libretro",
+        "repo": "citra",
+        "rev": "b1959d07a340bfd9af65ad464fd19eb6799a96ef",
+        "sha256": "Tw6Niba9gsZOMKGaXF9AZ5gdigB0mmFyqoRTMElM/Ps=",
+        "fetchSubmodules": true
+    },
+    "desmume": {
+        "owner": "libretro",
+        "repo": "desmume",
+        "rev": "7ea0fc96804fcd9c8d33e8f76cf64b1be50cc5ea",
+        "sha256": "4S/CirRVOBN6PVbato5X5fu0tBn3Fu5FEAbdf3TBqng=",
+        "fetchSubmodules": false
+    },
+    "desmume2015": {
+        "owner": "libretro",
+        "repo": "desmume2015",
+        "rev": "cd89fb7c48c735cb321311fbce7e6e9889dda1ce",
+        "sha256": "9Ou/n6pxRjJOp/Ybpyg4+Simosj2X26kLZCMEqeVL6U=",
+        "fetchSubmodules": false
+    },
+    "dolphin": {
+        "owner": "libretro",
+        "repo": "dolphin",
+        "rev": "82e617439b622af5d1189e9fec67e7f1376be099",
+        "sha256": "Q3a+0SYocX1hBGLs1K9r932NkiCDFINPhtHeyzUknJE=",
+        "fetchSubmodules": false
+    },
+    "dosbox": {
+        "owner": "libretro",
+        "repo": "dosbox-libretro",
+        "rev": "aa71b67d54eaaf9e41cdd3cb5153d9cff0ad116e",
+        "sha256": "L0Y67UROjldnXUlLQ+Xbd7RHLb96jDxlB/k+LR9Kbas=",
+        "fetchSubmodules": false
+    },
+    "eightyone": {
+        "owner": "libretro",
+        "repo": "81-libretro",
+        "rev": "30344d3499fdb301ee33de136f7b390bebe0756a",
+        "sha256": "kMwga9MkjV+dKxW3VLu+rxst6H20HhREoiNBsCLa1G0=",
+        "fetchSubmodules": false
+    },
+    "fbalpha2012": {
+        "owner": "libretro",
+        "repo": "fbalpha2012",
+        "rev": "23f98fc7cf4f2f216149c263cf5913d2e28be8d4",
+        "sha256": "dAInW6tTV7oXcPhKMnHWcmQaWQCTqRrYHD2yuaI1I1w=",
+        "fetchSubmodules": false
+    },
+    "fbneo": {
+        "owner": "libretro",
+        "repo": "fbneo",
+        "rev": "4d6387b7f3e3f1a9c25015789d751c6db1a9ae8c",
+        "sha256": "bIOmvhu9mOfOXoOTbwbjMHIZ3JkGz96yyFZALmqkOmk=",
+        "fetchSubmodules": false
+    },
+    "fceumm": {
+        "owner": "libretro",
+        "repo": "libretro-fceumm",
+        "rev": "a918869c18c9f30b84e04260b78b675b8a3c7be1",
+        "sha256": "nDYPrwIsvhWveDQDE0WEK7GO60iRE967p1XxXn+lNj4=",
+        "fetchSubmodules": false
+    },
+    "flycast": {
+        "owner": "libretro",
+        "repo": "flycast",
+        "rev": "ae670ea28fdbb9f08149cb598312a71a0970ca67",
+        "sha256": "jmSOfyak5mX04HgZOtCF9cz8HqAApxDXHJ6IqhqGILE=",
+        "fetchSubmodules": false
+    },
+    "fmsx": {
+        "owner": "libretro",
+        "repo": "fmsx-libretro",
+        "rev": "20c805409b8f6e1f9d61cb3dff0d5b28d82d1ee3",
+        "sha256": "uqqVF2+YpfWOKbe8aIreoImFb3/kL8ohslJkl+JivQI=",
+        "fetchSubmodules": false
+    },
+    "freeintv": {
+        "owner": "libretro",
+        "repo": "freeintv",
+        "rev": "0058a09492c5c17a4fa59ebb3601ce66844b3b25",
+        "sha256": "DA6eAl9ZR84Ow8rH9q/DVbEU83nmidwMy3kqk+hWWLQ=",
+        "fetchSubmodules": false
+    },
+    "gambatte": {
+        "owner": "libretro",
+        "repo": "gambatte-libretro",
+        "rev": "4b822bcf561856689e101dd5505d365de5ffcffe",
+        "sha256": "FsIQLd/UO5xs/aTpggSn8WLPgi83gsxRlwKR+UzH+TY=",
+        "fetchSubmodules": false
+    },
+    "genesis-plus-gx": {
+        "owner": "libretro",
+        "repo": "Genesis-Plus-GX",
+        "rev": "309a4aacfd582c312dcad61b7abfdffba4a0c66e",
+        "sha256": "jnbey1USldDZGXGXLLR5TgSJZgD+6ZFpwfIf6c8xvyM=",
+        "fetchSubmodules": false
+    },
+    "gpsp": {
+        "owner": "libretro",
+        "repo": "gpsp",
+        "rev": "a2aa78733d8daf1d550c9dc76c6ff94e8670b31c",
+        "sha256": "nKim7YkksUyZO97SvrW1TEYQlA+7Yi7xbLtyDPV4LWc=",
+        "fetchSubmodules": false
+    },
+    "gw": {
+        "owner": "libretro",
+        "repo": "gw-libretro",
+        "rev": "0f1ccca156388880bf4507ad44741f80945dfc6f",
+        "sha256": "BVpx8pL224J2u9W6UDrxzfEv4qIsh6wrf3bDdd1R850=",
+        "fetchSubmodules": false
+    },
+    "handy": {
+        "owner": "libretro",
+        "repo": "libretro-handy",
+        "rev": "e7b4e32d5f32d6e96630072072844a7dd16a02d9",
+        "sha256": "dQpEqxOcac7gdbmWu4HTvFx++us/spVMfroBlLTAgF0=",
+        "fetchSubmodules": false
+    },
+    "hatari": {
+        "owner": "libretro",
+        "repo": "hatari",
+        "rev": "cea06eebf695b078fadc0e78bb0f2b2baaca799f",
+        "sha256": "Z05IGubwdgg7X/e2ZG49zVfXuITM59HW/1gicdpDXls=",
+        "fetchSubmodules": false
+    },
+    "mame": {
+        "owner": "libretro",
+        "repo": "mame",
+        "rev": "031ac783585e7d5156a6f87a9ba20d88caf94ad6",
+        "sha256": "hLMQw5jvJTxojGwCY7iUDHcJdLZjcLzEDhW576TerJI=",
+        "fetchSubmodules": false
+    },
+    "mame2000": {
+        "owner": "libretro",
+        "repo": "mame2000-libretro",
+        "rev": "4793742b457945afb74053c8a895e6ff0b36b033",
+        "sha256": "DA9fZTic/jlYzSAIiOjfhohyEyQZiBNdIa8YCZoKZNs=",
+        "fetchSubmodules": false
+    },
+    "mame2003": {
+        "owner": "libretro",
+        "repo": "mame2003-libretro",
+        "rev": "d0ed1a565803cfada9f4088326eae616f6e5f8a3",
+        "sha256": "JGEy6Mp5qcZwaehzbj+qpdBfxHzqi6qIR7akxIj/WK8=",
+        "fetchSubmodules": false
+    },
+    "mame2003-plus": {
+        "owner": "libretro",
+        "repo": "mame2003-plus-libretro",
+        "rev": "841e44dff953a346127f15be53cb34778e20ce1c",
+        "sha256": "aCXyeDcz0uSObe4S2bQWCxIAF5aA3kne5v0HT+oXHuw=",
+        "fetchSubmodules": false
+    },
+    "mame2010": {
+        "owner": "libretro",
+        "repo": "mame2010-libretro",
+        "rev": "932e6f2c4f13b67b29ab33428a4037dee9a236a8",
+        "sha256": "HSZRSnc+0300UE9fPcUOMrXABlxHhTewkFPTqQ4Srxs=",
+        "fetchSubmodules": false
+    },
+    "mame2015": {
+        "owner": "libretro",
+        "repo": "mame2015-libretro",
+        "rev": "ef41361dc9c88172617f7bbf6cd0ead4516a3c3f",
+        "sha256": "HZrw9KKwYAJyU4NH1BEvuod/TK/nqjN03qJuSX8JP8o=",
+        "fetchSubmodules": false
+    },
+    "mame2016": {
+        "owner": "libretro",
+        "repo": "mame2016-libretro",
+        "rev": "d53c379892b0bd91b4a52fc2de491e1199f03e32",
+        "sha256": "GQ4Sdg/1nZRT4Z1Aqq1zPo96duqIGyt6sjghf9ap2Jg=",
+        "fetchSubmodules": false
+    },
+    "mesen": {
+        "owner": "SourMesen",
+        "repo": "mesen",
+        "rev": "86326e832974d984846ae078e568c023a5f76f1f",
+        "sha256": "At5rhlJ6rAnXaQrmRA1NtCCi+Ff/ytlt5dwsaXZhxXg=",
+        "fetchSubmodules": false
+    },
+    "meteor": {
+        "owner": "libretro",
+        "repo": "meteor-libretro",
+        "rev": "e533d300d0561564451bde55a2b73119c768453c",
+        "sha256": "zMkgzUz2rk0SD5ojY4AqaDlNM4k4QxuUxVBRBcn6TqQ=",
+        "fetchSubmodules": false
+    },
+    "mgba": {
+        "owner": "libretro",
+        "repo": "mgba",
+        "rev": "033e067285745909722df930deaeead80ea2d54a",
+        "sha256": "ZFmiVOf8H3PtSCWTtYc3XsIpiJI6XZ2v/HsusQsg7H8=",
+        "fetchSubmodules": false
+    },
+    "mupen64plus": {
+        "owner": "libretro",
+        "repo": "mupen64plus-libretro-nx",
+        "rev": "018ee72b4fe247b38ed161033ad12a19bb936f00",
+        "sha256": "vJz9S9lUgJp8O0NgJF6/EYymFqwZefvrT/HJLpMhgEk=",
+        "fetchSubmodules": false
+    },
+    "neocd": {
+        "owner": "libretro",
+        "repo": "neocd_libretro",
+        "rev": "83d10f3be10fff2f28aa56fc674c687528cb7f5c",
+        "sha256": "yYZGoMsUfE8cpU9i826UWQGi1l0zPJPcBDb2CINxGeQ=",
+        "fetchSubmodules": false
+    },
+    "nestopia": {
+        "owner": "libretro",
+        "repo": "nestopia",
+        "rev": "ea6f1c0631bb62bf15ab96493127dd9cfaf74d1c",
+        "sha256": "v+5000V1SR1sXWHryoZEi5sTgaRlVMrHmWKJX2stdSk=",
+        "fetchSubmodules": false
+    },
+    "np2kai": {
+        "owner": "AZO234",
+        "repo": "NP2kai",
+        "rev": "3e8fedc7c1c6f68faa26589187512474a766ee9e",
+        "sha256": "5bfh/aZOqfHz1x2s5AzZo4zq9qA4w10d9vYuuILdKJQ=",
+        "fetchSubmodules": true
+    },
+    "o2em": {
+        "owner": "libretro",
+        "repo": "libretro-o2em",
+        "rev": "c039e83f2589cb9d21b9aa5dc211954234ab8c97",
+        "sha256": "QQS4mS68C3aTZ4dw7ju6WyPlDjIBoDkIeQduCccAmDQ=",
+        "fetchSubmodules": false
+    },
+    "opera": {
+        "owner": "libretro",
+        "repo": "opera-libretro",
+        "rev": "d8aa7cecf96298bd7ee51718086f7b1bc8c57e2a",
+        "sha256": "1t+zwCVmqiPFFNCNq9XzVfRGbEA1q8v4jzhOb+wV/nA=",
+        "fetchSubmodules": false
+    },
+    "parallel-n64": {
+        "owner": "libretro",
+        "repo": "parallel-n64",
+        "rev": "0a67445ce63513584d92e5c57ea87efe0da9b3bd",
+        "sha256": "rms+T8JOp/TJ/T5a5uLj8lu1LLz/GAsJZ7UbK42C9yU=",
+        "fetchSubmodules": false
+    },
+    "pcsx_rearmed": {
+        "owner": "libretro",
+        "repo": "pcsx_rearmed",
+        "rev": "589bd99ba31de8216624dbf0cbbc016f0663ce3d",
+        "sha256": "6OtsWXTo6ca0M/cofpvWPEd0Tqy3XDa8vaa7OUTxnMU=",
+        "fetchSubmodules": false
+    },
+    "picodrive": {
+        "owner": "libretro",
+        "repo": "picodrive",
+        "rev": "9cb99ce36f93871b05c5adc2790b2e33e63b50b6",
+        "sha256": "hhdEuri1hSNLAkno8Rwd0Yls11Yh6Q7/+t4T2LH+BaE=",
+        "fetchSubmodules": true
+    },
+    "play": {
+        "owner": "jpd002",
+        "repo": "Play-",
+        "rev": "b8e16159734c2068db0f2f12b11bc16ef55058ce",
+        "sha256": "qjp1rEjmDAAB2wXITA3lAS+ERJuZinoneJToYiYRi/w=",
+        "fetchSubmodules": true
+    },
+    "ppsspp": {
+        "owner": "hrydgard",
+        "repo": "ppsspp",
+        "rev": "b6e7fe1aaf2bbb8f4faa1378bf14f434aea33cc1",
+        "sha256": "Kif6oF8Bjhgc02xKDivCG9RBxj5wxNFEwxl9nX3AZug=",
+        "fetchSubmodules": true
+    },
+    "prboom": {
+        "owner": "libretro",
+        "repo": "libretro-prboom",
+        "rev": "0f5927db4fb7e61f32bc9eccc5f809e54f71a371",
+        "sha256": "DFpDxEUHjuCcHQGxT+impj98vYITeok1SHrRN5Hba4M=",
+        "fetchSubmodules": false
+    },
+    "prosystem": {
+        "owner": "libretro",
+        "repo": "prosystem-libretro",
+        "rev": "f8652c7f2b0edc81685d03204d4963fc4ea9eccd",
+        "sha256": "Ki4Dyb//X8isP0tScqunA/qt2vkX6d2HH7rHhqk3D5k=",
+        "fetchSubmodules": false
+    },
+    "quicknes": {
+        "owner": "libretro",
+        "repo": "QuickNES_Core",
+        "rev": "71b8000b33daab8ed488f8707ccd8d5b623443f8",
+        "sha256": "Wx8nFWy0DQaZlhEMiI2KRwBK0earSVSke7/qXbs0bQ0=",
+        "fetchSubmodules": false
+    },
+    "sameboy": {
+        "owner": "libretro",
+        "repo": "sameboy",
+        "rev": "68f67b3db7747ba7aac84c5c253bc71d5a906525",
+        "sha256": "/4JQ1Tem3UgOUIcsLV0aLU+1R55hMTaT+wWElwj00Q4=",
+        "fetchSubmodules": false
+    },
+    "scummvm": {
+        "owner": "libretro",
+        "repo": "scummvm",
+        "rev": "63e57573a9ffe71a1083ff46d9cd210203b87afb",
+        "sha256": "LTFe8HIX9OSJuJj5YfPigrPAE8nrbSpDckh0hj3w52s=",
+        "fetchSubmodules": false
+    },
+    "smsplus-gx": {
+        "owner": "libretro",
+        "repo": "smsplus-gx",
+        "rev": "3f1ffede55bcfe0168caa484a00bf041ab591abf",
+        "sha256": "fD+grzMPk4uXvmzGf+f9Mor0eefBLHIumCydsSHUsck=",
+        "fetchSubmodules": false
+    },
+    "snes9x": {
+        "owner": "snes9xgit",
+        "repo": "snes9x",
+        "rev": "edc32fc0bd6aea6d5645a03f0f94b72f3cbfa43e",
+        "sha256": "Zeojdoykmk+lpG1z5EdZToGWYDQvSSQqaEr7F68iyk0=",
+        "fetchSubmodules": false
+    },
+    "snes9x2002": {
+        "owner": "libretro",
+        "repo": "snes9x2002",
+        "rev": "e16cb16efa00765b1bc3b8fee195680efb1542c7",
+        "sha256": "0dhLpNy+NUE3mE/ejEwbq3G28/a2HONS5NPslI5LOEc=",
+        "fetchSubmodules": false
+    },
+    "snes9x2005": {
+        "owner": "libretro",
+        "repo": "snes9x2005",
+        "rev": "88a46f7c085f6e2accc4c777e264b9b5cd41cf0e",
+        "sha256": "5wVKK3xhCXkvonwQRyVtd8Afggb0gv8Sv7PEYkDfKRE=",
+        "fetchSubmodules": false
+    },
+    "snes9x2010": {
+        "owner": "libretro",
+        "repo": "snes9x2010",
+        "rev": "714b1c8e08c7580430190119b07e793405773ac2",
+        "sha256": "yKSQEE+lT4V2V1XqemfziHuIt79TcvC0ranU9ounTXo=",
+        "fetchSubmodules": false
+    },
+    "stella": {
+        "owner": "stella-emu",
+        "repo": "stella",
+        "rev": "e1035b74fce26932078d00e8625688927efce34c",
+        "sha256": "+ZvSCnnoKGyToSFqUQOArolFdgUcBBFNjFw8aoVDkYI=",
+        "fetchSubmodules": false
+    },
+    "stella2014": {
+        "owner": "libretro",
+        "repo": "stella2014-libretro",
+        "rev": "934c7a2a44ef038af529b68950ddba4f7ea3478e",
+        "sha256": "s7LQ47sAPTyk4COONk4qnebxCq78zGLIjh3Y2+1fIak=",
+        "fetchSubmodules": false
+    },
+    "tgbdual": {
+        "owner": "libretro",
+        "repo": "tgbdual-libretro",
+        "rev": "1e0c4f931d8c5e859e6d3255d67247d7a2987434",
+        "sha256": "0wHv9DpKuzJ/q5vERqCo4GBLre2ggClBIWSjGnMLQq8=",
+        "fetchSubmodules": false
+    },
+    "thepowdertoy": {
+        "owner": "libretro",
+        "repo": "ThePowderToy",
+        "rev": "ac620c0a89a18774c3ad176a8a1bc596df23ff57",
+        "sha256": "C/X1DbmnucRddemEYml2zN3qr5yoXY3b+nvqfpboS0M=",
+        "fetchSubmodules": false
+    },
+    "tic80": {
+        "owner": "libretro",
+        "repo": "tic-80",
+        "rev": "bd03e6a548676745e81fa95e60b233b5a56420c2",
+        "sha256": "SXJvWX6Q3BrdajNnT4HIf6H2z7dXXvnXTJXf/TYRw4I=",
+        "fetchSubmodules": true
+    },
+    "vba-next": {
+        "owner": "libretro",
+        "repo": "vba-next",
+        "rev": "b218f48bb27b5d3885fa4076ff325922b5acd817",
+        "sha256": "idqGMbMA9mZlIh0QAba3BxpPDi/bFJJkUbnxV3xMOCo=",
+        "fetchSubmodules": false
+    },
+    "vba-m": {
+        "owner": "libretro",
+        "repo": "vbam-libretro",
+        "rev": "254f6effebe882b7d3d29d9e417c6aeeabc08026",
+        "sha256": "vJWjdqJ913NLGL4G15sRPqO/wp9xPsuhUMLUuAbDRKk=",
+        "fetchSubmodules": false
+    },
+    "vecx": {
+        "owner": "libretro",
+        "repo": "libretro-vecx",
+        "rev": "28d6efc8972313903d0802a736ff8c3bc115e78f",
+        "sha256": "VYa8s+HB8IYF+HS6SA+sO5DzpgCtnMGrh88KTVNGICY=",
+        "fetchSubmodules": false
+    },
+    "virtualjaguar": {
+        "owner": "libretro",
+        "repo": "virtualjaguar-libretro",
+        "rev": "d1b1b28a6ad2518b746e3f7537ec6d66db96ec57",
+        "sha256": "Io25dt80fqIqIxwzF2DK9J5UFz6YCUQoqThcIuxdEBo=",
+        "fetchSubmodules": false
+    },
+    "yabause": {
+        "owner": "libretro",
+        "repo": "yabause",
+        "rev": "811f9e81dbff4bed18644e19631fd4893e73e6ee",
+        "sha256": "VstPh0oMEZ7/ts58NjZxBYZZx/7dRTYePhDIQMu0WOo=",
+        "fetchSubmodules": false
+    }
+}
diff --git a/pkgs/misc/emulators/retroarch/update.py b/pkgs/misc/emulators/retroarch/update.py
new file mode 100755
index 00000000000..db43db13575
--- /dev/null
+++ b/pkgs/misc/emulators/retroarch/update.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i python3 -p "python3.withPackages (ps: with ps; [ requests nix-prefetch-github ])" -p "git"
+
+import json
+import sys
+from pathlib import Path
+
+from nix_prefetch_github import nix_prefetch_github
+
+SCRIPT_PATH = Path(__file__).absolute().parent
+HASHES_PATH = SCRIPT_PATH / "hashes.json"
+CORES = {
+    "atari800": {"repo": "libretro-atari800"},
+    "beetle-snes": {"repo": "beetle-bsnes-libretro"},
+    "beetle-gba": {"repo": "beetle-gba-libretro"},
+    "beetle-lynx": {"repo": "beetle-lynx-libretro"},
+    "beetle-ngp": {"repo": "beetle-ngp-libretro"},
+    "beetle-pce-fast": {"repo": "beetle-pce-fast-libretro"},
+    "beetle-pcfx": {"repo": "beetle-pcfx-libretro"},
+    "beetle-psx": {"repo": "beetle-psx-libretro"},
+    "beetle-saturn": {"repo": "beetle-saturn-libretro"},
+    "beetle-supergrafx": {"repo": "beetle-supergrafx-libretro"},
+    "beetle-wswan": {"repo": "beetle-wswan-libretro"},
+    "beetle-vb": {"repo": "beetle-vb-libretro"},
+    "bluemsx": {"repo": "bluemsx-libretro"},
+    "bsnes-mercury": {"repo": "bsnes-mercury"},
+    "citra": {"repo": "citra", "fetch_submodules": True},
+    "desmume": {"repo": "desmume"},
+    "desmume2015": {"repo": "desmume2015"},
+    "dolphin": {"repo": "dolphin"},
+    "dosbox": {"repo": "dosbox-libretro"},
+    "eightyone": {"repo": "81-libretro"},
+    "fbalpha2012": {"repo": "fbalpha2012"},
+    "fbneo": {"repo": "fbneo"},
+    "fceumm": {"repo": "libretro-fceumm"},
+    "flycast": {"repo": "flycast"},
+    "fmsx": {"repo": "fmsx-libretro"},
+    "freeintv": {"repo": "freeintv"},
+    "gambatte": {"repo": "gambatte-libretro"},
+    "genesis-plus-gx": {"repo": "Genesis-Plus-GX"},
+    "gpsp": {"repo": "gpsp"},
+    "gw": {"repo": "gw-libretro"},
+    "handy": {"repo": "libretro-handy"},
+    "hatari": {"repo": "hatari"},
+    "mame": {"repo": "mame"},
+    "mame2000": {"repo": "mame2000-libretro"},
+    "mame2003": {"repo": "mame2003-libretro"},
+    "mame2003-plus": {"repo": "mame2003-plus-libretro"},
+    "mame2010": {"repo": "mame2010-libretro"},
+    "mame2015": {"repo": "mame2015-libretro"},
+    "mame2016": {"repo": "mame2016-libretro"},
+    "mesen": {"repo": "mesen", "owner": "SourMesen"},
+    "meteor": {"repo": "meteor-libretro"},
+    "mgba": {"repo": "mgba"},
+    "mupen64plus": {"repo": "mupen64plus-libretro-nx"},
+    "neocd": {"repo": "neocd_libretro"},
+    "nestopia": {"repo": "nestopia"},
+    "np2kai": {"repo": "NP2kai", "owner": "AZO234", "fetch_submodules": True},
+    "o2em": {"repo": "libretro-o2em"},
+    "opera": {"repo": "opera-libretro"},
+    "parallel-n64": {"repo": "parallel-n64"},
+    "pcsx_rearmed": {"repo": "pcsx_rearmed"},
+    "picodrive": {"repo": "picodrive", "fetch_submodules": True},
+    "play": {"repo": "Play-", "owner": "jpd002", "fetch_submodules": True},
+    "ppsspp": {"repo": "ppsspp", "owner": "hrydgard", "fetch_submodules": True},
+    "prboom": {"repo": "libretro-prboom"},
+    "prosystem": {"repo": "prosystem-libretro"},
+    "quicknes": {"repo": "QuickNES_Core"},
+    "sameboy": {"repo": "sameboy"},
+    "scummvm": {"repo": "scummvm"},
+    "smsplus-gx": {"repo": "smsplus-gx"},
+    "snes9x": {"repo": "snes9x", "owner": "snes9xgit"},
+    "snes9x2002": {"repo": "snes9x2002"},
+    "snes9x2005": {"repo": "snes9x2005"},
+    "snes9x2010": {"repo": "snes9x2010"},
+    "stella": {"repo": "stella", "owner": "stella-emu"},
+    "stella2014": {"repo": "stella2014-libretro"},
+    "tgbdual": {"repo": "tgbdual-libretro"},
+    "thepowdertoy": {"repo": "ThePowderToy"},
+    "tic80": {"repo": "tic-80", "fetch_submodules": True},
+    "vba-next": {"repo": "vba-next"},
+    "vba-m": {"repo": "vbam-libretro"},
+    "vecx": {"repo": "libretro-vecx"},
+    "virtualjaguar": {"repo": "virtualjaguar-libretro"},
+    "yabause": {"repo": "yabause"},
+}
+
+
+def info(*msg):
+    print(*msg, file=sys.stderr)
+
+
+def get_repo_hash_fetchFromGitHub(repo, owner="libretro", fetch_submodules=False):
+    assert repo is not None, "Parameter 'repo' can't be None."
+
+    repo_hash = nix_prefetch_github(
+        owner=owner, repo=repo, fetch_submodules=fetch_submodules
+    )
+    return {
+        "owner": repo_hash.repository.owner,
+        "repo": repo_hash.repository.name,
+        "rev": repo_hash.rev,
+        "sha256": repo_hash.sha256,
+        "fetchSubmodules": repo_hash.fetch_submodules,
+    }
+
+
+def get_repo_hash(fetcher="fetchFromGitHub", **kwargs):
+    if fetcher == "fetchFromGitHub":
+        return get_repo_hash_fetchFromGitHub(**kwargs)
+    else:
+        raise ValueError(f"Unsupported fetcher: {fetcher}")
+
+
+def get_repo_hashes():
+    repo_hashes = {}
+
+    for core, repo in CORES.items():
+        info(f"Getting repo hash for '{core}'...")
+        repo_hashes[core] = get_repo_hash(**repo)
+
+    return repo_hashes
+
+
+def main():
+    repo_hashes = get_repo_hashes()
+    info(f"Generating '{HASHES_PATH}'...")
+    with open(HASHES_PATH, "w") as f:
+        f.write(json.dumps(repo_hashes, indent=4))
+        f.write("\n")
+    info("Finished!")
+
+
+if __name__ == "__main__":
+    main()
diff --git a/pkgs/misc/emulators/retroarch/wrapper.nix b/pkgs/misc/emulators/retroarch/wrapper.nix
index 4cc7ad404be..b8fbd70ecc4 100644
--- a/pkgs/misc/emulators/retroarch/wrapper.nix
+++ b/pkgs/misc/emulators/retroarch/wrapper.nix
@@ -1,4 +1,4 @@
-{ stdenv, lib, makeWrapper, retroarch, cores }:
+{ stdenv, lib, makeWrapper, retroarch, cores ? [ ] }:
 
 stdenv.mkDerivation {
   pname = "retroarch";
@@ -8,10 +8,10 @@ stdenv.mkDerivation {
 
   buildCommand = ''
     mkdir -p $out/lib
-    $(for coreDir in $cores
+    for coreDir in $cores
     do
-      $(ln -s $coreDir/* $out/lib/.)
-    done)
+      ln -s $coreDir/* $out/lib/.
+    done
 
     ln -s -t $out ${retroarch}/share
 
diff --git a/pkgs/servers/heisenbridge/default.nix b/pkgs/servers/heisenbridge/default.nix
index f9f2c1ce7bf..0d1b538ceba 100644
--- a/pkgs/servers/heisenbridge/default.nix
+++ b/pkgs/servers/heisenbridge/default.nix
@@ -2,20 +2,17 @@
 
 python3Packages.buildPythonApplication rec {
   pname = "heisenbridge";
-  version = "1.6.0";
+  version = "1.7.0";
 
   src = fetchFromGitHub {
     owner = "hifi";
     repo = pname;
     rev = "v${version}";
-    sha256 = "sha256-Q7xqKjAUBHh87VAgsgDOCPDINDh0yUdr3UoUlLqJr5k=";
+    sha256 = "sha256-rN+qoBS9zIy5EHlFQxgAlcz9haoYJNMKJ2wlS46UOi0=";
   };
 
   postPatch = ''
     echo "${version}" > heisenbridge/version.txt
-
-    substituteInPlace setup.cfg \
-      --replace "mautrix >=0.10.5, <0.11" "mautrix >=0.10.5, <0.12"
   '';
 
   propagatedBuildInputs = with python3Packages; [
diff --git a/pkgs/servers/mjolnir/default.nix b/pkgs/servers/mjolnir/default.nix
index f6444ef386a..8480cf4e8bf 100644
--- a/pkgs/servers/mjolnir/default.nix
+++ b/pkgs/servers/mjolnir/default.nix
@@ -9,13 +9,13 @@
 
 stdenv.mkDerivation rec {
   pname = "mjolnir";
-  version = "1.1.20";
+  version = "1.2.1";
 
   src = fetchFromGitHub {
     owner = "matrix-org";
     repo = "mjolnir";
     rev = "v${version}";
-    sha256 = "yfMBnNriSpwitR4u664iz+8uWp/3iSTymyFajMBP5xg=";
+    sha256 = "4c9LyQb5SZ1IoBayiP0C0ho4hwJDv49DhsuoQIv9bTs=";
   };
 
   nativeBuildInputs = [
diff --git a/pkgs/servers/mjolnir/node-deps.nix b/pkgs/servers/mjolnir/node-deps.nix
index 30c8a33277e..8a10a95cdd8 100644
--- a/pkgs/servers/mjolnir/node-deps.nix
+++ b/pkgs/servers/mjolnir/node-deps.nix
@@ -4,13 +4,22 @@
 
 let
   sources = {
-    "@babel/code-frame-7.14.5" = {
+    "@babel/code-frame-7.12.11" = {
       name = "_at_babel_slash_code-frame";
       packageName = "@babel/code-frame";
-      version = "7.14.5";
+      version = "7.12.11";
       src = fetchurl {
-        url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz";
-        sha512 = "9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==";
+        url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz";
+        sha512 = "Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==";
+      };
+    };
+    "@babel/code-frame-7.16.0" = {
+      name = "_at_babel_slash_code-frame";
+      packageName = "@babel/code-frame";
+      version = "7.16.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz";
+        sha512 = "IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==";
       };
     };
     "@babel/helper-validator-identifier-7.15.7" = {
@@ -22,31 +31,85 @@ let
         sha512 = "K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==";
       };
     };
-    "@babel/highlight-7.14.5" = {
+    "@babel/highlight-7.16.0" = {
       name = "_at_babel_slash_highlight";
       packageName = "@babel/highlight";
-      version = "7.14.5";
+      version = "7.16.0";
       src = fetchurl {
-        url = "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz";
-        sha512 = "qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==";
+        url = "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz";
+        sha512 = "t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==";
       };
     };
-    "@jest/types-27.1.1" = {
+    "@eslint/eslintrc-0.4.3" = {
+      name = "_at_eslint_slash_eslintrc";
+      packageName = "@eslint/eslintrc";
+      version = "0.4.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz";
+        sha512 = "J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==";
+      };
+    };
+    "@humanwhocodes/config-array-0.5.0" = {
+      name = "_at_humanwhocodes_slash_config-array";
+      packageName = "@humanwhocodes/config-array";
+      version = "0.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz";
+        sha512 = "FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==";
+      };
+    };
+    "@humanwhocodes/object-schema-1.2.1" = {
+      name = "_at_humanwhocodes_slash_object-schema";
+      packageName = "@humanwhocodes/object-schema";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz";
+        sha512 = "ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==";
+      };
+    };
+    "@jest/types-27.2.5" = {
       name = "_at_jest_slash_types";
       packageName = "@jest/types";
-      version = "27.1.1";
+      version = "27.2.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@jest/types/-/types-27.2.5.tgz";
+        sha512 = "nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==";
+      };
+    };
+    "@selderee/plugin-htmlparser2-0.6.0" = {
+      name = "_at_selderee_slash_plugin-htmlparser2";
+      packageName = "@selderee/plugin-htmlparser2";
+      version = "0.6.0";
       src = fetchurl {
-        url = "https://registry.npmjs.org/@jest/types/-/types-27.1.1.tgz";
-        sha512 = "yqJPDDseb0mXgKqmNqypCsb85C22K1aY5+LUxh7syIM9n/b0AsaltxNy+o6tt29VcfGDpYEve175bm3uOhcehA==";
+        url = "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.6.0.tgz";
+        sha512 = "J3jpy002TyBjd4N/p6s+s90eX42H2eRhK3SbsZuvTDv977/E8p2U3zikdiehyJja66do7FlxLomZLPlvl2/xaA==";
       };
     };
-    "@types/body-parser-1.19.1" = {
+    "@tootallnate/once-1.1.2" = {
+      name = "_at_tootallnate_slash_once";
+      packageName = "@tootallnate/once";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz";
+        sha512 = "RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==";
+      };
+    };
+    "@types/axios-0.14.0" = {
+      name = "_at_types_slash_axios";
+      packageName = "@types/axios";
+      version = "0.14.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz";
+        sha1 = "ec2300fbe7d7dddd7eb9d3abf87999964cafce46";
+      };
+    };
+    "@types/body-parser-1.19.2" = {
       name = "_at_types_slash_body-parser";
       packageName = "@types/body-parser";
-      version = "1.19.1";
+      version = "1.19.2";
       src = fetchurl {
-        url = "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz";
-        sha512 = "a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==";
+        url = "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz";
+        sha512 = "ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==";
       };
     };
     "@types/connect-3.4.35" = {
@@ -58,6 +121,15 @@ let
         sha512 = "cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==";
       };
     };
+    "@types/crypto-js-4.0.2" = {
+      name = "_at_types_slash_crypto-js";
+      packageName = "@types/crypto-js";
+      version = "4.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.0.2.tgz";
+        sha512 = "sCVniU+h3GcGqxOmng11BRvf9TfN9yIs8KKjB8C8d75W69cpTfZG80gau9yTx5SxF3gvHGbJhdESzzvnjtf3Og==";
+      };
+    };
     "@types/express-4.17.13" = {
       name = "_at_types_slash_express";
       packageName = "@types/express";
@@ -67,13 +139,13 @@ let
         sha512 = "6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==";
       };
     };
-    "@types/express-serve-static-core-4.17.24" = {
+    "@types/express-serve-static-core-4.17.25" = {
       name = "_at_types_slash_express-serve-static-core";
       packageName = "@types/express-serve-static-core";
-      version = "4.17.24";
+      version = "4.17.25";
       src = fetchurl {
-        url = "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz";
-        sha512 = "3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==";
+        url = "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz";
+        sha512 = "OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==";
       };
     };
     "@types/istanbul-lib-coverage-2.0.3" = {
@@ -103,6 +175,15 @@ let
         sha512 = "c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==";
       };
     };
+    "@types/jsdom-16.2.13" = {
+      name = "_at_types_slash_jsdom";
+      packageName = "@types/jsdom";
+      version = "16.2.13";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.13.tgz";
+        sha512 = "8JQCjdeAidptSsOcRWk2iTm9wCcwn9l+kRG6k5bzUacrnm1ezV4forq0kWjUih/tumAeoG+OspOvQEbbRucBTw==";
+      };
+    };
     "@types/json5-0.0.29" = {
       name = "_at_types_slash_json5";
       packageName = "@types/json5";
@@ -130,13 +211,22 @@ let
         sha512 = "scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==";
       };
     };
-    "@types/node-11.15.54" = {
+    "@types/node-16.11.7" = {
       name = "_at_types_slash_node";
       packageName = "@types/node";
-      version = "11.15.54";
+      version = "16.11.7";
       src = fetchurl {
-        url = "https://registry.npmjs.org/@types/node/-/node-11.15.54.tgz";
-        sha512 = "1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g==";
+        url = "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz";
+        sha512 = "QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==";
+      };
+    };
+    "@types/parse5-6.0.2" = {
+      name = "_at_types_slash_parse5";
+      packageName = "@types/parse5";
+      version = "6.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.2.tgz";
+        sha512 = "+hQX+WyJAOne7Fh3zF5CxPemILIbuhNcqHHodzK9caYOLnC8pD5efmPleRnw0z++LfKUC/sVNMwk0Gap+B0baA==";
       };
     };
     "@types/qs-6.9.7" = {
@@ -175,6 +265,15 @@ let
         sha512 = "Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==";
       };
     };
+    "@types/tough-cookie-4.0.1" = {
+      name = "_at_types_slash_tough-cookie";
+      packageName = "@types/tough-cookie";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.1.tgz";
+        sha512 = "Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==";
+      };
+    };
     "@types/yargs-16.0.4" = {
       name = "_at_types_slash_yargs";
       packageName = "@types/yargs";
@@ -202,6 +301,15 @@ let
         sha512 = "sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==";
       };
     };
+    "abab-2.0.5" = {
+      name = "abab";
+      packageName = "abab";
+      version = "2.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz";
+        sha512 = "9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==";
+      };
+    };
     "accepts-1.3.7" = {
       name = "accepts";
       packageName = "accepts";
@@ -211,6 +319,60 @@ let
         sha512 = "Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==";
       };
     };
+    "acorn-7.4.1" = {
+      name = "acorn";
+      packageName = "acorn";
+      version = "7.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz";
+        sha512 = "nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==";
+      };
+    };
+    "acorn-8.6.0" = {
+      name = "acorn";
+      packageName = "acorn";
+      version = "8.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz";
+        sha512 = "U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==";
+      };
+    };
+    "acorn-globals-6.0.0" = {
+      name = "acorn-globals";
+      packageName = "acorn-globals";
+      version = "6.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz";
+        sha512 = "ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==";
+      };
+    };
+    "acorn-jsx-5.3.2" = {
+      name = "acorn-jsx";
+      packageName = "acorn-jsx";
+      version = "5.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz";
+        sha512 = "rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==";
+      };
+    };
+    "acorn-walk-7.2.0" = {
+      name = "acorn-walk";
+      packageName = "acorn-walk";
+      version = "7.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz";
+        sha512 = "OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==";
+      };
+    };
+    "agent-base-6.0.2" = {
+      name = "agent-base";
+      packageName = "agent-base";
+      version = "6.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz";
+        sha512 = "RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==";
+      };
+    };
     "ajv-6.12.6" = {
       name = "ajv";
       packageName = "ajv";
@@ -220,6 +382,15 @@ let
         sha512 = "j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==";
       };
     };
+    "ajv-8.8.1" = {
+      name = "ajv";
+      packageName = "ajv";
+      version = "8.8.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ajv/-/ajv-8.8.1.tgz";
+        sha512 = "6CiMNDrzv0ZR916u2T+iRunnD60uWmNn8SkdB44/6stVORUg0aAkWO7PkOhpCmjmW8f2I/G/xnowD66fxGyQJg==";
+      };
+    };
     "ansi-colors-4.1.1" = {
       name = "ansi-colors";
       packageName = "ansi-colors";
@@ -229,15 +400,6 @@ let
         sha512 = "JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==";
       };
     };
-    "ansi-regex-3.0.0" = {
-      name = "ansi-regex";
-      packageName = "ansi-regex";
-      version = "3.0.0";
-      src = fetchurl {
-        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
-        sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
-      };
-    };
     "ansi-regex-5.0.1" = {
       name = "ansi-regex";
       packageName = "ansi-regex";
@@ -319,13 +481,13 @@ let
         sha1 = "898508da2226f380df904728456849c1501a4b0d";
       };
     };
-    "asn1-0.2.4" = {
+    "asn1-0.2.6" = {
       name = "asn1";
       packageName = "asn1";
-      version = "0.2.4";
+      version = "0.2.6";
       src = fetchurl {
-        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
-        sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
+        url = "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz";
+        sha512 = "ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==";
       };
     };
     "assert-plus-1.0.0" = {
@@ -337,6 +499,15 @@ let
         sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
       };
     };
+    "astral-regex-2.0.0" = {
+      name = "astral-regex";
+      packageName = "astral-regex";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz";
+        sha512 = "Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==";
+      };
+    };
     "asynckit-0.4.0" = {
       name = "asynckit";
       packageName = "asynckit";
@@ -364,6 +535,15 @@ let
         sha512 = "xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==";
       };
     };
+    "axios-0.21.4" = {
+      name = "axios";
+      packageName = "axios";
+      version = "0.21.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz";
+        sha512 = "ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==";
+      };
+    };
     "balanced-match-1.0.2" = {
       name = "balanced-match";
       packageName = "balanced-match";
@@ -436,6 +616,15 @@ let
         sha512 = "b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==";
       };
     };
+    "browser-process-hrtime-1.0.0" = {
+      name = "browser-process-hrtime";
+      packageName = "browser-process-hrtime";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz";
+        sha512 = "9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==";
+      };
+    };
     "browser-stdout-1.3.1" = {
       name = "browser-stdout";
       packageName = "browser-stdout";
@@ -472,13 +661,22 @@ let
         sha512 = "zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==";
       };
     };
-    "camelcase-6.2.0" = {
+    "callsites-3.1.0" = {
+      name = "callsites";
+      packageName = "callsites";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz";
+        sha512 = "P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==";
+      };
+    };
+    "camelcase-6.2.1" = {
       name = "camelcase";
       packageName = "camelcase";
-      version = "6.2.0";
+      version = "6.2.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz";
-        sha512 = "c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==";
+        url = "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz";
+        sha512 = "tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==";
       };
     };
     "caseless-0.12.0" = {
@@ -562,15 +760,6 @@ let
         sha512 = "dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==";
       };
     };
-    "colorette-1.4.0" = {
-      name = "colorette";
-      packageName = "colorette";
-      version = "1.4.0";
-      src = fetchurl {
-        url = "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz";
-        sha512 = "Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==";
-      };
-    };
     "combined-stream-1.0.8" = {
       name = "combined-stream";
       packageName = "combined-stream";
@@ -589,6 +778,15 @@ let
         sha512 = "GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==";
       };
     };
+    "commandpost-1.4.0" = {
+      name = "commandpost";
+      packageName = "commandpost";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/commandpost/-/commandpost-1.4.0.tgz";
+        sha512 = "aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==";
+      };
+    };
     "concat-map-0.0.1" = {
       name = "concat-map";
       packageName = "concat-map";
@@ -652,6 +850,51 @@ let
         sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
       };
     };
+    "cross-spawn-7.0.3" = {
+      name = "cross-spawn";
+      packageName = "cross-spawn";
+      version = "7.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz";
+        sha512 = "iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==";
+      };
+    };
+    "crypto-js-4.1.1" = {
+      name = "crypto-js";
+      packageName = "crypto-js";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz";
+        sha512 = "o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==";
+      };
+    };
+    "cssom-0.3.8" = {
+      name = "cssom";
+      packageName = "cssom";
+      version = "0.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz";
+        sha512 = "b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==";
+      };
+    };
+    "cssom-0.4.4" = {
+      name = "cssom";
+      packageName = "cssom";
+      version = "0.4.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz";
+        sha512 = "p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==";
+      };
+    };
+    "cssstyle-2.3.0" = {
+      name = "cssstyle";
+      packageName = "cssstyle";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz";
+        sha512 = "AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==";
+      };
+    };
     "dashdash-1.14.1" = {
       name = "dashdash";
       packageName = "dashdash";
@@ -661,6 +904,15 @@ let
         sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
       };
     };
+    "data-urls-2.0.0" = {
+      name = "data-urls";
+      packageName = "data-urls";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz";
+        sha512 = "X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==";
+      };
+    };
     "debug-2.6.9" = {
       name = "debug";
       packageName = "debug";
@@ -670,13 +922,13 @@ let
         sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
       };
     };
-    "debug-4.3.1" = {
+    "debug-4.3.2" = {
       name = "debug";
       packageName = "debug";
-      version = "4.3.1";
+      version = "4.3.2";
       src = fetchurl {
-        url = "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz";
-        sha512 = "doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==";
+        url = "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz";
+        sha512 = "mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==";
       };
     };
     "decamelize-4.0.0" = {
@@ -688,6 +940,24 @@ let
         sha512 = "9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==";
       };
     };
+    "decimal.js-10.3.1" = {
+      name = "decimal.js";
+      packageName = "decimal.js";
+      version = "10.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz";
+        sha512 = "V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==";
+      };
+    };
+    "deep-is-0.1.4" = {
+      name = "deep-is";
+      packageName = "deep-is";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz";
+        sha512 = "oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==";
+      };
+    };
     "deepmerge-4.2.2" = {
       name = "deepmerge";
       packageName = "deepmerge";
@@ -769,6 +1039,24 @@ let
         sha512 = "ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==";
       };
     };
+    "discontinuous-range-1.0.0" = {
+      name = "discontinuous-range";
+      packageName = "discontinuous-range";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz";
+        sha1 = "e38331f0844bba49b9a9cb71c771585aab1bc65a";
+      };
+    };
+    "doctrine-3.0.0" = {
+      name = "doctrine";
+      packageName = "doctrine";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz";
+        sha512 = "yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==";
+      };
+    };
     "dom-serializer-1.3.2" = {
       name = "dom-serializer";
       packageName = "dom-serializer";
@@ -787,6 +1075,15 @@ let
         sha512 = "DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==";
       };
     };
+    "domexception-2.0.1" = {
+      name = "domexception";
+      packageName = "domexception";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz";
+        sha512 = "yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==";
+      };
+    };
     "domhandler-3.3.0" = {
       name = "domhandler";
       packageName = "domhandler";
@@ -823,6 +1120,15 @@ let
         sha1 = "3a83a904e54353287874c564b7549386849a98c9";
       };
     };
+    "editorconfig-0.15.3" = {
+      name = "editorconfig";
+      packageName = "editorconfig";
+      version = "0.15.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz";
+        sha512 = "M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==";
+      };
+    };
     "ee-first-1.1.1" = {
       name = "ee-first";
       packageName = "ee-first";
@@ -850,6 +1156,15 @@ let
         sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
       };
     };
+    "enquirer-2.3.6" = {
+      name = "enquirer";
+      packageName = "enquirer";
+      version = "2.3.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz";
+        sha512 = "yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==";
+      };
+    };
     "entities-2.2.0" = {
       name = "entities";
       packageName = "entities";
@@ -904,6 +1219,69 @@ let
         sha512 = "TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==";
       };
     };
+    "escodegen-2.0.0" = {
+      name = "escodegen";
+      packageName = "escodegen";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz";
+        sha512 = "mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==";
+      };
+    };
+    "eslint-7.32.0" = {
+      name = "eslint";
+      packageName = "eslint";
+      version = "7.32.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz";
+        sha512 = "VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==";
+      };
+    };
+    "eslint-scope-5.1.1" = {
+      name = "eslint-scope";
+      packageName = "eslint-scope";
+      version = "5.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz";
+        sha512 = "2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==";
+      };
+    };
+    "eslint-utils-2.1.0" = {
+      name = "eslint-utils";
+      packageName = "eslint-utils";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz";
+        sha512 = "w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==";
+      };
+    };
+    "eslint-visitor-keys-1.3.0" = {
+      name = "eslint-visitor-keys";
+      packageName = "eslint-visitor-keys";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz";
+        sha512 = "6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==";
+      };
+    };
+    "eslint-visitor-keys-2.1.0" = {
+      name = "eslint-visitor-keys";
+      packageName = "eslint-visitor-keys";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz";
+        sha512 = "0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==";
+      };
+    };
+    "espree-7.3.1" = {
+      name = "espree";
+      packageName = "espree";
+      version = "7.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz";
+        sha512 = "v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==";
+      };
+    };
     "esprima-4.0.1" = {
       name = "esprima";
       packageName = "esprima";
@@ -913,6 +1291,51 @@ let
         sha512 = "eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==";
       };
     };
+    "esquery-1.4.0" = {
+      name = "esquery";
+      packageName = "esquery";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz";
+        sha512 = "cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==";
+      };
+    };
+    "esrecurse-4.3.0" = {
+      name = "esrecurse";
+      packageName = "esrecurse";
+      version = "4.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz";
+        sha512 = "KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==";
+      };
+    };
+    "estraverse-4.3.0" = {
+      name = "estraverse";
+      packageName = "estraverse";
+      version = "4.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz";
+        sha512 = "39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==";
+      };
+    };
+    "estraverse-5.3.0" = {
+      name = "estraverse";
+      packageName = "estraverse";
+      version = "5.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz";
+        sha512 = "MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==";
+      };
+    };
+    "esutils-2.0.3" = {
+      name = "esutils";
+      packageName = "esutils";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz";
+        sha512 = "kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==";
+      };
+    };
     "etag-1.8.1" = {
       name = "etag";
       packageName = "etag";
@@ -922,13 +1345,13 @@ let
         sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
       };
     };
-    "expect-27.2.1" = {
+    "expect-27.3.1" = {
       name = "expect";
       packageName = "expect";
-      version = "27.2.1";
+      version = "27.3.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/expect/-/expect-27.2.1.tgz";
-        sha512 = "ekOA2mBtT2phxcoPVHCXIzbJxCvRXhx2fr7m28IgGdZxUOh8UvxvoRz1FcPlfgZMpE92biHB6woIcAKXqR28hA==";
+        url = "https://registry.npmjs.org/expect/-/expect-27.3.1.tgz";
+        sha512 = "MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg==";
       };
     };
     "express-4.17.1" = {
@@ -976,6 +1399,24 @@ let
         sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
       };
     };
+    "fast-levenshtein-2.0.6" = {
+      name = "fast-levenshtein";
+      packageName = "fast-levenshtein";
+      version = "2.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
+        sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
+      };
+    };
+    "file-entry-cache-6.0.1" = {
+      name = "file-entry-cache";
+      packageName = "file-entry-cache";
+      version = "6.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz";
+        sha512 = "7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==";
+      };
+    };
     "fill-range-7.0.1" = {
       name = "fill-range";
       packageName = "fill-range";
@@ -1012,6 +1453,33 @@ let
         sha512 = "b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==";
       };
     };
+    "flat-cache-3.0.4" = {
+      name = "flat-cache";
+      packageName = "flat-cache";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz";
+        sha512 = "dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==";
+      };
+    };
+    "flatted-3.2.4" = {
+      name = "flatted";
+      packageName = "flatted";
+      version = "3.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz";
+        sha512 = "8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==";
+      };
+    };
+    "follow-redirects-1.14.5" = {
+      name = "follow-redirects";
+      packageName = "follow-redirects";
+      version = "1.14.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz";
+        sha512 = "wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==";
+      };
+    };
     "forever-agent-0.6.1" = {
       name = "forever-agent";
       packageName = "forever-agent";
@@ -1030,6 +1498,15 @@ let
         sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
       };
     };
+    "form-data-3.0.1" = {
+      name = "form-data";
+      packageName = "form-data";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz";
+        sha512 = "RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==";
+      };
+    };
     "forwarded-0.2.0" = {
       name = "forwarded";
       packageName = "forwarded";
@@ -1075,6 +1552,15 @@ let
         sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
       };
     };
+    "functional-red-black-tree-1.0.1" = {
+      name = "functional-red-black-tree";
+      packageName = "functional-red-black-tree";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz";
+        sha1 = "1b0ab3bd553b2a0d6399d29c0e3ea0b252078327";
+      };
+    };
     "get-caller-file-2.0.5" = {
       name = "get-caller-file";
       packageName = "get-caller-file";
@@ -1102,6 +1588,15 @@ let
         sha512 = "OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==";
       };
     };
+    "glob-7.2.0" = {
+      name = "glob";
+      packageName = "glob";
+      version = "7.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz";
+        sha512 = "lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==";
+      };
+    };
     "glob-parent-5.1.2" = {
       name = "glob-parent";
       packageName = "glob-parent";
@@ -1120,6 +1615,15 @@ let
         sha512 = "lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==";
       };
     };
+    "globals-13.12.0" = {
+      name = "globals";
+      packageName = "globals";
+      version = "13.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz";
+        sha512 = "uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==";
+      };
+    };
     "graceful-fs-4.2.8" = {
       name = "graceful-fs";
       packageName = "graceful-fs";
@@ -1201,6 +1705,15 @@ let
         sha512 = "F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==";
       };
     };
+    "html-encoding-sniffer-2.0.1" = {
+      name = "html-encoding-sniffer";
+      packageName = "html-encoding-sniffer";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz";
+        sha512 = "D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==";
+      };
+    };
     "html-to-text-6.0.0" = {
       name = "html-to-text";
       packageName = "html-to-text";
@@ -1210,6 +1723,15 @@ let
         sha512 = "r0KNC5aqCAItsjlgtirW6RW25c92Ee3ybQj8z//4Sl4suE3HIPqM4deGpYCUJULLjtVPEP1+Ma+1ZeX1iMsCiA==";
       };
     };
+    "html-to-text-8.1.0" = {
+      name = "html-to-text";
+      packageName = "html-to-text";
+      version = "8.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/html-to-text/-/html-to-text-8.1.0.tgz";
+        sha512 = "Z9iYAqYK2c18GswSbnxJSeMs7lyJgwR2oIkDOyOHGBbYsPsG4HvT379jj3Lcbfko8A5ceyyMHAfkmp/BiXA9/Q==";
+      };
+    };
     "htmlencode-0.0.4" = {
       name = "htmlencode";
       packageName = "htmlencode";
@@ -1246,6 +1768,15 @@ let
         sha512 = "uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==";
       };
     };
+    "http-proxy-agent-4.0.1" = {
+      name = "http-proxy-agent";
+      packageName = "http-proxy-agent";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz";
+        sha512 = "k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==";
+      };
+    };
     "http-signature-1.2.0" = {
       name = "http-signature";
       packageName = "http-signature";
@@ -1255,6 +1786,15 @@ let
         sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
       };
     };
+    "https-proxy-agent-5.0.0" = {
+      name = "https-proxy-agent";
+      packageName = "https-proxy-agent";
+      version = "5.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz";
+        sha512 = "EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==";
+      };
+    };
     "iconv-lite-0.4.24" = {
       name = "iconv-lite";
       packageName = "iconv-lite";
@@ -1264,6 +1804,33 @@ let
         sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==";
       };
     };
+    "ignore-4.0.6" = {
+      name = "ignore";
+      packageName = "ignore";
+      version = "4.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz";
+        sha512 = "cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==";
+      };
+    };
+    "import-fresh-3.3.0" = {
+      name = "import-fresh";
+      packageName = "import-fresh";
+      version = "3.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz";
+        sha512 = "veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==";
+      };
+    };
+    "imurmurhash-0.1.4" = {
+      name = "imurmurhash";
+      packageName = "imurmurhash";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz";
+        sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
+      };
+    };
     "inflight-1.0.6" = {
       name = "inflight";
       packageName = "inflight";
@@ -1300,13 +1867,13 @@ let
         sha512 = "ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==";
       };
     };
-    "is-core-module-2.6.0" = {
+    "is-core-module-2.8.0" = {
       name = "is-core-module";
       packageName = "is-core-module";
-      version = "2.6.0";
+      version = "2.8.0";
       src = fetchurl {
-        url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz";
-        sha512 = "wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==";
+        url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz";
+        sha512 = "vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==";
       };
     };
     "is-extglob-2.1.1" = {
@@ -1318,15 +1885,6 @@ let
         sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
       };
     };
-    "is-fullwidth-code-point-2.0.0" = {
-      name = "is-fullwidth-code-point";
-      packageName = "is-fullwidth-code-point";
-      version = "2.0.0";
-      src = fetchurl {
-        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
-        sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
-      };
-    };
     "is-fullwidth-code-point-3.0.0" = {
       name = "is-fullwidth-code-point";
       packageName = "is-fullwidth-code-point";
@@ -1336,13 +1894,13 @@ let
         sha512 = "zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==";
       };
     };
-    "is-glob-4.0.1" = {
+    "is-glob-4.0.3" = {
       name = "is-glob";
       packageName = "is-glob";
-      version = "4.0.1";
+      version = "4.0.3";
       src = fetchurl {
-        url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz";
-        sha512 = "5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==";
+        url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz";
+        sha512 = "xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==";
       };
     };
     "is-number-7.0.0" = {
@@ -1372,6 +1930,15 @@ let
         sha512 = "VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==";
       };
     };
+    "is-potential-custom-element-name-1.0.1" = {
+      name = "is-potential-custom-element-name";
+      packageName = "is-potential-custom-element-name";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz";
+        sha512 = "bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==";
+      };
+    };
     "is-promise-2.2.2" = {
       name = "is-promise";
       packageName = "is-promise";
@@ -1417,40 +1984,40 @@ let
         sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
       };
     };
-    "jest-diff-27.2.0" = {
+    "jest-diff-27.3.1" = {
       name = "jest-diff";
       packageName = "jest-diff";
-      version = "27.2.0";
+      version = "27.3.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.0.tgz";
-        sha512 = "QSO9WC6btFYWtRJ3Hac0sRrkspf7B01mGrrQEiCW6TobtViJ9RWL0EmOs/WnBsZDsI/Y2IoSHZA2x6offu0sYw==";
+        url = "https://registry.npmjs.org/jest-diff/-/jest-diff-27.3.1.tgz";
+        sha512 = "PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==";
       };
     };
-    "jest-get-type-27.0.6" = {
+    "jest-get-type-27.3.1" = {
       name = "jest-get-type";
       packageName = "jest-get-type";
-      version = "27.0.6";
+      version = "27.3.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz";
-        sha512 = "XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==";
+        url = "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.3.1.tgz";
+        sha512 = "+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==";
       };
     };
-    "jest-matcher-utils-27.2.0" = {
+    "jest-matcher-utils-27.3.1" = {
       name = "jest-matcher-utils";
       packageName = "jest-matcher-utils";
-      version = "27.2.0";
+      version = "27.3.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.2.0.tgz";
-        sha512 = "F+LG3iTwJ0gPjxBX6HCyrARFXq6jjiqhwBQeskkJQgSLeF1j6ui1RTV08SR7O51XTUhtc8zqpDj8iCG4RGmdKw==";
+        url = "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz";
+        sha512 = "hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==";
       };
     };
-    "jest-message-util-27.2.0" = {
+    "jest-message-util-27.3.1" = {
       name = "jest-message-util";
       packageName = "jest-message-util";
-      version = "27.2.0";
+      version = "27.3.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.2.0.tgz";
-        sha512 = "y+sfT/94CiP8rKXgwCOzO1mUazIEdEhrLjuiu+RKmCP+8O/TJTSne9dqQRbFIHBtlR2+q7cddJlWGir8UATu5w==";
+        url = "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.3.1.tgz";
+        sha512 = "bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==";
       };
     };
     "jest-regex-util-27.0.6" = {
@@ -1498,6 +2065,15 @@ let
         sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
       };
     };
+    "jsdom-16.7.0" = {
+      name = "jsdom";
+      packageName = "jsdom";
+      version = "16.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz";
+        sha512 = "u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==";
+      };
+    };
     "json-schema-0.2.3" = {
       name = "json-schema";
       packageName = "json-schema";
@@ -1516,6 +2092,24 @@ let
         sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
       };
     };
+    "json-schema-traverse-1.0.0" = {
+      name = "json-schema-traverse";
+      packageName = "json-schema-traverse";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz";
+        sha512 = "NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==";
+      };
+    };
+    "json-stable-stringify-without-jsonify-1.0.1" = {
+      name = "json-stable-stringify-without-jsonify";
+      packageName = "json-stable-stringify-without-jsonify";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz";
+        sha1 = "9db7b59496ad3f3cfef30a75142d2d930ad72651";
+      };
+    };
     "json-stringify-safe-5.0.1" = {
       name = "json-stringify-safe";
       packageName = "json-stringify-safe";
@@ -1552,13 +2146,22 @@ let
         sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
       };
     };
-    "klona-2.0.4" = {
-      name = "klona";
-      packageName = "klona";
-      version = "2.0.4";
+    "levn-0.3.0" = {
+      name = "levn";
+      packageName = "levn";
+      version = "0.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
+        sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
+      };
+    };
+    "levn-0.4.1" = {
+      name = "levn";
+      packageName = "levn";
+      version = "0.4.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz";
-        sha512 = "ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==";
+        url = "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz";
+        sha512 = "+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==";
       };
     };
     "locate-path-6.0.0" = {
@@ -1579,6 +2182,24 @@ let
         sha512 = "v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==";
       };
     };
+    "lodash.merge-4.6.2" = {
+      name = "lodash.merge";
+      packageName = "lodash.merge";
+      version = "4.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz";
+        sha512 = "0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==";
+      };
+    };
+    "lodash.truncate-4.4.2" = {
+      name = "lodash.truncate";
+      packageName = "lodash.truncate";
+      version = "4.4.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz";
+        sha1 = "5a350da0b1113b837ecfffd5812cbe58d6eae193";
+      };
+    };
     "log-symbols-4.1.0" = {
       name = "log-symbols";
       packageName = "log-symbols";
@@ -1597,6 +2218,15 @@ let
         sha512 = "2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==";
       };
     };
+    "lru-cache-4.1.5" = {
+      name = "lru-cache";
+      packageName = "lru-cache";
+      version = "4.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz";
+        sha512 = "sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==";
+      };
+    };
     "lru-cache-6.0.0" = {
       name = "lru-cache";
       packageName = "lru-cache";
@@ -1669,22 +2299,22 @@ let
         sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
       };
     };
-    "mime-db-1.49.0" = {
+    "mime-db-1.51.0" = {
       name = "mime-db";
       packageName = "mime-db";
-      version = "1.49.0";
+      version = "1.51.0";
       src = fetchurl {
-        url = "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz";
-        sha512 = "CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==";
+        url = "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz";
+        sha512 = "5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==";
       };
     };
-    "mime-types-2.1.32" = {
+    "mime-types-2.1.34" = {
       name = "mime-types";
       packageName = "mime-types";
-      version = "2.1.32";
+      version = "2.1.34";
       src = fetchurl {
-        url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz";
-        sha512 = "hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==";
+        url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz";
+        sha512 = "6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==";
       };
     };
     "minimalistic-assert-1.0.1" = {
@@ -1732,13 +2362,22 @@ let
         sha512 = "vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==";
       };
     };
-    "mocha-9.1.1" = {
+    "mocha-9.1.3" = {
       name = "mocha";
       packageName = "mocha";
-      version = "9.1.1";
+      version = "9.1.3";
       src = fetchurl {
-        url = "https://registry.npmjs.org/mocha/-/mocha-9.1.1.tgz";
-        sha512 = "0wE74YMgOkCgBUj8VyIDwmLUjTsS13WV1Pg7l0SHea2qzZzlq7MDnfbPsHKcELBRk3+izEVkRofjmClpycudCA==";
+        url = "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz";
+        sha512 = "Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==";
+      };
+    };
+    "moo-0.5.1" = {
+      name = "moo";
+      packageName = "moo";
+      version = "0.5.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz";
+        sha512 = "I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==";
       };
     };
     "morgan-1.10.0" = {
@@ -1786,22 +2425,40 @@ let
         sha512 = "6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==";
       };
     };
-    "nanoid-3.1.23" = {
+    "nanoid-3.1.25" = {
       name = "nanoid";
       packageName = "nanoid";
-      version = "3.1.23";
+      version = "3.1.25";
       src = fetchurl {
-        url = "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz";
-        sha512 = "FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==";
+        url = "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz";
+        sha512 = "rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==";
       };
     };
-    "nanoid-3.1.25" = {
+    "nanoid-3.1.30" = {
       name = "nanoid";
       packageName = "nanoid";
-      version = "3.1.25";
+      version = "3.1.30";
       src = fetchurl {
-        url = "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz";
-        sha512 = "rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==";
+        url = "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz";
+        sha512 = "zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==";
+      };
+    };
+    "natural-compare-1.4.0" = {
+      name = "natural-compare";
+      packageName = "natural-compare";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz";
+        sha1 = "4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7";
+      };
+    };
+    "nearley-2.20.1" = {
+      name = "nearley";
+      packageName = "nearley";
+      version = "2.20.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz";
+        sha512 = "+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==";
       };
     };
     "negotiator-0.6.2" = {
@@ -1822,6 +2479,15 @@ let
         sha512 = "6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==";
       };
     };
+    "nwsapi-2.2.0" = {
+      name = "nwsapi";
+      packageName = "nwsapi";
+      version = "2.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz";
+        sha512 = "h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==";
+      };
+    };
     "oauth-sign-0.9.0" = {
       name = "oauth-sign";
       packageName = "oauth-sign";
@@ -1858,6 +2524,24 @@ let
         sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
       };
     };
+    "optionator-0.8.3" = {
+      name = "optionator";
+      packageName = "optionator";
+      version = "0.8.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz";
+        sha512 = "+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==";
+      };
+    };
+    "optionator-0.9.1" = {
+      name = "optionator";
+      packageName = "optionator";
+      version = "0.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz";
+        sha512 = "74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==";
+      };
+    };
     "p-limit-3.1.0" = {
       name = "p-limit";
       packageName = "p-limit";
@@ -1876,6 +2560,15 @@ let
         sha512 = "LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==";
       };
     };
+    "parent-module-1.0.1" = {
+      name = "parent-module";
+      packageName = "parent-module";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz";
+        sha512 = "GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==";
+      };
+    };
     "parse-srcset-1.0.2" = {
       name = "parse-srcset";
       packageName = "parse-srcset";
@@ -1885,6 +2578,24 @@ let
         sha1 = "f2bd221f6cc970a938d88556abc589caaaa2bde1";
       };
     };
+    "parse5-6.0.1" = {
+      name = "parse5";
+      packageName = "parse5";
+      version = "6.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz";
+        sha512 = "Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==";
+      };
+    };
+    "parseley-0.7.0" = {
+      name = "parseley";
+      packageName = "parseley";
+      version = "0.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parseley/-/parseley-0.7.0.tgz";
+        sha512 = "xyOytsdDu077M3/46Am+2cGXEKM9U9QclBDv7fimY7e+BBlxh2JcBp2mgNsmkyA9uvgyTjVzDi7cP1v4hcFxbw==";
+      };
+    };
     "parseurl-1.3.3" = {
       name = "parseurl";
       packageName = "parseurl";
@@ -1912,6 +2623,15 @@ let
         sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
       };
     };
+    "path-key-3.1.1" = {
+      name = "path-key";
+      packageName = "path-key";
+      version = "3.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz";
+        sha512 = "ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==";
+      };
+    };
     "path-parse-1.0.7" = {
       name = "path-parse";
       packageName = "path-parse";
@@ -1939,6 +2659,15 @@ let
         sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
       };
     };
+    "picocolors-1.0.0" = {
+      name = "picocolors";
+      packageName = "picocolors";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz";
+        sha512 = "1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==";
+      };
+    };
     "picomatch-2.3.0" = {
       name = "picomatch";
       packageName = "picomatch";
@@ -1957,22 +2686,49 @@ let
         sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
       };
     };
-    "postcss-8.3.6" = {
+    "postcss-8.3.11" = {
       name = "postcss";
       packageName = "postcss";
-      version = "8.3.6";
+      version = "8.3.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz";
+        sha512 = "hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==";
+      };
+    };
+    "prelude-ls-1.1.2" = {
+      name = "prelude-ls";
+      packageName = "prelude-ls";
+      version = "1.1.2";
       src = fetchurl {
-        url = "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz";
-        sha512 = "wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==";
+        url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
+        sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
       };
     };
-    "pretty-format-27.2.0" = {
+    "prelude-ls-1.2.1" = {
+      name = "prelude-ls";
+      packageName = "prelude-ls";
+      version = "1.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz";
+        sha512 = "vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==";
+      };
+    };
+    "pretty-format-27.3.1" = {
       name = "pretty-format";
       packageName = "pretty-format";
-      version = "27.2.0";
+      version = "27.3.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.0.tgz";
-        sha512 = "KyJdmgBkMscLqo8A7K77omgLx5PWPiXJswtTtFV7XgVZv2+qPk6UivpXXO+5k6ZEbWIbLoKdx1pZ6ldINzbwTA==";
+        url = "https://registry.npmjs.org/pretty-format/-/pretty-format-27.3.1.tgz";
+        sha512 = "DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==";
+      };
+    };
+    "progress-2.0.3" = {
+      name = "progress";
+      packageName = "progress";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz";
+        sha512 = "7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==";
       };
     };
     "proxy-addr-2.0.7" = {
@@ -1984,6 +2740,15 @@ let
         sha512 = "llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==";
       };
     };
+    "pseudomap-1.0.2" = {
+      name = "pseudomap";
+      packageName = "pseudomap";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz";
+        sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
+      };
+    };
     "psl-1.8.0" = {
       name = "psl";
       packageName = "psl";
@@ -2020,6 +2785,24 @@ let
         sha512 = "VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==";
       };
     };
+    "railroad-diagrams-1.0.0" = {
+      name = "railroad-diagrams";
+      packageName = "railroad-diagrams";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz";
+        sha1 = "eb7e6267548ddedfb899c1b90e57374559cddb7e";
+      };
+    };
+    "randexp-0.4.6" = {
+      name = "randexp";
+      packageName = "randexp";
+      version = "0.4.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz";
+        sha512 = "80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==";
+      };
+    };
     "randombytes-2.1.0" = {
       name = "randombytes";
       packageName = "randombytes";
@@ -2065,6 +2848,15 @@ let
         sha512 = "hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==";
       };
     };
+    "regexpp-3.2.0" = {
+      name = "regexpp";
+      packageName = "regexpp";
+      version = "3.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz";
+        sha512 = "pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==";
+      };
+    };
     "request-2.88.2" = {
       name = "request";
       packageName = "request";
@@ -2101,6 +2893,15 @@ let
         sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
       };
     };
+    "require-from-string-2.0.2" = {
+      name = "require-from-string";
+      packageName = "require-from-string";
+      version = "2.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz";
+        sha512 = "Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==";
+      };
+    };
     "resolve-1.20.0" = {
       name = "resolve";
       packageName = "resolve";
@@ -2110,6 +2911,33 @@ let
         sha512 = "wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==";
       };
     };
+    "resolve-from-4.0.0" = {
+      name = "resolve-from";
+      packageName = "resolve-from";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz";
+        sha512 = "pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==";
+      };
+    };
+    "ret-0.1.15" = {
+      name = "ret";
+      packageName = "ret";
+      version = "0.1.15";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz";
+        sha512 = "TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==";
+      };
+    };
+    "rimraf-3.0.2" = {
+      name = "rimraf";
+      packageName = "rimraf";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz";
+        sha512 = "JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==";
+      };
+    };
     "safe-buffer-5.1.2" = {
       name = "safe-buffer";
       packageName = "safe-buffer";
@@ -2128,13 +2956,31 @@ let
         sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
       };
     };
-    "sanitize-html-2.5.1" = {
+    "sanitize-html-2.5.3" = {
       name = "sanitize-html";
       packageName = "sanitize-html";
-      version = "2.5.1";
+      version = "2.5.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.5.3.tgz";
+        sha512 = "DGATXd1fs/Rm287/i5FBKVYSBBUL0iAaztOA1/RFhEs4yqo39/X52i/q/CwsfCUG5cilmXSBmnQmyWfnKhBlOg==";
+      };
+    };
+    "saxes-5.0.1" = {
+      name = "saxes";
+      packageName = "saxes";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz";
+        sha512 = "5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==";
+      };
+    };
+    "selderee-0.6.0" = {
+      name = "selderee";
+      packageName = "selderee";
+      version = "0.6.0";
       src = fetchurl {
-        url = "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.5.1.tgz";
-        sha512 = "hUITPitQk+eFNLtr4dEkaaiAJndG2YE87IOpcfBSL1XdklWgwcNDJdr9Ppe8QKL/C3jFt1xH/Mbj20e0GZQOfg==";
+        url = "https://registry.npmjs.org/selderee/-/selderee-0.6.0.tgz";
+        sha512 = "ibqWGV5aChDvfVdqNYuaJP/HnVBhlRGSRrlbttmlMpHcLuTqqbMH36QkSs9GEgj5M88JDYLI8eyP94JaQ8xRlg==";
       };
     };
     "semver-5.7.1" = {
@@ -2146,6 +2992,15 @@ let
         sha512 = "sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==";
       };
     };
+    "semver-7.3.5" = {
+      name = "semver";
+      packageName = "semver";
+      version = "7.3.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz";
+        sha512 = "PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==";
+      };
+    };
     "send-0.17.1" = {
       name = "send";
       packageName = "send";
@@ -2182,6 +3037,33 @@ let
         sha512 = "JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==";
       };
     };
+    "shebang-command-2.0.0" = {
+      name = "shebang-command";
+      packageName = "shebang-command";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz";
+        sha512 = "kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==";
+      };
+    };
+    "shebang-regex-3.0.0" = {
+      name = "shebang-regex";
+      packageName = "shebang-regex";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz";
+        sha512 = "7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==";
+      };
+    };
+    "sigmund-1.0.1" = {
+      name = "sigmund";
+      packageName = "sigmund";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz";
+        sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
+      };
+    };
     "slash-3.0.0" = {
       name = "slash";
       packageName = "slash";
@@ -2191,6 +3073,15 @@ let
         sha512 = "g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==";
       };
     };
+    "slice-ansi-4.0.0" = {
+      name = "slice-ansi";
+      packageName = "slice-ansi";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz";
+        sha512 = "qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==";
+      };
+    };
     "source-map-0.6.1" = {
       name = "source-map";
       packageName = "source-map";
@@ -2272,40 +3163,22 @@ let
         sha1 = "071105bdfc286e6615c0403c27e9d7b5dcb855cb";
       };
     };
-    "string-width-2.1.1" = {
-      name = "string-width";
-      packageName = "string-width";
-      version = "2.1.1";
-      src = fetchurl {
-        url = "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz";
-        sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==";
-      };
-    };
-    "string-width-4.2.2" = {
+    "string-width-4.2.3" = {
       name = "string-width";
       packageName = "string-width";
-      version = "4.2.2";
+      version = "4.2.3";
       src = fetchurl {
-        url = "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz";
-        sha512 = "XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==";
+        url = "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz";
+        sha512 = "wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==";
       };
     };
-    "strip-ansi-4.0.0" = {
+    "strip-ansi-6.0.1" = {
       name = "strip-ansi";
       packageName = "strip-ansi";
-      version = "4.0.0";
+      version = "6.0.1";
       src = fetchurl {
-        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
-        sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
-      };
-    };
-    "strip-ansi-6.0.0" = {
-      name = "strip-ansi";
-      packageName = "strip-ansi";
-      version = "6.0.0";
-      src = fetchurl {
-        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz";
-        sha512 = "AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==";
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz";
+        sha512 = "Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==";
       };
     };
     "strip-bom-3.0.0" = {
@@ -2353,6 +3226,33 @@ let
         sha512 = "MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==";
       };
     };
+    "symbol-tree-3.2.4" = {
+      name = "symbol-tree";
+      packageName = "symbol-tree";
+      version = "3.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz";
+        sha512 = "9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==";
+      };
+    };
+    "table-6.7.3" = {
+      name = "table";
+      packageName = "table";
+      version = "6.7.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/table/-/table-6.7.3.tgz";
+        sha512 = "5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==";
+      };
+    };
+    "text-table-0.2.0" = {
+      name = "text-table";
+      packageName = "text-table";
+      version = "0.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz";
+        sha1 = "7f5ee823ae805207c00af2df4a84ec3fcfa570b4";
+      };
+    };
     "to-regex-range-5.0.1" = {
       name = "to-regex-range";
       packageName = "to-regex-range";
@@ -2380,6 +3280,24 @@ let
         sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
       };
     };
+    "tough-cookie-4.0.0" = {
+      name = "tough-cookie";
+      packageName = "tough-cookie";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz";
+        sha512 = "tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==";
+      };
+    };
+    "tr46-2.1.0" = {
+      name = "tr46";
+      packageName = "tr46";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz";
+        sha512 = "15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==";
+      };
+    };
     "ts-mocha-8.0.0" = {
       name = "ts-mocha";
       packageName = "ts-mocha";
@@ -2452,6 +3370,33 @@ let
         sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
       };
     };
+    "type-check-0.3.2" = {
+      name = "type-check";
+      packageName = "type-check";
+      version = "0.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
+        sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
+      };
+    };
+    "type-check-0.4.0" = {
+      name = "type-check";
+      packageName = "type-check";
+      version = "0.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz";
+        sha512 = "XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==";
+      };
+    };
+    "type-fest-0.20.2" = {
+      name = "type-fest";
+      packageName = "type-fest";
+      version = "0.20.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz";
+        sha512 = "Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==";
+      };
+    };
     "type-is-1.6.18" = {
       name = "type-is";
       packageName = "type-is";
@@ -2461,13 +3406,31 @@ let
         sha512 = "TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==";
       };
     };
-    "typescript-4.4.3" = {
+    "typescript-4.5.2" = {
       name = "typescript";
       packageName = "typescript";
-      version = "4.4.3";
+      version = "4.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz";
+        sha512 = "5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==";
+      };
+    };
+    "typescript-formatter-7.2.2" = {
+      name = "typescript-formatter";
+      packageName = "typescript-formatter";
+      version = "7.2.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/typescript-formatter/-/typescript-formatter-7.2.2.tgz";
+        sha512 = "V7vfI9XArVhriOTYHPzMU2WUnm5IMdu9X/CPxs8mIMGxmTBFpDABlbkBka64PZJ9/xgQeRpK8KzzAG4MPzxBDQ==";
+      };
+    };
+    "universalify-0.1.2" = {
+      name = "universalify";
+      packageName = "universalify";
+      version = "0.1.2";
       src = fetchurl {
-        url = "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz";
-        sha512 = "4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==";
+        url = "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz";
+        sha512 = "rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==";
       };
     };
     "unpipe-1.0.0" = {
@@ -2506,6 +3469,15 @@ let
         sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==";
       };
     };
+    "v8-compile-cache-2.3.0" = {
+      name = "v8-compile-cache";
+      packageName = "v8-compile-cache";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz";
+        sha512 = "l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==";
+      };
+    };
     "vary-1.1.2" = {
       name = "vary";
       packageName = "vary";
@@ -2524,6 +3496,69 @@ let
         sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
       };
     };
+    "w3c-hr-time-1.0.2" = {
+      name = "w3c-hr-time";
+      packageName = "w3c-hr-time";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz";
+        sha512 = "z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==";
+      };
+    };
+    "w3c-xmlserializer-2.0.0" = {
+      name = "w3c-xmlserializer";
+      packageName = "w3c-xmlserializer";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz";
+        sha512 = "4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==";
+      };
+    };
+    "webidl-conversions-5.0.0" = {
+      name = "webidl-conversions";
+      packageName = "webidl-conversions";
+      version = "5.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz";
+        sha512 = "VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==";
+      };
+    };
+    "webidl-conversions-6.1.0" = {
+      name = "webidl-conversions";
+      packageName = "webidl-conversions";
+      version = "6.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz";
+        sha512 = "qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==";
+      };
+    };
+    "whatwg-encoding-1.0.5" = {
+      name = "whatwg-encoding";
+      packageName = "whatwg-encoding";
+      version = "1.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz";
+        sha512 = "b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==";
+      };
+    };
+    "whatwg-mimetype-2.3.0" = {
+      name = "whatwg-mimetype";
+      packageName = "whatwg-mimetype";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz";
+        sha512 = "M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==";
+      };
+    };
+    "whatwg-url-8.7.0" = {
+      name = "whatwg-url";
+      packageName = "whatwg-url";
+      version = "8.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz";
+        sha512 = "gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==";
+      };
+    };
     "which-2.0.2" = {
       name = "which";
       packageName = "which";
@@ -2533,13 +3568,13 @@ let
         sha512 = "BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==";
       };
     };
-    "wide-align-1.1.3" = {
-      name = "wide-align";
-      packageName = "wide-align";
-      version = "1.1.3";
+    "word-wrap-1.2.3" = {
+      name = "word-wrap";
+      packageName = "word-wrap";
+      version = "1.2.3";
       src = fetchurl {
-        url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
-        sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
+        url = "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz";
+        sha512 = "Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==";
       };
     };
     "workerpool-6.1.5" = {
@@ -2569,6 +3604,33 @@ let
         sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
       };
     };
+    "ws-7.5.5" = {
+      name = "ws";
+      packageName = "ws";
+      version = "7.5.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz";
+        sha512 = "BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==";
+      };
+    };
+    "xml-name-validator-3.0.0" = {
+      name = "xml-name-validator";
+      packageName = "xml-name-validator";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz";
+        sha512 = "A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==";
+      };
+    };
+    "xmlchars-2.2.0" = {
+      name = "xmlchars";
+      packageName = "xmlchars";
+      version = "2.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz";
+        sha512 = "JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==";
+      };
+    };
     "y18n-5.0.8" = {
       name = "y18n";
       packageName = "y18n";
@@ -2578,6 +3640,15 @@ let
         sha512 = "0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==";
       };
     };
+    "yallist-2.1.2" = {
+      name = "yallist";
+      packageName = "yallist";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz";
+        sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
+      };
+    };
     "yallist-4.0.0" = {
       name = "yallist";
       packageName = "yallist";
@@ -2636,12 +3707,12 @@ let
   args = {
     name = "mjolnir";
     packageName = "mjolnir";
-    version = "1.1.20";
-    src = ../../../../../../../nix/store/hc66j9i16g2n08v0laiyydqch4szfygn-source;
+    version = "1.2.1";
+    src = ../../../../../../../nix/store/8x9ib7ymf5yj075632mz4qap4m0nzd52-source;
     dependencies = [
-      sources."@babel/code-frame-7.14.5"
+      sources."@babel/code-frame-7.12.11"
       sources."@babel/helper-validator-identifier-7.15.7"
-      (sources."@babel/highlight-7.14.5" // {
+      (sources."@babel/highlight-7.16.0" // {
         dependencies = [
           sources."ansi-styles-3.2.1"
           sources."chalk-2.4.2"
@@ -2652,26 +3723,63 @@ let
           sources."supports-color-5.5.0"
         ];
       })
-      sources."@jest/types-27.1.1"
-      sources."@types/body-parser-1.19.1"
+      (sources."@eslint/eslintrc-0.4.3" // {
+        dependencies = [
+          sources."argparse-1.0.10"
+          sources."debug-4.3.2"
+          sources."js-yaml-3.14.1"
+          sources."ms-2.1.2"
+        ];
+      })
+      (sources."@humanwhocodes/config-array-0.5.0" // {
+        dependencies = [
+          sources."debug-4.3.2"
+          sources."ms-2.1.2"
+        ];
+      })
+      sources."@humanwhocodes/object-schema-1.2.1"
+      sources."@jest/types-27.2.5"
+      sources."@selderee/plugin-htmlparser2-0.6.0"
+      sources."@tootallnate/once-1.1.2"
+      sources."@types/axios-0.14.0"
+      sources."@types/body-parser-1.19.2"
       sources."@types/connect-3.4.35"
+      sources."@types/crypto-js-4.0.2"
       sources."@types/express-4.17.13"
-      sources."@types/express-serve-static-core-4.17.24"
+      sources."@types/express-serve-static-core-4.17.25"
       sources."@types/istanbul-lib-coverage-2.0.3"
       sources."@types/istanbul-lib-report-3.0.0"
       sources."@types/istanbul-reports-3.0.1"
+      sources."@types/jsdom-16.2.13"
       sources."@types/json5-0.0.29"
       sources."@types/mime-1.3.2"
       sources."@types/mocha-9.0.0"
-      sources."@types/node-11.15.54"
+      sources."@types/node-16.11.7"
+      sources."@types/parse5-6.0.2"
       sources."@types/qs-6.9.7"
       sources."@types/range-parser-1.2.4"
       sources."@types/serve-static-1.13.10"
       sources."@types/stack-utils-2.0.1"
+      sources."@types/tough-cookie-4.0.1"
       sources."@types/yargs-16.0.4"
       sources."@types/yargs-parser-20.2.1"
       sources."@ungap/promise-all-settled-1.1.2"
+      sources."abab-2.0.5"
       sources."accepts-1.3.7"
+      sources."acorn-8.6.0"
+      (sources."acorn-globals-6.0.0" // {
+        dependencies = [
+          sources."acorn-7.4.1"
+        ];
+      })
+      sources."acorn-jsx-5.3.2"
+      sources."acorn-walk-7.2.0"
+      (sources."agent-base-6.0.2" // {
+        dependencies = [
+          sources."debug-4.3.2"
+          sources."ms-2.1.2"
+        ];
+      })
       sources."ajv-6.12.6"
       sources."ansi-colors-4.1.1"
       sources."ansi-regex-5.0.1"
@@ -2680,11 +3788,13 @@ let
       sources."argparse-2.0.1"
       sources."array-flatten-1.1.1"
       sources."arrify-1.0.1"
-      sources."asn1-0.2.4"
+      sources."asn1-0.2.6"
       sources."assert-plus-1.0.0"
+      sources."astral-regex-2.0.0"
       sources."asynckit-0.4.0"
       sources."aws-sign2-0.7.0"
       sources."aws4-1.11.0"
+      sources."axios-0.21.4"
       sources."balanced-match-1.0.2"
       sources."basic-auth-2.0.1"
       sources."bcrypt-pbkdf-1.0.2"
@@ -2693,26 +3803,22 @@ let
       sources."body-parser-1.19.0"
       sources."brace-expansion-1.1.11"
       sources."braces-3.0.2"
+      sources."browser-process-hrtime-1.0.0"
       sources."browser-stdout-1.3.1"
       sources."buffer-from-1.1.2"
       sources."builtin-modules-1.1.1"
       sources."bytes-3.1.0"
-      sources."camelcase-6.2.0"
+      sources."callsites-3.1.0"
+      sources."camelcase-6.2.1"
       sources."caseless-0.12.0"
       sources."chalk-4.1.2"
       sources."chokidar-3.5.2"
-      (sources."cliui-7.0.4" // {
-        dependencies = [
-          sources."is-fullwidth-code-point-3.0.0"
-          sources."string-width-4.2.2"
-          sources."strip-ansi-6.0.0"
-        ];
-      })
+      sources."cliui-7.0.4"
       sources."color-convert-2.0.1"
       sources."color-name-1.1.4"
-      sources."colorette-1.4.0"
       sources."combined-stream-1.0.8"
       sources."commander-2.20.3"
+      sources."commandpost-1.4.0"
       sources."concat-map-0.0.1"
       sources."config-3.3.6"
       sources."content-disposition-0.5.3"
@@ -2720,38 +3826,90 @@ let
       sources."cookie-0.4.0"
       sources."cookie-signature-1.0.6"
       sources."core-util-is-1.0.2"
+      sources."cross-spawn-7.0.3"
+      sources."crypto-js-4.1.1"
+      sources."cssom-0.4.4"
+      (sources."cssstyle-2.3.0" // {
+        dependencies = [
+          sources."cssom-0.3.8"
+        ];
+      })
       sources."dashdash-1.14.1"
+      sources."data-urls-2.0.0"
       sources."debug-2.6.9"
       sources."decamelize-4.0.0"
+      sources."decimal.js-10.3.1"
+      sources."deep-is-0.1.4"
       sources."deepmerge-4.2.2"
       sources."delayed-stream-1.0.0"
       sources."depd-1.1.2"
       sources."destroy-1.0.4"
       sources."diff-5.0.0"
       sources."diff-sequences-27.0.6"
-      (sources."dom-serializer-1.3.2" // {
+      sources."discontinuous-range-1.0.0"
+      sources."doctrine-3.0.0"
+      sources."dom-serializer-1.3.2"
+      sources."domelementtype-2.2.0"
+      (sources."domexception-2.0.1" // {
         dependencies = [
-          sources."domhandler-4.2.2"
+          sources."webidl-conversions-5.0.0"
         ];
       })
-      sources."domelementtype-2.2.0"
-      sources."domhandler-3.3.0"
-      (sources."domutils-2.8.0" // {
+      sources."domhandler-4.2.2"
+      sources."domutils-2.8.0"
+      sources."ecc-jsbn-0.1.2"
+      (sources."editorconfig-0.15.3" // {
         dependencies = [
-          sources."domhandler-4.2.2"
+          sources."lru-cache-4.1.5"
+          sources."semver-5.7.1"
+          sources."yallist-2.1.2"
         ];
       })
-      sources."ecc-jsbn-0.1.2"
       sources."ee-first-1.1.1"
       sources."emoji-regex-8.0.0"
       sources."encodeurl-1.0.2"
+      sources."enquirer-2.3.6"
       sources."entities-2.2.0"
       sources."escalade-3.1.1"
       sources."escape-html-1.0.3"
       sources."escape-string-regexp-4.0.0"
+      sources."escodegen-2.0.0"
+      (sources."eslint-7.32.0" // {
+        dependencies = [
+          sources."argparse-1.0.10"
+          sources."debug-4.3.2"
+          sources."js-yaml-3.14.1"
+          sources."levn-0.4.1"
+          sources."ms-2.1.2"
+          sources."optionator-0.9.1"
+          sources."prelude-ls-1.2.1"
+          sources."type-check-0.4.0"
+        ];
+      })
+      (sources."eslint-scope-5.1.1" // {
+        dependencies = [
+          sources."estraverse-4.3.0"
+        ];
+      })
+      (sources."eslint-utils-2.1.0" // {
+        dependencies = [
+          sources."eslint-visitor-keys-1.3.0"
+        ];
+      })
+      sources."eslint-visitor-keys-2.1.0"
+      (sources."espree-7.3.1" // {
+        dependencies = [
+          sources."acorn-7.4.1"
+          sources."eslint-visitor-keys-1.3.0"
+        ];
+      })
       sources."esprima-4.0.1"
+      sources."esquery-1.4.0"
+      sources."esrecurse-4.3.0"
+      sources."estraverse-5.3.0"
+      sources."esutils-2.0.3"
       sources."etag-1.8.1"
-      (sources."expect-27.2.1" // {
+      (sources."expect-27.3.1" // {
         dependencies = [
           sources."ansi-styles-5.2.0"
         ];
@@ -2761,22 +3919,29 @@ let
       sources."extsprintf-1.3.0"
       sources."fast-deep-equal-3.1.3"
       sources."fast-json-stable-stringify-2.1.0"
+      sources."fast-levenshtein-2.0.6"
+      sources."file-entry-cache-6.0.1"
       sources."fill-range-7.0.1"
       sources."finalhandler-1.1.2"
       sources."find-up-5.0.0"
       sources."flat-5.0.2"
+      sources."flat-cache-3.0.4"
+      sources."flatted-3.2.4"
+      sources."follow-redirects-1.14.5"
       sources."forever-agent-0.6.1"
-      sources."form-data-2.3.3"
+      sources."form-data-3.0.1"
       sources."forwarded-0.2.0"
       sources."fresh-0.5.2"
       sources."fs.realpath-1.0.0"
       sources."fsevents-2.3.2"
       sources."function-bind-1.1.1"
+      sources."functional-red-black-tree-1.0.1"
       sources."get-caller-file-2.0.5"
       sources."getpass-0.1.7"
-      sources."glob-7.1.7"
+      sources."glob-7.2.0"
       sources."glob-parent-5.1.2"
       sources."glob-to-regexp-0.4.1"
+      sources."globals-13.12.0"
       sources."graceful-fs-4.2.8"
       sources."growl-1.10.5"
       sources."har-schema-2.0.0"
@@ -2785,129 +3950,184 @@ let
       sources."has-flag-4.0.0"
       sources."hash.js-1.1.7"
       sources."he-1.2.0"
-      sources."html-to-text-6.0.0"
+      sources."html-encoding-sniffer-2.0.1"
+      sources."html-to-text-8.1.0"
       sources."htmlencode-0.0.4"
-      sources."htmlparser2-4.1.0"
+      sources."htmlparser2-6.1.0"
       sources."http-errors-1.7.2"
+      (sources."http-proxy-agent-4.0.1" // {
+        dependencies = [
+          sources."debug-4.3.2"
+          sources."ms-2.1.2"
+        ];
+      })
       sources."http-signature-1.2.0"
+      (sources."https-proxy-agent-5.0.0" // {
+        dependencies = [
+          sources."debug-4.3.2"
+          sources."ms-2.1.2"
+        ];
+      })
       sources."iconv-lite-0.4.24"
+      sources."ignore-4.0.6"
+      sources."import-fresh-3.3.0"
+      sources."imurmurhash-0.1.4"
       sources."inflight-1.0.6"
       sources."inherits-2.0.3"
       sources."ipaddr.js-1.9.1"
       sources."is-binary-path-2.1.0"
-      sources."is-core-module-2.6.0"
+      sources."is-core-module-2.8.0"
       sources."is-extglob-2.1.1"
-      sources."is-fullwidth-code-point-2.0.0"
-      sources."is-glob-4.0.1"
+      sources."is-fullwidth-code-point-3.0.0"
+      sources."is-glob-4.0.3"
       sources."is-number-7.0.0"
       sources."is-plain-obj-2.1.0"
       sources."is-plain-object-5.0.0"
+      sources."is-potential-custom-element-name-1.0.1"
       sources."is-promise-2.2.2"
       sources."is-typedarray-1.0.0"
       sources."is-unicode-supported-0.1.0"
       sources."isexe-2.0.0"
       sources."isstream-0.1.2"
-      sources."jest-diff-27.2.0"
-      sources."jest-get-type-27.0.6"
-      sources."jest-matcher-utils-27.2.0"
-      sources."jest-message-util-27.2.0"
+      sources."jest-diff-27.3.1"
+      sources."jest-get-type-27.3.1"
+      sources."jest-matcher-utils-27.3.1"
+      (sources."jest-message-util-27.3.1" // {
+        dependencies = [
+          sources."@babel/code-frame-7.16.0"
+        ];
+      })
       sources."jest-regex-util-27.0.6"
       sources."js-tokens-4.0.0"
       sources."js-yaml-4.1.0"
       sources."jsbn-0.1.1"
+      sources."jsdom-16.7.0"
       sources."json-schema-0.2.3"
       sources."json-schema-traverse-0.4.1"
+      sources."json-stable-stringify-without-jsonify-1.0.1"
       sources."json-stringify-safe-5.0.1"
       sources."json5-2.2.0"
       sources."jsprim-1.4.1"
-      sources."klona-2.0.4"
+      sources."levn-0.3.0"
       sources."locate-path-6.0.0"
       sources."lodash-4.17.21"
+      sources."lodash.merge-4.6.2"
+      sources."lodash.truncate-4.4.2"
       sources."log-symbols-4.1.0"
       sources."lowdb-1.0.0"
       sources."lru-cache-6.0.0"
       sources."make-error-1.3.6"
-      sources."matrix-bot-sdk-0.5.19"
+      (sources."matrix-bot-sdk-0.5.19" // {
+        dependencies = [
+          sources."domhandler-3.3.0"
+          sources."html-to-text-6.0.0"
+          sources."htmlparser2-4.1.0"
+        ];
+      })
       sources."media-typer-0.3.0"
       sources."merge-descriptors-1.0.1"
       sources."methods-1.1.2"
       sources."micromatch-4.0.4"
       sources."mime-1.6.0"
-      sources."mime-db-1.49.0"
-      sources."mime-types-2.1.32"
+      sources."mime-db-1.51.0"
+      sources."mime-types-2.1.34"
       sources."minimalistic-assert-1.0.1"
       sources."minimatch-3.0.4"
       sources."minimist-1.2.5"
       sources."mkdirp-1.0.4"
-      (sources."mocha-9.1.1" // {
+      (sources."mocha-9.1.3" // {
         dependencies = [
-          (sources."debug-4.3.1" // {
+          (sources."debug-4.3.2" // {
             dependencies = [
               sources."ms-2.1.2"
             ];
           })
+          sources."glob-7.1.7"
           sources."ms-2.1.3"
-          sources."nanoid-3.1.23"
+          sources."nanoid-3.1.25"
           sources."supports-color-8.1.1"
         ];
       })
+      sources."moo-0.5.1"
       (sources."morgan-1.10.0" // {
         dependencies = [
           sources."depd-2.0.0"
         ];
       })
       sources."ms-2.0.0"
-      sources."nanoid-3.1.25"
+      sources."nanoid-3.1.30"
+      sources."natural-compare-1.4.0"
+      sources."nearley-2.20.1"
       sources."negotiator-0.6.2"
       sources."normalize-path-3.0.0"
+      sources."nwsapi-2.2.0"
       sources."oauth-sign-0.9.0"
       sources."on-finished-2.3.0"
       sources."on-headers-1.0.2"
       sources."once-1.4.0"
+      sources."optionator-0.8.3"
       sources."p-limit-3.1.0"
       sources."p-locate-5.0.0"
+      sources."parent-module-1.0.1"
       sources."parse-srcset-1.0.2"
+      sources."parse5-6.0.1"
+      sources."parseley-0.7.0"
       sources."parseurl-1.3.3"
       sources."path-exists-4.0.0"
       sources."path-is-absolute-1.0.1"
+      sources."path-key-3.1.1"
       sources."path-parse-1.0.7"
       sources."path-to-regexp-0.1.7"
       sources."performance-now-2.1.0"
+      sources."picocolors-1.0.0"
       sources."picomatch-2.3.0"
       sources."pify-3.0.0"
-      sources."postcss-8.3.6"
-      (sources."pretty-format-27.2.0" // {
+      sources."postcss-8.3.11"
+      sources."prelude-ls-1.1.2"
+      (sources."pretty-format-27.3.1" // {
         dependencies = [
           sources."ansi-styles-5.2.0"
         ];
       })
+      sources."progress-2.0.3"
       sources."proxy-addr-2.0.7"
+      sources."pseudomap-1.0.2"
       sources."psl-1.8.0"
       sources."punycode-2.1.1"
       sources."qs-6.7.0"
+      sources."railroad-diagrams-1.0.0"
+      sources."randexp-0.4.6"
       sources."randombytes-2.1.0"
       sources."range-parser-1.2.1"
       sources."raw-body-2.4.0"
       sources."react-is-17.0.2"
       sources."readdirp-3.6.0"
+      sources."regexpp-3.2.0"
       (sources."request-2.88.2" // {
         dependencies = [
+          sources."form-data-2.3.3"
           sources."qs-6.5.2"
+          sources."tough-cookie-2.5.0"
+        ];
+      })
+      (sources."request-promise-4.2.6" // {
+        dependencies = [
+          sources."tough-cookie-2.5.0"
         ];
       })
-      sources."request-promise-4.2.6"
       sources."request-promise-core-1.1.4"
       sources."require-directory-2.1.1"
+      sources."require-from-string-2.0.2"
       sources."resolve-1.20.0"
+      sources."resolve-from-4.0.0"
+      sources."ret-0.1.15"
+      sources."rimraf-3.0.2"
       sources."safe-buffer-5.1.2"
       sources."safer-buffer-2.1.2"
-      (sources."sanitize-html-2.5.1" // {
-        dependencies = [
-          sources."domhandler-4.2.2"
-          sources."htmlparser2-6.1.0"
-        ];
-      })
-      sources."semver-5.7.1"
+      sources."sanitize-html-2.5.3"
+      sources."saxes-5.0.1"
+      sources."selderee-0.6.0"
+      sources."semver-7.3.5"
       (sources."send-0.17.1" // {
         dependencies = [
           sources."ms-2.1.1"
@@ -2916,7 +4136,11 @@ let
       sources."serialize-javascript-6.0.0"
       sources."serve-static-1.14.1"
       sources."setprototypeof-1.1.1"
+      sources."shebang-command-2.0.0"
+      sources."shebang-regex-3.0.0"
+      sources."sigmund-1.0.1"
       sources."slash-3.0.0"
+      sources."slice-ansi-4.0.0"
       sources."source-map-0.6.1"
       sources."source-map-js-0.6.2"
       sources."source-map-support-0.5.20"
@@ -2930,18 +4154,23 @@ let
       sources."statuses-1.5.0"
       sources."stealthy-require-1.1.1"
       sources."steno-0.4.4"
-      sources."string-width-2.1.1"
-      (sources."strip-ansi-4.0.0" // {
-        dependencies = [
-          sources."ansi-regex-3.0.0"
-        ];
-      })
+      sources."string-width-4.2.3"
+      sources."strip-ansi-6.0.1"
       sources."strip-bom-3.0.0"
       sources."strip-json-comments-3.1.1"
       sources."supports-color-7.2.0"
+      sources."symbol-tree-3.2.4"
+      (sources."table-6.7.3" // {
+        dependencies = [
+          sources."ajv-8.8.1"
+          sources."json-schema-traverse-1.0.0"
+        ];
+      })
+      sources."text-table-0.2.0"
       sources."to-regex-range-5.0.1"
       sources."toidentifier-1.0.0"
-      sources."tough-cookie-2.5.0"
+      sources."tough-cookie-4.0.0"
+      sources."tr46-2.1.0"
       sources."ts-mocha-8.0.0"
       (sources."ts-node-7.0.1" // {
         dependencies = [
@@ -2967,40 +4196,43 @@ let
           sources."has-flag-3.0.0"
           sources."js-yaml-3.14.1"
           sources."mkdirp-0.5.5"
+          sources."semver-5.7.1"
           sources."supports-color-5.5.0"
         ];
       })
       sources."tsutils-2.29.0"
       sources."tunnel-agent-0.6.0"
       sources."tweetnacl-0.14.5"
+      sources."type-check-0.3.2"
+      sources."type-fest-0.20.2"
       sources."type-is-1.6.18"
-      sources."typescript-4.4.3"
+      sources."typescript-4.5.2"
+      sources."typescript-formatter-7.2.2"
+      sources."universalify-0.1.2"
       sources."unpipe-1.0.0"
       sources."uri-js-4.4.1"
       sources."utils-merge-1.0.1"
       sources."uuid-3.4.0"
+      sources."v8-compile-cache-2.3.0"
       sources."vary-1.1.2"
       sources."verror-1.10.0"
+      sources."w3c-hr-time-1.0.2"
+      sources."w3c-xmlserializer-2.0.0"
+      sources."webidl-conversions-6.1.0"
+      sources."whatwg-encoding-1.0.5"
+      sources."whatwg-mimetype-2.3.0"
+      sources."whatwg-url-8.7.0"
       sources."which-2.0.2"
-      sources."wide-align-1.1.3"
+      sources."word-wrap-1.2.3"
       sources."workerpool-6.1.5"
-      (sources."wrap-ansi-7.0.0" // {
-        dependencies = [
-          sources."is-fullwidth-code-point-3.0.0"
-          sources."string-width-4.2.2"
-          sources."strip-ansi-6.0.0"
-        ];
-      })
+      sources."wrap-ansi-7.0.0"
       sources."wrappy-1.0.2"
+      sources."ws-7.5.5"
+      sources."xml-name-validator-3.0.0"
+      sources."xmlchars-2.2.0"
       sources."y18n-5.0.8"
       sources."yallist-4.0.0"
-      (sources."yargs-16.2.0" // {
-        dependencies = [
-          sources."is-fullwidth-code-point-3.0.0"
-          sources."string-width-4.2.2"
-          sources."strip-ansi-6.0.0"
-        ];
-      })
+      sources."yargs-16.2.0"
       sources."yargs-parser-20.2.4"
       sources."yargs-unparser-2.0.0"
       sources."yn-2.0.0"
diff --git a/pkgs/servers/nextcloud/default.nix b/pkgs/servers/nextcloud/default.nix
index 9c6e3a22122..0b7fb6f50fe 100644
--- a/pkgs/servers/nextcloud/default.nix
+++ b/pkgs/servers/nextcloud/default.nix
@@ -51,8 +51,8 @@ in {
   };
 
   nextcloud22 = generic {
-    version = "22.2.2";
-    sha256 = "sha256-lDvn29N19Lhm3P2YIVM/85vr/U07qR+M8TkF/D/GTfA=";
+    version = "22.2.3";
+    sha256 = "sha256-ZqKaakkHOMCr7bZ3y2jHyR+rqz5kGaPJnYtAaJnrlCo=";
   };
   # tip: get she sha with:
   # curl 'https://download.nextcloud.com/server/releases/nextcloud-${version}.tar.bz2.sha256'
diff --git a/pkgs/tools/filesystems/kio-fuse/default.nix b/pkgs/tools/filesystems/kio-fuse/default.nix
new file mode 100644
index 00000000000..a68165956eb
--- /dev/null
+++ b/pkgs/tools/filesystems/kio-fuse/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, mkDerivation
+, fetchgit
+, cmake
+, extra-cmake-modules
+, kio
+, fuse3
+}:
+
+mkDerivation rec {
+  pname = "kio-fuse";
+  version = "5.0.1";
+
+  src = fetchgit {
+    url = "https://invent.kde.org/system/kio-fuse.git";
+    sha256 = "sha256-LSFbFCaEPkQTk1Rg9xpueBOQpkbr/tgYxLD31F6i/qE=";
+    rev = "v${version}";
+  };
+
+  nativeBuildInputs = [ cmake extra-cmake-modules ];
+
+  buildInputs = [ kio fuse3 ];
+
+  meta = with lib; {
+    description = "FUSE Interface for KIO";
+    homepage = "https://invent.kde.org/system/kio-fuse";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ _1000teslas ];
+  };
+}
diff --git a/pkgs/tools/misc/ibus-theme-tools/default.nix b/pkgs/tools/misc/ibus-theme-tools/default.nix
new file mode 100644
index 00000000000..ee8a8719d13
--- /dev/null
+++ b/pkgs/tools/misc/ibus-theme-tools/default.nix
@@ -0,0 +1,29 @@
+{ lib, python3Packages, fetchFromGitHub, gettext }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "ibus-theme-tools";
+  version = "4.2.0";
+
+  src = fetchFromGitHub {
+    owner = "openSUSE";
+    repo = "IBus-Theme-Tools";
+    rev = "v${version}";
+    sha256 = "0i8vwnikwd1bfpv4xlgzc51gn6s18q58nqhvcdiyjzcmy3z344c2";
+  };
+
+  buildInputs = [ gettext ];
+
+  propagatedBuildInputs = with python3Packages; [ tinycss2 pygobject3 ];
+
+  # No test.
+  doCheck = false;
+
+  pythonImportsCheck = [ "ibus_theme_tools" ];
+
+  meta = with lib; {
+    description = "Generate the IBus GTK or GNOME Shell theme from existing themes";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ hollowman6 ];
+    homepage = "https://github.com/openSUSE/IBus-Theme-Tools";
+  };
+}
diff --git a/pkgs/tools/system/plan9port/default.nix b/pkgs/tools/system/plan9port/default.nix
index 7e4ce71ec54..6b22dd5fe5c 100644
--- a/pkgs/tools/system/plan9port/default.nix
+++ b/pkgs/tools/system/plan9port/default.nix
@@ -14,7 +14,7 @@
 
 stdenv.mkDerivation {
   pname = "plan9port";
-  version = "0.pre+date=2021-10-19";
+  version = "2021-10-19";
 
   src =  fetchFromGitHub {
     owner = "9fans";
@@ -101,6 +101,7 @@ stdenv.mkDerivation {
       kovirobi
     ];
     platforms = platforms.unix;
+    broken = stdenv.isDarwin;
   };
 }
 # TODO: investigate the mouse chording support patch
diff --git a/pkgs/tools/text/tidy-viewer/default.nix b/pkgs/tools/text/tidy-viewer/default.nix
index 29d243a6504..43b38d06b92 100644
--- a/pkgs/tools/text/tidy-viewer/default.nix
+++ b/pkgs/tools/text/tidy-viewer/default.nix
@@ -2,16 +2,16 @@
 
 rustPlatform.buildRustPackage rec {
   pname = "tidy-viewer";
-  version = "1.4.2";
+  version = "1.4.3";
 
   src = fetchFromGitHub {
     owner = "alexhallam";
     repo = "tv";
     rev = version;
-    sha256 = "sha256-YXYz+SvL6YRwnZ7frmmx4NevNTh0rJcW7e4jSuX3TNs=";
+    sha256 = "sha256-onLu4XNe3sLfZ273Hq9IvgZEV9ir8oEXX7tQG75K2Hw=";
   };
 
-  cargoSha256 = "sha256-KwnnoVacTMw7kHLQynv9557zUq8aFZfzBD+Zc9Q6XBs=";
+  cargoSha256 = "sha256-CYiRi6ny0wzTddpjdnnMHGqcWRM9wVjF34RmETgLH5A=";
 
   # this test parses command line arguments
   # error: Found argument '--test-threads' which wasn't expected, or isn't valid in this context
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 1a8f5662310..1d045c2afc2 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -259,7 +259,9 @@ with pkgs;
 
   clj-kondo = callPackage ../development/tools/clj-kondo { };
 
-  cloak = callPackage ../applications/misc/cloak { };
+  cloak = callPackage ../applications/misc/cloak {
+    inherit (darwin.apple_sdk.frameworks) Security;
+  };
 
   cmark = callPackage ../development/libraries/cmark { };
 
@@ -1044,6 +1046,8 @@ with pkgs;
 
   hyper = callPackage ../applications/terminal-emulators/hyper { };
 
+  iqueue = callPackage ../development/libraries/iqueue {};
+
   iterm2 = callPackage ../applications/terminal-emulators/iterm2 {};
 
   kitty = callPackage ../applications/terminal-emulators/kitty {
@@ -1735,6 +1739,8 @@ with pkgs;
 
   gitless = callPackage ../applications/version-management/gitless { python = python3; };
 
+  gistyc = with python3Packages; toPythonApplication gistyc;
+
   gitlint = python3Packages.callPackage ../tools/misc/gitlint { };
 
   gitter = callPackage  ../applications/networking/instant-messengers/gitter { };
@@ -3222,6 +3228,10 @@ with pkgs;
 
   lite = callPackage ../applications/editors/lite { };
 
+  lite-xl = callPackage ../applications/editors/lite-xl {
+    inherit (darwin.apple_sdk.frameworks) Foundation;
+  };
+
   loadwatch = callPackage ../tools/system/loadwatch { };
 
   loccount = callPackage ../development/tools/misc/loccount { };
@@ -4159,6 +4169,8 @@ with pkgs;
 
   ibus-with-plugins = callPackage ../tools/inputmethods/ibus/wrapper.nix { };
 
+  ibus-theme-tools = callPackage ../tools/misc/ibus-theme-tools { };
+
   interception-tools = callPackage ../tools/inputmethods/interception-tools { };
   interception-tools-plugins = {
     caps2esc = callPackage ../tools/inputmethods/interception-tools/caps2esc.nix { };
@@ -6741,6 +6753,8 @@ with pkgs;
 
   kibi = callPackage ../applications/editors/kibi { };
 
+  kio-fuse = libsForQt5.callPackage ../tools/filesystems/kio-fuse { };
+
   kismet = callPackage ../applications/networking/sniffers/kismet { };
 
   kiterunner = callPackage ../tools/security/kiterunner { };
@@ -7664,7 +7678,9 @@ with pkgs;
 
   metasploit = callPackage ../tools/security/metasploit { };
 
-  mhost = callPackage ../applications/networking/mhost { };
+  mhost = callPackage ../applications/networking/mhost {
+    inherit (darwin.apple_sdk.frameworks) Security;
+  };
 
   ms-sys = callPackage ../tools/misc/ms-sys { };
 
@@ -19665,7 +19681,7 @@ with pkgs;
 
   StormLib = callPackage ../development/libraries/StormLib { };
 
-  stxxl = callPackage ../development/libraries/stxxl { parallel = true; };
+  stxxl = callPackage ../development/libraries/stxxl { };
 
   sqlite = lowPrio (callPackage ../development/libraries/sqlite { });
 
@@ -27116,6 +27132,8 @@ with pkgs;
     mlt-qt5 = libsForQt514.mlt;
   };
 
+  synology-drive = libsForQt5.callPackage ../applications/networking/synology-drive { };
+
   taxi = callPackage ../applications/networking/ftp/taxi { };
 
   librep = callPackage ../development/libraries/librep { };
@@ -33035,6 +33053,8 @@ with pkgs;
 
   tfswitch = callPackage ../applications/networking/cluster/tfswitch {};
 
+  tgswitch = callPackage ../applications/networking/cluster/tgswitch {};
+
   tilt = callPackage ../applications/networking/cluster/tilt {};
 
   timeular = callPackage ../applications/office/timeular {};
diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix
index 10f51ae5772..895fa1d0d6a 100644
--- a/pkgs/top-level/python-packages.nix
+++ b/pkgs/top-level/python-packages.nix
@@ -3098,6 +3098,8 @@ in {
 
   gipc = callPackage ../development/python-modules/gipc { };
 
+  gistyc = callPackage ../development/python-modules/gistyc { };
+
   git-annex-adapter =
     callPackage ../development/python-modules/git-annex-adapter { };
 
@@ -6362,6 +6364,8 @@ in {
 
   pydy = callPackage ../development/python-modules/pydy { };
 
+  pydyf = callPackage ../development/python-modules/pydyf { };
+
   pyechonest = callPackage ../development/python-modules/pyechonest { };
 
   pyeclib = callPackage ../development/python-modules/pyeclib { };