about summary refs log tree commit diff
path: root/nixpkgs/pkgs/misc
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/misc')
-rw-r--r--nixpkgs/pkgs/misc/acpilight/default.nix34
-rw-r--r--nixpkgs/pkgs/misc/ananicy-cpp/default.nix69
-rw-r--r--nixpkgs/pkgs/misc/ananicy-rules-cachyos/default.nix32
-rw-r--r--nixpkgs/pkgs/misc/ananicy/default.nix52
-rw-r--r--nixpkgs/pkgs/misc/apulse/default.nix33
-rw-r--r--nixpkgs/pkgs/misc/apulse/pressureaudio.nix82
-rw-r--r--nixpkgs/pkgs/misc/arm-trusted-firmware/default.nix154
-rw-r--r--nixpkgs/pkgs/misc/arm-trusted-firmware/remove-hdcp-blob.patch47
-rw-r--r--nixpkgs/pkgs/misc/autoadb/default.nix22
-rw-r--r--nixpkgs/pkgs/misc/autotiling-rs/default.nix23
-rw-r--r--nixpkgs/pkgs/misc/autotiling/default.nix25
-rw-r--r--nixpkgs/pkgs/misc/barebox/default.nix96
-rw-r--r--nixpkgs/pkgs/misc/base16-builder/default.nix8
-rwxr-xr-xnixpkgs/pkgs/misc/base16-builder/generate.sh8
-rw-r--r--nixpkgs/pkgs/misc/base16-builder/node-packages-generated.nix1875
-rw-r--r--nixpkgs/pkgs/misc/base16-builder/node-packages.json3
-rw-r--r--nixpkgs/pkgs/misc/base16-builder/node-packages.nix21
-rw-r--r--nixpkgs/pkgs/misc/base16-builder/supplement.json3
-rw-r--r--nixpkgs/pkgs/misc/base16-builder/supplement.nix693
-rw-r--r--nixpkgs/pkgs/misc/base16-shell-preview/default.nix29
-rw-r--r--nixpkgs/pkgs/misc/beep/default.nix28
-rw-r--r--nixpkgs/pkgs/misc/brightnessctl/default.nix28
-rw-r--r--nixpkgs/pkgs/misc/calaos/installer/default.nix34
-rw-r--r--nixpkgs/pkgs/misc/cbeams/default.nix21
-rw-r--r--nixpkgs/pkgs/misc/cliscord/default.nix35
-rw-r--r--nixpkgs/pkgs/misc/cups/0001-TargetConditionals.patch29
-rw-r--r--nixpkgs/pkgs/misc/cups/cups-pk-helper.nix30
-rw-r--r--nixpkgs/pkgs/misc/cups/default.nix153
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/brgenml1cupswrapper/default.nix125
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/brgenml1lpr/default.nix95
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/brlaser/default.nix63
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/brother/dcp9020cdw/default.nix101
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/brother/hll2375dw/default.nix104
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/brother/hll2375dw/fix-perm.patch10
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/brother/mfcl3770cdw/default.nix90
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/canon/default.nix199
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/carps-cups/default.nix44
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter2/default.nix150
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter2/patches/get_protocol.patch14
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/default.nix114
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/patches/libpng15.patch23
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/patches/missing-include.patch20
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/default.nix156
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-3.80-1-cups-1.6.patch62
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-3.80-6-cups-1.6.patch87
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-4-ppd.patch10
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-5-abi_x86_32.patch45
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-6-headers.patch11
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-7-sysctl.patch10
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cups-bjnp/default.nix31
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix58
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/cups-pdf-to-pdf/default.nix62
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/dymo/default.nix28
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/dymo/fix-includes.patch80
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/estudio/default.nix50
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/foomatic-db-engine/default.nix95
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/foomatic-db-nonfree/default.nix87
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/foomatic-db-ppds/default.nix122
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/foomatic-db/default.nix103
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/fxlinuxprint/default.nix52
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/hl1110/default.nix75
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/hl1210w/default.nix64
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/hl3140cw/default.nix80
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/hll2340dw/default.nix72
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/hll2350dw/default.nix95
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/hll2390dw-cups/default.nix72
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/hll3230cdw/default.nix76
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/kyocera-ecosys-m2x35-40-p2x35-40dnw/default.nix33
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/kyocera-ecosys-m552x-p502x/default.nix29
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/kyocera/default.nix58
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/kyodialog/default.nix106
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfc5890cncupswrapper/default.nix76
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfc5890cnlpr/default.nix75
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfc9140cdncupswrapper/default.nix69
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfc9140cdnlpr/default.nix74
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix62
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcj470dwlpr/default.nix46
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix65
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcj6510dwlpr/default.nix90
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl2700dncupswrapper/default.nix44
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl2700dnlpr/default.nix45
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl2720dwcupswrapper/default.nix47
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl2720dwlpr/default.nix46
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl2740dwcupswrapper/default.nix45
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl2740dwlpr/default.nix44
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl2750dw/default.nix94
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl8690cdwcupswrapper/default.nix45
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/mfcl8690cdwlpr/default.nix46
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.36/default.nix120
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.36/module.nix44
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.37.nix102
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/samsung/4.00.39/builder.sh36
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/samsung/4.01.17.nix96
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/splix/default.nix54
-rw-r--r--nixpkgs/pkgs/misc/cups/drivers/zj-58/default.nix28
-rw-r--r--nixpkgs/pkgs/misc/cups/filters.nix122
-rw-r--r--nixpkgs/pkgs/misc/dart-sass-embedded/default.nix74
-rw-r--r--nixpkgs/pkgs/misc/documentation-highlighter/LICENSE24
-rw-r--r--nixpkgs/pkgs/misc/documentation-highlighter/README.md152
-rw-r--r--nixpkgs/pkgs/misc/documentation-highlighter/default.nix22
-rw-r--r--nixpkgs/pkgs/misc/documentation-highlighter/highlight.pack.js2
-rw-r--r--nixpkgs/pkgs/misc/documentation-highlighter/loader.js7
-rw-r--r--nixpkgs/pkgs/misc/documentation-highlighter/mono-blue.css59
-rwxr-xr-xnixpkgs/pkgs/misc/documentation-highlighter/update.sh42
-rw-r--r--nixpkgs/pkgs/misc/doge/default.nix18
-rw-r--r--nixpkgs/pkgs/misc/drivers/argononed/default.nix48
-rw-r--r--nixpkgs/pkgs/misc/drivers/argononed/fix-hardcoded-reboot-poweroff-paths.patch18
-rw-r--r--nixpkgs/pkgs/misc/drivers/dell-530cdn/default.nix13
-rw-r--r--nixpkgs/pkgs/misc/drivers/epkowa/default.nix417
-rw-r--r--nixpkgs/pkgs/misc/drivers/epkowa/firmware_location.patch21
-rw-r--r--nixpkgs/pkgs/misc/drivers/epkowa/sscanf.patch29
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-201106w/default.nix77
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-201401w/default.nix67
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-201401w/fixbuild.patch101
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-alc1100/cups-data-dir.patch13
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-alc1100/default.nix72
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-alc1100/ppd.patch13
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-escpr/cups-filter-ppd-dirs.patch62
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-escpr/default.nix51
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-escpr2/cups-filter-ppd-dirs.patch55
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-escpr2/default.nix44
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson-workforce-635-nx625-series/default.nix102
-rw-r--r--nixpkgs/pkgs/misc/drivers/epson_201207w/default.nix77
-rw-r--r--nixpkgs/pkgs/misc/drivers/epsonscan2/build.patch91
-rw-r--r--nixpkgs/pkgs/misc/drivers/epsonscan2/default.nix162
-rw-r--r--nixpkgs/pkgs/misc/drivers/foo2zjs/default.nix76
-rw-r--r--nixpkgs/pkgs/misc/drivers/foo2zjs/dell1250c-color-fix.patch29
-rw-r--r--nixpkgs/pkgs/misc/drivers/foo2zjs/hbpl1.patch4676
-rw-r--r--nixpkgs/pkgs/misc/drivers/foo2zjs/no-hardcode-fw.diff98
-rw-r--r--nixpkgs/pkgs/misc/drivers/foo2zjs/papercode-format-fix.patch101
-rw-r--r--nixpkgs/pkgs/misc/drivers/foomatic-filters/default.nix47
-rw-r--r--nixpkgs/pkgs/misc/drivers/gutenprint/bin.nix70
-rw-r--r--nixpkgs/pkgs/misc/drivers/gutenprint/default.nix55
-rw-r--r--nixpkgs/pkgs/misc/drivers/hplip/default.nix288
-rw-r--r--nixpkgs/pkgs/misc/drivers/hplip/hplip-3.20.11-nixos-cups-ppd-search-path.patch24
-rw-r--r--nixpkgs/pkgs/misc/drivers/hplip/hplip.state4
-rw-r--r--nixpkgs/pkgs/misc/drivers/hplip/revert-snprintf-change.patch61
-rw-r--r--nixpkgs/pkgs/misc/drivers/infnoise/default.nix60
-rw-r--r--nixpkgs/pkgs/misc/drivers/infnoise/makefile.patch14
-rw-r--r--nixpkgs/pkgs/misc/drivers/logiops/default.nix26
-rw-r--r--nixpkgs/pkgs/misc/drivers/m33-linux/default.nix26
-rw-r--r--nixpkgs/pkgs/misc/drivers/moltengamepad/default.nix39
-rw-r--r--nixpkgs/pkgs/misc/drivers/pantum-driver/default.nix53
-rw-r--r--nixpkgs/pkgs/misc/drivers/postscript-lexmark/default.nix36
-rw-r--r--nixpkgs/pkgs/misc/drivers/sc-controller/default.nix57
-rw-r--r--nixpkgs/pkgs/misc/drivers/spacenavd/configure-cfgfile-path.patch63
-rw-r--r--nixpkgs/pkgs/misc/drivers/spacenavd/configure-pidfile-path.patch82
-rw-r--r--nixpkgs/pkgs/misc/drivers/spacenavd/configure-socket-path.patch118
-rw-r--r--nixpkgs/pkgs/misc/drivers/spacenavd/default.nix46
-rw-r--r--nixpkgs/pkgs/misc/drivers/steamcontroller/default.nix34
-rw-r--r--nixpkgs/pkgs/misc/drivers/sundtek/default.nix53
-rw-r--r--nixpkgs/pkgs/misc/drivers/utsushi/default.nix179
-rw-r--r--nixpkgs/pkgs/misc/drivers/utsushi/networkscan.nix35
-rw-r--r--nixpkgs/pkgs/misc/drivers/xboxdrv/default.nix44
-rw-r--r--nixpkgs/pkgs/misc/drivers/xboxdrv/fix-60-sec-delay.patch27
-rw-r--r--nixpkgs/pkgs/misc/drivers/xboxdrv/scons-py3.patch63
-rw-r--r--nixpkgs/pkgs/misc/drivers/xboxdrv/scons-v4.2.0.patch20
-rw-r--r--nixpkgs/pkgs/misc/drivers/xboxdrv/xboxdrvctl-py3.patch73
-rw-r--r--nixpkgs/pkgs/misc/drivers/xwiimote/default.nix28
-rw-r--r--nixpkgs/pkgs/misc/dumb/default.nix29
-rw-r--r--nixpkgs/pkgs/misc/dxvk/darwin-dxvk-compat.patch48
-rw-r--r--nixpkgs/pkgs/misc/dxvk/darwin-thread-primitives.patch186
-rw-r--r--nixpkgs/pkgs/misc/dxvk/default.nix52
-rw-r--r--nixpkgs/pkgs/misc/dxvk/dxvk.nix114
-rw-r--r--nixpkgs/pkgs/misc/dxvk/setup_dxvk.sh266
-rw-r--r--nixpkgs/pkgs/misc/fastly/default.nix82
-rw-r--r--nixpkgs/pkgs/misc/flashfocus/default.nix50
-rw-r--r--nixpkgs/pkgs/misc/frescobaldi/default.nix61
-rw-r--r--nixpkgs/pkgs/misc/g810-led/default.nix51
-rw-r--r--nixpkgs/pkgs/misc/ghostscript/default.nix193
-rw-r--r--nixpkgs/pkgs/misc/ghostscript/doc-no-ref.diff7
-rw-r--r--nixpkgs/pkgs/misc/ghostscript/test-corpus-render.nix37
-rw-r--r--nixpkgs/pkgs/misc/ghostscript/urw-font-files.patch61
-rw-r--r--nixpkgs/pkgs/misc/gnu-shepherd/default.nix24
-rw-r--r--nixpkgs/pkgs/misc/gnuk/default.nix11
-rw-r--r--nixpkgs/pkgs/misc/gnuk/generic.nix52
-rw-r--r--nixpkgs/pkgs/misc/hdt/default.nix27
-rw-r--r--nixpkgs/pkgs/misc/i3a/default.nix29
-rw-r--r--nixpkgs/pkgs/misc/ite-backlight/default.nix47
-rw-r--r--nixpkgs/pkgs/misc/jackaudio/default.nix84
-rw-r--r--nixpkgs/pkgs/misc/jackaudio/jack1.nix45
-rw-r--r--nixpkgs/pkgs/misc/jitsi-meet-prosody/default.nix38
-rwxr-xr-xnixpkgs/pkgs/misc/jitsi-meet-prosody/update.sh12
-rw-r--r--nixpkgs/pkgs/misc/lguf-brightness/default.nix31
-rw-r--r--nixpkgs/pkgs/misc/libcardiacarrest/default.nix48
-rw-r--r--nixpkgs/pkgs/misc/lightspark/default.nix34
-rw-r--r--nixpkgs/pkgs/misc/lilypond/default.nix70
-rw-r--r--nixpkgs/pkgs/misc/lilypond/fonts.nix134
-rw-r--r--nixpkgs/pkgs/misc/lilypond/unstable.nix14
-rwxr-xr-xnixpkgs/pkgs/misc/lilypond/update.sh25
-rw-r--r--nixpkgs/pkgs/misc/lilypond/with-fonts.nix17
-rw-r--r--nixpkgs/pkgs/misc/logging/beats/7.x.nix59
-rw-r--r--nixpkgs/pkgs/misc/logging/pacemaker/default.nix102
-rw-r--r--nixpkgs/pkgs/misc/long-shebang/default.nix21
-rw-r--r--nixpkgs/pkgs/misc/lssecret/default.nix31
-rw-r--r--nixpkgs/pkgs/misc/meson-tools/default.nix27
-rw-r--r--nixpkgs/pkgs/misc/mlxbf-bootimages/default.nix41
-rw-r--r--nixpkgs/pkgs/misc/mnemonicode/default.nix27
-rw-r--r--nixpkgs/pkgs/misc/moonfire-nvr/Cargo.lock2651
-rw-r--r--nixpkgs/pkgs/misc/moonfire-nvr/default.nix80
-rw-r--r--nixpkgs/pkgs/misc/mxt-app/default.nix26
-rw-r--r--nixpkgs/pkgs/misc/my-env/default.nix152
-rw-r--r--nixpkgs/pkgs/misc/my-env/loadenv.sh22
-rw-r--r--nixpkgs/pkgs/misc/nflz/default.nix34
-rw-r--r--nixpkgs/pkgs/misc/opcua-client-gui/default.nix60
-rw-r--r--nixpkgs/pkgs/misc/openrussian-cli/default.nix59
-rw-r--r--nixpkgs/pkgs/misc/opensbi/default.nix49
-rw-r--r--nixpkgs/pkgs/misc/plasma-hud/default.nix41
-rw-r--r--nixpkgs/pkgs/misc/platformsh/default.nix51
-rw-r--r--nixpkgs/pkgs/misc/present/default.nix31
-rw-r--r--nixpkgs/pkgs/misc/ptouch-print/default.nix34
-rw-r--r--nixpkgs/pkgs/misc/pylode/default.nix49
-rw-r--r--nixpkgs/pkgs/misc/rich-cli/default.nix79
-rw-r--r--nixpkgs/pkgs/misc/riscv-pk/default.nix41
-rw-r--r--nixpkgs/pkgs/misc/rivalcfg/default.nix40
-rw-r--r--nixpkgs/pkgs/misc/rkdeveloptool-pine64/default.nix44
-rw-r--r--nixpkgs/pkgs/misc/rkdeveloptool/default.nix27
-rw-r--r--nixpkgs/pkgs/misc/sagetex/default.nix44
-rw-r--r--nixpkgs/pkgs/misc/sailsd/default.nix48
-rw-r--r--nixpkgs/pkgs/misc/scimark/default.nix36
-rw-r--r--nixpkgs/pkgs/misc/scrcpy/default.nix77
-rw-r--r--nixpkgs/pkgs/misc/screensavers/alock/default.nix46
-rw-r--r--nixpkgs/pkgs/misc/screensavers/betterlockscreen/default.nix58
-rw-r--r--nixpkgs/pkgs/misc/screensavers/electricsheep/default.nix76
-rw-r--r--nixpkgs/pkgs/misc/screensavers/i3lock-pixeled/default.nix40
-rw-r--r--nixpkgs/pkgs/misc/screensavers/light-locker/default.nix88
-rw-r--r--nixpkgs/pkgs/misc/screensavers/multilockscreen/default.nix47
-rw-r--r--nixpkgs/pkgs/misc/screensavers/physlock/default.nix27
-rw-r--r--nixpkgs/pkgs/misc/screensavers/pipes-rs/default.nix33
-rw-r--r--nixpkgs/pkgs/misc/screensavers/pipes/default.nix32
-rw-r--r--nixpkgs/pkgs/misc/screensavers/rss-glx/cstddef.patch12
-rw-r--r--nixpkgs/pkgs/misc/screensavers/rss-glx/default.nix42
-rw-r--r--nixpkgs/pkgs/misc/screensavers/slock/default.nix38
-rw-r--r--nixpkgs/pkgs/misc/screensavers/vlock/default.nix30
-rw-r--r--nixpkgs/pkgs/misc/screensavers/vlock/eintr.patch34
-rw-r--r--nixpkgs/pkgs/misc/screensavers/xautolock/default.nix35
-rw-r--r--nixpkgs/pkgs/misc/screensavers/xlockmore/default.nix42
-rw-r--r--nixpkgs/pkgs/misc/screensavers/xscreensaver/default.nix108
-rw-r--r--nixpkgs/pkgs/misc/screensavers/xss-lock/default.nix24
-rw-r--r--nixpkgs/pkgs/misc/screensavers/xssproxy/default.nix29
-rw-r--r--nixpkgs/pkgs/misc/screensavers/xtrlock-pam/default.nix30
-rw-r--r--nixpkgs/pkgs/misc/seafile-shared/default.nix64
-rw-r--r--nixpkgs/pkgs/misc/sndio/default.nix29
-rw-r--r--nixpkgs/pkgs/misc/solfege/css.patch33
-rw-r--r--nixpkgs/pkgs/misc/solfege/default.nix73
-rw-r--r--nixpkgs/pkgs/misc/solfege/menubar.patch7
-rw-r--r--nixpkgs/pkgs/misc/solfege/texinfo.patch20
-rw-r--r--nixpkgs/pkgs/misc/solfege/webbrowser.patch8
-rw-r--r--nixpkgs/pkgs/misc/sound-of-sorting/default.nix38
-rw-r--r--nixpkgs/pkgs/misc/source-and-tags/default.nix94
-rw-r--r--nixpkgs/pkgs/misc/stabber/default.nix33
-rw-r--r--nixpkgs/pkgs/misc/superd/default.nix43
-rw-r--r--nixpkgs/pkgs/misc/t-rec/default.nix37
-rw-r--r--nixpkgs/pkgs/misc/talkfilters/default.nix26
-rw-r--r--nixpkgs/pkgs/misc/tmux-plugins/default.nix725
-rw-r--r--nixpkgs/pkgs/misc/tmux-plugins/tmux-thumbs/default.nix29
-rw-r--r--nixpkgs/pkgs/misc/tmux-plugins/tmux-thumbs/fix.patch45
-rw-r--r--nixpkgs/pkgs/misc/tpm2-pkcs11/0001-configure-ac-version.patch13
-rw-r--r--nixpkgs/pkgs/misc/tpm2-pkcs11/default.nix79
-rw-r--r--nixpkgs/pkgs/misc/uboot/0001-configs-rpi-allow-for-bigger-kernels.patch45
-rw-r--r--nixpkgs/pkgs/misc/uboot/default.nix564
-rwxr-xr-xnixpkgs/pkgs/misc/uq/default.nix25
-rw-r--r--nixpkgs/pkgs/misc/urbit/default.nix39
-rwxr-xr-xnixpkgs/pkgs/misc/urbit/update-bin.sh40
-rw-r--r--nixpkgs/pkgs/misc/vencord/default.nix66
-rw-r--r--nixpkgs/pkgs/misc/vencord/disable-updater-ui.patch35
-rw-r--r--nixpkgs/pkgs/misc/vencord/package-lock.json5743
-rw-r--r--nixpkgs/pkgs/misc/vencord/replace-git.patch26
-rw-r--r--nixpkgs/pkgs/misc/wiki-tui/default.nix42
-rw-r--r--nixpkgs/pkgs/misc/xosd/default.nix21
-rw-r--r--nixpkgs/pkgs/misc/zeyple/default.nix27
271 files changed, 31983 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/misc/acpilight/default.nix b/nixpkgs/pkgs/misc/acpilight/default.nix
new file mode 100644
index 000000000000..91bb87829131
--- /dev/null
+++ b/nixpkgs/pkgs/misc/acpilight/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchgit, python3, coreutils }:
+
+stdenv.mkDerivation rec {
+  pname = "acpilight";
+  version = "1.2";
+
+  src = fetchgit {
+    url = "https://gitlab.com/wavexx/acpilight.git";
+    rev = "v${version}";
+    sha256 = "1r0r3nx6x6vkpal6vci0zaa1n9dfacypldf6k8fxg7919vzxdn1w";
+  };
+
+  pyenv = python3.withPackages (pythonPackages: with pythonPackages; [
+    configargparse
+  ]);
+
+  postConfigure = ''
+    substituteInPlace 90-backlight.rules --replace /bin ${coreutils}/bin
+    substituteInPlace Makefile --replace udevadm true
+  '';
+
+  buildInputs = [ pyenv ];
+
+  makeFlags = [ "DESTDIR=$(out) prefix=" ];
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/wavexx/acpilight";
+    description = "ACPI backlight control";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ smakarov ];
+    platforms = platforms.linux;
+    mainProgram = "xbacklight";
+  };
+}
diff --git a/nixpkgs/pkgs/misc/ananicy-cpp/default.nix b/nixpkgs/pkgs/misc/ananicy-cpp/default.nix
new file mode 100644
index 000000000000..e8679c9cb578
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ananicy-cpp/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, clangStdenv
+, fetchFromGitLab
+, cmake
+, pkg-config
+, spdlog
+, nlohmann_json
+, systemd
+, libbpf
+, elfutils
+, bpftools
+, zlib
+}:
+
+clangStdenv.mkDerivation rec {
+  pname = "ananicy-cpp";
+  version = "1.1.0";
+
+  src = fetchFromGitLab {
+    owner = "ananicy-cpp";
+    repo = "ananicy-cpp";
+    rev = "v${version}";
+    fetchSubmodules = true;
+    sha256 = "sha256-BomtP9KcipBJuZjra/ojRyJi+pgktxGGEdt86N1H9Hc=";
+  };
+
+  strictDeps = true;
+
+  nativeBuildInputs = [
+    cmake
+    pkg-config
+    bpftools
+  ];
+
+  buildInputs = [
+    spdlog
+    nlohmann_json
+    systemd
+    libbpf
+    elfutils
+    zlib
+  ];
+
+  # BPF A call to built-in function '__stack_chk_fail' is not supported.
+  hardeningDisable = [ "stackprotector" ];
+
+  cmakeFlags = [
+    "-DUSE_EXTERNAL_JSON=ON"
+    "-DUSE_EXTERNAL_SPDLOG=ON"
+    "-DUSE_EXTERNAL_FMTLIB=ON"
+    "-DUSE_BPF_PROC_IMPL=ON"
+    "-DBPF_BUILD_LIBBPF=OFF"
+    "-DENABLE_SYSTEMD=ON"
+    "-DVERSION=${version}"
+  ];
+
+  postInstall = ''
+    rm -rf "$out"/include
+    rm -rf "$out"/lib/cmake
+  '';
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/ananicy-cpp/ananicy-cpp";
+    description = "Rewrite of ananicy in c++ for lower cpu and memory usage";
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/ananicy-rules-cachyos/default.nix b/nixpkgs/pkgs/misc/ananicy-rules-cachyos/default.nix
new file mode 100644
index 000000000000..575f582d2c9f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ananicy-rules-cachyos/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation rec {
+  pname = "ananicy";
+  version = "unstable-2023-06-28";
+
+  src = fetchFromGitHub {
+    owner = "CachyOS";
+    repo = "ananicy-rules";
+    rev = "b2b4342d769bc3c6abc4ce77bd53d6ca06d659e5";
+    sha256 = "sha256-TGX7GlfSeKu68mVM71/kdJH31gzMmhzCAqA390aEq8U=";
+  };
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    runHook preBuild
+    mkdir -p $out
+    cp -r * $out
+    rm $out/README.md
+    runHook postBuild
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/CachyOS/ananicy-rules";
+    description = "ananicy-cpp-rules for CachyOS ";
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/ananicy/default.nix b/nixpkgs/pkgs/misc/ananicy/default.nix
new file mode 100644
index 000000000000..62daaad2c604
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ananicy/default.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, python3, fetchFromGitHub, makeWrapper, schedtool, sysctl, util-linux, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  pname = "ananicy";
+  version = "unstable-2023-03-21";
+
+  src = fetchFromGitHub {
+    owner = "nefelim4ag";
+    repo = "ananicy";
+    rev = "1e2cc9a62ba3b6793e59da66aa0039f89e1ad49f";
+    sha256 = "sha256-nHp47eYI36edka+cBMzayPHEflAzpgLx0VehhsyYpwI=";
+  };
+
+  patches = [
+    # https://github.com/Nefelim4ag/Ananicy/pull/437
+    # fix makefile destinations
+    (fetchpatch {
+      url = "https://github.com/Nefelim4ag/Ananicy/commit/dbda0f50670de3f249991706ef1cc107c5197a2f.patch";
+      sha256 = "sha256-vMcJxekg2QUbm253CLAv3tmo5kedSlw+/PI/LamNWwc=";
+      # only used for debian packaging. lets exclude it so the patch applies even when that file is changed
+      excludes = [ "package.sh" ];
+    })
+  ];
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ python3 ];
+
+  makeFlags = [
+    "PREFIX=$(out)"
+    "SYSCONFDIR=${placeholder "out"}/etc"
+  ];
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  postInstall = ''
+    wrapProgram $out/bin/ananicy \
+      --prefix PATH : ${lib.makeBinPath [ schedtool util-linux ]}
+
+    substituteInPlace $out/lib/systemd/system/ananicy.service \
+      --replace "/sbin/sysctl" "${sysctl}/bin/sysctl" \
+      --replace "/usr/bin/ananicy" "$out/bin/ananicy"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/Nefelim4ag/Ananicy";
+    description = "Another auto nice daemon, with community rules support";
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/apulse/default.nix b/nixpkgs/pkgs/misc/apulse/default.nix
new file mode 100644
index 000000000000..95beb8bcdf3f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/apulse/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, alsa-lib, cmake, pkg-config, glib
+, tracingSupport ? true, logToStderr ? true }:
+
+let oz = x: if x then "1" else "0"; in
+
+stdenv.mkDerivation rec {
+  pname = "apulse";
+  version = "0.1.13";
+
+  src = fetchFromGitHub {
+    owner = "i-rinat";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1p6fh6ah5v3qz7dxhcsixx38bxg44ypbim4m03bxk3ls5i9xslmn";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config ];
+
+  buildInputs = [ alsa-lib glib ];
+
+  cmakeFlags = [
+    "-DWITH_TRACE=${oz tracingSupport}"
+    "-DLOG_TO_STDERR=${oz logToStderr}"
+  ];
+
+  meta = with lib; {
+    description = "PulseAudio emulation for ALSA";
+    homepage = "https://github.com/i-rinat/apulse";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.jagajaga ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/apulse/pressureaudio.nix b/nixpkgs/pkgs/misc/apulse/pressureaudio.nix
new file mode 100644
index 000000000000..638334f44a5d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/apulse/pressureaudio.nix
@@ -0,0 +1,82 @@
+{ stdenv, apulse, libpulseaudio, pkg-config, intltool }:
+
+stdenv.mkDerivation {
+  pname = "libpressureaudio";
+  version = apulse.version;
+
+  src = libpulseaudio.src;
+
+  nativeBuildInputs = [ pkg-config intltool ];
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    echo "Copying libraries from apulse."
+    mkdir -p $out/lib
+    ls ${apulse}/lib/apulse $out/lib
+    cp -a ${apulse}/lib/apulse/* $out/lib/
+
+    echo "Copying headers from pulseaudio."
+    mkdir -p $out/include/pulse
+    cp -a src/pulse/*.h $out/include/pulse
+
+    echo "Generating custom pkgconfig definitions."
+    mkdir -p $out/lib/pkgconfig
+    for a in libpulse.pc libpulse-simple.pc libpulse-mainloop-glib.pc ; do
+        cat > $out/lib/pkgconfig/$a << EOF
+    prefix=$out
+    libdir=$out/lib
+    includedir=$out/include
+
+    EOF
+    done
+
+    cat >> $out/lib/pkgconfig/libpulse.pc << EOF
+    Name: libpulse
+    Description: PulseAudio Client Interface
+    Version: ${libpulseaudio.version}-rebootstrapped
+    Libs: -L$out/lib -lpulse
+    Cflags: -I$out/include -D_REENTRANT
+    EOF
+
+    cat >> $out/lib/pkgconfig/libpulse-simple.pc << EOF
+    Name: libpulse-simple
+    Description: PulseAudio Simplified Synchronous Client Interface
+    Version: ${libpulseaudio.version}-rebootstrapped
+    Libs: -L$out/lib -lpulse-simple
+    Cflags: -I$out/include -D_REENTRANT
+    Requires: libpulse
+    EOF
+
+    cat >> $out/lib/pkgconfig/libpulse-mainloop-glib.pc << EOF
+    Name: libpulse-mainloop-glib
+    Description: PulseAudio GLib 2.0 Main Loop Wrapper
+    Version: ${libpulseaudio.version}-rebootstrapped
+    Libs: -L$out/lib -lpulse-mainloop-glib
+    Cflags: -I$out/include -D_REENTRANT
+    Requires: libpulse glib-2.0
+    EOF
+  '';
+
+  meta = apulse.meta // {
+    description = "libpulse without any sound daemons over pure ALSA";
+    longDescription = ''
+      apulse (${apulse.meta.homepage}) implements most of libpulse
+      API over pure ALSA in 5% LOC of the original PulseAudio.
+
+      But apulse is made to be used as a wrapper that substitutes its
+      replacement libs into LD_LIBRARY_PATH. The problem with that is
+      that you still have to link against the original libpulse.
+
+      pressureaudio (http://git.r-36.net/pressureaudio/) wraps apulse
+      with everything you need to replace libpulse completely.
+
+      This derivation is a reimplementation of pressureaudio in pure
+      nix.
+
+      You can simply override libpulse with this and most
+      packages would just work.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/misc/arm-trusted-firmware/default.nix b/nixpkgs/pkgs/misc/arm-trusted-firmware/default.nix
new file mode 100644
index 000000000000..ee7fedbedbe8
--- /dev/null
+++ b/nixpkgs/pkgs/misc/arm-trusted-firmware/default.nix
@@ -0,0 +1,154 @@
+{ lib, stdenv, fetchFromGitHub, openssl, pkgsCross, buildPackages
+
+# Warning: this blob (hdcp.bin) runs on the main CPU (not the GPU) at
+# privilege level EL3, which is above both the kernel and the
+# hypervisor.
+#
+# This parameter applies only to platforms which are believed to use
+# hdcp.bin. On all other platforms, or if unfreeIncludeHDCPBlob=false,
+# hdcp.bin will be deleted before building.
+, unfreeIncludeHDCPBlob ? true
+}:
+
+let
+  buildArmTrustedFirmware = { filesToInstall
+            , installDir ? "$out"
+            , platform ? null
+            , platformCanUseHDCPBlob ? false  # set this to true if the platform is able to use hdcp.bin
+            , extraMakeFlags ? []
+            , extraMeta ? {}
+            , ... } @ args:
+
+           # delete hdcp.bin if either: the platform is thought to
+           # not need it or unfreeIncludeHDCPBlob is false
+           let deleteHDCPBlobBeforeBuild = !platformCanUseHDCPBlob || !unfreeIncludeHDCPBlob; in
+
+           stdenv.mkDerivation (rec {
+
+    pname = "arm-trusted-firmware${lib.optionalString (platform != null) "-${platform}"}";
+    version = "2.9.0";
+
+    src = fetchFromGitHub {
+      owner = "ARM-software";
+      repo = "arm-trusted-firmware";
+      rev = "v${version}";
+      hash = "sha256-F7RNYNLh0ORzl5PmzRX9wGK8dZgUQVLKQg1M9oNd0pk=";
+    };
+
+    patches = lib.optionals deleteHDCPBlobBeforeBuild [
+      # this is a rebased version of https://gitlab.com/vicencb/kevinboot/-/blob/master/atf.patch
+      ./remove-hdcp-blob.patch
+    ];
+
+    postPatch = lib.optionalString deleteHDCPBlobBeforeBuild ''
+      rm plat/rockchip/rk3399/drivers/dp/hdcp.bin
+    '';
+
+    depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+    # For Cortex-M0 firmware in RK3399
+    nativeBuildInputs = [ pkgsCross.arm-embedded.stdenv.cc ];
+
+    buildInputs = [ openssl ];
+
+    makeFlags = [
+      "CROSS_COMPILE=${stdenv.cc.targetPrefix}"
+      # binutils 2.39 regression
+      # `warning: /build/source/build/rk3399/release/bl31/bl31.elf has a LOAD segment with RWX permissions`
+      # See also: https://developer.trustedfirmware.org/T996
+      "LDFLAGS=-no-warn-rwx-segments"
+    ] ++ (lib.optional (platform != null) "PLAT=${platform}")
+      ++ extraMakeFlags;
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p ${installDir}
+      cp ${lib.concatStringsSep " " filesToInstall} ${installDir}
+
+      runHook postInstall
+    '';
+
+    hardeningDisable = [ "all" ];
+    dontStrip = true;
+
+    # Fatal error: can't create build/sun50iw1p1/release/bl31/sunxi_clocks.o: No such file or directory
+    enableParallelBuilding = false;
+
+    meta = with lib; {
+      homepage = "https://github.com/ARM-software/arm-trusted-firmware";
+      description = "A reference implementation of secure world software for ARMv8-A";
+      license = [ licenses.bsd3 ] ++ lib.optionals (!deleteHDCPBlobBeforeBuild) [ licenses.unfreeRedistributable ];
+      maintainers = with maintainers; [ lopsided98 ];
+    } // extraMeta;
+  } // builtins.removeAttrs args [ "extraMeta" ]);
+
+in {
+  inherit buildArmTrustedFirmware;
+
+  armTrustedFirmwareTools = buildArmTrustedFirmware rec {
+    extraMakeFlags = [
+      "HOSTCC=${stdenv.cc.targetPrefix}gcc"
+      "fiptool" "certtool"
+    ];
+    filesToInstall = [
+      "tools/fiptool/fiptool"
+      "tools/cert_create/cert_create"
+    ];
+    postInstall = ''
+      mkdir -p "$out/bin"
+      find "$out" -type f -executable -exec mv -t "$out/bin" {} +
+    '';
+  };
+
+  armTrustedFirmwareAllwinner = buildArmTrustedFirmware rec {
+    platform = "sun50i_a64";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = ["build/${platform}/release/bl31.bin"];
+  };
+
+  armTrustedFirmwareAllwinnerH616 = buildArmTrustedFirmware rec {
+    platform = "sun50i_h616";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = ["build/${platform}/release/bl31.bin"];
+  };
+
+  armTrustedFirmwareAllwinnerH6 = buildArmTrustedFirmware rec {
+    platform = "sun50i_h6";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = ["build/${platform}/release/bl31.bin"];
+  };
+
+  armTrustedFirmwareQemu = buildArmTrustedFirmware rec {
+    platform = "qemu";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = [
+      "build/${platform}/release/bl1.bin"
+      "build/${platform}/release/bl2.bin"
+      "build/${platform}/release/bl31.bin"
+    ];
+  };
+
+  armTrustedFirmwareRK3328 = buildArmTrustedFirmware rec {
+    extraMakeFlags = [ "bl31" ];
+    platform = "rk3328";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = [ "build/${platform}/release/bl31/bl31.elf"];
+    platformCanUseHDCPBlob = true;
+  };
+
+  armTrustedFirmwareRK3399 = buildArmTrustedFirmware rec {
+    extraMakeFlags = [ "bl31" ];
+    platform = "rk3399";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = [ "build/${platform}/release/bl31/bl31.elf"];
+    platformCanUseHDCPBlob = true;
+  };
+
+  armTrustedFirmwareS905 = buildArmTrustedFirmware rec {
+    extraMakeFlags = [ "bl31" ];
+    platform = "gxbb";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = [ "build/${platform}/release/bl31.bin"];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/arm-trusted-firmware/remove-hdcp-blob.patch b/nixpkgs/pkgs/misc/arm-trusted-firmware/remove-hdcp-blob.patch
new file mode 100644
index 000000000000..7f99fbdcabfd
--- /dev/null
+++ b/nixpkgs/pkgs/misc/arm-trusted-firmware/remove-hdcp-blob.patch
@@ -0,0 +1,47 @@
+diff --git a/plat/rockchip/rk3399/drivers/dp/cdn_dp.c b/plat/rockchip/rk3399/drivers/dp/cdn_dp.c
+index a8773f4f6..8e28c4830 100644
+--- a/plat/rockchip/rk3399/drivers/dp/cdn_dp.c
++++ b/plat/rockchip/rk3399/drivers/dp/cdn_dp.c
+@@ -13,17 +13,6 @@
+ 
+ #include <cdn_dp.h>
+ 
+-__asm__(
+-	".pushsection .text.hdcp_handler, \"ax\", %progbits\n"
+-	".global hdcp_handler\n"
+-	".balign 4\n"
+-	"hdcp_handler:\n"
+-	".incbin \"" HDCPFW "\"\n"
+-	".type hdcp_handler, %function\n"
+-	".size hdcp_handler, .- hdcp_handler\n"
+-	".popsection\n"
+-);
+-
+ static uint64_t *hdcp_key_pdata;
+ static struct cdn_dp_hdcp_key_1x key;
+ 
+@@ -38,7 +27,7 @@ uint64_t dp_hdcp_ctrl(uint64_t type)
+ 		return 0;
+ 	case HDCP_KEY_DATA_START_DECRYPT:
+ 		if (hdcp_key_pdata == (uint64_t *)(&key + 1))
+-			return hdcp_handler(&key);
++			return PSCI_E_DISABLED;
+ 		else
+ 			return PSCI_E_INVALID_PARAMS;
+ 		assert(0); /* Unreachable */
+diff --git a/plat/rockchip/rk3399/platform.mk b/plat/rockchip/rk3399/platform.mk
+index a658fb286..5edb6a25b 100644
+--- a/plat/rockchip/rk3399/platform.mk
++++ b/plat/rockchip/rk3399/platform.mk
+@@ -88,11 +88,6 @@ $(eval $(call add_define_val,RK3399M0PMUFW,\"$(RK3399M0PMUFW)\"))
+ ifdef PLAT_RK_DP_HDCP
+ BL31_SOURCES	+= ${RK_PLAT_SOC}/drivers/dp/cdn_dp.c
+ 
+-HDCPFW=${RK_PLAT_SOC}/drivers/dp/hdcp.bin
+-$(eval $(call add_define_val,HDCPFW,\"$(HDCPFW)\"))
+-
+-${BUILD_PLAT}/bl31/cdn_dp.o: CCACHE_EXTRAFILES=$(HDCPFW)
+-${RK_PLAT_SOC}/drivers/dp/cdn_dp.c: $(HDCPFW)
+ endif
+ 
+ # CCACHE_EXTRAFILES is needed because ccache doesn't handle .incbin
diff --git a/nixpkgs/pkgs/misc/autoadb/default.nix b/nixpkgs/pkgs/misc/autoadb/default.nix
new file mode 100644
index 000000000000..25043e9d45d6
--- /dev/null
+++ b/nixpkgs/pkgs/misc/autoadb/default.nix
@@ -0,0 +1,22 @@
+{ lib, rustPlatform, fetchFromGitHub }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "autoadb";
+  version = "unstable-2020-06-01";
+
+  src = fetchFromGitHub {
+    owner = "rom1v";
+    repo = pname;
+    rev = "7f8402983603a9854bf618a384f679a17cd85e2d";
+    sha256 = "sha256-9Sv38dCtvbqvxSnRpq+HsIwF/rfLUVZbi0J+mltLres=";
+  };
+
+  cargoSha256 = "1gzg1lhq8gp790mrc8fw8dg146k8lg20pnk45m2ssnmdka0826f7";
+
+  meta = with lib; {
+    description = "Execute a command whenever a device is adb-connected";
+    homepage = "https://github.com/rom1v/autoadb";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ shawn8901 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/autotiling-rs/default.nix b/nixpkgs/pkgs/misc/autotiling-rs/default.nix
new file mode 100644
index 000000000000..6e0ffebf0323
--- /dev/null
+++ b/nixpkgs/pkgs/misc/autotiling-rs/default.nix
@@ -0,0 +1,23 @@
+{ lib, fetchFromGitHub, rustPlatform }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "autotiling-rs";
+  version = "0.1.3";
+
+  src = fetchFromGitHub {
+    owner = "ammgws";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-LQbmF2M6pWa0QEbKF770x8TFLMGrJeq5HnXHvLrDDPA=";
+  };
+
+  cargoHash = "sha256-wot5GKBA2TBrA/jnWD0eypPRqUodmk/TJlYJMl3/gm4=";
+
+  meta = with lib; {
+    description = "Autotiling for sway (and possibly i3)";
+    homepage = "https://github.com/ammgws/autotiling-rs";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ dit7ya ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/autotiling/default.nix b/nixpkgs/pkgs/misc/autotiling/default.nix
new file mode 100644
index 000000000000..a24095759f02
--- /dev/null
+++ b/nixpkgs/pkgs/misc/autotiling/default.nix
@@ -0,0 +1,25 @@
+{ lib, buildPythonApplication, fetchFromGitHub, i3ipc, importlib-metadata }:
+
+buildPythonApplication rec {
+  pname = "autotiling";
+  version = "1.8";
+
+  src = fetchFromGitHub {
+    owner = "nwg-piotr";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    sha256 = "sha256-4iiiiuXCHFXEeA99ikq/G3q2KXBZ7vwpfET7QtoDVds=";
+  };
+
+  propagatedBuildInputs = [ i3ipc importlib-metadata ];
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://github.com/nwg-piotr/autotiling";
+    description = "Script for sway and i3 to automatically switch the horizontal / vertical window split orientation";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/misc/barebox/default.nix b/nixpkgs/pkgs/misc/barebox/default.nix
new file mode 100644
index 000000000000..cb77a607e016
--- /dev/null
+++ b/nixpkgs/pkgs/misc/barebox/default.nix
@@ -0,0 +1,96 @@
+{ stdenv
+, lib
+, fetchurl
+, bison
+, dtc
+, flex
+, libusb1
+, lzop
+, openssl
+, pkg-config
+, buildPackages
+}:
+
+let
+  buildBarebox = {
+    filesToInstall
+  , installDir ? "$out"
+  , defconfig
+  , extraMeta ? {}
+  , ... } @ args: stdenv.mkDerivation rec {
+    pname = "barebox-${defconfig}";
+
+    version = "2020.12.0";
+
+    src = fetchurl {
+      url = "https://www.barebox.org/download/barebox-${version}.tar.bz2";
+      sha256 = "06vsd95ihaa2nywpqy6k0c7xwk2pzws4yvbp328yd2pfiigachrv";
+    };
+
+    postPatch = ''
+      patchShebangs scripts
+    '';
+
+    nativeBuildInputs = [
+      bison
+      dtc
+      flex
+      openssl
+      libusb1
+      lzop
+      pkg-config
+    ];
+    depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+    hardeningDisable = [ "all" ];
+
+    makeFlags = [
+      "DTC=dtc"
+      "CROSS_COMPILE=${stdenv.cc.targetPrefix}"
+    ];
+
+    configurePhase = ''
+      runHook preConfigure
+
+      make ${defconfig}
+
+      runHook postConfigure
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p ${installDir}
+      cp ${lib.concatStringsSep " " filesToInstall} ${installDir}
+
+      runHook postInstall
+    '';
+
+    enableParallelBuilding = true;
+
+    dontStrip = true;
+
+    meta = with lib; {
+      homepage = "https://www.barebox.org";
+      description = "The Swiss Army Knive for bare metal";
+      license = licenses.gpl2;
+      maintainers = with maintainers; [ emantor ];
+    } // extraMeta;
+  } // removeAttrs args [ "extraMeta" ];
+
+in {
+  inherit buildBarebox;
+
+  bareboxTools = buildBarebox {
+    defconfig = "hosttools_defconfig";
+    installDir = "$out/bin";
+    extraMeta.platforms = lib.platforms.linux;
+    filesToInstall = [
+      "scripts/bareboximd"
+      "scripts/imx/imx-usb-loader"
+      "scripts/omap4_usbboot"
+      "scripts/omap3-usb-loader"
+      "scripts/kwboot"
+    ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/base16-builder/default.nix b/nixpkgs/pkgs/misc/base16-builder/default.nix
new file mode 100644
index 000000000000..af57f2a90de3
--- /dev/null
+++ b/nixpkgs/pkgs/misc/base16-builder/default.nix
@@ -0,0 +1,8 @@
+{ stdenv, pkgs }:
+
+let
+  nodePackages = import ./node-packages.nix {
+    inherit pkgs;
+    inherit (stdenv.hostPlatform) system;
+  };
+in nodePackages.base16-builder
diff --git a/nixpkgs/pkgs/misc/base16-builder/generate.sh b/nixpkgs/pkgs/misc/base16-builder/generate.sh
new file mode 100755
index 000000000000..ebcdc72ed1bc
--- /dev/null
+++ b/nixpkgs/pkgs/misc/base16-builder/generate.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env nix-shell
+#! nix-shell -i bash -p nodePackages.node2nix
+exec node2nix --nodejs-18 \
+     --input node-packages.json \
+     --output node-packages-generated.nix \
+     --supplement-input supplement.json \
+     --composition node-packages.nix \
+     --node-env ./../../development/node-packages/node-env.nix \
diff --git a/nixpkgs/pkgs/misc/base16-builder/node-packages-generated.nix b/nixpkgs/pkgs/misc/base16-builder/node-packages-generated.nix
new file mode 100644
index 000000000000..312e4c3b3cde
--- /dev/null
+++ b/nixpkgs/pkgs/misc/base16-builder/node-packages-generated.nix
@@ -0,0 +1,1875 @@
+# This file has been generated by node2nix 1.11.1. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, nix-gitignore, stdenv, lib, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "@mapbox/node-pre-gyp-1.0.10" = {
+      name = "_at_mapbox_slash_node-pre-gyp";
+      packageName = "@mapbox/node-pre-gyp";
+      version = "1.0.10";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz";
+        sha512 = "4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==";
+      };
+    };
+    "abbrev-1.1.1" = {
+      name = "abbrev";
+      packageName = "abbrev";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
+        sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
+      };
+    };
+    "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==";
+      };
+    };
+    "ansi-regex-2.1.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha512 = "TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==";
+      };
+    };
+    "ansi-regex-5.0.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz";
+        sha512 = "quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==";
+      };
+    };
+    "ansi-styles-2.2.1" = {
+      name = "ansi-styles";
+      packageName = "ansi-styles";
+      version = "2.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
+        sha512 = "kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==";
+      };
+    };
+    "any-promise-0.1.0" = {
+      name = "any-promise";
+      packageName = "any-promise";
+      version = "0.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/any-promise/-/any-promise-0.1.0.tgz";
+        sha512 = "lqzY9o+BbeGHRCOyxQkt/Tgvz0IZhTmQiA+LxQW8wSNpcTbj8K+0cZiSEvbpNZZP9/11Gy7dnLO3GNWUXO4d1g==";
+      };
+    };
+    "aproba-2.0.0" = {
+      name = "aproba";
+      packageName = "aproba";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz";
+        sha512 = "lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==";
+      };
+    };
+    "are-we-there-yet-2.0.0" = {
+      name = "are-we-there-yet";
+      packageName = "are-we-there-yet";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz";
+        sha512 = "Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==";
+      };
+    };
+    "argparse-1.0.10" = {
+      name = "argparse";
+      packageName = "argparse";
+      version = "1.0.10";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";
+        sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==";
+      };
+    };
+    "array-find-index-1.0.2" = {
+      name = "array-find-index";
+      packageName = "array-find-index";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz";
+        sha512 = "M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==";
+      };
+    };
+    "balanced-match-1.0.2" = {
+      name = "balanced-match";
+      packageName = "balanced-match";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz";
+        sha512 = "3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==";
+      };
+    };
+    "boxen-0.3.1" = {
+      name = "boxen";
+      packageName = "boxen";
+      version = "0.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/boxen/-/boxen-0.3.1.tgz";
+        sha512 = "u9JPc+sK+tsB7uH0870GNESSm2I005T9nE9fug2X/6COxMJ9qXmSducVSFt5f3xdZgR/PtKXVJTxN296cMCP6w==";
+      };
+    };
+    "brace-expansion-1.1.11" = {
+      name = "brace-expansion";
+      packageName = "brace-expansion";
+      version = "1.1.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
+      };
+    };
+    "bulk-replace-0.0.1" = {
+      name = "bulk-replace";
+      packageName = "bulk-replace";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/bulk-replace/-/bulk-replace-0.0.1.tgz";
+        sha512 = "IxLEnfsCYLjlpf6mG7SWpWgA4A8IAT5dAX3FxXHFn+6FTLf3ums771elQ74sj1BCOVanBf6esu0rEC6zgwfmIg==";
+      };
+    };
+    "camelcase-2.1.1" = {
+      name = "camelcase";
+      packageName = "camelcase";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz";
+        sha512 = "DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==";
+      };
+    };
+    "camelcase-keys-2.1.0" = {
+      name = "camelcase-keys";
+      packageName = "camelcase-keys";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz";
+        sha512 = "bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==";
+      };
+    };
+    "capture-stack-trace-1.0.2" = {
+      name = "capture-stack-trace";
+      packageName = "capture-stack-trace";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz";
+        sha512 = "X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==";
+      };
+    };
+    "chalk-1.1.3" = {
+      name = "chalk";
+      packageName = "chalk";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
+        sha512 = "U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==";
+      };
+    };
+    "chownr-2.0.0" = {
+      name = "chownr";
+      packageName = "chownr";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz";
+        sha512 = "bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==";
+      };
+    };
+    "code-point-at-1.1.0" = {
+      name = "code-point-at";
+      packageName = "code-point-at";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha512 = "RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==";
+      };
+    };
+    "color-support-1.1.3" = {
+      name = "color-support";
+      packageName = "color-support";
+      version = "1.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz";
+        sha512 = "qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==";
+      };
+    };
+    "commander-1.1.1" = {
+      name = "commander";
+      packageName = "commander";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz";
+        sha512 = "71Rod2AhcH3JhkBikVpNd0pA+fWsmAaVoti6OR38T76chA7vE3pSerS0Jor4wDw+tOueD2zLVvFOw5H0Rcj7rA==";
+      };
+    };
+    "concat-map-0.0.1" = {
+      name = "concat-map";
+      packageName = "concat-map";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
+        sha512 = "/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==";
+      };
+    };
+    "configstore-2.1.0" = {
+      name = "configstore";
+      packageName = "configstore";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz";
+        sha512 = "BOCxwwxF5WPspp1OBq9j0JLyL5JgJOTssz9PdOHr8VWjFijaC3PpjU48vFEX3uxx8sTusnVQckLbNzBq6fmkGw==";
+      };
+    };
+    "console-control-strings-1.1.0" = {
+      name = "console-control-strings";
+      packageName = "console-control-strings";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
+        sha512 = "ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==";
+      };
+    };
+    "core-util-is-1.0.3" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz";
+        sha512 = "ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==";
+      };
+    };
+    "create-error-class-3.0.2" = {
+      name = "create-error-class";
+      packageName = "create-error-class";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz";
+        sha512 = "gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==";
+      };
+    };
+    "currently-unhandled-0.4.1" = {
+      name = "currently-unhandled";
+      packageName = "currently-unhandled";
+      version = "0.4.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz";
+        sha512 = "/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==";
+      };
+    };
+    "debug-4.3.4" = {
+      name = "debug";
+      packageName = "debug";
+      version = "4.3.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz";
+        sha512 = "PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==";
+      };
+    };
+    "decamelize-1.2.0" = {
+      name = "decamelize";
+      packageName = "decamelize";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";
+        sha512 = "z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==";
+      };
+    };
+    "deep-extend-0.6.0" = {
+      name = "deep-extend";
+      packageName = "deep-extend";
+      version = "0.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz";
+        sha512 = "LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==";
+      };
+    };
+    "delegates-1.0.0" = {
+      name = "delegates";
+      packageName = "delegates";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
+        sha512 = "bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==";
+      };
+    };
+    "detect-libc-2.0.1" = {
+      name = "detect-libc";
+      packageName = "detect-libc";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz";
+        sha512 = "463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==";
+      };
+    };
+    "dot-prop-3.0.0" = {
+      name = "dot-prop";
+      packageName = "dot-prop";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz";
+        sha512 = "k4ELWeEU3uCcwub7+dWydqQBRjAjkV9L33HjVRG5Xo2QybI6ja/v+4W73SRi8ubCqJz0l9XsTP1NbewfyqaSlw==";
+      };
+    };
+    "duplexer2-0.1.4" = {
+      name = "duplexer2";
+      packageName = "duplexer2";
+      version = "0.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz";
+        sha512 = "asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==";
+      };
+    };
+    "ejs-2.7.4" = {
+      name = "ejs";
+      packageName = "ejs";
+      version = "2.7.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz";
+        sha512 = "7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==";
+      };
+    };
+    "emoji-regex-8.0.0" = {
+      name = "emoji-regex";
+      packageName = "emoji-regex";
+      version = "8.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz";
+        sha512 = "MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==";
+      };
+    };
+    "encoding-0.1.13" = {
+      name = "encoding";
+      packageName = "encoding";
+      version = "0.1.13";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz";
+        sha512 = "ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==";
+      };
+    };
+    "error-ex-1.3.2" = {
+      name = "error-ex";
+      packageName = "error-ex";
+      version = "1.3.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz";
+        sha512 = "7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==";
+      };
+    };
+    "escape-string-regexp-1.0.5" = {
+      name = "escape-string-regexp";
+      packageName = "escape-string-regexp";
+      version = "1.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
+        sha512 = "vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==";
+      };
+    };
+    "esprima-4.0.1" = {
+      name = "esprima";
+      packageName = "esprima";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz";
+        sha512 = "eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==";
+      };
+    };
+    "filled-array-1.1.0" = {
+      name = "filled-array";
+      packageName = "filled-array";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz";
+        sha512 = "4XwZ1k4rgoF3Yap59MyXFmiUh2zu9fht32NYPSRYwLv4o8BWHxi60I1VH5kHje14qGMoS3qyfHQUsN16ROOugQ==";
+      };
+    };
+    "find-up-1.1.2" = {
+      name = "find-up";
+      packageName = "find-up";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz";
+        sha512 = "jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==";
+      };
+    };
+    "fs-minipass-2.1.0" = {
+      name = "fs-minipass";
+      packageName = "fs-minipass";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz";
+        sha512 = "V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==";
+      };
+    };
+    "fs-promise-0.3.1" = {
+      name = "fs-promise";
+      packageName = "fs-promise";
+      version = "0.3.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fs-promise/-/fs-promise-0.3.1.tgz";
+        sha512 = "JjkAd4+JaA8VTL1vmX54f7xz6AgBZ9VA6mXlIvN8eJMJGZMVyJ6fdRyjwCP0pIuEkWkM0XcbVz/4F6sFu7OdQg==";
+      };
+    };
+    "fs.realpath-1.0.0" = {
+      name = "fs.realpath";
+      packageName = "fs.realpath";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha512 = "OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==";
+      };
+    };
+    "function-bind-1.1.1" = {
+      name = "function-bind";
+      packageName = "function-bind";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz";
+        sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
+      };
+    };
+    "gauge-3.0.2" = {
+      name = "gauge";
+      packageName = "gauge";
+      version = "3.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz";
+        sha512 = "+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==";
+      };
+    };
+    "get-stdin-4.0.1" = {
+      name = "get-stdin";
+      packageName = "get-stdin";
+      version = "4.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz";
+        sha512 = "F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==";
+      };
+    };
+    "glob-7.2.3" = {
+      name = "glob";
+      packageName = "glob";
+      version = "7.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz";
+        sha512 = "nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==";
+      };
+    };
+    "got-5.7.1" = {
+      name = "got";
+      packageName = "got";
+      version = "5.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/got/-/got-5.7.1.tgz";
+        sha512 = "1qd54GLxvVgzuidFmw9ze9umxS3rzhdBH6Wt6BTYrTQUXTN01vGGYXwzLzYLowNx8HBH3/c7kRyvx90fh13i7Q==";
+      };
+    };
+    "graceful-fs-4.2.11" = {
+      name = "graceful-fs";
+      packageName = "graceful-fs";
+      version = "4.2.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz";
+        sha512 = "RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==";
+      };
+    };
+    "has-1.0.3" = {
+      name = "has";
+      packageName = "has";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz";
+        sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==";
+      };
+    };
+    "has-ansi-2.0.0" = {
+      name = "has-ansi";
+      packageName = "has-ansi";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
+        sha512 = "C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==";
+      };
+    };
+    "has-unicode-2.0.1" = {
+      name = "has-unicode";
+      packageName = "has-unicode";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
+        sha512 = "8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==";
+      };
+    };
+    "hepburn-1.2.0" = {
+      name = "hepburn";
+      packageName = "hepburn";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/hepburn/-/hepburn-1.2.0.tgz";
+        sha512 = "xWjHb03dN/ivNcqG2vqA//sHQ0oapYGZ9QV/2TR7m2+cggxzoVpbDxZn9s/Zm1tF88/7a1IpdZyn00tNP5oABA==";
+      };
+    };
+    "hosted-git-info-2.8.9" = {
+      name = "hosted-git-info";
+      packageName = "hosted-git-info";
+      version = "2.8.9";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz";
+        sha512 = "mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==";
+      };
+    };
+    "https-proxy-agent-5.0.1" = {
+      name = "https-proxy-agent";
+      packageName = "https-proxy-agent";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz";
+        sha512 = "dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==";
+      };
+    };
+    "iconv-lite-0.6.3" = {
+      name = "iconv-lite";
+      packageName = "iconv-lite";
+      version = "0.6.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz";
+        sha512 = "4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==";
+      };
+    };
+    "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";
+        sha512 = "JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==";
+      };
+    };
+    "indent-string-2.1.0" = {
+      name = "indent-string";
+      packageName = "indent-string";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz";
+        sha512 = "aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==";
+      };
+    };
+    "inflight-1.0.6" = {
+      name = "inflight";
+      packageName = "inflight";
+      version = "1.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
+        sha512 = "k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==";
+      };
+    };
+    "inherits-2.0.4" = {
+      name = "inherits";
+      packageName = "inherits";
+      version = "2.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz";
+        sha512 = "k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==";
+      };
+    };
+    "ini-1.3.8" = {
+      name = "ini";
+      packageName = "ini";
+      version = "1.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz";
+        sha512 = "JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==";
+      };
+    };
+    "is-arrayish-0.2.1" = {
+      name = "is-arrayish";
+      packageName = "is-arrayish";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz";
+        sha512 = "zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==";
+      };
+    };
+    "is-core-module-2.12.0" = {
+      name = "is-core-module";
+      packageName = "is-core-module";
+      version = "2.12.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz";
+        sha512 = "RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==";
+      };
+    };
+    "is-finite-1.1.0" = {
+      name = "is-finite";
+      packageName = "is-finite";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz";
+        sha512 = "cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==";
+      };
+    };
+    "is-fullwidth-code-point-1.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha512 = "1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==";
+      };
+    };
+    "is-fullwidth-code-point-3.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "3.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz";
+        sha512 = "zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==";
+      };
+    };
+    "is-npm-1.0.0" = {
+      name = "is-npm";
+      packageName = "is-npm";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz";
+        sha512 = "9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==";
+      };
+    };
+    "is-obj-1.0.1" = {
+      name = "is-obj";
+      packageName = "is-obj";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz";
+        sha512 = "l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==";
+      };
+    };
+    "is-redirect-1.0.0" = {
+      name = "is-redirect";
+      packageName = "is-redirect";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz";
+        sha512 = "cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==";
+      };
+    };
+    "is-retry-allowed-1.2.0" = {
+      name = "is-retry-allowed";
+      packageName = "is-retry-allowed";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz";
+        sha512 = "RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==";
+      };
+    };
+    "is-stream-1.1.0" = {
+      name = "is-stream";
+      packageName = "is-stream";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz";
+        sha512 = "uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==";
+      };
+    };
+    "is-utf8-0.2.1" = {
+      name = "is-utf8";
+      packageName = "is-utf8";
+      version = "0.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz";
+        sha512 = "rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==";
+      };
+    };
+    "isarray-1.0.0" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
+        sha512 = "VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==";
+      };
+    };
+    "js-yaml-3.14.1" = {
+      name = "js-yaml";
+      packageName = "js-yaml";
+      version = "3.14.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz";
+        sha512 = "okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==";
+      };
+    };
+    "keypress-0.1.0" = {
+      name = "keypress";
+      packageName = "keypress";
+      version = "0.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz";
+        sha512 = "x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA==";
+      };
+    };
+    "latest-version-2.0.0" = {
+      name = "latest-version";
+      packageName = "latest-version";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz";
+        sha512 = "8925wFYLfWBciewimt0VmDyYw0GFCRcbFSTrZGt4JgQ7lh5jb/kodMlUt0uMaxXdRKVi+7F3ib30N7fTv83ikw==";
+      };
+    };
+    "limax-1.7.0" = {
+      name = "limax";
+      packageName = "limax";
+      version = "1.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/limax/-/limax-1.7.0.tgz";
+        sha512 = "ibcGylOXT5vry2JKfKwLWx2tZudRYWm4SzG9AE/cc5zqwW+3nQy/uPLUvfAUChRdmqxVrK6SNepmO7ZY8RoKfA==";
+      };
+    };
+    "load-json-file-1.1.0" = {
+      name = "load-json-file";
+      packageName = "load-json-file";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz";
+        sha512 = "cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==";
+      };
+    };
+    "loud-rejection-1.6.0" = {
+      name = "loud-rejection";
+      packageName = "loud-rejection";
+      version = "1.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz";
+        sha512 = "RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==";
+      };
+    };
+    "lowercase-keys-1.0.1" = {
+      name = "lowercase-keys";
+      packageName = "lowercase-keys";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz";
+        sha512 = "G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==";
+      };
+    };
+    "lru-cache-6.0.0" = {
+      name = "lru-cache";
+      packageName = "lru-cache";
+      version = "6.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz";
+        sha512 = "Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==";
+      };
+    };
+    "make-dir-3.1.0" = {
+      name = "make-dir";
+      packageName = "make-dir";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz";
+        sha512 = "g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==";
+      };
+    };
+    "map-obj-1.0.1" = {
+      name = "map-obj";
+      packageName = "map-obj";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz";
+        sha512 = "7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==";
+      };
+    };
+    "meow-3.7.0" = {
+      name = "meow";
+      packageName = "meow";
+      version = "3.7.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz";
+        sha512 = "TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==";
+      };
+    };
+    "minimatch-3.1.2" = {
+      name = "minimatch";
+      packageName = "minimatch";
+      version = "3.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz";
+        sha512 = "J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==";
+      };
+    };
+    "minimist-1.2.8" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "1.2.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz";
+        sha512 = "2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==";
+      };
+    };
+    "minipass-3.3.6" = {
+      name = "minipass";
+      packageName = "minipass";
+      version = "3.3.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz";
+        sha512 = "DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==";
+      };
+    };
+    "minipass-5.0.0" = {
+      name = "minipass";
+      packageName = "minipass";
+      version = "5.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz";
+        sha512 = "3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==";
+      };
+    };
+    "minizlib-2.1.2" = {
+      name = "minizlib";
+      packageName = "minizlib";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz";
+        sha512 = "bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==";
+      };
+    };
+    "mkdirp-0.5.6" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "0.5.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz";
+        sha512 = "FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==";
+      };
+    };
+    "mkdirp-1.0.4" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz";
+        sha512 = "vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==";
+      };
+    };
+    "ms-2.1.2" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz";
+        sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==";
+      };
+    };
+    "node-addon-api-3.2.1" = {
+      name = "node-addon-api";
+      packageName = "node-addon-api";
+      version = "3.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz";
+        sha512 = "mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==";
+      };
+    };
+    "node-fetch-2.6.10" = {
+      name = "node-fetch";
+      packageName = "node-fetch";
+      version = "2.6.10";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.10.tgz";
+        sha512 = "5YytjUVbwzjE/BX4N62vnPPkGNxlJPwdA9/ArUc4pcM6cYS4Hinuv4VazzwjMGgnWuiQqcemOanib/5PpcsGug==";
+      };
+    };
+    "node-status-codes-1.0.0" = {
+      name = "node-status-codes";
+      packageName = "node-status-codes";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz";
+        sha512 = "1cBMgRxdMWE8KeWCqk2RIOrvUb0XCwYfEsY5/y2NlXyq4Y/RumnOZvTj4Nbr77+Vb2C+kyBoRTdkNOS8L3d/aQ==";
+      };
+    };
+    "nodejieba-2.5.2" = {
+      name = "nodejieba";
+      packageName = "nodejieba";
+      version = "2.5.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nodejieba/-/nodejieba-2.5.2.tgz";
+        sha512 = "ByskJvaBrQ2eV+5M0OeD80S5NKoGaHc9zi3Z/PTKl/95eac2YF8RmWduq9AknLpkQLrLAIcqurrtC6BzjpKwwg==";
+      };
+    };
+    "nopt-5.0.0" = {
+      name = "nopt";
+      packageName = "nopt";
+      version = "5.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz";
+        sha512 = "Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==";
+      };
+    };
+    "normalize-package-data-2.5.0" = {
+      name = "normalize-package-data";
+      packageName = "normalize-package-data";
+      version = "2.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz";
+        sha512 = "/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==";
+      };
+    };
+    "npmlog-5.0.1" = {
+      name = "npmlog";
+      packageName = "npmlog";
+      version = "5.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz";
+        sha512 = "AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==";
+      };
+    };
+    "number-is-nan-1.0.1" = {
+      name = "number-is-nan";
+      packageName = "number-is-nan";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha512 = "4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==";
+      };
+    };
+    "object-assign-4.1.1" = {
+      name = "object-assign";
+      packageName = "object-assign";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
+        sha512 = "rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==";
+      };
+    };
+    "once-1.4.0" = {
+      name = "once";
+      packageName = "once";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
+        sha512 = "lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==";
+      };
+    };
+    "open-0.0.5" = {
+      name = "open";
+      packageName = "open";
+      version = "0.0.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/open/-/open-0.0.5.tgz";
+        sha512 = "+X/dJYLapVO1VbC620DhtNZK9U4/kQVaTQp/Gh7cb6UTLYfGZzzU2ZXkWrOA/wBrf4UqAFwtLqXYTxe4tSnWQQ==";
+      };
+    };
+    "os-homedir-1.0.2" = {
+      name = "os-homedir";
+      packageName = "os-homedir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha512 = "B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==";
+      };
+    };
+    "os-tmpdir-1.0.2" = {
+      name = "os-tmpdir";
+      packageName = "os-tmpdir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha512 = "D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==";
+      };
+    };
+    "osenv-0.1.5" = {
+      name = "osenv";
+      packageName = "osenv";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
+        sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
+      };
+    };
+    "package-json-2.4.0" = {
+      name = "package-json";
+      packageName = "package-json";
+      version = "2.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz";
+        sha512 = "PRg65iXMTt/uK8Rfh5zvzkUbfAPitF17YaCY+IbHsYgksiLvtzWWTUildHth3mVaZ7871OJ7gtP4LBRBlmAdXg==";
+      };
+    };
+    "parse-json-2.2.0" = {
+      name = "parse-json";
+      packageName = "parse-json";
+      version = "2.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz";
+        sha512 = "QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==";
+      };
+    };
+    "path-exists-2.1.0" = {
+      name = "path-exists";
+      packageName = "path-exists";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz";
+        sha512 = "yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==";
+      };
+    };
+    "path-is-absolute-1.0.1" = {
+      name = "path-is-absolute";
+      packageName = "path-is-absolute";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha512 = "AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==";
+      };
+    };
+    "path-parse-1.0.7" = {
+      name = "path-parse";
+      packageName = "path-parse";
+      version = "1.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz";
+        sha512 = "LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==";
+      };
+    };
+    "path-type-1.1.0" = {
+      name = "path-type";
+      packageName = "path-type";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz";
+        sha512 = "S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==";
+      };
+    };
+    "pify-2.3.0" = {
+      name = "pify";
+      packageName = "pify";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz";
+        sha512 = "udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==";
+      };
+    };
+    "pinkie-2.0.4" = {
+      name = "pinkie";
+      packageName = "pinkie";
+      version = "2.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz";
+        sha512 = "MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==";
+      };
+    };
+    "pinkie-promise-2.0.1" = {
+      name = "pinkie-promise";
+      packageName = "pinkie-promise";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
+        sha512 = "0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==";
+      };
+    };
+    "pinyin-2.11.2" = {
+      name = "pinyin";
+      packageName = "pinyin";
+      version = "2.11.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/pinyin/-/pinyin-2.11.2.tgz";
+        sha512 = "tAWDBcowj09j/vLUjty98nVqrbTVNhutf1VcyID4p0sxTFPzRyXw7n7Ic0HQwBdWFIWrrDP8bYiT64gaT6h3gA==";
+      };
+    };
+    "prepend-http-1.0.4" = {
+      name = "prepend-http";
+      packageName = "prepend-http";
+      version = "1.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz";
+        sha512 = "PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==";
+      };
+    };
+    "process-nextick-args-2.0.1" = {
+      name = "process-nextick-args";
+      packageName = "process-nextick-args";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
+        sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
+      };
+    };
+    "rc-1.2.8" = {
+      name = "rc";
+      packageName = "rc";
+      version = "1.2.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz";
+        sha512 = "y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==";
+      };
+    };
+    "read-all-stream-3.1.0" = {
+      name = "read-all-stream";
+      packageName = "read-all-stream";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz";
+        sha512 = "DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==";
+      };
+    };
+    "read-pkg-1.1.0" = {
+      name = "read-pkg";
+      packageName = "read-pkg";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz";
+        sha512 = "7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==";
+      };
+    };
+    "read-pkg-up-1.0.1" = {
+      name = "read-pkg-up";
+      packageName = "read-pkg-up";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz";
+        sha512 = "WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==";
+      };
+    };
+    "readable-stream-2.3.8" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "2.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz";
+        sha512 = "8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==";
+      };
+    };
+    "readable-stream-3.6.2" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "3.6.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz";
+        sha512 = "9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==";
+      };
+    };
+    "redent-1.0.0" = {
+      name = "redent";
+      packageName = "redent";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz";
+        sha512 = "qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==";
+      };
+    };
+    "registry-auth-token-3.4.0" = {
+      name = "registry-auth-token";
+      packageName = "registry-auth-token";
+      version = "3.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz";
+        sha512 = "4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==";
+      };
+    };
+    "registry-url-3.1.0" = {
+      name = "registry-url";
+      packageName = "registry-url";
+      version = "3.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz";
+        sha512 = "ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==";
+      };
+    };
+    "repeating-2.0.1" = {
+      name = "repeating";
+      packageName = "repeating";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz";
+        sha512 = "ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==";
+      };
+    };
+    "resolve-1.22.3" = {
+      name = "resolve";
+      packageName = "resolve";
+      version = "1.22.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz";
+        sha512 = "P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==";
+      };
+    };
+    "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";
+      version = "5.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
+      };
+    };
+    "safe-buffer-5.2.1" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz";
+        sha512 = "rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==";
+      };
+    };
+    "safer-buffer-2.1.2" = {
+      name = "safer-buffer";
+      packageName = "safer-buffer";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
+      };
+    };
+    "semver-5.7.1" = {
+      name = "semver";
+      packageName = "semver";
+      version = "5.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";
+        sha512 = "sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==";
+      };
+    };
+    "semver-6.3.0" = {
+      name = "semver";
+      packageName = "semver";
+      version = "6.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz";
+        sha512 = "b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==";
+      };
+    };
+    "semver-7.5.0" = {
+      name = "semver";
+      packageName = "semver";
+      version = "7.5.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz";
+        sha512 = "+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==";
+      };
+    };
+    "semver-diff-2.1.0" = {
+      name = "semver-diff";
+      packageName = "semver-diff";
+      version = "2.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz";
+        sha512 = "gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==";
+      };
+    };
+    "set-blocking-2.0.0" = {
+      name = "set-blocking";
+      packageName = "set-blocking";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
+        sha512 = "KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==";
+      };
+    };
+    "signal-exit-3.0.7" = {
+      name = "signal-exit";
+      packageName = "signal-exit";
+      version = "3.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz";
+        sha512 = "wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==";
+      };
+    };
+    "slide-1.1.6" = {
+      name = "slide";
+      packageName = "slide";
+      version = "1.1.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";
+        sha512 = "NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==";
+      };
+    };
+    "spdx-correct-3.2.0" = {
+      name = "spdx-correct";
+      packageName = "spdx-correct";
+      version = "3.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz";
+        sha512 = "kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==";
+      };
+    };
+    "spdx-exceptions-2.3.0" = {
+      name = "spdx-exceptions";
+      packageName = "spdx-exceptions";
+      version = "2.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz";
+        sha512 = "/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==";
+      };
+    };
+    "spdx-expression-parse-3.0.1" = {
+      name = "spdx-expression-parse";
+      packageName = "spdx-expression-parse";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz";
+        sha512 = "cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==";
+      };
+    };
+    "spdx-license-ids-3.0.13" = {
+      name = "spdx-license-ids";
+      packageName = "spdx-license-ids";
+      version = "3.0.13";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz";
+        sha512 = "XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==";
+      };
+    };
+    "speakingurl-14.0.1" = {
+      name = "speakingurl";
+      packageName = "speakingurl";
+      version = "14.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz";
+        sha512 = "1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==";
+      };
+    };
+    "sprintf-js-1.0.3" = {
+      name = "sprintf-js";
+      packageName = "sprintf-js";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
+        sha512 = "D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==";
+      };
+    };
+    "string-width-1.0.2" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
+        sha512 = "0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==";
+      };
+    };
+    "string-width-4.2.3" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "4.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz";
+        sha512 = "wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==";
+      };
+    };
+    "string_decoder-1.1.1" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
+      };
+    };
+    "string_decoder-1.3.0" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "1.3.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz";
+        sha512 = "hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==";
+      };
+    };
+    "strip-ansi-3.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha512 = "VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==";
+      };
+    };
+    "strip-ansi-6.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "6.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz";
+        sha512 = "Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==";
+      };
+    };
+    "strip-bom-2.0.0" = {
+      name = "strip-bom";
+      packageName = "strip-bom";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz";
+        sha512 = "kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==";
+      };
+    };
+    "strip-indent-1.0.1" = {
+      name = "strip-indent";
+      packageName = "strip-indent";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz";
+        sha512 = "I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==";
+      };
+    };
+    "strip-json-comments-2.0.1" = {
+      name = "strip-json-comments";
+      packageName = "strip-json-comments";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
+        sha512 = "4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==";
+      };
+    };
+    "supports-color-2.0.0" = {
+      name = "supports-color";
+      packageName = "supports-color";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
+        sha512 = "KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==";
+      };
+    };
+    "supports-preserve-symlinks-flag-1.0.0" = {
+      name = "supports-preserve-symlinks-flag";
+      packageName = "supports-preserve-symlinks-flag";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz";
+        sha512 = "ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==";
+      };
+    };
+    "tar-6.1.14" = {
+      name = "tar";
+      packageName = "tar";
+      version = "6.1.14";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz";
+        sha512 = "piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==";
+      };
+    };
+    "timed-out-3.1.3" = {
+      name = "timed-out";
+      packageName = "timed-out";
+      version = "3.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz";
+        sha512 = "3RB4qgvPkxF/FGPnrzaWLhW1rxNK2sdH0mFjbhxkfTR6QXvcM3EtYm9L44UrhODZrZ+yhDXeMncLqi8QXn2MJg==";
+      };
+    };
+    "tr46-0.0.3" = {
+      name = "tr46";
+      packageName = "tr46";
+      version = "0.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz";
+        sha512 = "N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==";
+      };
+    };
+    "trim-newlines-1.0.0" = {
+      name = "trim-newlines";
+      packageName = "trim-newlines";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz";
+        sha512 = "Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==";
+      };
+    };
+    "unzip-response-1.0.2" = {
+      name = "unzip-response";
+      packageName = "unzip-response";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz";
+        sha512 = "pwCcjjhEcpW45JZIySExBHYv5Y9EeL2OIGEfrSKp2dMUFGFv4CpvZkwJbVge8OvGH2BNNtJBx67DuKuJhf+N5Q==";
+      };
+    };
+    "update-notifier-0.6.3" = {
+      name = "update-notifier";
+      packageName = "update-notifier";
+      version = "0.6.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/update-notifier/-/update-notifier-0.6.3.tgz";
+        sha512 = "Gjt2a7j+qL2wvazHPSkWZOay4NfZe7WpV63OtrKbK6Uxyta0U1aS7f++XSNpljIinKYLC8wrNfPHYkPmV5AhbQ==";
+      };
+    };
+    "url-parse-lax-1.0.0" = {
+      name = "url-parse-lax";
+      packageName = "url-parse-lax";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz";
+        sha512 = "BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==";
+      };
+    };
+    "util-deprecate-1.0.2" = {
+      name = "util-deprecate";
+      packageName = "util-deprecate";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha512 = "EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==";
+      };
+    };
+    "uuid-2.0.3" = {
+      name = "uuid";
+      packageName = "uuid";
+      version = "2.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz";
+        sha512 = "FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==";
+      };
+    };
+    "validate-npm-package-license-3.0.4" = {
+      name = "validate-npm-package-license";
+      packageName = "validate-npm-package-license";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
+        sha512 = "DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==";
+      };
+    };
+    "webidl-conversions-3.0.1" = {
+      name = "webidl-conversions";
+      packageName = "webidl-conversions";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz";
+        sha512 = "2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==";
+      };
+    };
+    "whatwg-url-5.0.0" = {
+      name = "whatwg-url";
+      packageName = "whatwg-url";
+      version = "5.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz";
+        sha512 = "saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==";
+      };
+    };
+    "wide-align-1.1.5" = {
+      name = "wide-align";
+      packageName = "wide-align";
+      version = "1.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz";
+        sha512 = "eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==";
+      };
+    };
+    "widest-line-1.0.0" = {
+      name = "widest-line";
+      packageName = "widest-line";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz";
+        sha512 = "r5vvGtqsHUHn98V0jURY4Ts86xJf6+SzK9rpWdV8/73nURB3WFPIHd67aOvPw2fSuunIyHjAUqiJ2TY0x4E5gw==";
+      };
+    };
+    "wrappy-1.0.2" = {
+      name = "wrappy";
+      packageName = "wrappy";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
+        sha512 = "l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==";
+      };
+    };
+    "write-file-atomic-1.3.4" = {
+      name = "write-file-atomic";
+      packageName = "write-file-atomic";
+      version = "1.3.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz";
+        sha512 = "SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==";
+      };
+    };
+    "xdg-basedir-2.0.0" = {
+      name = "xdg-basedir";
+      packageName = "xdg-basedir";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz";
+        sha512 = "NF1pPn594TaRSUO/HARoB4jK8I+rWgcpVlpQCK6/6o5PHyLUt2CSiDrpUZbQ6rROck+W2EwF8mBJcTs+W98J9w==";
+      };
+    };
+    "yallist-4.0.0" = {
+      name = "yallist";
+      packageName = "yallist";
+      version = "4.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz";
+        sha512 = "3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==";
+      };
+    };
+  };
+in
+{
+  base16-builder = nodeEnv.buildNodePackage {
+    name = "base16-builder";
+    packageName = "base16-builder";
+    version = "1.3.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/base16-builder/-/base16-builder-1.3.0.tgz";
+      sha512 = "fXzZ8Pn1mVA0POzZJ1tQzFHlHdVHpR+z31xlbECEy+7yW3jdkYvFtZl9V0SPJSwkOA5aPQALqi4rM0BCtJiAVA==";
+    };
+    dependencies = [
+      sources."@mapbox/node-pre-gyp-1.0.10"
+      sources."abbrev-1.1.1"
+      sources."agent-base-6.0.2"
+      sources."ansi-regex-2.1.1"
+      sources."ansi-styles-2.2.1"
+      sources."any-promise-0.1.0"
+      sources."aproba-2.0.0"
+      sources."are-we-there-yet-2.0.0"
+      sources."argparse-1.0.10"
+      sources."array-find-index-1.0.2"
+      sources."balanced-match-1.0.2"
+      (sources."boxen-0.3.1" // {
+        dependencies = [
+          sources."is-fullwidth-code-point-1.0.0"
+          sources."string-width-1.0.2"
+        ];
+      })
+      sources."brace-expansion-1.1.11"
+      sources."bulk-replace-0.0.1"
+      sources."camelcase-2.1.1"
+      sources."camelcase-keys-2.1.0"
+      sources."capture-stack-trace-1.0.2"
+      sources."chalk-1.1.3"
+      sources."chownr-2.0.0"
+      sources."code-point-at-1.1.0"
+      sources."color-support-1.1.3"
+      sources."commander-1.1.1"
+      sources."concat-map-0.0.1"
+      (sources."configstore-2.1.0" // {
+        dependencies = [
+          sources."mkdirp-0.5.6"
+        ];
+      })
+      sources."console-control-strings-1.1.0"
+      sources."core-util-is-1.0.3"
+      sources."create-error-class-3.0.2"
+      sources."currently-unhandled-0.4.1"
+      sources."debug-4.3.4"
+      sources."decamelize-1.2.0"
+      sources."deep-extend-0.6.0"
+      sources."delegates-1.0.0"
+      sources."detect-libc-2.0.1"
+      sources."dot-prop-3.0.0"
+      (sources."duplexer2-0.1.4" // {
+        dependencies = [
+          sources."readable-stream-2.3.8"
+          sources."safe-buffer-5.1.2"
+          sources."string_decoder-1.1.1"
+        ];
+      })
+      sources."ejs-2.7.4"
+      sources."emoji-regex-8.0.0"
+      sources."encoding-0.1.13"
+      sources."error-ex-1.3.2"
+      sources."escape-string-regexp-1.0.5"
+      sources."esprima-4.0.1"
+      sources."filled-array-1.1.0"
+      sources."find-up-1.1.2"
+      (sources."fs-minipass-2.1.0" // {
+        dependencies = [
+          sources."minipass-3.3.6"
+        ];
+      })
+      sources."fs-promise-0.3.1"
+      sources."fs.realpath-1.0.0"
+      sources."function-bind-1.1.1"
+      (sources."gauge-3.0.2" // {
+        dependencies = [
+          sources."ansi-regex-5.0.1"
+          sources."strip-ansi-6.0.1"
+        ];
+      })
+      sources."get-stdin-4.0.1"
+      sources."glob-7.2.3"
+      (sources."got-5.7.1" // {
+        dependencies = [
+          sources."readable-stream-2.3.8"
+          sources."safe-buffer-5.1.2"
+          sources."string_decoder-1.1.1"
+        ];
+      })
+      sources."graceful-fs-4.2.11"
+      sources."has-1.0.3"
+      sources."has-ansi-2.0.0"
+      sources."has-unicode-2.0.1"
+      sources."hepburn-1.2.0"
+      sources."hosted-git-info-2.8.9"
+      sources."https-proxy-agent-5.0.1"
+      sources."iconv-lite-0.6.3"
+      sources."imurmurhash-0.1.4"
+      sources."indent-string-2.1.0"
+      sources."inflight-1.0.6"
+      sources."inherits-2.0.4"
+      sources."ini-1.3.8"
+      sources."is-arrayish-0.2.1"
+      sources."is-core-module-2.12.0"
+      sources."is-finite-1.1.0"
+      sources."is-fullwidth-code-point-3.0.0"
+      sources."is-npm-1.0.0"
+      sources."is-obj-1.0.1"
+      sources."is-redirect-1.0.0"
+      sources."is-retry-allowed-1.2.0"
+      sources."is-stream-1.1.0"
+      sources."is-utf8-0.2.1"
+      sources."isarray-1.0.0"
+      sources."js-yaml-3.14.1"
+      sources."keypress-0.1.0"
+      sources."latest-version-2.0.0"
+      sources."limax-1.7.0"
+      sources."load-json-file-1.1.0"
+      sources."loud-rejection-1.6.0"
+      sources."lowercase-keys-1.0.1"
+      sources."lru-cache-6.0.0"
+      (sources."make-dir-3.1.0" // {
+        dependencies = [
+          sources."semver-6.3.0"
+        ];
+      })
+      sources."map-obj-1.0.1"
+      sources."meow-3.7.0"
+      sources."minimatch-3.1.2"
+      sources."minimist-1.2.8"
+      sources."minipass-5.0.0"
+      (sources."minizlib-2.1.2" // {
+        dependencies = [
+          sources."minipass-3.3.6"
+        ];
+      })
+      sources."mkdirp-1.0.4"
+      sources."ms-2.1.2"
+      sources."node-addon-api-3.2.1"
+      sources."node-fetch-2.6.10"
+      sources."node-status-codes-1.0.0"
+      sources."nodejieba-2.5.2"
+      sources."nopt-5.0.0"
+      (sources."normalize-package-data-2.5.0" // {
+        dependencies = [
+          sources."semver-5.7.1"
+        ];
+      })
+      sources."npmlog-5.0.1"
+      sources."number-is-nan-1.0.1"
+      sources."object-assign-4.1.1"
+      sources."once-1.4.0"
+      sources."open-0.0.5"
+      sources."os-homedir-1.0.2"
+      sources."os-tmpdir-1.0.2"
+      sources."osenv-0.1.5"
+      (sources."package-json-2.4.0" // {
+        dependencies = [
+          sources."semver-5.7.1"
+        ];
+      })
+      sources."parse-json-2.2.0"
+      sources."path-exists-2.1.0"
+      sources."path-is-absolute-1.0.1"
+      sources."path-parse-1.0.7"
+      sources."path-type-1.1.0"
+      sources."pify-2.3.0"
+      sources."pinkie-2.0.4"
+      sources."pinkie-promise-2.0.1"
+      sources."pinyin-2.11.2"
+      sources."prepend-http-1.0.4"
+      sources."process-nextick-args-2.0.1"
+      sources."rc-1.2.8"
+      (sources."read-all-stream-3.1.0" // {
+        dependencies = [
+          sources."readable-stream-2.3.8"
+          sources."safe-buffer-5.1.2"
+          sources."string_decoder-1.1.1"
+        ];
+      })
+      sources."read-pkg-1.1.0"
+      sources."read-pkg-up-1.0.1"
+      sources."readable-stream-3.6.2"
+      sources."redent-1.0.0"
+      sources."registry-auth-token-3.4.0"
+      sources."registry-url-3.1.0"
+      sources."repeating-2.0.1"
+      sources."resolve-1.22.3"
+      sources."rimraf-3.0.2"
+      sources."safe-buffer-5.2.1"
+      sources."safer-buffer-2.1.2"
+      sources."semver-7.5.0"
+      (sources."semver-diff-2.1.0" // {
+        dependencies = [
+          sources."semver-5.7.1"
+        ];
+      })
+      sources."set-blocking-2.0.0"
+      sources."signal-exit-3.0.7"
+      sources."slide-1.1.6"
+      sources."spdx-correct-3.2.0"
+      sources."spdx-exceptions-2.3.0"
+      sources."spdx-expression-parse-3.0.1"
+      sources."spdx-license-ids-3.0.13"
+      sources."speakingurl-14.0.1"
+      sources."sprintf-js-1.0.3"
+      (sources."string-width-4.2.3" // {
+        dependencies = [
+          sources."ansi-regex-5.0.1"
+          sources."strip-ansi-6.0.1"
+        ];
+      })
+      sources."string_decoder-1.3.0"
+      sources."strip-ansi-3.0.1"
+      sources."strip-bom-2.0.0"
+      sources."strip-indent-1.0.1"
+      sources."strip-json-comments-2.0.1"
+      sources."supports-color-2.0.0"
+      sources."supports-preserve-symlinks-flag-1.0.0"
+      sources."tar-6.1.14"
+      sources."timed-out-3.1.3"
+      sources."tr46-0.0.3"
+      sources."trim-newlines-1.0.0"
+      sources."unzip-response-1.0.2"
+      sources."update-notifier-0.6.3"
+      sources."url-parse-lax-1.0.0"
+      sources."util-deprecate-1.0.2"
+      sources."uuid-2.0.3"
+      sources."validate-npm-package-license-3.0.4"
+      sources."webidl-conversions-3.0.1"
+      sources."whatwg-url-5.0.0"
+      sources."wide-align-1.1.5"
+      (sources."widest-line-1.0.0" // {
+        dependencies = [
+          sources."is-fullwidth-code-point-1.0.0"
+          sources."string-width-1.0.2"
+        ];
+      })
+      sources."wrappy-1.0.2"
+      sources."write-file-atomic-1.3.4"
+      sources."xdg-basedir-2.0.0"
+      sources."yallist-4.0.0"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Base16 Builder is a nimble command-line tool that generates themes for your favourite programs.";
+      homepage = "https://github.com/base16-builder/base16-builder#readme";
+      license = "MIT";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/base16-builder/node-packages.json b/nixpkgs/pkgs/misc/base16-builder/node-packages.json
new file mode 100644
index 000000000000..3266c128bc4e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/base16-builder/node-packages.json
@@ -0,0 +1,3 @@
+[
+    "base16-builder"
+]
diff --git a/nixpkgs/pkgs/misc/base16-builder/node-packages.nix b/nixpkgs/pkgs/misc/base16-builder/node-packages.nix
new file mode 100644
index 000000000000..2bf491c2e665
--- /dev/null
+++ b/nixpkgs/pkgs/misc/base16-builder/node-packages.nix
@@ -0,0 +1,21 @@
+# This file has been generated by node2nix 1.11.1. Do not edit!
+
+{pkgs ? import <nixpkgs> {
+    inherit system;
+  }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs_18"}:
+
+let
+  globalBuildInputs = pkgs.lib.attrValues (import ./supplement.nix {
+    inherit nodeEnv;
+    inherit (pkgs) stdenv lib nix-gitignore fetchurl fetchgit;
+  });
+  nodeEnv = import ../../development/node-packages/node-env.nix {
+    inherit (pkgs) stdenv lib python2 runCommand writeTextFile writeShellScript;
+    inherit pkgs nodejs;
+    libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null;
+  };
+in
+import ./node-packages-generated.nix {
+  inherit (pkgs) fetchurl nix-gitignore stdenv lib fetchgit;
+  inherit nodeEnv globalBuildInputs;
+}
diff --git a/nixpkgs/pkgs/misc/base16-builder/supplement.json b/nixpkgs/pkgs/misc/base16-builder/supplement.json
new file mode 100644
index 000000000000..2838e627165f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/base16-builder/supplement.json
@@ -0,0 +1,3 @@
+[
+  "node-pre-gyp"
+]
diff --git a/nixpkgs/pkgs/misc/base16-builder/supplement.nix b/nixpkgs/pkgs/misc/base16-builder/supplement.nix
new file mode 100644
index 000000000000..e6abbfeb42ee
--- /dev/null
+++ b/nixpkgs/pkgs/misc/base16-builder/supplement.nix
@@ -0,0 +1,693 @@
+# This file has been generated by node2nix 1.11.1. Do not edit!
+
+{nodeEnv, fetchurl, fetchgit, nix-gitignore, stdenv, lib, globalBuildInputs ? []}:
+
+let
+  sources = {
+    "abbrev-1.1.1" = {
+      name = "abbrev";
+      packageName = "abbrev";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
+        sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
+      };
+    };
+    "ansi-regex-2.1.1" = {
+      name = "ansi-regex";
+      packageName = "ansi-regex";
+      version = "2.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
+        sha512 = "TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==";
+      };
+    };
+    "aproba-1.2.0" = {
+      name = "aproba";
+      packageName = "aproba";
+      version = "1.2.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";
+        sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
+      };
+    };
+    "are-we-there-yet-1.1.7" = {
+      name = "are-we-there-yet";
+      packageName = "are-we-there-yet";
+      version = "1.1.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz";
+        sha512 = "nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==";
+      };
+    };
+    "balanced-match-1.0.2" = {
+      name = "balanced-match";
+      packageName = "balanced-match";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz";
+        sha512 = "3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==";
+      };
+    };
+    "brace-expansion-1.1.11" = {
+      name = "brace-expansion";
+      packageName = "brace-expansion";
+      version = "1.1.11";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
+        sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
+      };
+    };
+    "chownr-1.1.4" = {
+      name = "chownr";
+      packageName = "chownr";
+      version = "1.1.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz";
+        sha512 = "jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==";
+      };
+    };
+    "code-point-at-1.1.0" = {
+      name = "code-point-at";
+      packageName = "code-point-at";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
+        sha512 = "RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==";
+      };
+    };
+    "concat-map-0.0.1" = {
+      name = "concat-map";
+      packageName = "concat-map";
+      version = "0.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
+        sha512 = "/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==";
+      };
+    };
+    "console-control-strings-1.1.0" = {
+      name = "console-control-strings";
+      packageName = "console-control-strings";
+      version = "1.1.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
+        sha512 = "ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==";
+      };
+    };
+    "core-util-is-1.0.3" = {
+      name = "core-util-is";
+      packageName = "core-util-is";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz";
+        sha512 = "ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==";
+      };
+    };
+    "debug-3.2.7" = {
+      name = "debug";
+      packageName = "debug";
+      version = "3.2.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz";
+        sha512 = "CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==";
+      };
+    };
+    "deep-extend-0.6.0" = {
+      name = "deep-extend";
+      packageName = "deep-extend";
+      version = "0.6.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz";
+        sha512 = "LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==";
+      };
+    };
+    "delegates-1.0.0" = {
+      name = "delegates";
+      packageName = "delegates";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
+        sha512 = "bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==";
+      };
+    };
+    "detect-libc-1.0.3" = {
+      name = "detect-libc";
+      packageName = "detect-libc";
+      version = "1.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz";
+        sha512 = "pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==";
+      };
+    };
+    "fs-minipass-1.2.7" = {
+      name = "fs-minipass";
+      packageName = "fs-minipass";
+      version = "1.2.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz";
+        sha512 = "GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==";
+      };
+    };
+    "fs.realpath-1.0.0" = {
+      name = "fs.realpath";
+      packageName = "fs.realpath";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
+        sha512 = "OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==";
+      };
+    };
+    "gauge-2.7.4" = {
+      name = "gauge";
+      packageName = "gauge";
+      version = "2.7.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
+        sha512 = "14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==";
+      };
+    };
+    "glob-7.2.3" = {
+      name = "glob";
+      packageName = "glob";
+      version = "7.2.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz";
+        sha512 = "nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==";
+      };
+    };
+    "has-unicode-2.0.1" = {
+      name = "has-unicode";
+      packageName = "has-unicode";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
+        sha512 = "8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==";
+      };
+    };
+    "iconv-lite-0.4.24" = {
+      name = "iconv-lite";
+      packageName = "iconv-lite";
+      version = "0.4.24";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";
+        sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==";
+      };
+    };
+    "ignore-walk-3.0.4" = {
+      name = "ignore-walk";
+      packageName = "ignore-walk";
+      version = "3.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz";
+        sha512 = "PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==";
+      };
+    };
+    "inflight-1.0.6" = {
+      name = "inflight";
+      packageName = "inflight";
+      version = "1.0.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
+        sha512 = "k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==";
+      };
+    };
+    "inherits-2.0.4" = {
+      name = "inherits";
+      packageName = "inherits";
+      version = "2.0.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz";
+        sha512 = "k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==";
+      };
+    };
+    "ini-1.3.8" = {
+      name = "ini";
+      packageName = "ini";
+      version = "1.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz";
+        sha512 = "JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==";
+      };
+    };
+    "is-fullwidth-code-point-1.0.0" = {
+      name = "is-fullwidth-code-point";
+      packageName = "is-fullwidth-code-point";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
+        sha512 = "1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==";
+      };
+    };
+    "isarray-1.0.0" = {
+      name = "isarray";
+      packageName = "isarray";
+      version = "1.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
+        sha512 = "VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==";
+      };
+    };
+    "minimatch-3.1.2" = {
+      name = "minimatch";
+      packageName = "minimatch";
+      version = "3.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz";
+        sha512 = "J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==";
+      };
+    };
+    "minimist-1.2.8" = {
+      name = "minimist";
+      packageName = "minimist";
+      version = "1.2.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz";
+        sha512 = "2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==";
+      };
+    };
+    "minipass-2.9.0" = {
+      name = "minipass";
+      packageName = "minipass";
+      version = "2.9.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz";
+        sha512 = "wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==";
+      };
+    };
+    "minizlib-1.3.3" = {
+      name = "minizlib";
+      packageName = "minizlib";
+      version = "1.3.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz";
+        sha512 = "6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==";
+      };
+    };
+    "mkdirp-0.5.6" = {
+      name = "mkdirp";
+      packageName = "mkdirp";
+      version = "0.5.6";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz";
+        sha512 = "FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==";
+      };
+    };
+    "ms-2.1.3" = {
+      name = "ms";
+      packageName = "ms";
+      version = "2.1.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz";
+        sha512 = "6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==";
+      };
+    };
+    "needle-2.9.1" = {
+      name = "needle";
+      packageName = "needle";
+      version = "2.9.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz";
+        sha512 = "6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==";
+      };
+    };
+    "nopt-4.0.3" = {
+      name = "nopt";
+      packageName = "nopt";
+      version = "4.0.3";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz";
+        sha512 = "CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==";
+      };
+    };
+    "npm-bundled-1.1.2" = {
+      name = "npm-bundled";
+      packageName = "npm-bundled";
+      version = "1.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz";
+        sha512 = "x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==";
+      };
+    };
+    "npm-normalize-package-bin-1.0.1" = {
+      name = "npm-normalize-package-bin";
+      packageName = "npm-normalize-package-bin";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz";
+        sha512 = "EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==";
+      };
+    };
+    "npm-packlist-1.4.8" = {
+      name = "npm-packlist";
+      packageName = "npm-packlist";
+      version = "1.4.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz";
+        sha512 = "5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==";
+      };
+    };
+    "npmlog-4.1.2" = {
+      name = "npmlog";
+      packageName = "npmlog";
+      version = "4.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
+        sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
+      };
+    };
+    "number-is-nan-1.0.1" = {
+      name = "number-is-nan";
+      packageName = "number-is-nan";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
+        sha512 = "4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==";
+      };
+    };
+    "object-assign-4.1.1" = {
+      name = "object-assign";
+      packageName = "object-assign";
+      version = "4.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
+        sha512 = "rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==";
+      };
+    };
+    "once-1.4.0" = {
+      name = "once";
+      packageName = "once";
+      version = "1.4.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
+        sha512 = "lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==";
+      };
+    };
+    "os-homedir-1.0.2" = {
+      name = "os-homedir";
+      packageName = "os-homedir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
+        sha512 = "B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==";
+      };
+    };
+    "os-tmpdir-1.0.2" = {
+      name = "os-tmpdir";
+      packageName = "os-tmpdir";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
+        sha512 = "D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==";
+      };
+    };
+    "osenv-0.1.5" = {
+      name = "osenv";
+      packageName = "osenv";
+      version = "0.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
+        sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
+      };
+    };
+    "path-is-absolute-1.0.1" = {
+      name = "path-is-absolute";
+      packageName = "path-is-absolute";
+      version = "1.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
+        sha512 = "AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==";
+      };
+    };
+    "process-nextick-args-2.0.1" = {
+      name = "process-nextick-args";
+      packageName = "process-nextick-args";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
+        sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
+      };
+    };
+    "rc-1.2.8" = {
+      name = "rc";
+      packageName = "rc";
+      version = "1.2.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz";
+        sha512 = "y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==";
+      };
+    };
+    "readable-stream-2.3.8" = {
+      name = "readable-stream";
+      packageName = "readable-stream";
+      version = "2.3.8";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz";
+        sha512 = "8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==";
+      };
+    };
+    "rimraf-2.7.1" = {
+      name = "rimraf";
+      packageName = "rimraf";
+      version = "2.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz";
+        sha512 = "uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==";
+      };
+    };
+    "safe-buffer-5.1.2" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
+        sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
+      };
+    };
+    "safe-buffer-5.2.1" = {
+      name = "safe-buffer";
+      packageName = "safe-buffer";
+      version = "5.2.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz";
+        sha512 = "rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==";
+      };
+    };
+    "safer-buffer-2.1.2" = {
+      name = "safer-buffer";
+      packageName = "safer-buffer";
+      version = "2.1.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
+        sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
+      };
+    };
+    "sax-1.2.4" = {
+      name = "sax";
+      packageName = "sax";
+      version = "1.2.4";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
+        sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
+      };
+    };
+    "semver-5.7.1" = {
+      name = "semver";
+      packageName = "semver";
+      version = "5.7.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";
+        sha512 = "sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==";
+      };
+    };
+    "set-blocking-2.0.0" = {
+      name = "set-blocking";
+      packageName = "set-blocking";
+      version = "2.0.0";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
+        sha512 = "KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==";
+      };
+    };
+    "signal-exit-3.0.7" = {
+      name = "signal-exit";
+      packageName = "signal-exit";
+      version = "3.0.7";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz";
+        sha512 = "wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==";
+      };
+    };
+    "string-width-1.0.2" = {
+      name = "string-width";
+      packageName = "string-width";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
+        sha512 = "0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==";
+      };
+    };
+    "string_decoder-1.1.1" = {
+      name = "string_decoder";
+      packageName = "string_decoder";
+      version = "1.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
+        sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
+      };
+    };
+    "strip-ansi-3.0.1" = {
+      name = "strip-ansi";
+      packageName = "strip-ansi";
+      version = "3.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
+        sha512 = "VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==";
+      };
+    };
+    "strip-json-comments-2.0.1" = {
+      name = "strip-json-comments";
+      packageName = "strip-json-comments";
+      version = "2.0.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
+        sha512 = "4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==";
+      };
+    };
+    "tar-4.4.19" = {
+      name = "tar";
+      packageName = "tar";
+      version = "4.4.19";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz";
+        sha512 = "a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==";
+      };
+    };
+    "util-deprecate-1.0.2" = {
+      name = "util-deprecate";
+      packageName = "util-deprecate";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
+        sha512 = "EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==";
+      };
+    };
+    "wide-align-1.1.5" = {
+      name = "wide-align";
+      packageName = "wide-align";
+      version = "1.1.5";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz";
+        sha512 = "eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==";
+      };
+    };
+    "wrappy-1.0.2" = {
+      name = "wrappy";
+      packageName = "wrappy";
+      version = "1.0.2";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
+        sha512 = "l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==";
+      };
+    };
+    "yallist-3.1.1" = {
+      name = "yallist";
+      packageName = "yallist";
+      version = "3.1.1";
+      src = fetchurl {
+        url = "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz";
+        sha512 = "a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==";
+      };
+    };
+  };
+in
+{
+  node-pre-gyp = nodeEnv.buildNodePackage {
+    name = "node-pre-gyp";
+    packageName = "node-pre-gyp";
+    version = "0.17.0";
+    src = fetchurl {
+      url = "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.17.0.tgz";
+      sha512 = "abzZt1hmOjkZez29ppg+5gGqdPLUuJeAEwVPtHYEJgx0qzttCbcKFpxrCQn2HYbwCv2c+7JwH4BgEzFkUGpn4A==";
+    };
+    dependencies = [
+      sources."abbrev-1.1.1"
+      sources."ansi-regex-2.1.1"
+      sources."aproba-1.2.0"
+      sources."are-we-there-yet-1.1.7"
+      sources."balanced-match-1.0.2"
+      sources."brace-expansion-1.1.11"
+      sources."chownr-1.1.4"
+      sources."code-point-at-1.1.0"
+      sources."concat-map-0.0.1"
+      sources."console-control-strings-1.1.0"
+      sources."core-util-is-1.0.3"
+      sources."debug-3.2.7"
+      sources."deep-extend-0.6.0"
+      sources."delegates-1.0.0"
+      sources."detect-libc-1.0.3"
+      sources."fs-minipass-1.2.7"
+      sources."fs.realpath-1.0.0"
+      sources."gauge-2.7.4"
+      sources."glob-7.2.3"
+      sources."has-unicode-2.0.1"
+      sources."iconv-lite-0.4.24"
+      sources."ignore-walk-3.0.4"
+      sources."inflight-1.0.6"
+      sources."inherits-2.0.4"
+      sources."ini-1.3.8"
+      sources."is-fullwidth-code-point-1.0.0"
+      sources."isarray-1.0.0"
+      sources."minimatch-3.1.2"
+      sources."minimist-1.2.8"
+      sources."minipass-2.9.0"
+      sources."minizlib-1.3.3"
+      sources."mkdirp-0.5.6"
+      sources."ms-2.1.3"
+      sources."needle-2.9.1"
+      sources."nopt-4.0.3"
+      sources."npm-bundled-1.1.2"
+      sources."npm-normalize-package-bin-1.0.1"
+      sources."npm-packlist-1.4.8"
+      sources."npmlog-4.1.2"
+      sources."number-is-nan-1.0.1"
+      sources."object-assign-4.1.1"
+      sources."once-1.4.0"
+      sources."os-homedir-1.0.2"
+      sources."os-tmpdir-1.0.2"
+      sources."osenv-0.1.5"
+      sources."path-is-absolute-1.0.1"
+      sources."process-nextick-args-2.0.1"
+      sources."rc-1.2.8"
+      sources."readable-stream-2.3.8"
+      sources."rimraf-2.7.1"
+      sources."safe-buffer-5.1.2"
+      sources."safer-buffer-2.1.2"
+      sources."sax-1.2.4"
+      sources."semver-5.7.1"
+      sources."set-blocking-2.0.0"
+      sources."signal-exit-3.0.7"
+      sources."string-width-1.0.2"
+      sources."string_decoder-1.1.1"
+      sources."strip-ansi-3.0.1"
+      sources."strip-json-comments-2.0.1"
+      (sources."tar-4.4.19" // {
+        dependencies = [
+          sources."safe-buffer-5.2.1"
+        ];
+      })
+      sources."util-deprecate-1.0.2"
+      sources."wide-align-1.1.5"
+      sources."wrappy-1.0.2"
+      sources."yallist-3.1.1"
+    ];
+    buildInputs = globalBuildInputs;
+    meta = {
+      description = "Node.js native addon binary install tool";
+      homepage = "https://github.com/mapbox/node-pre-gyp#readme";
+      license = "BSD-3-Clause";
+    };
+    production = true;
+    bypassCache = true;
+    reconstructLock = true;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/base16-shell-preview/default.nix b/nixpkgs/pkgs/misc/base16-shell-preview/default.nix
new file mode 100644
index 000000000000..bd1c8508023d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/base16-shell-preview/default.nix
@@ -0,0 +1,29 @@
+{ lib
+, python3Packages
+, fetchPypi
+}:
+
+let
+  pname = "base16-shell-preview";
+  version = "1.0.0";
+in
+python3Packages.buildPythonApplication {
+  inherit pname version;
+
+  src = fetchPypi {
+    inherit version;
+    pname = "${lib.replaceStrings ["-"] ["_"] pname}";
+    hash = "sha256-retnbxjdjo+NeA1B0+jpM9kToAX/Rh0ze0yNF9AfDiU=";
+  };
+
+  # If enabled, it will attempt to run '__init__.py, failing by trying to write
+  # at "/homeless-shelter" as HOME
+  doCheck = false;
+
+  meta = {
+    homepage = "https://github.com/nvllsvm/base16-shell-preview";
+    description = "Browse and preview Base16 Shell themes in your terminal";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ AndersonTorres ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/beep/default.nix b/nixpkgs/pkgs/misc/beep/default.nix
new file mode 100644
index 000000000000..31fbb82cc357
--- /dev/null
+++ b/nixpkgs/pkgs/misc/beep/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+# this package is working only as root
+# in order to work as a non privileged user you would need to suid the bin
+
+stdenv.mkDerivation rec {
+  pname = "beep";
+  version = "1.4.12";
+
+  src = fetchFromGitHub {
+    owner = "spkr-beep";
+    repo = "beep";
+    rev = "v${version}";
+    sha256 = "sha256-gDgGI9F+wW2cN89IwP93PkMv6vixJA2JckF78nxZ+TU=";
+  };
+
+  makeFlags = [ "prefix=${placeholder "out"}"];
+
+  # causes redefinition of _FORTIFY_SOURCE
+  hardeningDisable = [ "fortify3" ];
+
+  meta = with lib; {
+    description = "The advanced PC speaker beeper";
+    homepage = "https://github.com/spkr-beep/beep";
+    license = licenses.gpl2Only;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/brightnessctl/default.nix b/nixpkgs/pkgs/misc/brightnessctl/default.nix
new file mode 100644
index 000000000000..43a37ad764ee
--- /dev/null
+++ b/nixpkgs/pkgs/misc/brightnessctl/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, systemd }:
+
+stdenv.mkDerivation rec {
+  pname = "brightnessctl";
+  version = "0.5.1";
+
+  src = fetchFromGitHub {
+    owner = "Hummer12007";
+    repo = "brightnessctl";
+    rev = version;
+    sha256 = "0immxc7almmpg80n3bdn834p3nrrz7bspl2syhb04s3lawa5y2lq";
+  };
+
+  makeFlags = [ "PREFIX=" "DESTDIR=$(out)" "ENABLE_SYSTEMD=1" ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ systemd ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Hummer12007/brightnessctl";
+    description = "This program allows you read and control device brightness";
+    license = licenses.mit;
+    maintainers = with maintainers; [ megheaiulian ];
+    platforms = platforms.linux;
+    mainProgram = "brightnessctl";
+  };
+
+}
diff --git a/nixpkgs/pkgs/misc/calaos/installer/default.nix b/nixpkgs/pkgs/misc/calaos/installer/default.nix
new file mode 100644
index 000000000000..575471b2ee51
--- /dev/null
+++ b/nixpkgs/pkgs/misc/calaos/installer/default.nix
@@ -0,0 +1,34 @@
+{ mkDerivation, lib, stdenv, fetchFromGitHub, qmake, qttools, qtbase }:
+
+mkDerivation rec {
+  pname = "calaos_installer";
+  version = "3.5";
+
+  src = fetchFromGitHub {
+    owner = "calaos";
+    repo = "calaos_installer";
+    rev = "v${version}";
+    sha256 = "hx7XVF2iueKFR67U0EvSK1vYZnJBnuOpUOkSjx7h1XY=";
+  };
+
+  nativeBuildInputs = [ qmake qttools ];
+  buildInputs = [ qtbase ];
+
+  qmakeFlags = [ "REVISION=${version}" ];
+
+  installPhase = if stdenv.isDarwin then ''
+    mkdir -p $out/Applications
+    cp -a calaos_installer.app $out/Applications
+  '' else ''
+    mkdir -p $out/bin
+    cp -a calaos_installer $out/bin
+  '';
+
+  meta = with lib; {
+    description = "Calaos Installer, a tool to create calaos configuration";
+    homepage = "https://www.calaos.fr/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.all;
+    maintainers = with maintainers; [ tiramiseb ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cbeams/default.nix b/nixpkgs/pkgs/misc/cbeams/default.nix
new file mode 100644
index 000000000000..928b03df09f7
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cbeams/default.nix
@@ -0,0 +1,21 @@
+{ lib, buildPythonApplication, fetchPypi, isPy3k, blessings, docopt }:
+
+buildPythonApplication rec {
+  pname = "cbeams";
+  version = "1.0.3";
+  disabled = !isPy3k;
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "1agcjg6kmcyvk834xd2j60mi349qi9iw3dc2vwpd7pqwq1daq3gi";
+  };
+
+  propagatedBuildInputs = [ blessings docopt ];
+
+  meta = with lib; {
+    homepage = "https://github.com/tartley/cbeams";
+    description = "Command-line program to draw animated colored circles in the terminal";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ oxzi ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cliscord/default.nix b/nixpkgs/pkgs/misc/cliscord/default.nix
new file mode 100644
index 000000000000..1f8de323efe3
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cliscord/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, rustPlatform
+, openssl
+, pkg-config
+, fetchFromGitHub
+, fetchpatch
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "cliscord";
+  version = "unstable-2022-10-07";
+
+  src = fetchFromGitHub {
+    owner = "somebody1234";
+    repo = pname;
+    rev = "d62317d55c07ece8c9d042dcd74b62e58c9bfaeb";
+    hash = "sha256-dmR49yyErahOUxR9pGW1oYy8Wq5SWOprK317u+JPBv4=";
+  };
+
+  buildInputs = [ openssl ] ++ lib.optional stdenv.isDarwin Security;
+
+  nativeBuildInputs = [ pkg-config ];
+
+  cargoHash = "sha256-Z8ras6W4BnAWjHe6rPd1X1d3US5gq7CxnBAkW//OTsg=";
+
+  meta = with lib; {
+    description = "Simple command-line tool to send text and files to discord";
+    homepage = "https://github.com/somebody1234/cliscord";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lom ];
+    mainProgram = "cliscord";
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/0001-TargetConditionals.patch b/nixpkgs/pkgs/misc/cups/0001-TargetConditionals.patch
new file mode 100644
index 000000000000..42cd4c051d4b
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/0001-TargetConditionals.patch
@@ -0,0 +1,29 @@
+From 1204c841999808ba27267a0039777dcbccdcd6e3 Mon Sep 17 00:00:00 2001
+From: toonn <toonn@toonn.io>
+Date: Sun, 27 Jun 2021 12:30:08 +0200
+Subject: [PATCH] TargetConditionals
+
+---
+ test/ippserver.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/test/ippserver.c b/test/ippserver.c
+index 38b304f..68ccab1 100644
+--- a/test/ippserver.c
++++ b/test/ippserver.c
+@@ -25,7 +25,11 @@
+  * Include necessary headers...
+  */
+ 
+-#include <config.h>			/* CUPS configuration header */
++#ifdef __APPLE__
++#  include <xcode/config.h>		/* CUPS configuration header macOS */
++#else
++#  include <config.h>			/* CUPS configuration header */
++#endif /* __APPLE__ */
+ #include <cups/cups.h>			/* Public API */
+ #include <cups/string-private.h>	/* CUPS string functions */
+ #include <cups/thread-private.h>	/* For multithreading functions */
+-- 
+2.17.2 (Apple Git-113)
+
diff --git a/nixpkgs/pkgs/misc/cups/cups-pk-helper.nix b/nixpkgs/pkgs/misc/cups/cups-pk-helper.nix
new file mode 100644
index 000000000000..f5edc7293407
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/cups-pk-helper.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, intltool, pkg-config, glib, polkit, cups, fetchpatch }:
+
+stdenv.mkDerivation rec {
+  version = "0.2.6";
+  pname = "cups-pk-helper";
+
+  src = fetchurl {
+    url = "https://www.freedesktop.org/software/cups-pk-helper/releases/cups-pk-helper-${version}.tar.xz";
+    sha256 = "0a52jw6rm7lr5nbyksiia0rn7sasyb5cjqcb95z1wxm2yprgi6lm";
+  };
+
+  nativeBuildInputs = [ pkg-config intltool ];
+  buildInputs = [ glib polkit cups ];
+
+  patches = [
+    # Don't use etc/dbus-1/system.d
+    (fetchpatch {
+      url = "https://gitlab.freedesktop.org/cups-pk-helper/cups-pk-helper/merge_requests/2.patch";
+      sha256 = "1kamhr5kn8c1y0q8xbip0fgr7maf3dyddlvab4n0iypk7rwwikl0";
+    })
+  ];
+
+  meta = with lib; {
+    description = "PolicyKit helper to configure cups with fine-grained privileges";
+    homepage = "http://www.freedesktop.org/wiki/Software/cups-pk-helper/";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.bjornfor ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/default.nix b/nixpkgs/pkgs/misc/cups/default.nix
new file mode 100644
index 000000000000..99d56af97c3d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/default.nix
@@ -0,0 +1,153 @@
+{ lib, stdenv
+, fetchurl
+, pkg-config
+, removeReferencesTo
+, zlib
+, libjpeg
+, libpng
+, libtiff
+, pam
+, dbus
+, enableSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd
+, systemd
+, acl
+, gmp
+, darwin
+, libusb1 ? null
+, gnutls ? null
+, avahi ? null
+, libpaper ? null
+, coreutils
+, nixosTests
+}:
+
+stdenv.mkDerivation rec {
+  pname = "cups";
+  version = "2.4.6";
+
+  src = fetchurl {
+    url = "https://github.com/OpenPrinting/cups/releases/download/v${version}/cups-${version}-source.tar.gz";
+    sha256 = "sha256-WOlwzxlV4cyH0IR8MlJtnCzO4zXl8OOIKygxOLoOcmI=";
+  };
+
+  outputs = [ "out" "lib" "dev" "man" ];
+
+  postPatch = ''
+    substituteInPlace cups/testfile.c \
+      --replace 'cupsFileFind("cat", "/bin' 'cupsFileFind("cat", "${coreutils}/bin'
+
+      # The cups.socket unit shouldn't be part of cups.service: stopping the
+      # service would stop the socket and break subsequent socket activations.
+      # See https://github.com/apple/cups/issues/6005
+      sed -i '/PartOf=cups.service/d' scheduler/cups.socket.in
+  '' + lib.optionalString (stdenv.isDarwin && lib.versionOlder stdenv.targetPlatform.darwinSdkVersion "12") ''
+    substituteInPlace backend/usb-darwin.c \
+      --replace "kIOMainPortDefault" "kIOMasterPortDefault"
+  '';
+
+  nativeBuildInputs = [ pkg-config removeReferencesTo ];
+
+  buildInputs = [ zlib libjpeg libpng libtiff libusb1 gnutls libpaper ]
+    ++ lib.optionals stdenv.isLinux [ avahi pam dbus acl ]
+    ++ lib.optional enableSystemd systemd
+    ++ lib.optionals stdenv.isDarwin (with darwin; [
+      configd apple_sdk.frameworks.ApplicationServices
+    ]);
+
+  propagatedBuildInputs = [ gmp ];
+
+  configurePlatforms = lib.optionals stdenv.isLinux [ "build" "host" ];
+  configureFlags = [
+    "--localstatedir=/var"
+    "--sysconfdir=/etc"
+    "--enable-raw-printing"
+    "--enable-threads"
+  ] ++ lib.optionals stdenv.isLinux [
+    "--enable-dbus"
+    "--enable-pam"
+    "--with-dbusdir=${placeholder "out"}/share/dbus-1"
+  ] ++ lib.optional (libusb1 != null) "--enable-libusb"
+    ++ lib.optional (gnutls != null) "--enable-ssl"
+    ++ lib.optional (avahi != null) "--enable-avahi"
+    ++ lib.optional (libpaper != null) "--enable-libpaper";
+
+  # AR has to be an absolute path
+  preConfigure = ''
+    export AR="${lib.getBin stdenv.cc.bintools.bintools}/bin/${stdenv.cc.targetPrefix}ar"
+    configureFlagsArray+=(
+      # Put just lib/* and locale into $lib; this didn't work directly.
+      # lib/cups is moved back to $out in postInstall.
+      # Beware: some parts of cups probably don't fully respect these.
+      "--prefix=$lib"
+      "--datadir=$out/share"
+      "--localedir=$lib/share/locale"
+
+      "--with-systemd=$out/lib/systemd/system"
+
+      ${lib.optionalString stdenv.isDarwin ''
+        "--with-bundledir=$out"
+      ''}
+    )
+  '';
+
+  installFlags =
+    [ # Don't try to write in /var at build time.
+      "CACHEDIR=$(TMPDIR)/dummy"
+      "LAUNCHD_DIR=$(TMPDIR)/dummy"
+      "LOGDIR=$(TMPDIR)/dummy"
+      "REQUESTS=$(TMPDIR)/dummy"
+      "STATEDIR=$(TMPDIR)/dummy"
+      # Idem for /etc.
+      "PAMDIR=$(out)/etc/pam.d"
+      "XINETD=$(out)/etc/xinetd.d"
+      "SERVERROOT=$(out)/etc/cups"
+      # Idem for /usr.
+      "MENUDIR=$(out)/share/applications"
+      "ICONDIR=$(out)/share/icons"
+      # Work around a Makefile bug.
+      "CUPS_PRIMARY_SYSTEM_GROUP=root"
+    ];
+
+  enableParallelBuilding = true;
+
+  postInstall = ''
+      libexec=${if stdenv.isDarwin then "libexec/cups" else "lib/cups"}
+      moveToOutput $libexec "$out"
+
+      # $lib contains references to $out/share/cups.
+      # CUPS is working without them, so they are not vital.
+      find "$lib" -type f -exec grep -q "$out" {} \; \
+           -printf "removing references from %p\n" \
+           -exec remove-references-to -t "$out" {} +
+
+      # Delete obsolete stuff that conflicts with cups-filters.
+      rm -rf $out/share/cups/banners $out/share/cups/data/testprint
+
+      moveToOutput bin/cups-config "$dev"
+      sed -e "/^cups_serverbin=/s|$lib|$out|" \
+          -i "$dev/bin/cups-config"
+
+      for f in "$out"/lib/systemd/system/*; do
+        substituteInPlace "$f" --replace "$lib/$libexec" "$out/$libexec"
+      done
+    '' + lib.optionalString stdenv.isLinux ''
+      # Use xdg-open when on Linux
+      substituteInPlace "$out"/share/applications/cups.desktop \
+        --replace "Exec=htmlview" "Exec=xdg-open"
+    '';
+
+  passthru.tests = {
+    inherit (nixosTests)
+      printing-service
+      printing-socket
+    ;
+  };
+
+  meta = with lib; {
+    homepage = "https://openprinting.github.io/cups/";
+    description = "A standards-based printing system for UNIX";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ matthewbauer ];
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/brgenml1cupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/brgenml1cupswrapper/default.nix
new file mode 100644
index 000000000000..e309e8e8b264
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/brgenml1cupswrapper/default.nix
@@ -0,0 +1,125 @@
+{ lib, stdenv, fetchurl, makeWrapper, cups, perl, coreutils, gnused, gnugrep
+, brgenml1lpr, debugLvl ? "0"}:
+
+/*
+    [Setup instructions](http://support.brother.com/g/s/id/linux/en/instruction_prn1a.html).
+
+    URI example
+     ~  `lpd://BRW0080927AFBCE/binary_p1`
+
+    Logging
+    -------
+
+    `/tmp/br_cupswrapper_ml1.log` when `DEBUG > 0` in `brother_lpdwrapper_BrGenML1`.
+    Note that when `DEBUG > 1` the wrapper stops performing its function. Better
+    keep `DEBUG == 1` unless this is desirable.
+
+    Now activable through this package's `debugLvl` parameter whose value is to be
+    used to establish `DEBUG`.
+
+    Issues
+    ------
+
+     1.  >  Error: /tmp/brBrGenML1rc_15642 :cannot open file !!
+
+        Fixed.
+
+     2.  >  touch: cannot touch '/tmp/BrGenML1_latest_print_info': Permission denied
+
+        Fixed.
+
+     3.  >  perl: warning: Falling back to the standard locale ("C").
+
+            are supported and installed on your system.
+            LANG = "en_US.UTF-8"
+            LC_ALL = (unset),
+            LANGUAGE = (unset),
+            perl: warning: Please check that your locale settings:
+            perl: warning: Setting locale failed.
+
+        TODO: Address.
+
+     4. Since nixos 16.03 release, in `brother_lpdwrapper_BrGenML1`:
+
+        > sh: grep: command not found
+          sh: chmod: command not found
+          sh: cp: command not found
+          Error: /tmp/brBrGenML1rc_1850 :cannot open file !!
+          sh: sed: command not found
+
+        Fixed by use of a wrapper that brings `coreutils`, `gnused`, `gnugrep`
+        in `PATH`.
+*/
+
+stdenv.mkDerivation rec {
+  pname = "brgenml1cupswrapper";
+  version = "3.1.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101125/brgenml1cupswrapper-${version}.i386.deb";
+    sha256 = "0kd2a2waqr10kfv1s8is3nd5dlphw4d1343srdsbrlbbndja3s6r";
+  };
+
+  unpackPhase = ''
+    ar x $src
+    tar xfvz data.tar.gz
+  '';
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cups perl coreutils gnused gnugrep brgenml1lpr ];
+
+  dontBuild = true;
+
+  patchPhase = ''
+    WRAPPER=opt/brother/Printers/BrGenML1/cupswrapper/brother_lpdwrapper_BrGenML1
+    PAPER_CFG=opt/brother/Printers/BrGenML1/cupswrapper/paperconfigml1
+
+    substituteInPlace $WRAPPER \
+      --replace "basedir =~" "basedir = \"${brgenml1lpr}/opt/brother/Printers/BrGenML1\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"BrGenML1\"; #" \
+      --replace "\$DEBUG=0;" "\$DEBUG=${debugLvl};"
+
+    # Fixing issue #1 and #2.
+    substituteInPlace $WRAPPER \
+      --replace "\`cp " "\`cp -p " \
+      --replace "\$TEMPRC\`" "\$TEMPRC; chmod a+rw \$TEMPRC\`" \
+      --replace "\`mv " "\`cp -p "
+
+    # This config script make this assumption that the *.ppd are found in a global location `/etc/cups/ppd`.
+    substituteInPlace $PAPER_CFG \
+      --replace "/etc/cups/ppd" "$out/share/cups/model"
+  '';
+
+
+  installPhase = ''
+    CUPSFILTER_DIR=$out/lib/cups/filter
+    CUPSPPD_DIR=$out/share/cups/model
+    CUPSWRAPPER_DIR=opt/brother/Printers/BrGenML1/cupswrapper
+
+    mkdir -p $out/$CUPSWRAPPER_DIR
+    cp -rp $CUPSWRAPPER_DIR/* $out/$CUPSWRAPPER_DIR
+
+    mkdir -p $CUPSFILTER_DIR
+    # Fixing issue #4.
+    makeWrapper \
+      $out/$CUPSWRAPPER_DIR/brother_lpdwrapper_BrGenML1 \
+      $CUPSFILTER_DIR/brother_lpdwrapper_BrGenML1 \
+      --prefix PATH : ${coreutils}/bin \
+      --prefix PATH : ${gnused}/bin \
+      --prefix PATH : ${gnugrep}/bin
+
+    mkdir -p $CUPSPPD_DIR
+    ln -s $out/$CUPSWRAPPER_DIR/brother-BrGenML1-cups-en.ppd $CUPSPPD_DIR
+  '';
+
+  dontPatchELF = true;
+  dontStrip = true;
+
+  meta = {
+    description = "Brother BrGenML1 CUPS wrapper driver";
+    homepage = "http://www.brother.com";
+    platforms = lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+    maintainers = with lib.maintainers; [ jraygauthier ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/brgenml1lpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/brgenml1lpr/default.nix
new file mode 100644
index 000000000000..1e838db93263
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/brgenml1lpr/default.nix
@@ -0,0 +1,95 @@
+{ lib, stdenv, fetchurl, cups, perl, ghostscript, which, makeWrapper}:
+
+/*
+    [Setup instructions](http://support.brother.com/g/s/id/linux/en/instruction_prn1a.html).
+
+    URI example
+     ~  `lpd://BRW0080927AFBCE/binary_p1`
+
+    Logging
+    -------
+
+    `/tmp/br_lpdfilter_ml1.log` when `$ENV{LPD_DEBUG} > 0` in `filter_BrGenML1`
+    which is activated automatically when `DEBUG > 0` in `brother_lpdwrapper_BrGenML1`
+    from the cups wrapper.
+
+    Issues
+    ------
+
+     -  filter_BrGenML1 ln 196 `my $GHOST_SCRIPT=`which gs`;`
+
+        `GHOST_SCRIPT` is empty resulting in an empty `/tmp/br_lpdfilter_ml1_gsout.dat` file.
+        See `/tmp/br_lpdfilter_ml1.log` for the executed command.
+
+    Notes
+    -----
+
+     -  The `setupPrintcap` has totally no use in our context.
+*/
+
+let
+  myPatchElf = file: with lib; ''
+    patchelf --set-interpreter \
+      ${stdenv.cc.libc}/lib/ld-linux${optionalString stdenv.is64bit "-x86-64"}.so.2 \
+      ${file}
+  '';
+in
+stdenv.mkDerivation rec {
+  pname = "brgenml1lpr";
+  version = "3.1.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101123/brgenml1lpr-${version}.i386.deb";
+    sha256 = "0zdvjnrjrz9sba0k525linxp55lr4cyivfhqbkq1c11br2nvy09f";
+  };
+
+  unpackPhase = ''
+    ar x $src
+    tar xfvz data.tar.gz
+  '';
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cups perl stdenv.cc.libc ghostscript which ];
+
+  dontBuild = true;
+
+  patchPhase = ''
+    INFDIR=opt/brother/Printers/BrGenML1/inf
+    LPDDIR=opt/brother/Printers/BrGenML1/lpd
+
+    # Setup max debug log by default.
+    substituteInPlace $LPDDIR/filter_BrGenML1 \
+      --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$out/opt/brother/Printers/BrGenML1\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"BrGenML1\"; #"
+
+    ${myPatchElf "$INFDIR/braddprinter"}
+    ${myPatchElf "$LPDDIR/brprintconflsr3"}
+    ${myPatchElf "$LPDDIR/rawtobr3"}
+  '';
+
+  installPhase = ''
+    INFDIR=opt/brother/Printers/BrGenML1/inf
+    LPDDIR=opt/brother/Printers/BrGenML1/lpd
+
+    mkdir -p $out/$INFDIR
+    cp -rp $INFDIR/* $out/$INFDIR
+    mkdir -p $out/$LPDDIR
+    cp -rp $LPDDIR/* $out/$LPDDIR
+
+    wrapProgram $out/$LPDDIR/filter_BrGenML1 \
+      --prefix PATH ":" "${ghostscript}/bin" \
+      --prefix PATH ":" "${which}/bin"
+  '';
+
+  dontPatchELF = true;
+
+
+  meta = {
+    description = "Brother BrGenML1 LPR driver";
+    homepage = "http://www.brother.com";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    platforms = lib.platforms.linux;
+    license = lib.licenses.unfreeRedistributable;
+    maintainers = with lib.maintainers; [ jraygauthier ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/brlaser/default.nix b/nixpkgs/pkgs/misc/cups/drivers/brlaser/default.nix
new file mode 100644
index 000000000000..b0dfd8d8170a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/brlaser/default.nix
@@ -0,0 +1,63 @@
+{ lib, stdenv, fetchFromGitHub, cmake, zlib, cups }:
+
+stdenv.mkDerivation rec {
+  pname = "brlaser";
+  version = "6";
+
+  src = fetchFromGitHub {
+    owner = "pdewacht";
+    repo = "brlaser";
+    rev = "v${version}";
+    sha256 = "1995s69ksq1fz0vb34v0ndiqncrinbrlpmp70rkl6az7kag99s80";
+  };
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ zlib cups ];
+
+  cmakeFlags = [ "-DCUPS_SERVER_BIN=lib/cups" "-DCUPS_DATA_DIR=share/cups" ];
+
+  meta = with lib; {
+    description = "A CUPS driver for Brother laser printers";
+    longDescription =
+      ''
+       Although most Brother printers support a standard printer language such as PCL or PostScript, not all do. If you have a monochrome Brother laser printer (or multi-function device) and the other open source drivers don't work, this one might help.
+
+       This driver is known to work with these printers:
+
+           Brother DCP-1510
+           Brother DCP-1602
+           Brother DCP-7030
+           Brother DCP-7040
+           Brother DCP-7055
+           Brother DCP-7055W
+           Brother DCP-7060D
+           Brother DCP-7065DN
+           Brother DCP-7080
+           Brother DCP-L2500D
+           Brother DCP-L2520D
+           Brother DCP-L2540DW
+           Brother HL-1110
+           Brother HL-1200
+           Brother HL-2030
+           Brother HL-2140
+           Brother HL-2220
+           Brother HL-2270DW
+           Brother HL-5030
+           Brother HL-L2300D
+           Brother HL-L2320D
+           Brother HL-L2340D
+           Brother HL-L2360D
+           Brother MFC-1910W
+           Brother MFC-7240
+           Brother MFC-7360N
+           Brother MFC-7365DN
+           Brother MFC-7840W
+           Brother MFC-L2710DW
+           Lenovo M7605D
+      '';
+    homepage = "https://github.com/pdewacht/brlaser";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ StijnDW ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/brother/dcp9020cdw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/brother/dcp9020cdw/default.nix
new file mode 100644
index 000000000000..ddae34eaec83
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/brother/dcp9020cdw/default.nix
@@ -0,0 +1,101 @@
+{ lib
+, stdenv
+, fetchurl
+, cups
+, dpkg
+, gnused
+, makeWrapper
+, ghostscript
+, file
+, a2ps
+, coreutils
+, gnugrep
+, which
+, gawk
+}:
+
+let
+  version = "1.1.2";
+  model = "dcp9020cdw";
+in
+rec {
+  driver = stdenv.mkDerivation {
+    pname = "${model}-lpr";
+    inherit version;
+
+    src = fetchurl {
+      url = "https://download.brother.com/welcome/dlf100441/dcp9020cdwlpr-${version}-1.i386.deb";
+      sha256 = "1z6nma489s0a0b0a8wyg38yxanz4k99dg29fyjs4jlprsvmwk56y";
+    };
+
+    nativeBuildInputs = [ dpkg makeWrapper ];
+    buildInputs = [ cups ghostscript a2ps gawk ];
+    unpackPhase = "dpkg-deb -x $src $out";
+
+    installPhase = ''
+      substituteInPlace $out/opt/brother/Printers/${model}/lpd/filter${model} \
+      --replace /opt "$out/opt"
+
+      patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+      $out/opt/brother/Printers/${model}/lpd/br${model}filter
+
+      mkdir -p $out/lib/cups/filter/
+      ln -s $out/opt/brother/Printers/${model}/lpd/filter${model} $out/lib/cups/filter/brother_lpdwrapper_${model}
+
+      wrapProgram $out/opt/brother/Printers/${model}/lpd/filter${model} \
+        --prefix PATH ":" ${lib.makeBinPath [
+          gawk
+          ghostscript
+          a2ps
+          file
+          gnused
+          gnugrep
+          coreutils
+          which
+        ]}
+    '';
+
+    meta = with lib; {
+      homepage = "http://www.brother.com/";
+      description = "Brother ${model} printer driver";
+      sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+      license = licenses.unfree;
+      platforms = platforms.linux;
+      downloadPage = "https://support.brother.com/g/b/downloadlist.aspx?c=gb&lang=en&prod=${model}_eu&os=128";
+      maintainers = with maintainers; [ pshirshov ];
+    };
+  };
+
+  cupswrapper = stdenv.mkDerivation {
+    pname = "${model}-cupswrapper";
+    inherit version;
+
+    src = fetchurl {
+      url = "https://download.brother.com/welcome/dlf100443/dcp9020cdwcupswrapper-${version}-1.i386.deb";
+      sha256 = "04yqm1qv9p4hgp1p6mqq4siygl4056s6flv6kqln8mvmcr8zaq1s";
+    };
+
+    nativeBuildInputs = [ dpkg makeWrapper ];
+    buildInputs = [ cups ghostscript a2ps gawk ];
+    unpackPhase = "dpkg-deb -x $src $out";
+
+    installPhase = ''
+      for f in $out/opt/brother/Printers/${model}/cupswrapper/cupswrapper${model}; do
+        wrapProgram $f --prefix PATH : ${lib.makeBinPath [ coreutils ghostscript gnugrep gnused ]}
+      done
+
+      mkdir -p $out/share/cups/model
+      ln -s $out/opt/brother/Printers/${model}/cupswrapper/brother_${model}_printer_en.ppd $out/share/cups/model/
+    '';
+
+    meta = with lib; {
+      homepage = "http://www.brother.com/";
+      description = "Brother ${model} printer CUPS wrapper driver";
+      sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+      license = licenses.unfree;
+      platforms = platforms.linux;
+      downloadPage = "https://support.brother.com/g/b/downloadlist.aspx?c=gb&lang=en&prod=${model}_eu&os=128";
+      maintainers = with maintainers; [ pshirshov ];
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/brother/hll2375dw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/brother/hll2375dw/default.nix
new file mode 100644
index 000000000000..a6c2db9f90b1
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/brother/hll2375dw/default.nix
@@ -0,0 +1,104 @@
+{ lib
+, stdenv
+, fetchurl
+, dpkg
+, autoPatchelfHook
+, makeWrapper
+, perl
+, gnused
+, ghostscript
+, file
+, coreutils
+, gnugrep
+, which
+}:
+
+let
+  arches = [ "x86_64" "i686" "armv7l" ];
+
+  runtimeDeps = [
+    ghostscript
+    file
+    gnused
+    gnugrep
+    coreutils
+    which
+  ];
+in
+
+stdenv.mkDerivation rec {
+  pname = "cups-brother-hll2375dw";
+  version = "4.0.0-1";
+
+  nativeBuildInputs = [ dpkg makeWrapper autoPatchelfHook ];
+  buildInputs = [ perl ];
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf103535//hll2375dwpdrv-${version}.i386.deb";
+    hash = "sha256-N5VCBZLFrfw29QjjzlSvQ12urvyaf7ez/RJ08UwqHdk=";
+  };
+
+  unpackPhase = "dpkg-deb -x $src .";
+
+  patches = [
+    # The brother lpdwrapper uses a temporary file to convey the printer settings.
+    # The original settings file will be copied with "400" permissions and the "brprintconflsr3"
+    # binary cannot alter the temporary file later on. This fixes the permissions so the can be modified.
+    # Since this is all in briefly in the temporary directory of systemd-cups and not accessible by others,
+    # it shouldn't be a security concern.
+    ./fix-perm.patch
+  ];
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out
+    cp -ar opt $out/opt
+    # delete unnecessary files for the current architecture
+  '' + lib.concatMapStrings
+    (arch: ''
+      echo Deleting files for ${arch}
+      rm -r "$out/opt/brother/Printers/HLL2375DW/lpd/${arch}"
+    '')
+    (builtins.filter (arch: arch != stdenv.hostPlatform.linuxArch) arches) + ''
+    # bundled scripts don't understand the arch subdirectories for some reason
+    ln -s \
+      "$out/opt/brother/Printers/HLL2375DW/lpd/${stdenv.hostPlatform.linuxArch}/"* \
+      "$out/opt/brother/Printers/HLL2375DW/lpd/"
+
+    # Fix global references and replace auto discovery mechanism with hardcoded values
+    substituteInPlace $out/opt/brother/Printers/HLL2375DW/lpd/lpdfilter \
+      --replace "my \$BR_PRT_PATH =" "my \$BR_PRT_PATH = \"$out/opt/brother/Printers/HLL2375DW\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"HLL2375DW\"; #"
+    substituteInPlace $out/opt/brother/Printers/HLL2375DW/cupswrapper/lpdwrapper \
+      --replace "my \$basedir = C" "my \$basedir = \"$out/opt/brother/Printers/HLL2375DW\" ; #" \
+      --replace "PRINTER =~" "PRINTER = \"HLL2375DW\"; #"
+
+    # Make sure all executables have the necessary runtime dependencies available
+    find "$out" -executable -and -type f | while read file; do
+      wrapProgram "$file" --prefix PATH : "${lib.makeBinPath runtimeDeps}"
+    done
+
+    # Symlink filter and ppd into a location where CUPS will discover it
+    mkdir -p $out/lib/cups/filter
+    mkdir -p $out/share/cups/model
+    mkdir -p $out/etc/opt/brother/Printers/HLL2375DW/inf
+
+    ln -s $out/opt/brother/Printers/HLL2375DW/inf/brHLL2375DWrc \
+          $out/etc/opt/brother/Printers/HLL2375DW/inf/brHLL2375DWrc
+    ln -s \
+      $out/opt/brother/Printers/HLL2375DW/cupswrapper/lpdwrapper \
+      $out/lib/cups/filter/brother_lpdwrapper_HLL2375DW
+    ln -s \
+      $out/opt/brother/Printers/HLL2375DW/cupswrapper/brother-HLL2375DW-cups-en.ppd \
+      $out/share/cups/model/
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "http://www.brother.com/";
+    description = "Brother HLL2375DW printer driver";
+    license = licenses.unfree;
+    platforms = builtins.map (arch: "${arch}-linux") arches;
+    maintainers = [ maintainers.gador ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/brother/hll2375dw/fix-perm.patch b/nixpkgs/pkgs/misc/cups/drivers/brother/hll2375dw/fix-perm.patch
new file mode 100644
index 000000000000..6d85ad5bd53d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/brother/hll2375dw/fix-perm.patch
@@ -0,0 +1,10 @@
+--- a/opt/brother/Printers/HLL2375DW/cupswrapper/lpdwrapper  2022-12-07 18:32:29.950543083 +0100
++++ b/opt/brother/Printers/HLL2375DW/cupswrapper/lpdwrapper      2022-12-07 18:46:03.046989151 +0100
+@@ -379,6 +379,7 @@
+
+
+ `cp  $basedir/inf/br${PRINTER}rc  $TEMPRC`;
++`chmod 666  $TEMPRC`;
+ $ENV{BRPRINTERRCFILE} = $TEMPRC;
+
+ logprint( 0 , "TEMPRC    = $TEMPRC\n");
\ No newline at end of file
diff --git a/nixpkgs/pkgs/misc/cups/drivers/brother/mfcl3770cdw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/brother/mfcl3770cdw/default.nix
new file mode 100644
index 000000000000..828b4bb831b6
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/brother/mfcl3770cdw/default.nix
@@ -0,0 +1,90 @@
+{ pkgsi686Linux
+, stdenv
+, fetchurl
+, dpkg
+, makeWrapper
+, coreutils
+, ghostscript
+, gnugrep
+, gnused
+, which
+, perl
+, lib
+}:
+
+let
+  model = "mfcl3770cdw";
+  version = "1.0.2-0";
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf103935/${model}pdrv-${version}.i386.deb";
+    sha256 = "09fhbzhpjymhkwxqyxzv24b06ybmajr6872yp7pri39595mhrvay";
+  };
+  reldir = "opt/brother/Printers/${model}/";
+
+in rec {
+  driver = pkgsi686Linux.stdenv.mkDerivation rec {
+    inherit src version;
+    name = "${model}drv-${version}";
+
+    nativeBuildInputs = [ dpkg makeWrapper ];
+
+    unpackPhase = "dpkg-deb -x $src $out";
+
+    installPhase = ''
+      dir="$out/${reldir}"
+      substituteInPlace $dir/lpd/filter_${model} \
+        --replace /usr/bin/perl ${perl}/bin/perl \
+        --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$dir\"; #" \
+        --replace "PRINTER =~" "PRINTER = \"${model}\"; #"
+      wrapProgram $dir/lpd/filter_${model} \
+        --prefix PATH : ${lib.makeBinPath [
+          coreutils ghostscript gnugrep gnused which
+        ]}
+    # need to use i686 glibc here, these are 32bit proprietary binaries
+    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
+      $dir/lpd/brmfcl3770cdwfilter
+    '';
+
+    meta = {
+      description = "Brother ${lib.strings.toUpper model} driver";
+      homepage = "http://www.brother.com/";
+      sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+      license = lib.licenses.unfree;
+      platforms = [ "x86_64-linux" "i686-linux" ];
+      maintainers = [ lib.maintainers.steveej ];
+    };
+  };
+
+  cupswrapper = stdenv.mkDerivation rec {
+    inherit version src;
+    name = "${model}cupswrapper-${version}";
+
+    nativeBuildInputs = [ dpkg makeWrapper ];
+
+    unpackPhase = "dpkg-deb -x $src $out";
+
+    installPhase = ''
+      basedir=${driver}/${reldir}
+      dir=$out/${reldir}
+      substituteInPlace $dir/cupswrapper/brother_lpdwrapper_${model} \
+        --replace /usr/bin/perl ${perl}/bin/perl \
+        --replace "basedir =~" "basedir = \"$basedir\"; #" \
+        --replace "PRINTER =~" "PRINTER = \"${model}\"; #"
+      wrapProgram $dir/cupswrapper/brother_lpdwrapper_${model} \
+        --prefix PATH : ${lib.makeBinPath [ coreutils gnugrep gnused ]}
+      mkdir -p $out/lib/cups/filter
+      mkdir -p $out/share/cups/model
+      ln $dir/cupswrapper/brother_lpdwrapper_${model} $out/lib/cups/filter
+      ln $dir/cupswrapper/brother_${model}_printer_en.ppd $out/share/cups/model
+    '';
+
+    meta = {
+      description = "Brother ${lib.strings.toUpper model} CUPS wrapper driver";
+      homepage = "http://www.brother.com/";
+      sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+      license = lib.licenses.gpl2;
+      platforms = [ "x86_64-linux" "i686-linux" ];
+      maintainers = [ lib.maintainers.steveej ];
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/canon/default.nix b/nixpkgs/pkgs/misc/cups/drivers/canon/default.nix
new file mode 100644
index 000000000000..40438d333cf9
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/canon/default.nix
@@ -0,0 +1,199 @@
+{ lib
+, stdenv
+, fetchurl
+, unzip
+, autoconf
+, automake
+, libtool_1_5
+, makeWrapper
+, cups
+, jbigkit
+, glib
+, gtk3
+, gdk-pixbuf
+, pango
+, cairo
+, coreutils
+, atk
+, pkg-config
+, libxml2
+, runtimeShell
+, libredirect
+, ghostscript
+, pkgs
+, zlib
+}:
+
+let
+  system =
+    if stdenv.targetPlatform.system == "x86_64-linux" then "intel"
+    else if stdenv.targetPlatform.system == "aarch64-linux" then "arm"
+    else throw "Unsupported platform for Canon UFR2 Drivers: ${stdenv.targetPlatform.system}";
+  ld64 = "${stdenv.cc}/nix-support/dynamic-linker";
+  libs = pkgs: lib.makeLibraryPath buildInputs;
+
+  version = "5.70";
+  dl = "8/0100007658/33";
+
+  versionNoDots = builtins.replaceStrings [ "." ] [ "" ] version;
+  src_canon = fetchurl {
+    url = "http://gdlp01.c-wss.com/gds/${dl}/linux-UFRII-drv-v${versionNoDots}-m17n-11.tar.gz";
+    hash = "sha256-d5VHlPpUPAr3RWVdQRdn42YLuVekOw1IaMFLVt1Iu7o=";
+  };
+
+  buildInputs = [ cups zlib jbigkit glib gtk3 libxml2 gdk-pixbuf pango cairo atk ];
+in
+stdenv.mkDerivation rec {
+  pname = "canon-cups-ufr2";
+  inherit version;
+  src = src_canon;
+
+  postUnpack = ''
+    (
+      cd $sourceRoot
+      tar -xf Sources/cnrdrvcups-lb-${version}-1.11.tar.xz
+      sed -ie "s@_prefix=/usr@_prefix=$out@" cnrdrvcups-common-${version}/allgen.sh
+      sed -ie "s@_libdir=/usr/lib@_libdir=$out/lib@" cnrdrvcups-common-${version}/allgen.sh
+      sed -ie "s@_bindir=/usr/bin@_bindir=$out/bin@" cnrdrvcups-common-${version}/allgen.sh
+      sed -ie "s@/usr@$out@" cnrdrvcups-common-${version}/{{backend,rasterfilter}/Makefile.am,rasterfilter/cnrasterproc.h}
+      sed -ie "s@etc/cngplp@$out/etc/cngplp@" cnrdrvcups-common-${version}/cngplp/Makefile.am
+      sed -ie "s@usr/share/cngplp@$out/usr/share/cngplp@" cnrdrvcups-common-${version}/cngplp/src/Makefile.am
+      patchShebangs cnrdrvcups-common-${version}
+
+      sed -ie "s@_prefix=/usr@_prefix=$out@" cnrdrvcups-lb-${version}/allgen.sh
+      sed -ie "s@_libdir=/usr/lib@_libdir=$out/lib@" cnrdrvcups-lb-${version}/allgen.sh
+      sed -ie "s@_bindir=/usr/bin@_bindir=$out/bin@" cnrdrvcups-lb-${version}/allgen.sh
+      sed -ie '/^cd \.\.\/cngplp/,/^cd files/{/^cd files/!{d}}' cnrdrvcups-lb-${version}/allgen.sh
+      sed -ie "s@cd \.\./pdftocpca@cd pdftocpca@" cnrdrvcups-lb-${version}/allgen.sh
+      sed -ie "s@/usr@$out@" cnrdrvcups-lb-${version}/pdftocpca/Makefile.am
+      sed -i "/CNGPLPDIR/d" cnrdrvcups-lb-${version}/Makefile
+      patchShebangs cnrdrvcups-lb-${version}
+    )
+  '';
+
+  nativeBuildInputs = [ makeWrapper unzip autoconf automake libtool_1_5 pkg-config ];
+
+  inherit buildInputs;
+
+  installPhase = ''
+    runHook preInstall
+
+    (
+      cd cnrdrvcups-common-${version}
+      ./allgen.sh
+      make install
+    )
+    (
+      cd cnrdrvcups-common-${version}/Rule
+      mkdir -p $out/share/cups/usb
+      install -m 644 *.usb-quirks $out/share/cups/usb
+    )
+    (
+      cd cnrdrvcups-lb-${version}
+      ./allgen.sh
+      make install
+
+      mkdir -p $out/share/cups/model
+      install -m 644 ppd/*.ppd $out/share/cups/model/
+    )
+
+    (
+      cd lib
+      mkdir -p $out/lib
+      install -m 755 libs64/${system}/libColorGearCufr2.so.2.0.0 $out/lib
+      install -m 755 libs64/${system}/libcaepcmufr2.so.1.0 $out/lib
+      install -m 755 libs64/${system}/libcaiocnpkbidir.so.1.0.0 $out/lib
+      install -m 755 libs64/${system}/libcaiousb.so.1.0.0 $out/lib
+      install -m 755 libs64/${system}/libcaiowrapufr2.so.1.0.0 $out/lib
+      install -m 755 libs64/${system}/libcanon_slimufr2.so.1.0.0 $out/lib
+      install -m 755 libs64/${system}/libcanonufr2r.so.1.0.0 $out/lib
+      install -m 755 libs64/${system}/libcnaccm.so.1.0 $out/lib
+      install -m 755 libs64/${system}/libcnlbcmr.so.1.0 $out/lib
+      install -m 755 libs64/${system}/libcnncapcmr.so.1.0 $out/lib
+      install -m 755 libs64/${system}/libufr2filterr.so.1.0.0 $out/lib
+
+      install -m 755 libs64/${system}/cnpdfdrv $out/bin
+      install -m 755 libs64/${system}/cnpkbidir $out/bin
+      install -m 755 libs64/${system}/cnpkmoduleufr2r $out/bin
+      install -m 755 libs64/${system}/cnrsdrvufr2 $out/bin
+      install -m 755 libs64/${system}/cnsetuputil2 $out/bin/cnsetuputil2
+
+      mkdir -p $out/share/cnpkbidir
+      install -m 644 libs64/${system}/cnpkbidir_info* $out/share/cnpkbidir
+
+      mkdir -p $out/share/ufr2filter
+      install -m 644 libs64/${system}/ThLB* $out/share/ufr2filter
+    )
+
+    (
+      cd $out/lib
+
+      ln -sf libColorGearCufr2.so.2.0.0 libColorGearCufr2.so
+      ln -sf libColorGearCufr2.so.2.0.0 libColorGearCufr2.so.2
+      ln -sf libcaepcmufr2.so.1.0 libcaepcmufr2.so
+      ln -sf libcaepcmufr2.so.1.0 libcaepcmufr2.so.1
+      ln -sf libcaiocnpkbidir.so.1.0.0 libcaiocnpkbidir.so
+      ln -sf libcaiocnpkbidir.so.1.0.0 libcaiocnpkbidir.so.1
+      ln -sf libcaiowrapufr2.so.1.0.0 libcaiowrapufr2.so
+      ln -sf libcaiowrapufr2.so.1.0.0 libcaiowrapufr2.so.1
+      ln -sf libcanon_slimufr2.so.1.0.0 libcanon_slimufr2.so
+      ln -sf libcanon_slimufr2.so.1.0.0 libcanon_slimufr2.so.1
+      ln -sf libcanonufr2r.so.1.0.0 libcanonufr2r.so
+      ln -sf libcanonufr2r.so.1.0.0 libcanonufr2r.so.1
+      ln -sf libcnlbcmr.so.1.0 libcnlbcmr.so
+      ln -sf libcnlbcmr.so.1.0 libcnlbcmr.so.1
+      ln -sf libufr2filterr.so.1.0.0 libufr2filterr.so
+      ln -sf libufr2filterr.so.1.0.0 libufr2filterr.so.1
+      ln -sf libuictlufr2r.so.1.0.0 libuictlufr2r.so
+      ln -sf libuictlufr2r.so.1.0.0 libuictlufr2r.so.1
+
+      patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${stdenv.cc.cc.lib}/lib64:${stdenv.cc.libc}/lib64:$out/lib" libcanonufr2r.so.1.0.0
+      patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${stdenv.cc.cc.lib}/lib64:${stdenv.cc.libc}/lib64" libcaepcmufr2.so.1.0
+      patchelf --set-rpath "$(cat $NIX_CC/nix-support/orig-cc)/lib:${libs pkgs}:${stdenv.cc.cc.lib}/lib64:${stdenv.cc.libc}/lib64" libColorGearCufr2.so.2.0.0
+    )
+
+    (
+      cd $out/bin
+      patchelf --set-interpreter "$(cat ${ld64})" --set-rpath "${lib.makeLibraryPath buildInputs}:${stdenv.cc.cc.lib}/lib64:${stdenv.cc.libc}/lib64" cnsetuputil2 cnpdfdrv
+      patchelf --set-interpreter "$(cat ${ld64})" --set-rpath "${lib.makeLibraryPath buildInputs}:${stdenv.cc.cc.lib}/lib64:${stdenv.cc.libc}/lib64:$out/lib" cnpkbidir cnrsdrvufr2 cnpkmoduleufr2r cnjbigufr2
+
+      wrapProgram $out/bin/cnrsdrvufr2 \
+        --prefix LD_LIBRARY_PATH ":" "$out/lib" \
+        --set LD_PRELOAD "${libredirect}/lib/libredirect.so" \
+        --set NIX_REDIRECTS /usr/bin/cnpkmoduleufr2r=$out/bin/cnpkmoduleufr2r:/usr/bin/cnjbigufr2=$out/bin/cnjbigufr2
+
+      wrapProgram $out/bin/cnsetuputil2 \
+        --set LD_PRELOAD "${libredirect}/lib/libredirect.so" \
+        --set NIX_REDIRECTS /usr/share/cnsetuputil2=$out/usr/share/cnsetuputil2
+    )
+
+    (
+      cd lib/data/ufr2
+      mkdir -p $out/share/caepcm
+      install -m 644 *.ICC $out/share/caepcm
+      install -m 644 *.icc $out/share/caepcm
+      install -m 644 *.PRF $out/share/caepcm
+      install -m 644 CnLB* $out/share/caepcm
+    )
+
+    (
+      cd cnrdrvcups-utility-${version}/data
+      mkdir -p $out/usr/share/cnsetuputil2
+      install -m 644 cnsetuputil* $out/usr/share/cnsetuputil2
+    )
+
+    makeWrapper "${ghostscript}/bin/gs" "$out/bin/gs" \
+      --prefix LD_LIBRARY_PATH ":" "$out/lib" \
+      --prefix PATH ":" "$out/bin"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "CUPS Linux drivers for Canon printers";
+    homepage = "http://www.canon.com/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ lluchs ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/carps-cups/default.nix b/nixpkgs/pkgs/misc/cups/drivers/carps-cups/default.nix
new file mode 100644
index 000000000000..32e92da16084
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/carps-cups/default.nix
@@ -0,0 +1,44 @@
+{ stdenv
+, lib
+, fetchFromGitHub
+, cups
+}:
+
+stdenv.mkDerivation {
+  pname = "carps-cups";
+  version = "unstable-2018-03-05";
+
+  src = fetchFromGitHub {
+    owner = "ondrej-zary";
+    repo = "carps-cups";
+    rev = "18d80d1d6f473dd9132e4b6d8b5c592c74982f17";
+    sha256 = "0mjj9hs5lqxi0qamgb4sxfz4fvf7ggi66bxd37bkz3fl0g9xff70";
+  };
+
+  preBuild = ''
+    export CUPS_DATADIR="${cups}/share/cups"
+  '';
+
+  installPhase = ''
+    CUPSDIR="$out/lib/cups"
+    CUPSDATADIR="$out/share/cups"
+
+    mkdir -p "$CUPSDIR/filter" "$CUPSDATADIR/drv" "$CUPSDATADIR/usb"
+
+    install -s rastertocarps $CUPSDIR/filter
+    install -m 644 carps.drv $CUPSDATADIR/drv/
+    install -m 644 carps.usb-quirks $CUPSDATADIR/usb/
+  '';
+
+  buildInputs = [ cups ];
+
+  meta = with lib; {
+    description = "CUPS Linux drivers for Canon printers";
+    homepage = "https://www.canon.com/";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [
+      ewok
+    ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter2/default.nix b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter2/default.nix
new file mode 100644
index 000000000000..8390d5e0ba84
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter2/default.nix
@@ -0,0 +1,150 @@
+{ stdenv, lib, fetchzip, autoconf, automake, cups, glib, libxml2, libusb1, libtool
+, withDebug ? false }:
+
+stdenv.mkDerivation {
+  pname = "cnijfilter2";
+
+  version = "6.40";
+
+  src = fetchzip {
+    url = "https://gdlp01.c-wss.com/gds/1/0100011381/01/cnijfilter2-source-6.40-1.tar.gz";
+    sha256 = "3RoG83jLOsdTEmvUkkxb7wa8oBrJA4v1mGtxTGwSowU=";
+  };
+
+  nativeBuildInputs = [ automake autoconf ];
+  buildInputs = [
+    cups glib libxml2 libusb1 libtool
+  ];
+
+  patches = [
+    ./patches/get_protocol.patch
+  ];
+
+  # lgmon3's --enable-libdir flag is used soley for specifying in which
+  # directory the cnnnet.ini cache file should reside.
+  # NixOS uses /var/cache/cups, and given the name, it seems like a reasonable
+  # place to put the cnnet.ini file, and thus we do so.
+  #
+  # Note that the drivers attempt to dlopen
+  # $out/lib/cups/filter/libcnbpcnclapicom2.so
+  buildPhase = ''
+    mkdir -p $out/lib
+    cp com/libs_bin_x86_64/* $out/lib
+    mkdir -p $out/lib/cups/filter
+    ln -s $out/lib/libcnbpcnclapicom2.so $out/lib/cups/filter
+
+    export NIX_LDFLAGS="$NIX_LDFLAGS -L$out/lib"
+  '' + lib.optionalString withDebug ''
+    export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -D__DEBUG__ -DDEBUG_LOG"
+  '' + ''
+
+    (
+      cd lgmon3
+      substituteInPlace src/Makefile.am \
+        --replace /usr/include/libusb-1.0 \
+                  ${libusb1.dev}/include/libusb-1.0
+      ./autogen.sh --prefix=$out --enable-progpath=$out/bin \
+                   --datadir=$out/share \
+                   --enable-libdir=/var/cache/cups
+      make
+    )
+
+    (
+      cd cmdtocanonij2
+      ./autogen.sh --prefix=$out
+      make
+    )
+
+    (
+      cd cmdtocanonij3
+      ./autogen.sh --prefix=$out
+      make
+    )
+
+    (
+      cd cnijbe2
+      substituteInPlace src/Makefile.am \
+        --replace "/usr/lib/cups/backend" \
+                  "$out/lib/cups/backend"
+      ./autogen.sh --prefix=$out --enable-progpath=$out/bin
+      make
+    )
+
+    (
+      cd rastertocanonij
+      ./autogen.sh --prefix=$out --enable-progpath=$out/bin
+      make
+    )
+
+    (
+      cd tocanonij
+      ./autogen.sh --prefix=$out --enable-progpath=$out/bin
+      make
+    )
+
+    (
+      cd tocnpwg
+      ./autogen.sh --prefix=$out --enable-progpath=$out/bin
+      make
+    )
+  '';
+
+  installPhase = ''
+    (
+      cd lgmon3
+      make install
+    )
+
+    (
+      cd cmdtocanonij2
+      make install
+    )
+
+    (
+      cd cmdtocanonij3
+      make install
+    )
+
+    (
+      cd cnijbe2
+      make install
+    )
+
+    (
+      cd rastertocanonij
+      make install
+    )
+
+    (
+      cd tocanonij
+      make install
+    )
+
+    (
+      cd tocnpwg
+      make install
+    )
+
+    mkdir -p $out/share/cups/model
+    cp ppd/*.ppd $out/share/cups/model
+  '';
+
+  meta = with lib; {
+    description = "Canon InkJet printer drivers for many Pixma series printers.";
+    longDescription = ''
+      Canon InjKet printer drivers for series E200, E300, E3100, E3300, E4200, E450, E470, E480,
+      G3000, G3010, G4000, G4010, G5000, G5080, G6000, G6050, G6080, G7000, G7050, G7080, GM2000,
+      GM2080, GM4000, GM4080, iB4000, iB4100, iP110, MB2000, MB2100, MB2300, MB2700, MB5000,
+      MB5100, MB5300, MB5400, MG2900, MG3000, MG3600, MG5600, MG5700, MG6600, MG6700, MG6800,
+      MG6900, MG7500, MG7700, MX490, TR4500, TR703, TR7500, TR7530, TR8500, TR8530, TR8580, TR9530,
+      TS200, TS300, TS3100, TS3300, TS5000, TS5100, TS5300, TS5380, TS6000, TS6100, TS6130, TS6180,
+      TS6200, TS6230, TS6280, TS6300, TS6330, TS6380, TS700, TS708, TS7330, TS8000, TS8100, TS8130,
+      TS8180, TS8200, TS8230, TS8280, TS8300, TS8330, TS8380, TS9000, TS9100, TS9180, TS9500,
+      TS9580, XK50, XK60, XK70, XK80.
+    '';
+    homepage = "https://hk.canon/en/support/0101048401/1";
+    license = licenses.unfree;
+    platforms = [ "i686-linux" "x86_64-linux" ];
+    maintainers = with maintainers; [ cstrahan ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter2/patches/get_protocol.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter2/patches/get_protocol.patch
new file mode 100644
index 000000000000..18cb1ce1d014
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter2/patches/get_protocol.patch
@@ -0,0 +1,14 @@
+# Resolves the compilation issue reported at https://github.com/NixOS/nixpkgs/pull/180681#issuecomment-1192304711
+# An identical issue was previously reported in Gentoo: https://bugs.gentoo.org/723186
+# This patch is taken from the solution of Alfredo Tupone (https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=24688d64544b43f2c14be54531ad8764419dde09)
+--- a/lgmon3/src/cnijlgmon3.c	2022-07-22 12:44:32.194641628 +0100
++++ b/lgmon3/src/cnijlgmon3.c	2022-07-22 12:43:53.954817724 +0100
+@@ -55,7 +55,7 @@
+ int (*GET_STATUS)(char *, int, int *, int * , char *);
+ int (*GET_STATUS2)(char *, int, char *, int *, int * , char *, char *);
+ int (*GET_STATUS2_MAINTENANCE)(char *, int, char *, int *, int * , char *, char *);
+-int (*GET_PROTOCOL)(char *, size_t);
++static int (*GET_PROTOCOL)(char *, size_t);
+ 
+ 
+  int main(int argc, char *argv[])
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/default.nix b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/default.nix
new file mode 100644
index 000000000000..2b7e416eafef
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/default.nix
@@ -0,0 +1,114 @@
+{ stdenv, lib, fetchzip,
+  autoconf, automake, libtool,
+  cups, popt, libtiff, libpng,
+  ghostscript }:
+
+/* this derivation is basically just a transcription of the rpm .spec
+   file included in the tarball */
+
+stdenv.mkDerivation {
+  pname = "cnijfilter";
+
+  /* important note about versions: cnijfilter packages seem to use
+     versions in a non-standard way.  the version indicates which
+     printers are supported in the package.  so this package should
+     not be "upgraded" in the usual way.
+
+     instead, if you want to include another version supporting your
+     printer, you should try to abstract out the common things (which
+     should be pretty much everything except the version and the 'pr'
+     and 'pr_id' values to loop over). */
+  version = "2.80";
+
+  src = fetchzip {
+    url = "http://gdlp01.c-wss.com/gds/1/0100000841/01/cnijfilter-common-2.80-1.tar.gz";
+    sha256 = "06s9nl155yxmx56056y22kz1p5b2sb5fhr3gf4ddlczjkd1xch53";
+  };
+
+  nativeBuildInputs = [ autoconf automake ];
+  buildInputs = [ libtool
+                  cups popt libtiff libpng
+                  ghostscript ];
+
+  patches = [ ./patches/missing-include.patch
+              ./patches/libpng15.patch ];
+
+  postPatch = ''
+    sed -i "s|/usr/lib/cups/backend|$out/lib/cups/backend|" backend/src/Makefile.am;
+    sed -i "s|/usr|$out|" backend/src/cnij_backend_common.c;
+    sed -i "s|/usr/bin|${ghostscript}/bin|" pstocanonij/filter/pstocanonij.c;
+    sed -i "s|/usr/local|$out|" libs/bjexec/bjexec.c;
+  '';
+
+  configurePhase = ''
+    cd libs
+    ./autogen.sh --prefix=$out;
+
+    cd ../cngpij
+    ./autogen.sh --prefix=$out --enable-progpath=$out/bin;
+
+    cd ../pstocanonij
+    ./autogen.sh --prefix=$out --enable-progpath=$out/bin;
+
+    cd ../backend
+    ./autogen.sh --prefix=$out;
+    cd ..;
+  '';
+
+  preInstall = ''
+    mkdir -p $out/bin $out/lib/cups/filter $out/share/cups/model;
+  '';
+
+  postInstall = ''
+    for pr in mp140 mp210 ip3500 mp520 ip4500 mp610; do
+      cd ppd;
+      ./autogen.sh --prefix=$out --program-suffix=$pr
+      make clean;
+      make;
+      make install;
+
+      cd ../cnijfilter;
+      ./autogen.sh --prefix=$out --program-suffix=$pr --enable-libpath=/var/lib/cups/path/lib/bjlib --enable-binpath=$out/bin;
+      make clean;
+      make;
+      make install;
+
+      cd ..;
+    done;
+
+    mkdir -p $out/lib/bjlib;
+    for pr_id in 315 316 319 328 326 327; do
+      install -c -m 755 $pr_id/database/* $out/lib/bjlib;
+      install -c -s -m 755 $pr_id/libs_bin/*.so.* $out/lib;
+    done;
+
+    pushd $out/lib;
+    for so_file in *.so.*; do
+      ln -s $so_file ''${so_file/.so.*/}.so;
+      patchelf --set-rpath $out/lib $so_file;
+    done;
+    popd;
+  '';
+
+  /* the tarball includes some pre-built shared libraries.  we run
+     'patchelf --set-rpath' on them just a few lines above, so that
+     they can find each other.  but that's not quite enough.  some of
+     those libraries load each other in non-standard ways -- they
+     don't list each other in the DT_NEEDED section.  so, if the
+     standard 'patchelf --shrink-rpath' (from
+     pkgs/development/tools/misc/patchelf/setup-hook.sh) is run on
+     them, it undoes the --set-rpath.  this prevents that. */
+  dontPatchELF = true;
+
+  meta = with lib; {
+    description = "Canon InkJet printer drivers for the iP5400, MP520, MP210, MP140, iP3500, and MP610 series.  (MP520 drivers also work for MX700.)";
+    homepage = "http://support-asia.canon-asia.com/content/EN/0100084101.html";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryNativeCode
+    ];
+    license = licenses.unfree;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ jerith666 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/patches/libpng15.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/patches/libpng15.patch
new file mode 100644
index 000000000000..f5b3a1b13db5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/patches/libpng15.patch
@@ -0,0 +1,23 @@
+diff -aur cnijfilter-source-3.20-1/cnijfilter/src/bjfimage.c cnijfilter-source-3.20-1.new/cnijfilter/src/bjfimage.c
+--- cnijfilter-source-3.20-1/cnijfilter/src/bjfimage.c	2009-03-26 06:11:05.000000000 +0100
++++ cnijfilter-source-3.20-1.new/cnijfilter/src/bjfimage.c	2012-02-10 09:33:52.512334139 +0100
+@@ -1520,8 +1520,8 @@
+ 	short			tmpformat;
+ 	short			retbyte = 0;
+ 	short			bpp = 3;
+-	long			width = 0;
+-	long			length = 0;
++	png_uint_32		width = 0;
++	png_uint_32		length = 0;
+ 	long			rstep = 0;
+ 	long			RasterLength = 0;
+ 	long			i;
+@@ -1574,7 +1574,7 @@
+ 		goto onErr;
+ 	}
+ 
+-	if (setjmp (png_p->jmpbuf))
++	if (setjmp (png_jmpbuf(png_p)))
+ 	{
+ 		png_destroy_read_struct(&png_p, &info_p, (png_infopp)NULL);
+ 		goto onErr;
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/patches/missing-include.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/patches/missing-include.patch
new file mode 100644
index 000000000000..20c2d756d1eb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_2_80/patches/missing-include.patch
@@ -0,0 +1,20 @@
+--- a/backend/src/cnij_backend_common.c	2008-09-01 10:05:44.000000000 +0200
++++ b/backend/src/cnij_backend_common.c	2012-05-06 17:38:40.000000000 +0200
+@@ -39,6 +39,7 @@
+ // CUPS Header
+ #include <cups/cups.h>
+ #include <cups/ipp.h>
++#include <cups/ppd.h>
+ 
+ // Header file for CANON
+ #include "cnij_backend_common.h"
+--- a/cngpijmon/src/bjcupsmon_cups.c	2008-09-02 12:28:24.000000000 +0200
++++ b/cngpijmon/src/bjcupsmon_cups.c	2012-05-06 17:39:20.000000000 +0200
+@@ -21,6 +21,7 @@
+ /*** Includes ***/
+ #include <cups/cups.h>
+ #include <cups/language.h>
++#include <cups/ppd.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+ #include <pwd.h>
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/default.nix b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/default.nix
new file mode 100644
index 000000000000..d632ed12d89b
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/default.nix
@@ -0,0 +1,156 @@
+{ stdenv, lib, fetchzip,
+  autoconf, automake, libtool,
+  cups, popt, libtiff, libpng,
+  ghostscript, glib, libusb1, libxml2 }:
+
+/* this derivation is basically just a transcription of the rpm .spec
+   file included in the tarball */
+
+let arch =
+  if stdenv.hostPlatform.system == "x86_64-linux" then "64"
+    else if stdenv.hostPlatform.system == "i686-linux" then "32"
+    else throw "Unsupported system ${stdenv.hostPlatform.system}";
+
+in stdenv.mkDerivation {
+  pname = "cnijfilter";
+
+  /* important note about versions: cnijfilter packages seem to use
+     versions in a non-standard way.  the version indicates which
+     printers are supported in the package.  so this package should
+     not be "upgraded" in the usual way.
+
+     instead, if you want to include another version supporting your
+     printer, you should try to abstract out the common things (which
+     should be pretty much everything except the version and the 'pr'
+     and 'pr_id' values to loop over). */
+  version = "4.00";
+
+  src = fetchzip {
+    url = "http://gdlp01.c-wss.com/gds/5/0100005515/01/cnijfilter-source-4.00-1.tar.gz";
+    sha256 = "1f6vpx1z3qa88590i5m0s49j9n90vpk81xmw6pvj0nfd3qbvzkya";
+  };
+
+  nativeBuildInputs = [ autoconf automake ];
+  buildInputs = [ libtool
+                  cups popt libtiff libpng
+                  ghostscript glib libusb1 libxml2 ];
+
+  # patches from https://github.com/tokiclover/bar-overlay/tree/master/net-print/cnijfilter
+  patches = [
+    ./patches/cnijfilter-3.80-1-cups-1.6.patch
+    ./patches/cnijfilter-3.80-6-cups-1.6.patch
+    ./patches/cnijfilter-4.00-4-ppd.patch
+    ./patches/cnijfilter-4.00-5-abi_x86_32.patch
+    ./patches/cnijfilter-4.00-6-headers.patch
+    ./patches/cnijfilter-4.00-7-sysctl.patch
+  ];
+
+  postPatch = ''
+    sed -i "s|/usr/lib/cups/backend|$out/lib/cups/backend|" backend/src/Makefile.am;
+    sed -i "s|/usr/lib/cups/backend|$out/lib/cups/backend|" backendnet/backend/Makefile.am;
+    sed -i "s|/usr/lib/cups/backend|$out/lib/cups/backend|" cnijbe/src/Makefile.am;
+    sed -i "s|/usr|$out|" backend/src/cnij_backend_common.c;
+    sed -i "s|/usr/bin|${ghostscript}/bin|" pstocanonij/filter/pstocanonij.c;
+  '';
+
+  configurePhase = ''
+    cd libs
+    ./autogen.sh --prefix=$out
+
+    cd ../bscc2sts
+    ./autogen.sh
+
+    cd ../cnijnpr
+    ./autogen.sh --prefix=$out --enable-libpath=$out/lib/bjlib
+
+    cd ../cngpij
+    ./autogen.sh --prefix=$out --enable-progpath=$out/bin
+
+    cd ../cngpijmnt
+    ./autogen.sh --prefix=$out --enable-progpath=$out/bin
+
+    cd ../pstocanonij
+    ./autogen.sh --prefix=$out --enable-progpath=$out/bin
+
+    cd ../backend
+    ./autogen.sh --prefix=$out
+
+    cd ../backendnet
+    ./autogen.sh --prefix=$out --enable-libpath=$out/lib/bjlib --enable-progpath=$out/bin
+
+    cd ../cmdtocanonij
+    ./autogen.sh --prefix=$out --datadir=$out/share
+
+    cd ../cnijbe
+    ./autogen.sh --prefix=$out --enable-progpath=$out/bin
+
+    cd ../lgmon2
+    substituteInPlace src/Makefile.am \
+        --replace /usr/include/libusb-1.0 \
+                  ${libusb1.dev}/include/libusb-1.0
+    ./autogen.sh --prefix=$out --enable-libpath=$out/lib/bjlib --enable-progpath=$out/bin
+
+    cd ..;
+
+    sed -e "s,cnijlgmon2_LDADD =,cnijlgmon2_LDADD = -L../../com/libs_bin${arch}," \
+    -i lgmon2/src/Makefile.am || die
+  '';
+
+  preInstall = ''
+    mkdir -p $out/bin $out/lib/cups/filter $out/share/cups/model;
+  '';
+
+  postInstall = ''
+    set -o xtrace
+    for pr in mg2400 mg2500 mg3500 mg5500 mg6400 mg6500 mg7100 p200; do
+      cd ppd;
+      ./autogen.sh --prefix=$out --program-suffix=$pr
+      make clean;
+      make;
+      make install;
+
+      cd ../cnijfilter;
+      ./autogen.sh --prefix=$out --program-suffix=$pr --enable-libpath=/var/lib/cups/path/lib/bjlib --enable-binpath=$out/bin;
+      make clean;
+      make;
+      make install;
+
+      cd ..;
+    done;
+
+    mkdir -p $out/lib/bjlib;
+    for pr_id in 423 424 425 426 427 428 429 430; do
+      install -c -m 755 $pr_id/database/* $out/lib/bjlib;
+      install -c -s -m 755 $pr_id/libs_bin${arch}/*.so.* $out/lib;
+    done;
+
+    pushd $out/lib;
+    for so_file in *.so.*; do
+      ln -s $so_file ''${so_file/.so.*/}.so;
+      patchelf --set-rpath $out/lib $so_file;
+    done;
+    popd;
+  '';
+
+  /* the tarball includes some pre-built shared libraries.  we run
+     'patchelf --set-rpath' on them just a few lines above, so that
+     they can find each other.  but that's not quite enough.  some of
+     those libraries load each other in non-standard ways -- they
+     don't list each other in the DT_NEEDED section.  so, if the
+     standard 'patchelf --shrink-rpath' (from
+     pkgs/development/tools/misc/patchelf/setup-hook.sh) is run on
+     them, it undoes the --set-rpath.  this prevents that. */
+  dontPatchELF = true;
+
+  meta = with lib; {
+    description = "Canon InkJet printer drivers for the MG2400 MG2500 MG3500 MG5500 MG6400 MG6500 MG7100 and P200 series";
+    homepage = "https://www.canon-europe.com/support/consumer_products/products/fax__multifunctionals/inkjet/pixma_mg_series/pixma_mg5550.aspx?type=drivers&driverdetailid=tcm:13-1094072";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryNativeCode
+    ];
+    license = licenses.unfree;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ chpatrick ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-3.80-1-cups-1.6.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-3.80-1-cups-1.6.patch
new file mode 100644
index 000000000000..dfc0bb2268cb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-3.80-1-cups-1.6.patch
@@ -0,0 +1,62 @@
+--- a/cngpij/cngpij/bjcups.c
++++ a/cngpij/cngpij/bjcups.c
+@@ -698,8 +719,8 @@
+ 	else {
+ 		pRequest = ippNew();
+ 		
+-		pRequest->request.op.operation_id = CUPS_GET_PRINTERS;
+-		pRequest->request.op.request_id   = 1;
++		ippSetOperation(pRequest, CUPS_GET_PRINTERS);
++		ippSetRequestId(pRequest, 1);
+ 		
+ 		pLanguage = bjcupsLangDefault();	// cupsLangDefault() -> bjcupsLangDefault() for cups-1.1.19
+ 		
+@@ -708,29 +729,29 @@
+ 		ippAddString(pRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, NULL);
+ 		
+ 		if ((pResponse = cupsDoRequest(pHTTP, pRequest, "/")) != NULL) {
+-			if (pResponse->request.status.status_code > IPP_OK_CONFLICT) {
++			if (ippGetStatusCode(pResponse) > IPP_OK_CONFLICT) {
+ 				fputs("ERROR: IPP ERROR\n", stderr);
+ 				goto onErr;
+ 			}
+ 			else {
+-				pAttribute = pResponse->attrs;
++				pAttribute = ippFirstAttribute(pResponse);
+ 
+ 				while (pAttribute != NULL) {
+-					while (pAttribute != NULL && pAttribute->group_tag != IPP_TAG_PRINTER) {
+-						pAttribute = pAttribute->next;
++					while (pAttribute != NULL && ippGetGroupTag(pAttribute) != IPP_TAG_PRINTER) {
++						pAttribute = ippNextAttribute(pResponse);
+ 					}
+ 					if (pAttribute == NULL) {
+ 						break;
+ 					}
+ 					
+-					while (pAttribute != NULL && pAttribute->group_tag == IPP_TAG_PRINTER) {
+-						if (strcmp(pAttribute->name, "printer-name") == 0 && pAttribute->value_tag == IPP_TAG_NAME) {
+-							pPrinter = pAttribute->values[0].string.text;
++					while (pAttribute != NULL && ippGetGroupTag(pAttribute) == IPP_TAG_PRINTER) {
++						if (strcmp(ippGetName(pAttribute), "printer-name") == 0 && ippGetValueTag(pAttribute) == IPP_TAG_NAME) {
++							pPrinter = ippGetString(pAttribute, 0, NULL);
+ 						}
+-						if (strcmp(pAttribute->name, "device-uri") == 0 && pAttribute->value_tag == IPP_TAG_URI) {
+-							pDUri = pAttribute->values[0].string.text;
++						if (strcmp(ippGetName(pAttribute), "device-uri") == 0 && ippGetValueTag(pAttribute) == IPP_TAG_URI) {
++							pDUri = ippGetString(pAttribute, 0, NULL);
+ 						}
+-						pAttribute = pAttribute->next;
++						pAttribute = ippNextAttribute(pResponse);
+ 					}
+ 
+ 					if (strcasecmp(pDestName, pPrinter) == 0) {
+@@ -739,7 +760,7 @@
+ 					}
+ 					
+ 					if (pAttribute != NULL)
+-						 pAttribute = pAttribute->next;
++						pAttribute = ippNextAttribute(pResponse);
+ 				}
+ 			}
+
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-3.80-6-cups-1.6.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-3.80-6-cups-1.6.patch
new file mode 100644
index 000000000000..6b51d4837d45
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-3.80-6-cups-1.6.patch
@@ -0,0 +1,87 @@
+diff --git a/cngpijmnt/src/getipc.c b/cngpijmnt/src/getipc.c
+index 8688032..54c7933 100755
+--- a/cngpijmnt/src/getipc.c
++++ b/cngpijmnt/src/getipc.c
+@@ -42,7 +42,7 @@ int GetIPCData(LPIPCU pipc, char *sname)
+ 	int server_fd;
+ 	int client_fd;
+ 	char buf[128];
+-	size_t len;
++	socklen_t len;
+ 	short ret = RET_ERROR;
+ 
+ 	if( (server_fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0 )
+
+--- a/cngpijmnt/src/main.c	2016-11-12 23:39:03.534855723 +0100
++++ b/cngpijmnt/src/main.c	2016-11-12 23:47:02.521847145 +0100
+@@ -308,8 +308,8 @@
+ 					*pResponse;					// Pointer to CUPS IPP response.
+ 	ipp_attribute_t	*pAttribute;				// Pointer to CUPS attributes.
+ 	cups_lang_t		*pLanguage;					// Pointer to language.
+-	char			*pPrinter = NULL;			// Pointer to printer name.
+-	char			*pDUri = NULL;				// Pointer to Device uri.
++	const char			*pPrinter = NULL;			// Pointer to printer name.
++	const char			*pDUri = NULL;				// Pointer to Device uri.
+ 	short			retVal = -1;	// Return value.
+ /*** Parameters end ***/
+ 	
+@@ -321,8 +321,8 @@
+ 	else {
+ 		pRequest = ippNew();
+ 		
+-		pRequest->request.op.operation_id = CUPS_GET_PRINTERS;
+-		pRequest->request.op.request_id   = 1;
++		ippSetOperation(pRequest, CUPS_GET_PRINTERS);
++		ippSetRequestId(pRequest, 1);
+ 		
+ 		pLanguage = bjcupsLangDefault();	// cupsLangDefault() -> bjcupsLangDefault() for cups-1.1.19
+ 		
+@@ -331,29 +331,29 @@
+ 		ippAddString(pRequest, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, NULL);
+ 		
+ 		if ((pResponse = cupsDoRequest(pHTTP, pRequest, "/")) != NULL) {
+-			if (pResponse->request.status.status_code > IPP_OK_CONFLICT) {
++			if (ippGetStatusCode(pResponse) > IPP_OK_CONFLICT) {
+ 				fputs("ERROR: IPP ERROR\n", stderr);
+ 				goto onErr;
+ 			}
+ 			else {
+-				pAttribute = pResponse->attrs;
++				pAttribute = ippFirstAttribute(pResponse);
+ 
+ 				while (pAttribute != NULL) {
+-					while (pAttribute != NULL && pAttribute->group_tag != IPP_TAG_PRINTER) {
+-						pAttribute = pAttribute->next;
++					while (pAttribute != NULL && ippGetGroupTag(pAttribute) != IPP_TAG_PRINTER) {
++						pAttribute = ippNextAttribute(pResponse);
+ 					}
+ 					if (pAttribute == NULL) {
+ 						break;
+ 					}
+ 					
+-					while (pAttribute != NULL && pAttribute->group_tag == IPP_TAG_PRINTER) {
+-						if (strcmp(pAttribute->name, "printer-name") == 0 && pAttribute->value_tag == IPP_TAG_NAME) {
+-							pPrinter = pAttribute->values[0].string.text;
++					while (pAttribute != NULL && ippGetGroupTag(pAttribute) == IPP_TAG_PRINTER) {
++						if (strcmp(ippGetName(pAttribute), "printer-name") == 0 && ippGetValueTag(pAttribute) == IPP_TAG_NAME) {
++							pPrinter = ippGetString(pAttribute, 0, NULL);
+ 						}
+-						if (strcmp(pAttribute->name, "device-uri") == 0 && pAttribute->value_tag == IPP_TAG_URI) {
+-							pDUri = pAttribute->values[0].string.text;
++						if (strcmp(ippGetName(pAttribute), "device-uri") == 0 && ippGetValueTag(pAttribute) == IPP_TAG_URI) {
++							pDUri = ippGetString(pAttribute, 0, NULL);
+ 						}
+-						pAttribute = pAttribute->next;
++						pAttribute = ippNextAttribute(pResponse);
+ 					}
+ 
+ 					if (strcasecmp(pDestName, pPrinter) == 0) {
+@@ -362,7 +362,7 @@
+ 					}
+ 					
+ 					if (pAttribute != NULL)
+-						 pAttribute = pAttribute->next;
++						 pAttribute = ippNextAttribute(pResponse);
+ 				}
+ 			}
+ 			
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-4-ppd.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-4-ppd.patch
new file mode 100644
index 000000000000..92bef72ba056
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-4-ppd.patch
@@ -0,0 +1,10 @@
+--- a/backend/src/cnij_backend_common.c	2016-11-13 00:08:34.600824006 +0100
++++ a/backend/src/cnij_backend_common.c	2016-11-13 00:08:52.037823694 +0100
+@@ -37,6 +37,7 @@
+ // CUPS Header
+ #include <cups/cups.h>
+ #include <cups/ipp.h>
++#include <cups/ppd.h>
+ 
+ // Header file for CANON
+ #include "cnij_backend_common.h"
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-5-abi_x86_32.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-5-abi_x86_32.patch
new file mode 100644
index 000000000000..dc85801a256b
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-5-abi_x86_32.patch
@@ -0,0 +1,45 @@
+--- a/backendnet/configure.in	2014-08-11 08:38:46.034984462 +0200
++++ a/backendnet/configure.in	2014-08-11 08:35:42.902985813 +0200
+@@ -19,7 +19,11 @@
+ AC_DEFINE_UNQUOTED(BJLIB_PATH, "$enable_libpath")
+ AC_SUBST(BJLIB_PATH)
+ 
+-ARC=`getconf LONG_BIT`
++case "$ABI" in
++    x86) ARC=32;;
++    amd64) ARC=64;;
++    *) ARC=`getconf LONG_BIT`;;
++esac
+ AC_SUBST(ARC)
+ 
+ # Checks for programs.
+--- a/cnijfilter/configure.in	2014-08-11 08:39:44.426984031 +0200
++++ a/cnijfilter/configure.in	2014-08-11 08:35:19.788985984 +0200
+@@ -43,7 +43,11 @@
+ esac
+ AC_SUBST(CNCL_LIB_ID)
+ 
+-ARC=`getconf LONG_BIT`
++case "$ABI" in
++    x86) ARC=32;;
++    amd64) ARC=64;;
++    *) ARC=`getconf LONG_BIT`;;
++esac
+ AC_SUBST(ARC)
+ 
+ AC_PROG_CC
+--- a/cnijnpr/configure.in	2014-08-11 08:41:12.712983380 +0200
++++ a/cnijnpr/configure.in	2014-08-11 08:40:44.354983589 +0200
+@@ -37,7 +37,11 @@
+ 
+ CFLAGS="-O2"
+ 
+-ARC=`getconf LONG_BIT`
++case "$ABI" in
++    x86) ARC=32;;
++    amd64) ARC=64;;
++    *) ARC=`getconf LONG_BIT`;;
++esac
+ AC_SUBST(ARC)
+ 
+ AC_OUTPUT(Makefile
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-6-headers.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-6-headers.patch
new file mode 100644
index 000000000000..7dba79995114
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-6-headers.patch
@@ -0,0 +1,11 @@
+--- a/cnijnpr/src/cnijnpr.c	2016-11-13 21:51:33.844977618 +0100
++++ a/cnijnpr/src/cnijnpr.c	2016-11-13 21:52:03.129977094 +0100
+@@ -34,6 +34,8 @@
+ #include <sys/ioctl.h>
+ #include <net/if.h>
+ #include <sys/sysctl.h>
++#include <sys/types.h>
++#include <unistd.h>
+ #include <config.h>
+ #include <fcntl.h>
+ 
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-7-sysctl.patch b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-7-sysctl.patch
new file mode 100644
index 000000000000..a28ca208492b
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cnijfilter_4_00/patches/cnijfilter-4.00-7-sysctl.patch
@@ -0,0 +1,10 @@
+--- a/cnijnpr/src/cnijnpr.c
++++ b/cnijnpr/src/cnijnpr.c
+@@ -33,7 +33,6 @@
+ #include <signal.h>
+ #include <sys/ioctl.h>
+ #include <net/if.h>
+-#include <sys/sysctl.h>
+ #include <sys/types.h>
+ #include <unistd.h>
+ #include <config.h>
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cups-bjnp/default.nix b/nixpkgs/pkgs/misc/cups/drivers/cups-bjnp/default.nix
new file mode 100644
index 000000000000..6c8c8f21a3a2
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cups-bjnp/default.nix
@@ -0,0 +1,31 @@
+{lib, stdenv, fetchurl, cups}:
+
+stdenv.mkDerivation rec {
+  pname = "cups-bjnp";
+  version = "1.2.2";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/cups-bjnp/cups-bjnp-${version}.tar.gz";
+    sha256 = "0sb0vm1sf8ismzd9ba33qswxmsirj2z1b7lnyrc9v5ixm7q0bnrm";
+  };
+
+  preConfigure = ''configureFlags="--with-cupsbackenddir=$out/lib/cups/backend"'';
+
+  buildInputs = [cups];
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-include stdio.h"
+    "-Wno-error=stringop-truncation"
+    "-Wno-error=deprecated-declarations"
+  ];
+
+  meta = {
+    description = "CUPS back-end for Canon printers";
+    longDescription = ''
+      CUPS back-end for the canon printers using the proprietary USB over IP
+      BJNP protocol. This back-end allows Cups to print over the network to a
+      Canon printer. The design is based on reverse engineering of the protocol.
+    '';
+    homepage = "http://cups-bjnp.sourceforge.net";
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix b/nixpkgs/pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix
new file mode 100644
index 000000000000..4f1ad6c9911e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cups-drv-rastertosag-gdi/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, fetchzip
+, fetchpatch
+, cups
+, python3Packages
+, patchPpdFilesHook
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "rastertosag-gdi";
+  version = "0.1";
+  src = fetchzip {
+    url = "https://www.openprinting.org/download/printing/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "1ldplpv497j8vhw24sksg3fiw8c5pqr0wajajh7p5xpvb6zlcmvw";
+  };
+  patches = [
+    # port to python 3
+    ( fetchpatch {
+      url = "https://sources.debian.org/data/main/r/${pname}/0.1-7/debian/patches/0001-${pname}-python3.patch";
+      sha256 = "1l3xbrs67025595k9ba5794q3s74anizpbxwsshcfhmbrzd9h8hg";
+    })
+  ];
+  format = "other";
+  nativeBuildInputs = [ (lib.getBin cups) patchPpdFilesHook ];
+  # The source image also brings pre-built ppd files,
+  # but we prefer to generate from source where possible, so
+  # the following line generates ppd files from the drv file.
+  postBuild = ''
+    ppdc -v -d . -I "${cups}/share/cups/ppdc" rastertosag-gdi.drv
+  '';
+  installPhase = ''
+    runHook preInstall
+    install -vDm 0644 -t "${placeholder "out"}/share/cups/model/rastertosag-gdi/" *.ppd
+    install -vDm 0755 -t "${placeholder "out"}/bin/" rastertosag-gdi
+    install -vd "${placeholder "out"}/lib/cups/filter/"
+    ln -vst "${placeholder "out"}/lib/cups/filter/" "${placeholder "out"}/bin/rastertosag-gdi"
+    runHook postInstall
+  '';
+  ppdFileCommands = [ "rastertosag-gdi" ];
+  postFixup = ''
+    gzip -9nv "${placeholder "out"}/share/cups/model/rastertosag-gdi"/*.ppd
+  '';
+  meta = {
+    description = "CUPS driver for Ricoh Aficio SP 1000S and SP 1100S printers";
+    downloadPage = "https://www.openprinting.org/download/printing/rastertosag-gdi/";
+    homepage = "https://www.openprinting.org/driver/rastertosag-gdi/";
+    license = lib.licenses.free;  # just "GPL", according to README
+    maintainers = [ lib.maintainers.yarny ];
+    longDescription = ''
+      This package brings CUPS raster filter
+      for Ricoh Aficio SP 1000S and SP 1100S.
+      In contrast to other Ricoh laser printers,
+      they use the proprietary SAG-GDI raster format by
+      Sagem Communication and do not understand PCL or PostScript.
+      Therefore they do not work with Ricoh's PPD files.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/cups-pdf-to-pdf/default.nix b/nixpkgs/pkgs/misc/cups/drivers/cups-pdf-to-pdf/default.nix
new file mode 100644
index 000000000000..a26216cbc727
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/cups-pdf-to-pdf/default.nix
@@ -0,0 +1,62 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cups
+, coreutils
+, nixosTests
+}:
+
+stdenv.mkDerivation rec {
+  pname = "cups-pdf-to-pdf";
+  version = "unstable-2021-12-22";
+
+  src = fetchFromGitHub {
+    owner = "alexivkin";
+    repo = "CUPS-PDF-to-PDF";
+    rev = "c14428c2ca8e95371daad7db6d11c84046b1a2d4";
+    hash = "sha256-pa4PFf8OAFSra0hSazmKUfbMYL/cVWvYA1lBf7c7jmY=";
+  };
+
+  buildInputs = [ cups ];
+
+  postPatch = ''
+    sed -r 's|(gscall, size, ")cp |\1${coreutils}/bin/cp |' cups-pdf.c -i
+  '';
+
+  # gcc command line is taken from original cups-pdf's README file
+  # https://fossies.org/linux/cups-pdf/README
+  # however, we replace gcc with $CC following
+  # https://nixos.org/manual/nixpkgs/stable/#sec-darwin
+  buildPhase = ''
+    runHook preBuild
+    $CC -O9 -s cups-pdf.c -o cups-pdf -lcups
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    install -Dt $out/lib/cups/backend cups-pdf
+    install -Dm 0644 -t $out/etc/cups cups-pdf.conf
+    install -Dm 0644 -t $out/share/cups/model *.ppd
+    runHook postInstall
+  '';
+
+  passthru.tests.vmtest = nixosTests.cups-pdf;
+
+  meta = with lib; {
+    description = "A CUPS backend that turns print jobs into searchable PDF files";
+    homepage = "https://github.com/alexivkin/CUPS-PDF-to-PDF";
+    license = licenses.gpl2Only;
+    maintainers = [ maintainers.yarny ];
+    longDescription = ''
+      cups-pdf is a CUPS backend that generates a PDF file for each print job and puts this file
+      into a folder on the local machine such that the print job's owner can access the file.
+
+      https://www.cups-pdf.de/
+
+      cups-pdf-to-pdf is a fork of cups-pdf which tries hard to preserve the original text of the print job by avoiding rasterization.
+
+      Note that in order to use this package, you have to make sure that the cups-pdf program is called with root privileges.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/dymo/default.nix b/nixpkgs/pkgs/misc/cups/drivers/dymo/default.nix
new file mode 100644
index 000000000000..97dcbde2b8b5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/dymo/default.nix
@@ -0,0 +1,28 @@
+{ stdenv, lib, fetchurl, cups, ... }:
+
+stdenv.mkDerivation rec {
+  pname = "cups-dymo";
+  version = "1.4.0.5";
+
+  # exposed version and 'real' version may differ
+  # in this case the download states '1.4.0' but the real version is '1.4.0.5'
+  # this has the potential to break future builds
+  dl-name = "dymo-cups-drivers-1.4.0";
+
+  src = fetchurl {
+    url = "http://download.dymo.com/dymo/Software/Download%20Drivers/Linux/Download/${dl-name}.tar.gz";
+    sha256 = "0wagsrz3q7yrkzb5ws0m5faq68rqnqfap9p98sgk5jl6x7krf1y6";
+  };
+
+  buildInputs = [ cups ];
+  patches = [ ./fix-includes.patch ];
+
+  makeFlags = [ "cupsfilterdir=$(out)/lib/cups/filter" "cupsmodeldir=$(out)/share/cups/model" ];
+
+  meta = {
+    description = "CUPS Linux drivers and SDK for DYMO printers";
+    homepage = "https://www.dymo.com/";
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ makefu ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/dymo/fix-includes.patch b/nixpkgs/pkgs/misc/cups/drivers/dymo/fix-includes.patch
new file mode 100644
index 000000000000..55f71369a001
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/dymo/fix-includes.patch
@@ -0,0 +1,80 @@
+diff -rp dymo-cups-drivers-1.4.0.5/src/common/CupsFilter.h dymo-cups-drivers-1.4.0.5-fix/src/common/CupsFilter.h
+*** dymo-cups-drivers-1.4.0.5/src/common/CupsFilter.h	2012-02-07 14:22:37.000000000 +0100
+--- dymo-cups-drivers-1.4.0.5-fix/src/common/CupsFilter.h	2017-03-27 23:10:17.638976126 +0200
+***************
+*** 22,29 ****
+--- 22,31 ----
+  #define hfc4bbdea_8a1b_427c_9ab5_50b84576b19e
+  
+  #include <cups/cups.h>
++ #include <cups/ppd.h>
+  #include <cups/raster.h>
+  #include <memory>
++ #include <stdio.h>
+  #include <string>
+  #include "CupsPrintEnvironment.h"
+  #include "ErrorDiffusionHalftoning.h"
+diff -rp dymo-cups-drivers-1.4.0.5/src/common/CupsPrintEnvironment.h dymo-cups-drivers-1.4.0.5-fix/src/common/CupsPrintEnvironment.h
+*** dymo-cups-drivers-1.4.0.5/src/common/CupsPrintEnvironment.h	2012-02-07 14:22:37.000000000 +0100
+--- dymo-cups-drivers-1.4.0.5-fix/src/common/CupsPrintEnvironment.h	2017-03-27 23:10:17.638976126 +0200
+***************
+*** 22,27 ****
+--- 22,28 ----
+  #define h952b1c81_8931_433a_8479_7ae6d8e85a86
+  
+  #include "PrinterDriver.h"
++ #include <stdio.h>
+  
+  namespace DymoPrinterDriver
+  {
+diff -rp dymo-cups-drivers-1.4.0.5/src/lm/CupsFilterLabelManager.h dymo-cups-drivers-1.4.0.5-fix/src/lm/CupsFilterLabelManager.h
+*** dymo-cups-drivers-1.4.0.5/src/lm/CupsFilterLabelManager.h	2012-02-07 14:22:38.000000000 +0100
+--- dymo-cups-drivers-1.4.0.5-fix/src/lm/CupsFilterLabelManager.h	2017-03-27 23:10:17.635976126 +0200
+***************
+*** 22,27 ****
+--- 22,28 ----
+  #define he780684b_6efc_428d_bfdb_c5422b1ed982
+  
+  #include <cups/cups.h>
++ #include <cups/ppd.h>
+  #include <cups/raster.h>
+  #include "LabelManagerDriver.h"
+  #include "LabelManagerLanguageMonitor.h"
+*************** public:
+*** 50,53 ****
+  
+  /*
+   * End of "$Id: CupsFilterLabelManager.h 14880 2011-03-31 16:29:05Z aleksandr $".
+!  */
+\ No newline at end of file
+--- 51,54 ----
+  
+  /*
+   * End of "$Id: CupsFilterLabelManager.h 14880 2011-03-31 16:29:05Z aleksandr $".
+!  */
+diff -rp dymo-cups-drivers-1.4.0.5/src/lw/CupsFilterLabelWriter.h dymo-cups-drivers-1.4.0.5-fix/src/lw/CupsFilterLabelWriter.h
+*** dymo-cups-drivers-1.4.0.5/src/lw/CupsFilterLabelWriter.h	2012-02-07 14:22:37.000000000 +0100
+--- dymo-cups-drivers-1.4.0.5-fix/src/lw/CupsFilterLabelWriter.h	2017-03-27 23:10:17.632976126 +0200
+***************
+*** 22,27 ****
+--- 22,28 ----
+  #define hd8574b83_b264_47b2_8d33_a46ae75691d2
+  
+  #include <cups/cups.h>
++ #include <cups/ppd.h>
+  #include <cups/raster.h>
+  #include "LabelWriterDriver.h"
+  #include "LabelWriterLanguageMonitor.h"
+diff -rp dymo-cups-drivers-1.4.0.5/src/common/CupsPrintEnvironment.cpp dymo-cups-drivers-1.4.0.5-fix/src/common/CupsPrintEnvironment.cpp
+*** dymo-cups-drivers-1.4.0.5/src/common/CupsPrintEnvironment.cpp	2019-12-16 19:37:23.429662838 +0000
+--- dymo-cups-drivers-1.4.0.5-fix/src/common/CupsPrintEnvironment.cpp	2019-12-16 19:41:48.506991614 +0000
+***************
+*** 23,28 ****
+--- 23,29 ----
+  #include "CupsPrintEnvironment.h"
+  #include <errno.h>
+  #include <cups/cups.h>
++ #include <cups/sidechannel.h>
+  #include <cassert>
+
+  namespace DymoPrinterDriver
diff --git a/nixpkgs/pkgs/misc/cups/drivers/estudio/default.nix b/nixpkgs/pkgs/misc/cups/drivers/estudio/default.nix
new file mode 100644
index 000000000000..1af8d1f575b8
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/estudio/default.nix
@@ -0,0 +1,50 @@
+{ lib, stdenv, fetchurl, perl }:
+
+stdenv.mkDerivation {
+  pname = "cups-toshiba-estudio";
+  version = "7.89";
+
+  src = fetchurl {
+    url = "http://business.toshiba.com/downloads/KB/f1Ulds/15178/TOSHIBA_ColorMFP_CUPS.tar";
+    sha256 = "0qz4r7q55i0adf4fv3aqnfqgi2pz3jb1jixkqm9x6nk4vanyjf4r";
+  };
+
+  buildInputs = [ perl ];
+
+  patchPhase = ''
+    patchShebangs lib/
+    gunzip                share/cups/model/Toshiba/TOSHIBA_ColorMFP_CUPS.gz
+    sed -i "s+/usr+$out+" share/cups/model/Toshiba/TOSHIBA_ColorMFP_CUPS
+    gzip                  share/cups/model/Toshiba/TOSHIBA_ColorMFP_CUPS
+  '';
+
+  installPhase = ''
+    mkdir -p $out/lib/cups/filter
+    mkdir -p $out/share/cups/model/Toshiba
+    cp {.,$out}/lib/cups/filter/est6550_Authentication
+    chmod 755 $out/lib/cups/filter/est6550_Authentication
+    cp {.,$out}/share/cups/model/Toshiba/TOSHIBA_ColorMFP_CUPS.gz
+    chmod 755 $out/share/cups/model/Toshiba/TOSHIBA_ColorMFP_CUPS.gz
+  '';
+
+  meta = with lib; {
+    description = "Printer only driver for the Toshiba e-STUDIO class of printers";
+    longDescription = ''
+      This driver supports the following printers: TOSHIBA e-STUDIO2000AC,
+      TOSHIBA e-STUDIO2005AC, TOSHIBA e-STUDIO2040C, TOSHIBA e-STUDIO2050C,
+      TOSHIBA e-STUDIO2055C, TOSHIBA e-STUDIO2500AC, TOSHIBA e-STUDIO2505AC,
+      TOSHIBA e-STUDIO2540C, TOSHIBA e-STUDIO2550C, TOSHIBA e-STUDIO2555C,
+      TOSHIBA e-STUDIO287CS, TOSHIBA e-STUDIO3005AC, TOSHIBA e-STUDIO3040C,
+      TOSHIBA e-STUDIO3055C, TOSHIBA e-STUDIO347CS, TOSHIBA e-STUDIO3505AC,
+      TOSHIBA e-STUDIO3540C, TOSHIBA e-STUDIO3555C, TOSHIBA e-STUDIO407CS,
+      TOSHIBA e-STUDIO4505AC, TOSHIBA e-STUDIO4540C, TOSHIBA e-STUDIO4555C,
+      TOSHIBA e-STUDIO5005AC, TOSHIBA e-STUDIO5055C, TOSHIBA e-STUDIO5506AC,
+      TOSHIBA e-STUDIO5540C, TOSHIBA e-STUDIO5560C, TOSHIBA e-STUDIO6506AC,
+      TOSHIBA e-STUDIO6540C, TOSHIBA e-STUDIO6550C, TOSHIBA e-STUDIO6560C,
+      TOSHIBA e-STUDIO6570C and TOSHIBA e-STUDIO7506AC.
+    '';
+    homepage = "https://business.toshiba.com/support/downloads/index.html";
+    license = licenses.unfree;
+    maintainers = [ maintainers.jpotier ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-engine/default.nix b/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-engine/default.nix
new file mode 100644
index 000000000000..7c1bc55d3330
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-engine/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, perlPackages
+, fetchFromGitHub
+, withCupsAccess ? false  # needed to access local cups server
+, cups
+, cups-filters
+, curl
+, withSocketAccess ? false  # needed to access network printers
+, netcat-gnu
+, withSMBAccess ? false  # needed to access SMB-connected printers
+, samba
+, autoconf
+, automake
+, file
+, makeWrapper
+}:
+
+perlPackages.buildPerlPackage rec {
+  pname = "foomatic-db-engine";
+  version = "unstable-2022-05-03";
+
+  src = fetchFromGitHub {
+    # there is also a daily snapshot at the `downloadPage`,
+    # but it gets deleted quickly and would provoke 404 errors
+    owner = "OpenPrinting";
+    repo = "foomatic-db-engine";
+    rev = "2e6f14b54748fa121a4d2e3d480010e10b070c5a";
+    hash = "sha256-m7FQTxWmawbtm24h8UqznGKXgX41JhOtyyFMRwEhm5k=";
+  };
+
+  outputs = [ "out" ];
+
+  propagatedBuildInputs = [
+    perlPackages.Clone
+    perlPackages.DBI
+    perlPackages.XMLLibXML
+  ];
+
+  buildInputs =
+       # provide some "cups-*" commands to `foomatic-{configure,printjob}`
+       # so that they can manage a local cups server (add queues, add jobs...)
+       lib.optionals withCupsAccess [ cups cups-filters curl ]
+       # the commands `foomatic-{configure,getpjloptions}` need
+       # netcat if they are used to query or alter a network
+       # printer via AppSocket/HP JetDirect protocol
+    ++ lib.optional withSocketAccess netcat-gnu
+       # `foomatic-configure` can be used to access printers that are
+       # shared via the SMB protocol, but it needs the `smbclient` binary
+    ++ lib.optional withSMBAccess samba
+  ;
+
+  nativeBuildInputs = [ autoconf automake file makeWrapper ];
+
+  # sed-substitute indirection is more robust against
+  # characters in paths that might need escaping
+  prePatch = ''
+    sed -Ei 's|^(S?BINSEARCHPATH=).+$|\1"@PATH@"|g' configure.ac
+    substituteInPlace configure.ac --subst-var PATH
+    touch Makefile.PL  # `buildPerlPackage` fails unless this exists
+  '';
+
+  preConfigure = ''
+    ./make_configure
+  '';
+
+  configureFlags = [
+    "--sysconfdir=${placeholder "out"}/etc"
+    "LIBDIR=${placeholder "out"}/share/foomatic"
+    "PERLPREFIX=${placeholder "out"}"
+  ];
+
+  postFixup = ''
+    for bin in "${placeholder "out"}/bin"/*; do
+      test '!' -L "$bin" || continue  # skip symlink
+      wrapProgram "$bin" --set PERL5LIB "$PERL5LIB"
+    done
+  '';
+
+  doCheck = false;  # no tests, would fail
+
+  meta = {
+    changelog = "https://github.com/OpenPrinting/foomatic-db-engine/blob/${src.rev}/ChangeLog";
+    description = "OpenPrinting printer support database engine";
+    downloadPage = "https://www.openprinting.org/download/foomatic/";
+    homepage = "https://openprinting.github.io/projects/02-foomatic/";
+    license = lib.licenses.gpl2Only;
+    maintainers = [ lib.maintainers.yarny ];
+    longDescription = ''
+      Foomatic's database engine generates PPD files
+      from the data in Foomatic's XML database.
+      It also contains scripts to directly
+      generate print queues and handle jobs.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-nonfree/default.nix b/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-nonfree/default.nix
new file mode 100644
index 000000000000..a9ce7228f45f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-nonfree/default.nix
@@ -0,0 +1,87 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, autoconf
+, automake
+, perl
+}:
+
+stdenv.mkDerivation rec {
+  pname = "foomatic-db-nonfree";
+  version = "unstable-2015-06-05";
+
+  src = fetchFromGitHub {
+    # there is also a daily snapshot at the `downloadPage`,
+    # but it gets deleted quickly and would provoke 404 errors
+    owner = "OpenPrinting";
+    repo = "foomatic-db-nonfree";
+    rev = "6ddae02ac89240c019f8b5026cfe70e30fd2b3db";
+    hash = "sha256-cRZH0CXg03FEqUJdxaNnPVXjf8+ct86PjhL59WQbw60=";
+  };
+
+  nativeBuildInputs = [ autoconf automake perl ];
+
+  # sed-substitute indirection is more robust against
+  # characters in paths that might need escaping
+  postPatch = ''
+    sed -Ei -e 's|^(S?BINSEARCHPATH=).+$|\1"@PATH@"|g'  \
+      -e 's|^(DATASEARCHPATH=).+$|\1"@DATA@"|g' configure.ac
+    substituteInPlace configure.ac  \
+      --subst-var PATH  \
+      --subst-var-by DATA "${placeholder "out"}/share"
+  '';
+
+  preConfigure = ''
+    mkdir -p "${placeholder "out"}/share/foomatic/db/source"
+    ./make_configure
+  '';
+
+  # make ppd files available to cups,
+  # use a package-specific subdirectory to avoid
+  # conflicts with other ppd-containing packages
+  postInstall = ''
+    if ! [[ -d "${placeholder "out"}/share/foomatic/db/source/PPD" ]]; then
+        echo "failed to create share/foomatic/db/source/PPD"
+        exit 1
+    fi
+    mkdir -p "${placeholder "out"}/share/cups/model"
+    ln -s "${placeholder "out"}/share/foomatic/db/source/PPD"  \
+      "${placeholder "out"}/share/cups/model/foomatic-db-nonfree"
+  '';
+
+  # we might patch ppd file commands with `patchPpdFilesHook`,
+  # but the only command "rastertophaser6100" isn't packaged yet
+
+  # compress ppd files
+  postFixup = ''
+    echo 'compressing ppd files'
+    find -H "${placeholder "out"}/share/cups/model/foomatic-db-nonfree" -type f -iname '*.ppd' -print0  \
+      | xargs -0r -n 64 -P "$NIX_BUILD_CORES" gzip -9n
+  '';
+
+  meta = {
+    changelog = "https://github.com/OpenPrinting/foomatic-db-nonfree/blob/${src.rev}/ChangeLog";
+    description = "OpenPrinting printer support database (unfree content)";
+    downloadPage = "https://www.openprinting.org/download/foomatic/";
+    homepage = "https://openprinting.github.io/projects/02-foomatic/";
+    license = lib.licenses.unfree;
+    maintainers = [ lib.maintainers.yarny ];
+    # list printer manufacturers here so people
+    # searching for ppd files can find this package
+    longDescription = ''
+      The collected knowledge about printers,
+      drivers, and driver options in XML files,
+      used by `foomatic-db-engine` to generate PPD files.
+      This is a package of PPD and Foomatic XML files
+      that may have restrictions that keep them
+      from being used on a variety of machines
+      for licensing and other non-technical reasons.
+      The XML files in this package enable `foomatic-db-ppds`
+      to create about 120 additional PPD files, for printer from
+      Dell, Genicom, Lexmark, Oce, Tektronix and Xerox.
+      Besides the XML files, this package contains
+      about 130 PPD files, for printers from
+      Dell, Genicom, Lexmark, Oce and Xerox.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-ppds/default.nix b/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-ppds/default.nix
new file mode 100644
index 000000000000..bdc1e0a9b5fe
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/foomatic-db-ppds/default.nix
@@ -0,0 +1,122 @@
+{ lib
+, foomatic-db
+, foomatic-db-nonfree
+, buildEnv
+, foomatic-db-engine
+, stdenv
+, cups-filters
+, ghostscript
+, netpbm
+, perl
+, psutils
+, patchPpdFilesHook
+, withNonfreeDb ? false  # include foomatic-db-nonfree ppd files
+}:
+
+let
+  foomatic-db-packages = [ foomatic-db ] ++
+    lib.lists.optional withNonfreeDb foomatic-db-nonfree;
+
+  foomatic-db-combined = buildEnv {
+    name = "foomatic-db-combined";
+    paths = foomatic-db-packages;
+    pathsToLink = [ "/share/foomatic" ];
+    # `foomatic-db-combined` is a nativeBuildInput of `foomatic-db-ppds`.
+    # The setup hook defined here helps scripts in
+    # `foomatic-db-engine` to find the database.
+    postBuild = ''
+      mkdir -p "${placeholder "out"}"/{etc/cups,nix-support}
+      cat  >> "${placeholder "out"}/nix-support/setup-hook"  << eof
+      export FOOMATICDB="${placeholder "out"}/share/foomatic"
+      eof
+    '';
+  };
+
+  # the effective license is `free` if all database
+  # packages have free licenses, `unfree` otherwise
+  isFree = lib.trivial.pipe foomatic-db-packages [
+    (lib.lists.map (lib.attrsets.attrByPath [ "meta" "license" ] lib.licenses.unfree))
+    (lib.lists.all (lib.attrsets.attrByPath [ "free" ] true))
+  ];
+in
+
+stdenv.mkDerivation {
+  pname = "foomatic-db-ppds";
+  # the effective version is simply the
+  # highest version of all database packages
+  version = lib.trivial.pipe foomatic-db-packages [
+    (lib.lists.map (lib.attrsets.getAttr "version"))
+    (lib.lists.sort lib.strings.versionOlder)
+    lib.lists.reverseList
+    lib.lists.head
+  ];
+
+  buildInputs = [
+    cups-filters
+    ghostscript
+    netpbm
+    perl
+    psutils
+  ];
+
+  nativeBuildInputs = [
+    foomatic-db-combined
+    foomatic-db-engine
+    patchPpdFilesHook
+  ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p "${placeholder "out"}/share/cups/model"
+    foomatic-compiledb -j "$NIX_BUILD_CORES" -d "${placeholder "out"}/share/cups/model/foomatic-db-ppds"
+    runHook postInstall
+  '';
+
+  # Comments indicate the respective
+  # package the command is contained in.
+  ppdFileCommands = [
+    "cat" "echo"  # coreutils
+    "foomatic-rip"  # cups-filters or foomatic-filters
+    "gs"  # ghostscript
+    "pnmflip" "pnmgamma" "pnmnoraw"  # netpbm
+    "perl"  # perl
+    "psresize"  # psutils
+    # These commands aren't packaged yet.
+    # ppd files using these likely won't work.
+    #"c2050" "c2070" "cjet" "lm1100"
+    #"pbm2l2030" "pbm2lwxl" "rastertophaser6100"
+  ];
+
+  # compress ppd files
+  postFixup = ''
+    echo 'compressing ppd files'
+    find -H "${placeholder "out"}/share/cups/model/foomatic-db-ppds" -type f -iname '*.ppd' -print0  \
+      | xargs -0r -n 64 -P "$NIX_BUILD_CORES" gzip -9n
+  '';
+
+  meta = {
+    description = "OpenPrinting ppd files";
+    homepage = "https://openprinting.github.io/projects/02-foomatic/";
+    license = if isFree then lib.licenses.free else lib.licenses.unfree;
+    maintainers = [ lib.maintainers.yarny ];
+    # list printer manufacturers here so people
+    # searching for ppd files can find this package
+    longDescription = ''
+      All PPD files available in
+      OpenPrinting's Foomatic database.
+      This package contains about 8,800 PPD files,
+      for printers from
+      Alps, Anitech, Apollo, Apple, Avery, Brother, Canon,
+      Citizen, CItoh, Compaq, DEC, Dell, Dymo-CoStar, Epson,
+      Fujitsu, FujiXerox, Generic, Genicom, Gestetner,
+      Heidelberg, Hitachi, HP, IBM, Imagen, Imagistics,
+      InfoPrint, Infotec, Kodak, KONICAMINOLTA, Kyocera, Lanier,
+      Lexmark, Minolta, MinoltaQMS, Mitsubishi, NEC, NRG, Oce,
+      Oki, Olivetti, Panasonic, PCPI, Pentax, QMS, Raven, Ricoh,
+      Samsung, Savin, Seiko, Sharp, SiPix, Sony, Star, Tally,
+      Tektronix, TexasInstruments, Toshiba, Xante and Xerox.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/foomatic-db/default.nix b/nixpkgs/pkgs/misc/cups/drivers/foomatic-db/default.nix
new file mode 100644
index 000000000000..de98f607d011
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/foomatic-db/default.nix
@@ -0,0 +1,103 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, cups
+, cups-filters
+, ghostscript
+, gnused
+, perl
+, autoconf
+, automake
+, patchPpdFilesHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "foomatic-db";
+  version = "unstable-2023-08-02";
+
+  src = fetchFromGitHub {
+    # there is also a daily snapshot at the `downloadPage`,
+    # but it gets deleted quickly and would provoke 404 errors
+    owner = "OpenPrinting";
+    repo = "foomatic-db";
+    rev = "a6e32fa657f3598dc87c650a9fa9cfa38dda6a60";
+    hash = "sha256-lEnog9Klxny6oEm/l2HDlI0DY5aIdPjHhWCBex2vp9Y=";
+  };
+
+  buildInputs = [ cups cups-filters ghostscript gnused perl ];
+
+  nativeBuildInputs = [ autoconf automake patchPpdFilesHook perl ];
+
+  # sed-substitute indirection is more robust
+  # against characters in paths that might need escaping
+  postPatch = ''
+    sed -Ei -e 's|^(S?BINSEARCHPATH=).+$|\1"@PATH@"|g'  \
+      -e 's|^(DATASEARCHPATH=).+$|\1"@DATA@"|g' configure.ac
+    substituteInPlace configure.ac  \
+      --subst-var PATH  \
+      --subst-var-by DATA "${placeholder "out"}/share"
+  '';
+
+  preConfigure = ''
+    mkdir -p "${placeholder "out"}/share/foomatic/db/source"
+    ./make_configure
+  '';
+
+  # don't let the intaller gzip ppd files as we would
+  # have to unzip them later in order to patch them
+  configureFlags = [ "--disable-gzip-ppds" ];
+
+  # make ppd files available to cups,
+  # use a package-specific subdirectory to avoid
+  # conflicts with other ppd-containing packages
+  postInstall = ''
+    if ! [[ -d "${placeholder "out"}/share/foomatic/db/source/PPD" ]]; then
+        echo "failed to create share/foomatic/db/source/PPD"
+        exit 1
+    fi
+    mkdir -p "${placeholder "out"}/share/cups/model"
+    ln -s "${placeholder "out"}/share/foomatic/db/source/PPD"  \
+      "${placeholder "out"}/share/cups/model/foomatic-db"
+  '';
+
+  # Comments indicate the respective
+  # package the command is contained in.
+  ppdFileCommands = [
+    "cat" "date" "printf"  # coreutils
+    "rastertohp"  # cups
+    "foomatic-rip"  # cups-filters or foomatic-filters
+    "gs"  # ghostscript
+    "sed"  # gnused
+    "perl"  # perl
+  ];
+
+  # compress ppd files
+  postFixup = ''
+    echo 'compressing ppd files'
+    find -H "${placeholder "out"}/share/cups/model/foomatic-db" -type f -iname '*.ppd' -print0  \
+      | xargs -0r -n 64 -P "$NIX_BUILD_CORES" gzip -9n
+  '';
+
+  meta = {
+    changelog = "https://github.com/OpenPrinting/foomatic-db/blob/${src.rev}/ChangeLog";
+    description = "OpenPrinting printer support database (free content)";
+    downloadPage = "https://www.openprinting.org/download/foomatic/";
+    homepage = "https://openprinting.github.io/projects/02-foomatic/";
+    license = lib.licenses.free;  # mostly GPL and MIT, see README in source dir
+    maintainers = [ lib.maintainers.yarny ];
+    # list printer manufacturers here so people
+    # searching for ppd files can find this package
+    longDescription = ''
+      The collected knowledge about printers,
+      drivers, and driver options in XML files,
+      used by `foomatic-db-engine` to generate PPD files.
+      PPD files generated from the XML files in this package
+      are contained in the package 'foomatic-db-ppds'.
+      Besides the XML files, this package contains
+      about 6,700 PPD files, for printers from
+      Brother, Canon, Epson, Gestetner, HP, InfoPrint,
+      Infotec, KONICA_MINOLTA, Kyocera, Lanier, Lexmark, NRG,
+      Oce, Oki, Ricoh, Samsung, Savin, Sharp, Toshiba and Utax.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/fxlinuxprint/default.nix b/nixpkgs/pkgs/misc/cups/drivers/fxlinuxprint/default.nix
new file mode 100644
index 000000000000..4edd8d0d85b6
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/fxlinuxprint/default.nix
@@ -0,0 +1,52 @@
+{ stdenv, lib, fetchzip, dpkg, autoPatchelfHook, cups }:
+let
+  debPlatform =
+    if stdenv.hostPlatform.system == "x86_64-linux" then "amd64"
+    else if stdenv.hostPlatform.system == "i686-linux" then "i386"
+         else throw "Unsupported system: ${stdenv.hostPlatform.system}";
+in
+stdenv.mkDerivation rec {
+  pname = "fxlinuxprint";
+  version = "1.1.2-1";
+
+  src = fetchzip {
+    url = "https://support-fb.fujifilm.com/driver_downloads/fxlinuxpdf112119031.zip";
+    sha256 = "1mv07ch6ysk9bknfmjqsgxb803sj6vfin29s9knaqv17jvgyh0n3";
+    curlOpts = "--user-agent Mozilla/5.0";  # HTTP 410 otherwise
+  };
+
+  nativeBuildInputs = [ dpkg autoPatchelfHook ];
+  buildInputs = [ cups ];
+
+  sourceRoot = ".";
+  unpackCmd = "dpkg-deb -x $curSrc/fxlinuxprint_${version}_${debPlatform}.deb .";
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  installPhase = ''
+    mkdir -p $out
+    mv etc $out
+    mv usr/lib $out
+
+    mkdir -p $out/share/cups/model
+    mv usr/share/ppd/FujiXerox/* $out/share/cups/model
+  '';
+
+  meta = with lib; {
+    description = "Fuji Xerox Linux Printer Driver";
+    longDescription = ''
+      DocuPrint P365/368 d
+      DocuPrint CM315/318 z
+      DocuPrint CP315/318 dw
+      ApeosPort-VI C2271/C3370/C3371/C4471/C5571/C6671/C7771
+      DocuCentre-VI C2271/C3370/C3371/C4471/C5571/C6671/C7771
+      DocuPrint 3205 d/3208 d/3505 d/3508 d/4405 d/4408 d
+    '';
+    homepage = "https://onlinesupport.fujixerox.com";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ delan ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/hl1110/default.nix b/nixpkgs/pkgs/misc/cups/drivers/hl1110/default.nix
new file mode 100644
index 000000000000..07143b0991fb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/hl1110/default.nix
@@ -0,0 +1,75 @@
+{lib, stdenv, fetchurl, cups, dpkg, gnused, makeWrapper, ghostscript, file, a2ps, coreutils, gawk }:
+
+let
+  version = "3.0.1-1";
+cupsdeb = fetchurl {
+  url = "http://download.brother.com/welcome/dlf100421/hl1110cupswrapper-${version}.i386.deb";
+  sha256 = "a87880f4ece764a724411b5b24d15d1b912f6ffc6ecbfd9fac4cd5eda13d2eb7";
+};
+srcdir = "hl1110cupswrapper-GPL_src-${version}";
+cupssrc = fetchurl {
+  url = "http://download.brother.com/welcome/dlf100422/${srcdir}.tar.gz";
+  sha256 = "be1dce6a4608cb253b0b382db30bf5885da46b010e8eb595b15c435e2487761c";
+};
+lprdeb = fetchurl {
+  url = "http://download.brother.com/welcome/dlf100419/hl1110lpr-${version}.i386.deb";
+  sha256 = "5af241782a0d500d7f47e06ea43d61127f4019b5b1c6e68b4c1cb4521a742c22";
+};
+  in
+stdenv.mkDerivation {
+  pname = "cups-brother-hl1110";
+  inherit version;
+
+  srcs = [ lprdeb cupssrc cupsdeb ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cups ghostscript dpkg a2ps ];
+  unpackPhase = ''
+    tar -xvf ${cupssrc}
+    '';
+  buildPhase = ''
+    gcc -Wall ${srcdir}/brcupsconfig/brcupsconfig.c -o brcupsconfig4
+    '';
+  installPhase = ''
+    # install lpr
+    dpkg-deb -x ${lprdeb} $out
+
+    substituteInPlace $out/opt/brother/Printers/HL1110/lpd/filter_HL1110 \
+    --replace /opt "$out/opt" \
+
+    sed -i '/GHOST_SCRIPT=/c\GHOST_SCRIPT=gs' $out/opt/brother/Printers/HL1110/lpd/psconvert2
+
+    patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux.so.2 $out/opt/brother/Printers/HL1110/lpd/brprintconflsr3
+    patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux.so.2 $out/opt/brother/Printers/HL1110/lpd/rawtobr3
+    patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux.so.2 $out/opt/brother/Printers/HL1110/inf/braddprinter
+
+    wrapProgram $out/opt/brother/Printers/HL1110/lpd/psconvert2 \
+    --prefix PATH ":" ${ lib.makeBinPath [ gnused coreutils gawk ] }
+
+    wrapProgram $out/opt/brother/Printers/HL1110/lpd/filter_HL1110 \
+    --prefix PATH ":" ${ lib.makeBinPath [ ghostscript a2ps file gnused coreutils ] }
+
+
+    dpkg-deb -x ${cupsdeb} $out
+
+    substituteInPlace $out/opt/brother/Printers/HL1110/cupswrapper/brother_lpdwrapper_HL1110 --replace /opt "$out/opt"
+
+    mkdir -p $out/lib/cups/filter
+    ln -s $out/opt/brother/Printers/HL1110/cupswrapper/brother_lpdwrapper_HL1110 $out/lib/cups/filter/brother_lpdwrapper_HL1110
+    ln -s $out/opt/brother/Printers/HL1110/cupswrapper/brother-HL1110-cups-en.ppd $out/lib/cups/filter/brother-HL1110-cups-en.ppd
+    cp brcupsconfig4 $out/opt/brother/Printers/HL1110/cupswrapper/
+    ln -s $out/opt/brother/Printers/HL1110/cupswrapper/brcupsconfig4 $out/lib/cups/filter/brcupsconfig4
+
+    wrapProgram $out/opt/brother/Printers/HL1110/cupswrapper/brother_lpdwrapper_HL1110 \
+    --prefix PATH ":" ${ lib.makeBinPath [ gnused coreutils gawk ] }
+
+    '';
+
+  meta = {
+    homepage = "http://www.brother.com/";
+    description = "Brother HL1110 printer driver";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    platforms = lib.platforms.linux;
+    downloadPage = "http://support.brother.com/g/b/downloadlist.aspx?c=eu_ot&lang=en&prod=hl1110_us_eu_as&os=128#SelectLanguageType-561_0_1";
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/hl1210w/default.nix b/nixpkgs/pkgs/misc/cups/drivers/hl1210w/default.nix
new file mode 100644
index 000000000000..c8cd6e95651b
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/hl1210w/default.nix
@@ -0,0 +1,64 @@
+{lib, stdenv, pkgsi686Linux, fetchurl, cups, dpkg, gnused, makeWrapper, ghostscript, file, a2ps, coreutils, gawk}:
+
+let
+  version = "3.0.1-1";
+  cupsdeb = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101546/hl1210wcupswrapper-${version}.i386.deb";
+    sha256 = "0395mnw6c7qpjgjch9in5q9p2fjdqvz9bwfwp6q1hzhs08ryk7w0";
+  };
+  lprdeb = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101547/hl1210wlpr-${version}.i386.deb";
+    sha256 = "1sl3g2cd4a2gygryrr27ax3qaa65cbirz3kzskd8afkwqpmjyv7j";
+  };
+in
+stdenv.mkDerivation {
+  pname = "cups-brother-hl1210W";
+  inherit version;
+
+  srcs = [ lprdeb cupsdeb ];
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cups ghostscript dpkg a2ps ];
+  dontUnpack = true;
+
+  installPhase = ''
+    # install lpr
+    dpkg-deb -x ${lprdeb} $out
+
+    substituteInPlace $out/opt/brother/Printers/HL1210W/lpd/filter_HL1210W \
+      --replace /opt "$out/opt"
+
+    sed -i '/GHOST_SCRIPT=/c\GHOST_SCRIPT=gs' $out/opt/brother/Printers/HL1210W/lpd/psconvert2
+
+    patchelf --set-interpreter ${pkgsi686Linux.glibc.out}/lib/ld-linux.so.2 $out/opt/brother/Printers/HL1210W/lpd/brprintconflsr3
+    patchelf --set-interpreter ${pkgsi686Linux.glibc.out}/lib/ld-linux.so.2 $out/opt/brother/Printers/HL1210W/lpd/rawtobr3
+    patchelf --set-interpreter ${pkgsi686Linux.glibc.out}/lib/ld-linux.so.2 $out/opt/brother/Printers/HL1210W/inf/braddprinter
+
+    wrapProgram $out/opt/brother/Printers/HL1210W/lpd/psconvert2 \
+      --prefix PATH ":" ${ lib.makeBinPath [ gnused coreutils gawk ] }
+    wrapProgram $out/opt/brother/Printers/HL1210W/lpd/filter_HL1210W \
+      --prefix PATH ":" ${ lib.makeBinPath [ ghostscript a2ps file gnused coreutils ] }
+
+    # install cups
+    dpkg-deb -x ${cupsdeb} $out
+
+    substituteInPlace $out/opt/brother/Printers/HL1210W/cupswrapper/brother_lpdwrapper_HL1210W --replace /opt "$out/opt"
+
+    mkdir -p $out/lib/cups/filter
+    ln -s $out/opt/brother/Printers/HL1210W/cupswrapper/brother_lpdwrapper_HL1210W $out/lib/cups/filter/brother_lpdwrapper_HL1210W
+    ln -s $out/opt/brother/Printers/HL1210W/cupswrapper/brother-HL1210W-cups-en.ppd $out/lib/cups/filter/brother-HL1210W-cups-en.ppd
+    # cp brcupsconfig4 $out/opt/brother/Printers/HL1110/cupswrapper/
+    ln -s $out/opt/brother/Printers/HL1210W/cupswrapper/brcupsconfig4 $out/lib/cups/filter/brcupsconfig4
+
+    wrapProgram $out/opt/brother/Printers/HL1210W/cupswrapper/brother_lpdwrapper_HL1210W \
+      --prefix PATH ":" ${ lib.makeBinPath [ gnused coreutils gawk ] }
+    '';
+
+  meta = {
+    homepage = "http://www.brother.com/";
+    description = "Brother HL1210W printer driver";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    platforms = lib.platforms.linux;
+    downloadPage = "https://support.brother.com/g/b/downloadlist.aspx?c=nz&lang=en&prod=hl1210w_eu_as&os=128";
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/hl3140cw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/hl3140cw/default.nix
new file mode 100644
index 000000000000..2eceb64d3668
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/hl3140cw/default.nix
@@ -0,0 +1,80 @@
+{lib, stdenv, fetchurl, cups, dpkg, gnused, makeWrapper, ghostscript, file, a2ps, coreutils, gawk }:
+
+let
+  version = "1.1.4-0";
+  cupsdeb = fetchurl {
+    url = "https://download.brother.com/welcome/dlf007070/hl3140cwcupswrapper-${version}.i386.deb";
+    sha256 = "a76281828ca6ee86c63034673577fadcf5f24e8ed003213bdbb6bf47a7aced6f";
+  };
+  srcdir = "hl3140cw_cupswrapper_GPL_source_${version}";
+  cupssrc = fetchurl {
+    url = "https://download.brother.com/welcome/dlf006740/${srcdir}.tar.gz";
+    sha256 = "1wp85rbvbar6rqqkaffymxjpls6jx9m9230dlrpqwy5akiaxf0rl";
+  };
+  lprdeb = fetchurl {
+    url = "https://support.brother.com/g/b/files/dlf/dlf007068/hl3140cwlpr-1.1.2-1.i386.deb";
+    sha256 = "601f392b52ed7080f71b780181823bb8f6abfd0591146b452ba1f23e21f9f865";
+  };
+in
+stdenv.mkDerivation {
+  pname = "cups-brother-hl3140cw";
+  inherit version;
+  nativeBuildInputs = [ makeWrapper dpkg ];
+  buildInputs = [ cups ghostscript a2ps ];
+
+  unpackPhase = ''
+    tar -xvf ${cupssrc}
+  '';
+
+  buildPhase = ''
+    gcc -Wall ${srcdir}/brcupsconfig/brcupsconfig.c -o brcupsconfpt1
+  '';
+
+  installPhase = ''
+    # install lpr
+    dpkg-deb -x ${lprdeb} $out
+
+    substituteInPlace $out/opt/brother/Printers/hl3140cw/lpd/filterhl3140cw \
+      --replace /opt "$out/opt"
+    substituteInPlace $out/opt/brother/Printers/hl3140cw/inf/setupPrintcapij \
+      --replace /opt "$out/opt"
+
+    sed -i '/GHOST_SCRIPT=/c\GHOST_SCRIPT=gs' $out/opt/brother/Printers/hl3140cw/lpd/psconvertij2
+
+    patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux.so.2 $out/opt/brother/Printers/hl3140cw/lpd/brhl3140cwfilter
+    patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux.so.2 $out/usr/bin/brprintconf_hl3140cw
+
+    wrapProgram $out/opt/brother/Printers/hl3140cw/lpd/psconvertij2 \
+      --prefix PATH ":" ${ lib.makeBinPath [ gnused coreutils gawk ] }
+
+    wrapProgram $out/opt/brother/Printers/hl3140cw/lpd/filterhl3140cw \
+      --prefix PATH ":" ${ lib.makeBinPath [ ghostscript a2ps file gnused coreutils ] }
+
+
+    dpkg-deb -x ${cupsdeb} $out
+
+    substituteInPlace $out/opt/brother/Printers/hl3140cw/cupswrapper/cupswrapperhl3140cw \
+      --replace /opt "$out/opt"
+
+    mkdir -p $out/lib/cups/filter
+    ln -s $out/opt/brother/Printers/hl3140cw/cupswrapper/cupswrapperhl3140cw $out/lib/cups/filter/cupswrapperhl3140cw
+
+    ln -s $out/opt/brother/Printers/hl3140cw/cupswrapper/brother_hl3140cw_printer_en.ppd $out/lib/cups/filter/brother_hl3140cw_printer_en.ppd
+
+    cp brcupsconfpt1 $out/opt/brother/Printers/hl3140cw/cupswrapper/
+    ln -s $out/opt/brother/Printers/hl3140cw/cupswrapper/brcupsconfpt1 $out/lib/cups/filter/brcupsconfpt1
+    ln -s $out/opt/brother/Printers/hl3140cw/lpd/filterhl3140cw $out/lib/cups/filter/brother_lpdwrapper_hl3140cw
+
+    wrapProgram $out/opt/brother/Printers/hl3140cw/cupswrapper/cupswrapperhl3140cw \
+      --prefix PATH ":" ${ lib.makeBinPath [ gnused coreutils gawk ] }
+  '';
+
+  meta = {
+    homepage = "http://www.brother.com/";
+    description = "Brother hl3140cw printer driver";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    platforms = lib.platforms.linux;
+    downloadPage = "https://support.brother.com/g/b/downloadlist.aspx?c=eu_ot&lang=en&prod=hl3140cw_us_eu&os=128";
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/hll2340dw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/hll2340dw/default.nix
new file mode 100644
index 000000000000..74f3c3819ae8
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/hll2340dw/default.nix
@@ -0,0 +1,72 @@
+{ lib, stdenv, fetchurl, cups, dpkg, gnused, makeWrapper, ghostscript, file
+, a2ps, coreutils, perl, gnugrep, which
+}:
+
+let
+  version = "3.2.0-1";
+  lprdeb = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101912/hll2340dlpr-${version}.i386.deb";
+    sha256 = "c0ae98b49b462cd8fbef445550f2177ce9d8bf627c904e182daa8cbaf8781e50";
+  };
+
+  cupsdeb = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101913/hll2340dcupswrapper-${version}.i386.deb";
+    sha256 = "8aa24a6a825e3a4d5b51778cb46fe63032ec5a731ace22f9ef2b0ffcc2033cc9";
+  };
+
+in
+stdenv.mkDerivation {
+  pname = "cups-brother-hll2340dw";
+  inherit version;
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cups ghostscript dpkg a2ps ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    mkdir -p $out
+    dpkg-deb -x ${cupsdeb} $out
+    dpkg-deb -x ${lprdeb} $out
+
+    substituteInPlace $out/opt/brother/Printers/HLL2340D/lpd/filter_HLL2340D \
+      --replace /opt "$out/opt" \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$out/opt/brother/Printers/HLL2340D/\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"HLL2340D\"; #"
+
+    patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+      $out/opt/brother/Printers/HLL2340D/lpd/brprintconflsr3
+    patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+      $out/opt/brother/Printers/HLL2340D/lpd/rawtobr3
+
+    for f in \
+      $out/opt/brother/Printers/HLL2340D/cupswrapper/brother_lpdwrapper_HLL2340D \
+      $out/opt/brother/Printers/HLL2340D/cupswrapper/paperconfigml1 \
+    ; do
+      wrapProgram $f \
+        --prefix PATH : ${lib.makeBinPath [
+          coreutils ghostscript gnugrep gnused
+        ]}
+    done
+
+    mkdir -p $out/lib/cups/filter/
+    ln -s $out/opt/brother/Printers/HLL2340D/lpd/filter_HLL2340D $out/lib/cups/filter/brother_lpdwrapper_HLL2340D
+
+    mkdir -p $out/share/cups/model
+    ln -s $out/opt/brother/Printers/HLL2340D/cupswrapper/brother-HLL2340D-cups-en.ppd $out/share/cups/model/
+
+    wrapProgram $out/opt/brother/Printers/HLL2340D/lpd/filter_HLL2340D \
+      --prefix PATH ":" ${ lib.makeBinPath [ ghostscript a2ps file gnused gnugrep coreutils which ] }
+    '';
+
+  meta = with lib; {
+    homepage = "http://www.brother.com/";
+    description = "Brother hl-l2340dw printer driver";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = platforms.linux;
+    downloadPage = "https://support.brother.com/g/b/downloadlist.aspx?c=us&lang=es&prod=hll2340dw_us_eu_as&os=128&flang=English";
+    maintainers = [ maintainers.qknight ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/hll2350dw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/hll2350dw/default.nix
new file mode 100644
index 000000000000..f018c8b64544
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/hll2350dw/default.nix
@@ -0,0 +1,95 @@
+{ lib
+, stdenv
+, fetchurl
+, dpkg
+, autoPatchelfHook
+, makeWrapper
+, perl
+, gnused
+, ghostscript
+, file
+, coreutils
+, gnugrep
+, which
+}:
+
+let
+  arches = [ "x86_64" "i686" "armv7l" ];
+
+  runtimeDeps = [
+    ghostscript
+    file
+    gnused
+    gnugrep
+    coreutils
+    which
+  ];
+in
+
+stdenv.mkDerivation rec {
+  pname = "cups-brother-hll2350dw";
+  version = "4.0.0-1";
+
+  nativeBuildInputs = [ dpkg makeWrapper autoPatchelfHook ];
+  buildInputs = [ perl ];
+
+  dontUnpack = true;
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf103566/hll2350dwpdrv-${version}.i386.deb";
+    sha256 = "0b7hhln105agc3rwpi7cjlx5nf4d2yk9iksahdv3725nnd06lg46";
+  };
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out
+    dpkg-deb -x $src $out
+
+    # delete unnecessary files for the current architecture
+  '' + lib.concatMapStrings (arch: ''
+    echo Deleting files for ${arch}
+    rm -r "$out/opt/brother/Printers/HLL2350DW/lpd/${arch}"
+  '') (builtins.filter (arch: arch != stdenv.hostPlatform.linuxArch) arches) + ''
+
+      # bundled scripts don't understand the arch subdirectories for some reason
+      ln -s \
+        "$out/opt/brother/Printers/HLL2350DW/lpd/${stdenv.hostPlatform.linuxArch}/"* \
+        "$out/opt/brother/Printers/HLL2350DW/lpd/"
+
+      # Fix global references and replace auto discovery mechanism with hardcoded values
+      substituteInPlace $out/opt/brother/Printers/HLL2350DW/lpd/lpdfilter \
+        --replace /opt "$out/opt" \
+        --replace "my \$BR_PRT_PATH =" "my \$BR_PRT_PATH = \"$out/opt/brother/Printers/HLL2350DW\"; #" \
+        --replace "PRINTER =~" "PRINTER = \"HLL2350DW\"; #"
+
+      # Make sure all executables have the necessary runtime dependencies available
+      find "$out" -executable -and -type f | while read file; do
+        wrapProgram "$file" --prefix PATH : "${lib.makeBinPath runtimeDeps}"
+      done
+
+      # Symlink filter and ppd into a location where CUPS will discover it
+      mkdir -p $out/lib/cups/filter
+      mkdir -p $out/share/cups/model
+
+      ln -s \
+        $out/opt/brother/Printers/HLL2350DW/lpd/lpdfilter \
+        $out/lib/cups/filter/brother_lpdwrapper_HLL2350DW
+
+      ln -s \
+        $out/opt/brother/Printers/HLL2350DW/cupswrapper/brother-HLL2350DW-cups-en.ppd \
+        $out/share/cups/model/
+
+      runHook postInstall
+    '';
+
+  meta = with lib; {
+    homepage = "http://www.brother.com/";
+    description = "Brother HL-L2350DW printer driver";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = builtins.map (arch: "${arch}-linux") arches;
+    downloadPage = "https://support.brother.com/g/b/downloadlist.aspx?c=us_ot&lang=en&prod=hll2350dw_us_eu_as&os=128";
+    maintainers = [ maintainers.sternenseemann ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/hll2390dw-cups/default.nix b/nixpkgs/pkgs/misc/cups/drivers/hll2390dw-cups/default.nix
new file mode 100644
index 000000000000..bd9974d5b644
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/hll2390dw-cups/default.nix
@@ -0,0 +1,72 @@
+{ lib, stdenv, fetchurl, makeWrapper
+, cups
+, dpkg
+, a2ps, ghostscript, gnugrep, gnused, coreutils, file, perl, which
+}:
+
+stdenv.mkDerivation rec {
+  pname = "hll2390dw-cups";
+  version = "4.0.0-1";
+
+  src = fetchurl {
+    # The i386 part is a lie. There are x86, x86_64 and armv7l drivers.
+    # Though this builds only supports x86_64 for now.
+    url = "https://download.brother.com/welcome/dlf103579/hll2390dwpdrv-${version}.i386.deb";
+    sha256 = "0w8rxh1sa5amxr87qmzs4m2p06b1b36wn2q127mg427sbkh1rwni";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cups ghostscript dpkg a2ps ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+
+    substituteInPlace $out/opt/brother/Printers/HLL2390DW/lpd/lpdfilter \
+      --replace /opt "$out/opt" \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$out\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"HLL2390DW\"; #"
+
+    # FIXME : Allow i686 and armv7l variations to be setup instead.
+    _PLAT=x86_64
+    patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+      $out/opt/brother/Printers/HLL2390DW/lpd/$_PLAT/brprintconflsr3
+    patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+      $out/opt/brother/Printers/HLL2390DW/lpd/$_PLAT/rawtobr3
+    ln -s $out/opt/brother/Printers/HLL2390DW/lpd/$_PLAT/brprintconflsr3 $out/opt/brother/Printers/HLL2390DW/lpd/brprintconflsr3
+    ln -s $out/opt/brother/Printers/HLL2390DW/lpd/$_PLAT/rawtobr3 $out/opt/brother/Printers/HLL2390DW/lpd/rawtobr3
+
+    for f in \
+      $out/opt/brother/Printers/HLL2390DW/cupswrapper/lpdwrapper \
+      $out/opt/brother/Printers/HLL2390DW/cupswrapper/paperconfigml2 \
+    ; do
+      #substituteInPlace $f \
+      wrapProgram $f \
+        --prefix PATH : ${lib.makeBinPath [
+          coreutils ghostscript gnugrep gnused
+        ]}
+    done
+
+    mkdir -p $out/lib/cups/filter/
+    ln -s $out/opt/brother/Printers/HLL2390DW/lpd/lpdfilter $out/lib/cups/filter/brother_lpdwrapper_HLL2390DW
+
+    mkdir -p $out/share/cups/model
+    ln -s $out/opt/brother/Printers/HLL2390DW/cupswrapper/brother-HLL2390DW-cups-en.ppd $out/share/cups/model/
+
+    wrapProgram $out/opt/brother/Printers/HLL2390DW/lpd/lpdfilter \
+      --prefix PATH ":" ${ lib.makeBinPath [ ghostscript a2ps file gnused gnugrep coreutils which ] }
+    '';
+
+  meta = with lib; {
+    homepage = "http://www.brother.com/";
+    description = "Brother HL-L2390DW combined print driver";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = [ "x86_64-linux" ];
+    downloadPage = "http://support.brother.com/g/b/downloadlist.aspx?c=us_ot&lang=en&prod=hll2390dw_us&os=128";
+    maintainers = [ maintainers.samueldr ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/misc/cups/drivers/hll3230cdw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/hll3230cdw/default.nix
new file mode 100644
index 000000000000..aff134d7a33a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/hll3230cdw/default.nix
@@ -0,0 +1,76 @@
+{ stdenv, lib, fetchurl, perl, gnused, dpkg, makeWrapper, autoPatchelfHook, libredirect }:
+
+stdenv.mkDerivation rec {
+  pname = "cups-brother-hll3230cdw";
+  version = "1.0.2";
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf103925/hll3230cdwpdrv-${version}-0.i386.deb";
+    sha256 = "9d49abc584bf22bc381510618a34107ead6ab14562b51831fefd6009947aa5a9";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper autoPatchelfHook ];
+
+  buildInputs = [ perl gnused libredirect ];
+
+  unpackPhase = "dpkg-deb -x $src .";
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p "$out"
+    cp -pr opt "$out"
+    cp -pr usr/bin "$out/bin"
+    rm "$out/opt/brother/Printers/hll3230cdw/cupswrapper/cupswrapperhll3230cdw"
+
+    mkdir -p "$out/lib/cups/filter" "$out/share/cups/model"
+
+    ln -s "$out/opt/brother/Printers/hll3230cdw/cupswrapper/brother_lpdwrapper_hll3230cdw" \
+      "$out/lib/cups/filter/brother_lpdwrapper_hll3230cdw"
+    ln -s "$out/opt/brother/Printers/hll3230cdw/cupswrapper/brother_hll3230cdw_printer_en.ppd" \
+      "$out/share/cups/model/brother_hll3230cdw_printer_en.ppd"
+
+    runHook postInstall
+  '';
+
+  # Fix global references and replace auto discovery mechanism
+  # with hardcoded values.
+  #
+  # The configuration binary 'brprintconf_hll3230cdw' and lpd filter
+  # 'brhll3230cdwfilter' has hardcoded /opt format strings.  There isn't
+  # sufficient space in the binaries to substitute a path in the store, so use
+  # libredirect to get it to see the correct path.  The configuration binary
+  # also uses this format string to print configuration locations.  Here the
+  # wrapper output is processed to point into the correct location in the
+  # store.
+
+  postFixup = ''
+    substituteInPlace $out/opt/brother/Printers/hll3230cdw/lpd/filter_hll3230cdw \
+      --replace "my \$BR_PRT_PATH =" "my \$BR_PRT_PATH = \"$out/opt/brother/Printers/hll3230cdw/\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"hll3230cdw\"; #"
+
+    substituteInPlace $out/opt/brother/Printers/hll3230cdw/cupswrapper/brother_lpdwrapper_hll3230cdw \
+      --replace "PRINTER =~" "PRINTER = \"hll3230cdw\"; #" \
+      --replace "my \$basedir = \`readlink \$0\`" "my \$basedir = \"$out/opt/brother/Printers/hll3230cdw/\""
+
+    wrapProgram $out/bin/brprintconf_hll3230cdw \
+      --set LD_PRELOAD "${libredirect}/lib/libredirect.so" \
+      --set NIX_REDIRECTS /opt=$out/opt
+
+    wrapProgram $out/opt/brother/Printers/hll3230cdw/lpd/brhll3230cdwfilter \
+      --set LD_PRELOAD "${libredirect}/lib/libredirect.so" \
+      --set NIX_REDIRECTS /opt=$out/opt
+
+    substituteInPlace $out/bin/brprintconf_hll3230cdw \
+      --replace \"\$"@"\" \"\$"@\" | LD_PRELOAD= ${gnused}/bin/sed -E '/^(function list :|resource file :).*/{s#/opt#$out/opt#}'"
+  '';
+
+  meta = with lib; {
+    description = "Brother HL-L3230CDW printer driver";
+    license = licenses.unfree;
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    maintainers = with maintainers; [ aplund ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+    homepage = "http://www.brother.com/";
+    downloadPage = "https://support.brother.com/g/b/downloadend.aspx?c=us&lang=en&prod=hll3230cdw_us_eu_as&os=128&dlid=dlf103925_000&flang=4&type3=10283";
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/kyocera-ecosys-m2x35-40-p2x35-40dnw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/kyocera-ecosys-m2x35-40-p2x35-40dnw/default.nix
new file mode 100644
index 000000000000..985a172d8731
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/kyocera-ecosys-m2x35-40-p2x35-40dnw/default.nix
@@ -0,0 +1,33 @@
+{ stdenv
+, lib
+, fetchzip
+  # can either be "EU" or "Global"; it's unclear what the difference is
+, region ? "Global"
+  # can be either "English", "French", "German", "Italian", "Portguese" or "Spanish"
+, language ? "English"
+}:
+
+stdenv.mkDerivation rec {
+  pname = "cups-kyocera-ecosys-m2x35-40-p2x35-40dnw";
+  version = "8.1606";
+
+  src = let
+    urlVersion = builtins.replaceStrings [ "." ] [ "_" ] version;
+  in fetchzip {
+    url = "https://www.kyoceradocumentsolutions.de/content/download-center/de/drivers/all/Linux_${urlVersion}_ECOSYS_M2x35_40_P2x35_40dnw_zip.download.zip";
+    sha256 = "10crxdfj62ini70vv471445zi6q0l9fmg2jsd74sp6fr0qa0kvr7";
+  };
+
+  installPhase = ''
+    mkdir -p $out/share/cups/model/Kyocera
+    cp ${region}/${language}/*.PPD $out/share/cups/model/Kyocera/
+  '';
+
+  meta = with lib; {
+    description = "PPD files for Kyocera ECOSYS M2040dn/M2135dn/M2540dn/M2540dw/M2635dn/M2635dw/M2640idw/M2735dw/P2040dn/M2040dw/P2235dn/P2235dw";
+    homepage = "https://www.kyoceradocumentsolutions.com";
+    license = licenses.unfree;
+    maintainers = with maintainers; [ hexa ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/kyocera-ecosys-m552x-p502x/default.nix b/nixpkgs/pkgs/misc/cups/drivers/kyocera-ecosys-m552x-p502x/default.nix
new file mode 100644
index 000000000000..66e3d036bcc6
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/kyocera-ecosys-m552x-p502x/default.nix
@@ -0,0 +1,29 @@
+{ stdenv
+, lib
+, fetchzip
+  # can either be "EU" or "Global"; it's unclear what the difference is
+, region ? "Global"
+}:
+
+stdenv.mkDerivation rec {
+  pname = "cups-kyocera-ecosys-m552x-p502x";
+  version = "8.1602";
+
+  src = fetchzip {
+    url = "https://www.kyoceradocumentsolutions.de/content/download-center/de/drivers/all/Linux_8_1602_ECOSYS_M5521_5526_P5021_5026_zip.download.zip";
+    sha256 = "sha256-XDH5deZmWNghfoO7JaYYvnVq++mbQ8RwLY57L2CKYaY=";
+  };
+
+  installPhase = ''
+    mkdir -p $out/share/cups/model/Kyocera
+    cp ${region}/English/*.PPD $out/share/cups/model/Kyocera/
+  '';
+
+  meta = with lib; {
+    description = "PPD files for Kyocera ECOSYS M5521cdn/M5521cdw/M5526cdn/M5526cdw/P5021cdn/P5021cdw/P5026cdn/P5026cdw";
+    homepage = "https://www.kyoceradocumentsolutions.com";
+    license = licenses.unfree;
+    maintainers = [ maintainers.mbrgm ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/kyocera/default.nix b/nixpkgs/pkgs/misc/cups/drivers/kyocera/default.nix
new file mode 100644
index 000000000000..cd435bc49662
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/kyocera/default.nix
@@ -0,0 +1,58 @@
+{ lib
+, stdenv
+, cups
+, fetchzip
+, patchPpdFilesHook
+}:
+
+let
+  platform =
+    if stdenv.hostPlatform.system == "x86_64-linux" then "64bit"
+    else if stdenv.hostPlatform.system == "i686-linux" then "32bit"
+         else throw "Unsupported system: ${stdenv.hostPlatform.system}";
+
+  libPath = lib.makeLibraryPath [ cups ];
+in
+
+stdenv.mkDerivation {
+  pname = "cups-kyocera";
+  version = "1.1203";
+
+  dontPatchELF = true;
+  dontStrip = true;
+
+  src = fetchzip {
+    url = "https://web.archive.org/web/20220709011705/https://cdn.kyostatics.net/dlc/ru/driver/all/linuxdrv_1_1203_fs-1x2xmfp.-downloadcenteritem-Single-File.downloadcenteritem.tmp/LinuxDrv_1.1203_FS-1x2xMFP.zip";
+    sha256 = "0z1pbgidkibv4j21z0ys8cq1lafc6687syqa07qij2qd8zp15wiz";
+  };
+
+  nativeBuildInputs = [ patchPpdFilesHook ];
+
+  installPhase = ''
+    runHook preInstall
+
+    tar -xvf ${platform}/Global/English.tar.gz
+    install -Dm755 English/rastertokpsl $out/lib/cups/filter/rastertokpsl
+    patchelf \
+      --set-rpath ${libPath} \
+      --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+      $out/lib/cups/filter/rastertokpsl
+
+    mkdir -p $out/share/cups/model/Kyocera
+    cd English
+    cp *.ppd $out/share/cups/model/Kyocera
+
+    runHook postInstall
+  '';
+
+  ppdFileCommands = [ "rastertokpsl" ];
+
+  meta = with lib; {
+    description = "CUPS drivers for several Kyocera FS-{1020,1025,1040,1060,1120,1125} printers";
+    homepage = "https://www.kyoceradocumentsolutions.ru/index/service_support/download_center.false.driver.FS1040._.EN.html#";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    maintainers = [ maintainers.vanzef ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/kyodialog/default.nix b/nixpkgs/pkgs/misc/cups/drivers/kyodialog/default.nix
new file mode 100644
index 000000000000..7137b5df56bf
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/kyodialog/default.nix
@@ -0,0 +1,106 @@
+{ lib
+, stdenv
+, fetchzip
+, cups
+, autoPatchelfHook
+, python3Packages
+
+# Sets the default paper format: use "EU" for A4, or "Global" for Letter
+, region ? "EU"
+# optional GUI, quite redundant to CUPS admin web GUI
+, withQtGui ? false
+, qt5
+}:
+
+# Open issues:
+#
+# Printing in grayscale mode (e.g. the test page) generates a warning
+# > [Job 59] Grayscale/monochrome printing requested for this job but Poppler is not able to convert to grayscale/monochrome PostScript.
+# > [Job 59] Use \"pdftops-renderer\" option (see cups-filters README file) to use Ghostscript or MuPDF for the PDF -> PostScript conversion.
+#
+# This is related to https://github.com/OpenPrinting/cups-filters/issues/169.
+
+assert region == "Global" || region == "EU";
+
+let
+  kyodialog_version = "9.2";
+  date = "20220928";
+in
+stdenv.mkDerivation rec {
+  pname = "cups-kyodialog";
+  version = "${kyodialog_version}-${date}";
+
+  dontStrip = true;
+
+  src = fetchzip {
+    urls = [
+      "https://www.kyoceradocumentsolutions.us/content/download-center-americas/us/drivers/drivers/KyoceraLinuxPackages_${date}_tar_gz.download.gz"
+      "https://web.archive.org/web/20221122230412/https://www.kyoceradocumentsolutions.us/content/download-center-americas/us/drivers/drivers/KyoceraLinuxPackages_${date}_tar_gz.download.gz"
+    ];
+    sha256 = "sha256-WCHuAQO2T6S8JtRsI2Yf/ypeCLMH365Ax/qX+Ah2s3k=";
+    extension = "tar.gz";
+    stripRoot = false;
+    postFetch = ''
+      # delete redundant Linux package dirs to reduce size in the Nix store; only keep Debian
+      rm -r $out/{CentOS,Fedora,OpenSUSE,Redhat,Ubuntu}
+    '';
+  };
+
+  sourceRoot = ".";
+
+  unpackCmd = let
+    platforms = {
+      x86_64-linux = "amd64";
+      i686-linux = "i386";
+    };
+    platform = platforms.${stdenv.hostPlatform.system} or (throw "unsupported system: ${stdenv.hostPlatform.system}");
+  in ''
+    ar p "$src/Debian/${region}/kyodialog_${platform}/kyodialog_${kyodialog_version}-0_${platform}.deb" data.tar.gz | tar -xz
+  '';
+
+  nativeBuildInputs = [ autoPatchelfHook python3Packages.wrapPython ]
+  ++ lib.optionals withQtGui [ qt5.wrapQtAppsHook ];
+
+  buildInputs = [ cups ] ++ lib.optionals withQtGui [ qt5.qtbase ];
+
+  # For lib/cups/filter/kyofilter_pre_H.
+  # The source already contains a copy of pypdf3, but we use the Nix package
+  propagatedBuildInputs = with python3Packages; [ reportlab pypdf3 setuptools ];
+
+  installPhase = ''
+    # allow cups to find the ppd files
+    mkdir -p $out/share/cups/model
+    mv ./usr/share/kyocera${kyodialog_version}/ppd${kyodialog_version} $out/share/cups/model/Kyocera
+
+    # remove absolute path prefixes to filters in ppd
+    find $out -name "*.ppd" -exec sed -E -i "s:/usr/lib/cups/filter/::g" {} \;
+
+
+    mkdir -p $out/lib/cups/
+    mv ./usr/lib/cups/filter/ $out/lib/cups/
+    # for lib/cups/filter/kyofilter_pre_H
+    wrapPythonProgramsIn $out/lib/cups/filter "$propagatedBuildInputs"
+
+
+    install -Dm444 usr/share/doc/kyodialog/copyright $out/share/doc/${pname}/copyright
+  '' + lib.optionalString withQtGui ''
+    install -D usr/bin/kyoPPDWrite_H $out/bin/kyoPPDWrite_H
+    install -D usr/bin/kyodialog${kyodialog_version} $out/bin/kyodialog
+
+    install -Dm444 usr/share/kyocera${kyodialog_version}/appicon_H.png $out/share/${pname}/icons/appicon_H.png
+
+    install -Dm444 usr/share/applications/kyodialog${kyodialog_version}.desktop $out/share/applications/kyodialog.desktop
+    substituteInPlace $out/share/applications/kyodialog.desktop \
+      --replace Exec=\"/usr/bin/kyodialog${kyodialog_version}\" Exec=\"$out/bin/kyodialog\" \
+      --replace Icon=/usr/share/kyocera/appicon_H.png Icon=$out/share/${pname}/icons/appicon_H.png
+  '';
+
+  meta = with lib; {
+    description = "CUPS drivers for several Kyocera printers";
+    homepage = "https://www.kyoceradocumentsolutions.com";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    maintainers = [ maintainers.steveej ];
+    platforms = [ "i686-linux" "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfc5890cncupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfc5890cncupswrapper/default.nix
new file mode 100644
index 000000000000..26e90cbf6bba
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfc5890cncupswrapper/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, findutils
+, stdenv
+, fetchurl
+, dpkg
+, makeWrapper
+, coreutils
+, gnugrep
+, gnused
+, mfc5890cnlpr
+, pkgsi686Linux
+, psutils
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mfc5890cncupswrapper";
+  version = "1.1.2-2";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf006170/${pname}-${version}.i386.deb";
+    hash = "sha256-UOCwzB09/a1/2rliY+hTrslSvO5ztVj51auisPx7OIQ=";
+  };
+
+  unpackPhase = ''
+    dpkg-deb -x $src $out
+  '';
+
+  nativeBuildInputs = [
+    dpkg
+    makeWrapper
+  ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    lpr=${mfc5890cnlpr}/usr/local/Brother/Printer/mfc5890cn
+    dir=$out/usr/local/Brother/Printer/mfc5890cn
+
+    interpreter=${pkgsi686Linux.glibc.out}/lib/ld-linux.so.2
+    patchelf --set-interpreter "$interpreter" "$dir/cupswrapper/brcupsconfpt1"
+
+    #comment out lpadmin commands to prohibit changes to CUPS config by just installing this driver.
+    substituteInPlace $dir/cupswrapper/cupswrappermfc5890cn \
+      --replace "lpadmin" "#lpadmin" \
+      --replace "/usr/" "$out/usr/"
+
+    #mfc5890cnlpr is a dependency of this package. Link all files of mfc5890cnlpr into the $out/usr folder, as other scripts depend on these files being present.
+    #Ideally, we would use substituteInPlace for each file this package actually requires. But the scripts of Brother use variables to dynamically build the paths
+    #at runtime, making this approach more complex. Hence, the easier route of simply linking all files was choosen.
+    find "$lpr" -type f -exec sh -c "mkdir -vp \$(echo '{}' | sed 's|$lpr|$dir|g' | xargs dirname) && ln -s '{}' \$(echo '{}' | sed 's|$lpr|$dir|g')" \;
+
+    mkdir -p $out/usr/share/ppd/
+    mkdir -p $out/usr/lib64/cups/filter
+    sed -i '941,972d' $dir/cupswrapper/cupswrappermfc5890cn
+    $dir/cupswrapper/cupswrappermfc5890cn
+
+    chmod +x $out/usr/lib64/cups/filter/brlpdwrappermfc5890cn
+    wrapProgram $out/usr/lib64/cups/filter/brlpdwrappermfc5890cn --prefix PATH : ${lib.makeBinPath [coreutils psutils gnugrep gnused]}
+
+    mkdir -p $out/lib/cups/filter
+    mkdir -p $out/share/cups/model
+    ln $out/usr/lib64/cups/filter/brlpdwrappermfc5890cn $out/lib/cups/filter
+    ln $dir/cupswrapper/cupswrappermfc5890cn $out/lib/cups/filter
+    ln $out/usr/share/ppd/brmfc5890cn.ppd $out/share/cups/model
+    '';
+
+  meta = with lib; {
+    description = "Brother MFC-5890CN CUPS wrapper driver.";
+    longDescription = "Brother MFC-5890CN CUPS wrapper driver. Use the connection string 'lpd://\${IP_ADDRESS}/binary_p1' when connecting to this printer via the network.";
+    homepage = "http://www.brother.com/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ martinramm ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfc5890cnlpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfc5890cnlpr/default.nix
new file mode 100644
index 000000000000..7878d77afc04
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfc5890cnlpr/default.nix
@@ -0,0 +1,75 @@
+{ stdenv
+, a2ps
+, lib
+, fetchurl
+, dpkg
+, makeWrapper
+, coreutils
+, file
+, gawk
+, ghostscript
+, gnused
+, pkgsi686Linux
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mfc5890cnlpr";
+  version = "1.1.2-2";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf006168/${pname}-${version}.i386.deb";
+    sha256 = "119h3s1p9pv83mrfv6cmxpc0v33xf8c9nw5clj9yafv3aizxy6dp";
+  };
+
+  unpackPhase = ''
+    dpkg-deb -x $src $out
+  '';
+
+  nativeBuildInputs = [
+    dpkg
+    makeWrapper
+  ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    dir=$out/usr/local/Brother/Printer/mfc5890cn
+
+    patchelf --set-interpreter ${pkgsi686Linux.glibc.out}/lib/ld-linux.so.2 $dir/lpd/brmfc5890cnfilter
+
+    wrapProgram $dir/inf/setupPrintcapij \
+      --prefix PATH : ${lib.makeBinPath [
+        coreutils
+      ]}
+
+    substituteInPlace $dir/lpd/filtermfc5890cn \
+      --replace "/usr/" "$out/usr/"
+
+    wrapProgram $dir/lpd/filtermfc5890cn \
+      --prefix PATH : ${lib.makeBinPath [
+        a2ps
+        coreutils
+        file
+        ghostscript
+        gnused
+      ]}
+
+    substituteInPlace $dir/lpd/psconvertij2 \
+      --replace '`which gs`' "${ghostscript}/bin/gs"
+
+    wrapProgram $dir/lpd/psconvertij2 \
+      --prefix PATH : ${lib.makeBinPath [
+        gnused
+        gawk
+      ]}
+  '';
+
+  meta = with lib; {
+    description = "Brother MFC-5890CN LPR printer driver";
+    homepage = "http://www.brother.com/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ martinramm ];
+    platforms = [ "i686-linux" "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfc9140cdncupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfc9140cdncupswrapper/default.nix
new file mode 100644
index 000000000000..c38b52618651
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfc9140cdncupswrapper/default.nix
@@ -0,0 +1,69 @@
+{ lib
+, stdenv
+, fetchurl
+, dpkg
+, makeWrapper
+, coreutils
+, gnugrep
+, gnused
+, mfc9140cdnlpr
+, pkgsi686Linux
+, psutils
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mfc9140cdncupswrapper";
+  version = "1.1.4-0";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf100407/${pname}-${version}.i386.deb";
+    sha256 = "18aramgqgra1shdhsa75i0090hk9i267gvabildwsk52kq2b96c6";
+  };
+
+  unpackPhase = ''
+    dpkg-deb -x $src $out
+  '';
+
+  nativeBuildInputs = [
+    dpkg
+    makeWrapper
+  ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    lpr=${mfc9140cdnlpr}/opt/brother/Printers/mfc9140cdn
+    dir=$out/opt/brother/Printers/mfc9140cdn
+
+    interpreter=${pkgsi686Linux.glibc.out}/lib/ld-linux.so.2
+    patchelf --set-interpreter "$interpreter" "$dir/cupswrapper/brcupsconfpt1"
+
+    substituteInPlace $dir/cupswrapper/cupswrappermfc9140cdn \
+      --replace "mkdir -p /usr" ": # mkdir -p /usr" \
+      --replace '/opt/brother/''${device_model}/''${printer_model}/lpd/filter''${printer_model}' "$lpr/lpd/filtermfc9140cdn" \
+      --replace '/usr/share/ppd/Brother/brother_''${printer_model}_printer_en.ppd' "$dir/cupswrapper/brother_mfc9140cdn_printer_en.ppd" \
+      --replace '/usr/share/cups/model/Brother/brother_''${printer_model}_printer_en.ppd' "$dir/cupswrapper/brother_mfc9140cdn_printer_en.ppd" \
+      --replace '/opt/brother/Printers/''${printer_model}/' "$lpr/" \
+      --replace 'nup="psnup' "nup=\"${psutils}/bin/psnup" \
+      --replace '/usr/bin/psnup' "${psutils}/bin/psnup"
+
+    mkdir -p $out/lib/cups/filter
+    mkdir -p $out/share/cups/model
+
+    ln $dir/cupswrapper/cupswrappermfc9140cdn $out/lib/cups/filter
+    ln $dir/cupswrapper/brother_mfc9140cdn_printer_en.ppd $out/share/cups/model
+
+    sed -n '/!ENDOFWFILTER!/,/!ENDOFWFILTER!/p' "$dir/cupswrapper/cupswrappermfc9140cdn" | sed '1 br; b; :r s/.*/printer_model=mfc9140cdn; cat <<!ENDOFWFILTER!/'  | bash > $out/lib/cups/filter/brother_lpdwrapper_mfc9140cdn
+    sed -i "/#! \/bin\/sh/a PATH=${lib.makeBinPath [ coreutils gnused gnugrep ]}:\$PATH" $out/lib/cups/filter/brother_lpdwrapper_mfc9140cdn
+    chmod +x $out/lib/cups/filter/brother_lpdwrapper_mfc9140cdn
+    '';
+
+  meta = with lib; {
+    description = "Brother MFC-9140CDN CUPS wrapper driver";
+    homepage = "http://www.brother.com/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ hexa ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfc9140cdnlpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfc9140cdnlpr/default.nix
new file mode 100644
index 000000000000..ab20016c7ff0
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfc9140cdnlpr/default.nix
@@ -0,0 +1,74 @@
+{ stdenv
+, lib
+, fetchurl
+, dpkg
+, makeWrapper
+, coreutils
+, file
+, gawk
+, ghostscript
+, gnused
+, pkgsi686Linux
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mfc9140cdnlpr";
+  version = "1.1.2-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf100405/${pname}-${version}.i386.deb";
+    sha256 = "1wqx8njrv078fc3vlq90qyrfg3cw9kr9m6f3qvfnkhq1f95fbslh";
+  };
+
+  unpackPhase = ''
+    dpkg-deb -x $src $out
+  '';
+
+  nativeBuildInputs = [
+    dpkg
+    makeWrapper
+  ];
+
+  dontBuild = true;
+
+  installPhase = ''
+    dir=$out/opt/brother/Printers/mfc9140cdn
+
+    patchelf --set-interpreter ${pkgsi686Linux.glibc.out}/lib/ld-linux.so.2 $dir/lpd/brmfc9140cdnfilter
+
+    wrapProgram $dir/inf/setupPrintcapij \
+      --prefix PATH : ${lib.makeBinPath [
+        coreutils
+      ]}
+
+    substituteInPlace $dir/lpd/filtermfc9140cdn \
+      --replace "BR_CFG_PATH=" "BR_CFG_PATH=\"$dir/\" #" \
+      --replace "BR_LPD_PATH=" "BR_LPD_PATH=\"$dir/\" #"
+
+    wrapProgram $dir/lpd/filtermfc9140cdn \
+      --prefix PATH : ${lib.makeBinPath [
+        coreutils
+        file
+        ghostscript
+        gnused
+      ]}
+
+    substituteInPlace $dir/lpd/psconvertij2 \
+      --replace '`which gs`' "${ghostscript}/bin/gs"
+
+    wrapProgram $dir/lpd/psconvertij2 \
+      --prefix PATH : ${lib.makeBinPath [
+        gnused
+        gawk
+      ]}
+  '';
+
+  meta = with lib; {
+    description = "Brother MFC-9140CDN LPR printer driver";
+    homepage = "http://www.brother.com/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ hexa ];
+    platforms = [ "i686-linux" "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix
new file mode 100644
index 000000000000..dc54611d335a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcj470dwcupswrapper/default.nix
@@ -0,0 +1,62 @@
+{ lib, stdenv, fetchurl, mfcj470dwlpr, makeWrapper}:
+
+stdenv.mkDerivation rec {
+  pname = "mfcj470dw-cupswrapper";
+  version = "3.0.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf006866/mfcj470dw_cupswrapper_GPL_source_${version}.tar.gz";
+    sha256 = "b88f9b592723a00c024129560367f40a560ca3cba06fd99512ab368dd6855853";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ mfcj470dwlpr ];
+
+  patchPhase = ''
+    WRAPPER=cupswrapper/cupswrappermfcj470dw
+
+    substituteInPlace $WRAPPER \
+    --replace /opt "${mfcj470dwlpr}/opt" \
+    --replace /usr "${mfcj470dwlpr}/usr" \
+    --replace /etc "$out/etc"
+
+    substituteInPlace $WRAPPER \
+    --replace "cp " "cp -p "
+    '';
+
+  buildPhase = ''
+    cd brcupsconfpt1
+    make all
+    cd ..
+    '';
+
+  installPhase = ''
+    TARGETFOLDER=$out/opt/brother/Printers/mfcj470dw/cupswrapper/
+    PPDFOLDER=$out/share/cups/model/
+    FILTERFOLDER=$out/lib/cups/filter/
+
+    mkdir -p $TARGETFOLDER
+    mkdir -p $PPDFOLDER
+    mkdir -p $FILTERFOLDER
+
+    cp brcupsconfpt1/brcupsconfpt1 $TARGETFOLDER
+    cp cupswrapper/cupswrappermfcj470dw $TARGETFOLDER
+    cp PPD/brother_mfcj470dw_printer_en.ppd $PPDFOLDER
+
+    ln -s ${mfcj470dwlpr}/lib/cups/filter/brother_lpdwrapper_mfcj470dw $FILTERFOLDER/
+    '';
+
+  cleanPhase = ''
+    cd brcupsconfpt1
+    make clean
+    '';
+
+  meta = {
+    homepage = "http://www.brother.com/";
+    description = "Brother MFC-J470DW CUPS wrapper driver";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+    downloadPage = "http://support.brother.com/g/b/downloadlist.aspx?c=us&lang=en&prod=mfcj470dw_us_eu_as&os=128";
+    maintainers = [ lib.maintainers.yochai ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcj470dwlpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcj470dwlpr/default.nix
new file mode 100644
index 000000000000..28be1b580a44
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcj470dwlpr/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, fetchurl, cups, dpkg, ghostscript, a2ps, coreutils, gnused, gawk, file, makeWrapper }:
+
+stdenv.mkDerivation rec {
+  pname = "mfcj470dw-cupswrapper";
+  version = "3.0.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf006843/mfcj470dwlpr-${version}.i386.deb";
+    sha256 = "7202dd895d38d50bb767080f2995ed350eed99bc2b7871452c3c915c8eefc30a";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cups ghostscript dpkg a2ps ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+
+    substituteInPlace $out/opt/brother/Printers/mfcj470dw/lpd/filtermfcj470dw \
+    --replace /opt "$out/opt" \
+
+    sed -i '/GHOST_SCRIPT=/c\GHOST_SCRIPT=gs' $out/opt/brother/Printers/mfcj470dw/lpd/psconvertij2
+
+    patchelf --set-interpreter ${stdenv.cc.libc}/lib/ld-linux.so.2 $out/opt/brother/Printers/mfcj470dw/lpd/brmfcj470dwfilter
+
+    mkdir -p $out/lib/cups/filter/
+    ln -s $out/opt/brother/Printers/mfcj470dw/lpd/filtermfcj470dw $out/lib/cups/filter/brother_lpdwrapper_mfcj470dw
+
+    wrapProgram $out/opt/brother/Printers/mfcj470dw/lpd/psconvertij2 \
+    --prefix PATH ":" ${ lib.makeBinPath [ gnused coreutils gawk ] }
+
+    wrapProgram $out/opt/brother/Printers/mfcj470dw/lpd/filtermfcj470dw \
+    --prefix PATH ":" ${ lib.makeBinPath [ ghostscript a2ps file gnused coreutils ] }
+    '';
+
+  meta = {
+    homepage = "http://www.brother.com/";
+    description = "Brother MFC-J470DW LPR driver";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    platforms = lib.platforms.linux;
+    downloadPage = "http://support.brother.com/g/b/downloadlist.aspx?c=us&lang=en&prod=mfcj470dw_us_eu_as&os=128";
+    maintainers = [ lib.maintainers.yochai ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix
new file mode 100644
index 000000000000..1653ced85c5a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcj6510dwcupswrapper/default.nix
@@ -0,0 +1,65 @@
+{ lib, stdenv, fetchurl, mfcj6510dwlpr, makeWrapper}:
+
+stdenv.mkDerivation rec {
+  pname = "mfcj6510dw-cupswrapper";
+  version = "3.0.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf006814/mfcj6510dw_cupswrapper_GPL_source_${version}.tar.gz";
+    sha256 = "0y5iffybxjin8injrdmc9n9hl4s6b8n6ck76m1z78bzi88vwmhai";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ mfcj6510dwlpr ];
+
+  buildPhase = ''
+    cd brcupsconfig
+    make all
+    cd ..
+    '';
+
+  installPhase = ''
+    TARGETFOLDER=$out/opt/brother/Printers/mfcj6510dw/cupswrapper
+    mkdir -p $TARGETFOLDER
+    cp PPD/brother_mfcj6510dw_printer_en.ppd $TARGETFOLDER
+    cp brcupsconfig/brcupsconfpt1 $TARGETFOLDER
+    cp scripts/cupswrappermfcj6510dw $TARGETFOLDER
+    sed -i -e '26,304d' $TARGETFOLDER/cupswrappermfcj6510dw
+    substituteInPlace $TARGETFOLDER/cupswrappermfcj6510dw \
+      --replace "\$ppd_file_name" "$TARGETFOLDER/brother_mfcj6510dw_printer_en.ppd"
+
+    CPUSFILTERFOLDER=$out/lib/cups/filter
+    mkdir -p $TARGETFOLDER $CPUSFILTERFOLDER
+    ln -s ${mfcj6510dwlpr}/lib/cups/filter/brother_lpdwrapper_mfcj6510dw $out/lib/cups/filter/brother_lpdwrapper_mfcj6510dw
+    ##TODO: Use the cups filter instead of the LPR one.
+    #cp scripts/cupswrappermfcj6510dw $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw
+    #sed -i -e '110,258!d' $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw
+    #sed -i -e '33,40d' $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw
+    #sed -i -e '34,35d' $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw
+    #substituteInPlace $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw \
+    #  --replace "/opt/brother/$``{device_model``}/$``{printer_model``}/lpd/filter$``{printer_model``}" \
+    #    "${mfcj6510dwlpr}/opt/brother/Printers/mfcj6510dw/lpd/filtermfcj6510dw" \
+    #  --replace "/opt/brother/Printers/$``{printer_model``}/inf/br$``{printer_model``}rc" \
+    #    "${mfcj6510dwlpr}/opt/brother/Printers/mfcj6510dw/inf/brmfcj6510dwrc" \
+    #  --replace "/opt/brother/$``{device_model``}/$``{printer_model``}/cupswrapper/brcupsconfpt1" \
+    #    "$out/opt/brother/Printers/mfcj6510dw/cupswrapper/brcupsconfpt1" \
+    #  --replace "/usr/share/cups/model/Brother/brother_" "$out/opt/brother/Printers/mfcj6510dw/cupswrapper/brother_"
+    #substituteInPlace $CPUSFILTERFOLDER/brother_lpdwrapper_mfcj6510dw \
+    #  --replace "$``{printer_model``}" "mfcj6510dw" \
+    #  --replace "$``{printer_name``}" "MFCJ6510DW"
+    '';
+
+  cleanPhase = ''
+    cd brcupsconfpt1
+    make clean
+    '';
+
+  meta = with lib; {
+    homepage = "http://www.brother.com/";
+    description = "Brother MFC-J6510DW CUPS wrapper driver";
+    license = with licenses; gpl2;
+    platforms = with platforms; linux;
+    downloadPage = "http://support.brother.com/g/b/downloadlist.aspx?c=us&lang=en&prod=mfcj6510dw_all&os=128";
+    maintainers = with maintainers; [ ramkromberg ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcj6510dwlpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcj6510dwlpr/default.nix
new file mode 100644
index 000000000000..0af79443ef6d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcj6510dwlpr/default.nix
@@ -0,0 +1,90 @@
+{ lib, stdenv, fetchurl, pkgsi686Linux, dpkg, makeWrapper, coreutils, gnused, gawk, file, cups, util-linux, xxd, runtimeShell
+, ghostscript, a2ps }:
+
+# Why:
+# The executable "brprintconf_mfcj6510dw" binary is looking for "/opt/brother/Printers/%s/inf/br%sfunc" and "/opt/brother/Printers/%s/inf/br%src".
+# Whereby, %s is printf(3) string substitution for stdin's arg0 (the command's own filename) from the 10th char forwards, as a runtime dependency.
+# e.g. Say the filename is "0123456789ABCDE", the runtime will be looking for /opt/brother/Printers/ABCDE/inf/brABCDEfunc.
+# Presumably, the binary was designed to be deployed under the filename "printconf_mfcj6510dw", whereby it will search for "/opt/brother/Printers/mfcj6510dw/inf/brmfcj6510dwfunc".
+# For NixOS, we want to change the string to the store path of brmfcj6510dwfunc and brmfcj6510dwrc but we're faced with two complications:
+# 1. Too little room to specify the nix store path. We can't even take advantage of %s by renaming the file to the store path hash since the variable is too short and can't contain the whole hash.
+# 2. The binary needs the directory it's running from to be r/w.
+# What:
+# As such, we strip the path and substitution altogether, leaving only "brmfcj6510dwfunc" and "brmfcj6510dwrc", while filling the leftovers with nulls.
+# Fully null terminating the cstrings is necessary to keep the array the same size and preventing overflows.
+# We then use a shell script to link and execute the binary, func and rc files in a temporary directory.
+# How:
+# In the package, we dump the raw binary as a string of search-able hex values using hexdump. We execute the substitution with sed. We then convert the hex values back to binary form using xxd.
+# We also write a shell script that invoked "mktemp -d" to produce a r/w temporary directory and link what we need in the temporary directory.
+# Result:
+# The user can run brprintconf_mfcj6510dw in the shell.
+
+stdenv.mkDerivation rec {
+  pname = "mfcj6510dwlpr";
+  version = "3.0.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf006614/mfcj6510dwlpr-${version}.i386.deb";
+    sha256 = "1ccvx393pqavsgzd8igrzlin5jrsf01d3acyvwqd1d0yz5jgqy6d";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ cups ghostscript dpkg a2ps ];
+
+  dontUnpack = true;
+
+  brprintconf_mfcj6510dw_script = ''
+    #!${runtimeShell}
+    cd $(mktemp -d)
+    ln -s @out@/usr/bin/brprintconf_mfcj6510dw_patched brprintconf_mfcj6510dw_patched
+    ln -s @out@/opt/brother/Printers/mfcj6510dw/inf/brmfcj6510dwfunc brmfcj6510dwfunc
+    ln -s @out@/opt/brother/Printers/mfcj6510dw/inf/brmfcj6510dwrc brmfcj6510dwrc
+    ./brprintconf_mfcj6510dw_patched "$@"
+  '';
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+    substituteInPlace $out/opt/brother/Printers/mfcj6510dw/lpd/filtermfcj6510dw \
+      --replace /opt "$out/opt"
+    substituteInPlace $out/opt/brother/Printers/mfcj6510dw/lpd/psconvertij2 \
+      --replace "GHOST_SCRIPT=`which gs`" "GHOST_SCRIPT=${ghostscript}/bin/gs"
+    substituteInPlace $out/opt/brother/Printers/mfcj6510dw/inf/setupPrintcapij \
+      --replace "/opt/brother/Printers" "$out/opt/brother/Printers" \
+      --replace "printcap.local" "printcap"
+
+    patchelf --set-interpreter ${pkgsi686Linux.stdenv.cc.libc.out}/lib/ld-linux.so.2 \
+      --set-rpath $out/opt/brother/Printers/mfcj6510dw/inf:$out/opt/brother/Printers/mfcj6510dw/lpd \
+      $out/opt/brother/Printers/mfcj6510dw/lpd/brmfcj6510dwfilter
+    patchelf --set-interpreter ${pkgsi686Linux.stdenv.cc.libc.out}/lib/ld-linux.so.2 $out/usr/bin/brprintconf_mfcj6510dw
+
+    #stripping the hardcoded path.
+    ${util-linux}/bin/hexdump -ve '1/1 "%.2X"' $out/usr/bin/brprintconf_mfcj6510dw | \
+    sed 's.2F6F70742F62726F746865722F5072696E746572732F25732F696E662F6272257366756E63.62726d66636a36353130647766756e63000000000000000000000000000000000000000000.' | \
+    sed 's.2F6F70742F62726F746865722F5072696E746572732F25732F696E662F627225737263.62726D66636A3635313064777263000000000000000000000000000000000000000000.' | \
+    ${xxd}/bin/xxd -r -p > $out/usr/bin/brprintconf_mfcj6510dw_patched
+    chmod +x $out/usr/bin/brprintconf_mfcj6510dw_patched
+    #executing from current dir. segfaults if it's not r\w.
+    mkdir -p $out/bin
+    echo -n "$brprintconf_mfcj6510dw_script" > $out/bin/brprintconf_mfcj6510dw
+    chmod +x $out/bin/brprintconf_mfcj6510dw
+    substituteInPlace $out/bin/brprintconf_mfcj6510dw --replace @out@ $out
+
+    mkdir -p $out/lib/cups/filter/
+    ln -s $out/opt/brother/Printers/mfcj6510dw/lpd/filtermfcj6510dw $out/lib/cups/filter/brother_lpdwrapper_mfcj6510dw
+
+    wrapProgram $out/opt/brother/Printers/mfcj6510dw/lpd/psconvertij2 \
+      --prefix PATH ":" ${ lib.makeBinPath [ coreutils gnused gawk ] }
+    wrapProgram $out/opt/brother/Printers/mfcj6510dw/lpd/filtermfcj6510dw \
+      --prefix PATH ":" ${ lib.makeBinPath [ coreutils gnused file ghostscript a2ps ] }
+    '';
+
+  meta = with lib; {
+    description  = "Brother MFC-J6510DW LPR driver";
+    downloadPage = "http://support.brother.com/g/b/downloadlist.aspx?c=us&lang=en&prod=mfcj6510dw_all&os=128";
+    homepage     = "http://www.brother.com/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license      = with licenses; unfree;
+    maintainers  = with maintainers; [ ramkromberg ];
+    platforms    = with platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl2700dncupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl2700dncupswrapper/default.nix
new file mode 100644
index 000000000000..0b145dfa3853
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl2700dncupswrapper/default.nix
@@ -0,0 +1,44 @@
+{ coreutils, dpkg, fetchurl, gnugrep, gnused, makeWrapper, mfcl2700dnlpr, perl, lib, stdenv }:
+
+stdenv.mkDerivation rec {
+  pname = "mfcl2700dncupswrapper";
+  version = "3.2.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf102086/mfcl2700dncupswrapper-${version}.i386.deb";
+    sha256 = "07w48mah0xbv4h8vsh1qd5cd4b463bx8y6gc5x9pfgsxsy6h6da1";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+
+    basedir=${mfcl2700dnlpr}/opt/brother/Printers/MFCL2700DN
+    dir=$out/opt/brother/Printers/MFCL2700DN
+
+    substituteInPlace $dir/cupswrapper/brother_lpdwrapper_MFCL2700DN \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "basedir =~" "basedir = \"$basedir\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"MFCL2700DN\"; #"
+
+    wrapProgram $dir/cupswrapper/brother_lpdwrapper_MFCL2700DN \
+      --prefix PATH : ${lib.makeBinPath [ coreutils gnugrep gnused ]}
+
+    mkdir -p $out/lib/cups/filter
+    mkdir -p $out/share/cups/model
+
+    ln $dir/cupswrapper/brother_lpdwrapper_MFCL2700DN $out/lib/cups/filter
+    ln $dir/cupswrapper/brother-MFCL2700DN-cups-en.ppd $out/share/cups/model
+  '';
+
+  meta = {
+    description = "Brother MFC-L2700DN CUPS wrapper driver";
+    homepage = "http://www.brother.com/";
+    license = lib.licenses.gpl2Plus;
+    maintainers = [ lib.maintainers.tv ];
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl2700dnlpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl2700dnlpr/default.nix
new file mode 100644
index 000000000000..7e0c95582f53
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl2700dnlpr/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, coreutils, dpkg, fetchurl, ghostscript, gnugrep, gnused, makeWrapper, perl, which }:
+
+stdenv.mkDerivation rec {
+  pname = "mfcl2700dnlpr";
+  version = "3.2.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf102085/${pname}-${version}.i386.deb";
+    sha256 = "170qdzxlqikzvv2wphvfb37m19mn13az4aj88md87ka3rl5knk4m";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+
+    dir=$out/opt/brother/Printers/MFCL2700DN
+
+    substituteInPlace $dir/lpd/filter_MFCL2700DN \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$dir\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"MFCL2700DN\"; #"
+
+    wrapProgram $dir/lpd/filter_MFCL2700DN \
+      --prefix PATH : ${lib.makeBinPath [
+        coreutils ghostscript gnugrep gnused which
+      ]}
+
+    interpreter=$(cat $NIX_CC/nix-support/dynamic-linker)
+    patchelf --set-interpreter "$interpreter" $dir/inf/braddprinter
+    patchelf --set-interpreter "$interpreter" $dir/lpd/brprintconflsr3
+    patchelf --set-interpreter "$interpreter" $dir/lpd/rawtobr3
+  '';
+
+  meta = {
+    description = "Brother MFC-L2700DN LPR driver";
+    homepage = "http://www.brother.com/";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    maintainers = [ lib.maintainers.tv ];
+    platforms = [ "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl2720dwcupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl2720dwcupswrapper/default.nix
new file mode 100644
index 000000000000..f30f9abae334
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl2720dwcupswrapper/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, fetchurl, dpkg, makeWrapper, coreutils, gnugrep, gnused, perl, mfcl2720dwlpr }:
+
+stdenv.mkDerivation rec {
+  pname = "mfcl2720dwcupswrapper";
+  version = "3.2.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101802/${pname}-${version}.i386.deb";
+    sha256 = "6d131926ce22c51b1854d2b91e426cc7ecbf5d6dabd698ef51a417090e35c598";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+
+    basedir=${mfcl2720dwlpr}/opt/brother/Printers/MFCL2720DW
+    dir=$out/opt/brother/Printers/MFCL2720DW
+
+    substituteInPlace $dir/cupswrapper/brother_lpdwrapper_MFCL2720DW \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "basedir =~" "basedir = \"$basedir\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"MFCL2720DW\"; #"
+
+    substituteInPlace $dir/cupswrapper/paperconfigml1 \
+      --replace /usr/bin/perl ${perl}/bin/perl
+
+    wrapProgram $dir/cupswrapper/brother_lpdwrapper_MFCL2720DW \
+      --prefix PATH : ${lib.makeBinPath [ coreutils gnugrep gnused ]}
+
+    mkdir -p $out/lib/cups/filter
+    mkdir -p $out/share/cups/model
+
+    ln $dir/cupswrapper/brother_lpdwrapper_MFCL2720DW $out/lib/cups/filter
+    ln $dir/cupswrapper/brother-MFCL2720DW-cups-en.ppd $out/share/cups/model
+  '';
+
+  meta = {
+    description = "Brother MFC-L2720DW CUPS wrapper driver";
+    homepage = "http://www.brother.com/";
+    license = lib.licenses.gpl2;
+    platforms = [ "x86_64-linux" "i686-linux" ];
+    maintainers = [ lib.maintainers.xeji ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl2720dwlpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl2720dwlpr/default.nix
new file mode 100644
index 000000000000..36600a4505aa
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl2720dwlpr/default.nix
@@ -0,0 +1,46 @@
+{ pkgs, lib, stdenv, fetchurl, dpkg, makeWrapper, coreutils, ghostscript, gnugrep, gnused, which, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "mfcl2720dwlpr";
+  version = "3.2.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101801/${pname}-${version}.i386.deb";
+    sha256 = "088217e9ad118ec1e7f3d3f8f60f3bd839fe2c7d7c1136b249e9ac648dc742af";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+
+    dir=$out/opt/brother/Printers/MFCL2720DW
+
+    substituteInPlace $dir/lpd/filter_MFCL2720DW \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$dir\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"MFCL2720DW\"; #"
+
+    wrapProgram $dir/lpd/filter_MFCL2720DW \
+      --prefix PATH : ${lib.makeBinPath [
+        coreutils ghostscript gnugrep gnused which
+      ]}
+
+    # need to use i686 glibc here, these are 32bit proprietary binaries
+    interpreter=${pkgs.pkgsi686Linux.glibc}/lib/ld-linux.so.2
+    patchelf --set-interpreter "$interpreter" $dir/inf/braddprinter
+    patchelf --set-interpreter "$interpreter" $dir/lpd/brprintconflsr3
+    patchelf --set-interpreter "$interpreter" $dir/lpd/rawtobr3
+  '';
+
+  meta = {
+    description = "Brother MFC-L2720DW lpr driver";
+    homepage = "http://www.brother.com/";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    platforms = [ "x86_64-linux" "i686-linux" ];
+    maintainers = [ lib.maintainers.xeji ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl2740dwcupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl2740dwcupswrapper/default.nix
new file mode 100644
index 000000000000..2cad0ceba55b
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl2740dwcupswrapper/default.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, dpkg, makeWrapper, coreutils, gnugrep, gnused, perl, mfcl2740dwlpr }:
+
+stdenv.mkDerivation rec {
+  pname = "mfcl2740dwcupswrapper";
+  version = "3.2.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101726/${pname}-${version}.i386.deb";
+    sha256 = "078453e19f20ab6c7fc4d63c3e09f162f3d1410c04c23a294b6ffbd720b35ffb";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper ];
+
+  unpackPhase = "dpkg-deb -x $src $out";
+
+  installPhase = ''
+    basedir=${mfcl2740dwlpr}/opt/brother/Printers/MFCL2740DW
+    dir=$out/opt/brother/Printers/MFCL2740DW
+
+    substituteInPlace $dir/cupswrapper/brother_lpdwrapper_MFCL2740DW \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "basedir =~" "basedir = \"$basedir\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"MFCL2740DW\"; #"
+
+    substituteInPlace $dir/cupswrapper/paperconfigml1 \
+      --replace /usr/bin/perl ${perl}/bin/perl
+
+    wrapProgram $dir/cupswrapper/brother_lpdwrapper_MFCL2740DW \
+      --prefix PATH : ${lib.makeBinPath [ coreutils gnugrep gnused ]}
+
+    mkdir -p $out/lib/cups/filter
+    mkdir -p $out/share/cups/model
+
+    ln $dir/cupswrapper/brother_lpdwrapper_MFCL2740DW $out/lib/cups/filter
+    ln $dir/cupswrapper/brother-MFCL2740DW-cups-en.ppd $out/share/cups/model
+  '';
+
+  meta = {
+    description = "Brother MFC-L2740DW CUPS wrapper driver";
+    homepage = "http://www.brother.com/";
+    license = lib.licenses.gpl2;
+    platforms = [ "x86_64-linux" "i686-linux" ];
+    maintainers = [ lib.maintainers.Enzime ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl2740dwlpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl2740dwlpr/default.nix
new file mode 100644
index 000000000000..9c4dfa2f9978
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl2740dwlpr/default.nix
@@ -0,0 +1,44 @@
+{ pkgsi686Linux, lib, stdenv, fetchurl, dpkg, makeWrapper, coreutils, ghostscript, gnugrep, gnused, which, perl }:
+
+stdenv.mkDerivation rec {
+  pname = "mfcl2740dwlpr";
+  version = "3.2.0-1";
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf101727/${pname}-${version}.i386.deb";
+    sha256 = "10a2bc672bd54e718b478f3afc7e47d451557f7d5513167d3ad349a3d00bffaf";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper ];
+
+  unpackPhase = "dpkg-deb -x $src $out";
+
+  installPhase = ''
+    dir=$out/opt/brother/Printers/MFCL2740DW
+
+    substituteInPlace $dir/lpd/filter_MFCL2740DW \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$dir\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"MFCL2740DW\"; #"
+
+    wrapProgram $dir/lpd/filter_MFCL2740DW \
+      --prefix PATH : ${lib.makeBinPath [
+        coreutils ghostscript gnugrep gnused which
+      ]}
+
+    # need to use i686 glibc here, these are 32bit proprietary binaries
+    interpreter=${pkgsi686Linux.glibc}/lib/ld-linux.so.2
+    patchelf --set-interpreter "$interpreter" $dir/inf/braddprinter
+    patchelf --set-interpreter "$interpreter" $dir/lpd/brprintconflsr3
+    patchelf --set-interpreter "$interpreter" $dir/lpd/rawtobr3
+  '';
+
+  meta = {
+    description = "Brother MFC-L2740DW lpr driver";
+    homepage = "http://www.brother.com/";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    platforms = [ "x86_64-linux" "i686-linux" ];
+    maintainers = [ lib.maintainers.Enzime ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl2750dw/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl2750dw/default.nix
new file mode 100644
index 000000000000..73753b0dea07
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl2750dw/default.nix
@@ -0,0 +1,94 @@
+{ lib
+, stdenv
+, fetchurl
+, dpkg
+, autoPatchelfHook
+, makeWrapper
+, perl
+, gnused
+, ghostscript
+, file
+, coreutils
+, gnugrep
+, which
+}:
+
+let
+  arches = [ "x86_64" "i686" "armv7l" ];
+
+  runtimeDeps = [
+    ghostscript
+    file
+    gnused
+    gnugrep
+    coreutils
+    which
+  ];
+in
+
+stdenv.mkDerivation rec {
+  pname = "cups-brother-mfcl2750dw";
+  version = "4.0.0-1";
+
+  nativeBuildInputs = [ dpkg makeWrapper autoPatchelfHook ];
+  buildInputs = [ perl ];
+
+  dontUnpack = true;
+
+  src = fetchurl {
+    url = "https://download.brother.com/welcome/dlf103530/mfcl2750dwpdrv-${version}.i386.deb";
+    hash = "sha256-3uDwzLQTF8r1tsGZ7ChGhk4ryQmVsZYdUaj9eFaC0jc=";
+  };
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out
+    dpkg-deb -x $src $out
+
+    # delete unnecessary files for the current architecture
+  '' + lib.concatMapStrings (arch: ''
+    echo Deleting files for ${arch}
+    rm -r "$out/opt/brother/Printers/MFCL2750DW/lpd/${arch}"
+  '') (builtins.filter (arch: arch != stdenv.hostPlatform.linuxArch) arches) + ''
+
+      # bundled scripts don't understand the arch subdirectories for some reason
+      ln -s \
+        "$out/opt/brother/Printers/MFCL2750DW/lpd/${stdenv.hostPlatform.linuxArch}/"* \
+        "$out/opt/brother/Printers/MFCL2750DW/lpd/"
+
+      # Fix global references and replace auto discovery mechanism with hardcoded values
+      substituteInPlace $out/opt/brother/Printers/MFCL2750DW/lpd/lpdfilter \
+        --replace /opt "$out/opt" \
+        --replace "my \$BR_PRT_PATH =" "my \$BR_PRT_PATH = \"$out/opt/brother/Printers/MFCL2750DW\"; #" \
+        --replace "PRINTER =~" "PRINTER = \"MFCL2750DW\"; #"
+
+      # Make sure all executables have the necessary runtime dependencies available
+      find "$out" -executable -and -type f | while read file; do
+        wrapProgram "$file" --prefix PATH : "${lib.makeBinPath runtimeDeps}"
+      done
+
+      # Symlink filter and ppd into a location where CUPS will discover it
+      mkdir -p $out/lib/cups/filter
+      mkdir -p $out/share/cups/model
+
+      ln -s \
+        $out/opt/brother/Printers/MFCL2750DW/lpd/lpdfilter \
+        $out/lib/cups/filter/brother_lpdwrapper_MFCL2750DW
+
+      ln -s \
+        $out/opt/brother/Printers/MFCL2750DW/cupswrapper/brother-MFCL2750DW-cups-en.ppd \
+        $out/share/cups/model/
+
+      runHook postInstall
+    '';
+
+  meta = with lib; {
+    homepage = "http://www.brother.com/";
+    description = "Brother MFC-L2750DW printer driver";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = builtins.map (arch: "${arch}-linux") arches;
+    maintainers = [ maintainers.lovesegfault ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl8690cdwcupswrapper/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl8690cdwcupswrapper/default.nix
new file mode 100644
index 000000000000..dbc6a8fc8e5e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl8690cdwcupswrapper/default.nix
@@ -0,0 +1,45 @@
+{ coreutils, dpkg, fetchurl, gnugrep, gnused, makeWrapper,
+mfcl8690cdwlpr, perl, lib, stdenv}:
+
+stdenv.mkDerivation rec {
+  pname = "mfcl8690cdwcupswrapper";
+  version = "1.4.0-0";
+
+  src = fetchurl {
+    url = "http://download.brother.com/welcome/dlf103250/${pname}-${version}.i386.deb";
+    sha256 = "1bl9r8mmj4vnanwpfjqgq3c9lf2v46wp5k6r2n9iqprf7ldd1kb2";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+
+    basedir=${mfcl8690cdwlpr}/opt/brother/Printers/mfcl8690cdw
+    dir=$out/opt/brother/Printers/mfcl8690cdw
+
+    substituteInPlace $dir/cupswrapper/brother_lpdwrapper_mfcl8690cdw \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "basedir =~" "basedir = \"$basedir/\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"mfcl8690cdw\"; #"
+
+    wrapProgram $dir/cupswrapper/brother_lpdwrapper_mfcl8690cdw \
+      --prefix PATH : ${lib.makeBinPath [ coreutils gnugrep gnused ]}
+
+    mkdir -p $out/lib/cups/filter
+    mkdir -p $out/share/cups/model
+
+    ln $dir/cupswrapper/brother_lpdwrapper_mfcl8690cdw $out/lib/cups/filter
+    ln $dir/cupswrapper/brother_mfcl8690cdw_printer_en.ppd $out/share/cups/model
+    '';
+
+  meta = {
+    description = "Brother MFC-L8690CDW CUPS wrapper driver";
+    homepage = "http://www.brother.com/";
+    license = lib.licenses.unfree;
+    platforms = lib.platforms.linux;
+    maintainers = [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/mfcl8690cdwlpr/default.nix b/nixpkgs/pkgs/misc/cups/drivers/mfcl8690cdwlpr/default.nix
new file mode 100644
index 000000000000..f290b9563cc7
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/mfcl8690cdwlpr/default.nix
@@ -0,0 +1,46 @@
+{ coreutils, dpkg, fetchurl, file, ghostscript, gnugrep, gnused,
+makeWrapper, perl, pkgs, lib, stdenv, which }:
+
+stdenv.mkDerivation rec {
+  pname = "mfcl8690cdwlpr";
+  version = "1.3.0-0";
+
+  src = fetchurl {
+    url = "http://download.brother.com/welcome/dlf103241/${pname}-${version}.i386.deb";
+    sha256 = "0x8zd4b1psmw1znp2ibncs37xm5mljcy9yza2rx8jm8lp0a3l85v";
+  };
+
+  nativeBuildInputs = [ dpkg makeWrapper ];
+
+  dontUnpack = true;
+
+  installPhase = ''
+    dpkg-deb -x $src $out
+
+    dir=$out/opt/brother/Printers/mfcl8690cdw
+    filter=$dir/lpd/filter_mfcl8690cdw
+
+    substituteInPlace $filter \
+      --replace /usr/bin/perl ${perl}/bin/perl \
+      --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$dir/\"; #" \
+      --replace "PRINTER =~" "PRINTER = \"mfcl8690cdw\"; #"
+
+    wrapProgram $filter \
+      --prefix PATH : ${lib.makeBinPath [
+      coreutils file ghostscript gnugrep gnused which
+      ]}
+
+    # need to use i686 glibc here, these are 32bit proprietary binaries
+    interpreter=${pkgs.pkgsi686Linux.glibc}/lib/ld-linux.so.2
+    patchelf --set-interpreter "$interpreter" $dir/lpd/brmfcl8690cdwfilter
+  '';
+
+  meta = {
+    description = "Brother MFC-L8690CDW LPR printer driver";
+    homepage = "http://www.brother.com/";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    maintainers = [ ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.36/default.nix b/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.36/default.nix
new file mode 100644
index 000000000000..47700265231f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.36/default.nix
@@ -0,0 +1,120 @@
+{ lib, stdenv, fetchurl, cups, libusb-compat-0_1, libxml2, perl }:
+
+let
+
+    arch = if stdenv.system == "x86_64-linux"
+      then "x86_64"
+      else "i386";
+
+in stdenv.mkDerivation rec {
+  pname = "samsung-unified-linux-driver";
+  version = "1.00.36";
+
+  src = fetchurl {
+    sha256 = "1a7ngd03x0bkdl7pszy5zqqic0plxvdxqm5w7klr6hbdskx1lir9";
+    url = "http://www.bchemnet.com/suldr/driver/UnifiedLinuxDriver-${version}.tar.gz";
+  };
+
+  buildInputs = [
+    cups
+    libusb-compat-0_1
+    libxml2
+    perl
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp -R ${arch}/{gettext,pstosecps,rastertospl,smfpnetdiscovery,usbresetter} $out/bin
+
+    mkdir -p $out/etc/sane.d/dll.d/
+    install -m644 noarch/etc/smfp.conf $out/etc/sane.d
+    echo smfp >> $out/etc/sane.d/dll.d/smfp-scanner.conf
+
+    mkdir -p $out/etc/smfp-common/scanner/share/
+    install -m644 noarch/libsane-smfp.cfg $out/etc/smfp-common/scanner/share/
+    install -m644 noarch/pagesize.xml $out/etc/smfp-common/scanner/share/
+
+    mkdir -p $out/etc/samsung/scanner/share/
+    install -m644 noarch/oem.conf $out/etc/samsung/scanner/share/
+
+    mkdir -p $out/lib
+    install -m755 ${arch}/libscmssc.so* $out/lib
+
+    mkdir -p $out/lib/cups/backend
+    ln -s $out/bin/smfpnetdiscovery $out/lib/cups/backend
+
+    mkdir -p $out/lib/cups/filter
+    ln -s $out/bin/{pstosecps,rastertospl} $out/lib/cups/filter
+    ln -s $ghostscript/bin/gs $out/lib/cups/filter
+
+    mkdir -p $out/lib/sane
+    install -m755 ${arch}/libsane-smfp.so* $out/lib/sane
+    ln -s libsane-smfp.so.1.0.1 $out/lib/sane/libsane-smfp.so.1
+    ln -s libsane-smfp.so.1     $out/lib/sane/libsane-smfp.so
+
+    perl -pi -e \
+      's|/opt/smfp-common/scanner/.usedby/|/tmp/\0\0fp-common/scanner/.usedby/|g' \
+       $out/lib/sane/libsane-smfp.so.1.0.1
+    perl -pi -e 's|/opt|/etc|g' \
+       $out/lib/sane/libsane-smfp.so.1.0.1 \
+       $out/bin/rastertospl \
+       noarch/package_utils \
+       noarch/pre_install.sh
+
+    mkdir -p $out/lib/udev/rules.d
+    (
+      OEM_FILE=noarch/oem.conf
+      INSTALL_LOG_FILE=/dev/null
+      . noarch/scripting_utils
+      . noarch/package_utils
+      . noarch/scanner-script.pkg
+      fill_full_template noarch/etc/smfp.rules.in $out/lib/udev/rules.d/60_smfp_samsung.rules
+      chmod -x $out/lib/udev/rules.d/60_smfp_samsung.rules
+    )
+
+    mkdir -p $out/share
+    cp -R noarch/share/* $out/share
+    gzip -9 $out/share/ppd/*.ppd
+    rm -r $out/share/locale/*/*/install.mo
+
+    mkdir -p $out/share/cups
+    cd $out/share/cups
+    ln -s ../ppd .
+    ln -s ppd model
+
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    for bin in "$out/bin/"*; do
+      patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$bin"
+      patchelf --set-rpath "$out/lib:${lib.getLib cups}/lib" "$bin"
+    done
+
+    patchelf --set-rpath "$out/lib:${lib.getLib cups}/lib" "$out/lib/libscmssc.so"
+    patchelf --set-rpath "$out/lib:${libxml2.out}/lib:${libusb-compat-0_1.out}/lib" "$out/lib/sane/libsane-smfp.so.1.0.1"
+
+    ln -s ${stdenv.cc.cc.lib}/lib/libstdc++.so.6 $out/lib/
+  '';
+
+  # all binaries are already stripped
+  dontStrip = true;
+
+  # we did this in prefixup already
+  dontPatchELF = true;
+
+  meta = with lib; {
+    description = "Unified Linux Driver for Samsung printers and scanners";
+    homepage = "http://www.bchemnet.com/suldr";
+    downloadPage = "http://www.bchemnet.com/suldr/driver/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+
+    # Tested on linux-x86_64. Might work on linux-i386.
+    # Probably won't work on anything else.
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.36/module.nix b/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.36/module.nix
new file mode 100644
index 000000000000..e98da9de2b60
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.36/module.nix
@@ -0,0 +1,44 @@
+# the original samsung-unified-linux-driver_1_00_36 has some paths
+# hardcoded in binary files
+#
+# nixos samsung-unified-linux-driver_1_00_36 tries to fix those paths
+# by patching the binaries
+#
+# this module is needed to put the expected files in the new paths
+#
+# printing works without problems
+#
+# scanning works, except one detail: sometimes it is possible to scan
+# more pages in sequence.  most of the time though, scanning stops
+# working after one page.  this problem happens both with scanimage
+# and simple-scan.  errors indicate an I/O error.  scanning works
+# again after turning the device off and on.  atm i have no idea how
+# to fix this and no time to do more about it.
+{config, pkgs, lib ? pkgs.lib, ...}:
+with lib;
+let
+  cfg = config.services.samsung-unified-linux-driver_1_00_36;
+  pkg = pkgs.samsung-unified-linux-driver_1_00_36;
+in {
+  options = {
+    services.samsung-unified-linux-driver_1_00_36 = {
+      enable = mkEnableOption "enable samsung-unified-linux-driver_1_00_36";
+    };
+  };
+  config = mkIf cfg.enable {
+    services.printing.drivers = [pkg];
+    hardware.sane.extraBackends = [pkg];
+    environment.etc = {
+      "samsung/scanner/share/oem.conf".source
+        = "${pkg}/etc/samsung/scanner/share/oem.conf";
+      "smfp-common/scanner/share/libsane-smfp.cfg".source
+        = "${pkg}/etc/smfp-common/scanner/share/libsane-smfp.cfg";
+      "smfp-common/scanner/share/pagesize.xml".source
+        = "${pkg}/etc/smfp-common/scanner/share/pagesize.xml";
+      "sane.d/smfp.conf".source
+        = "${pkg}/etc/sane.d/smfp.conf";
+      "sane.d/dll.d/smfp-scanner.conf".source
+        = "${pkg}/etc/sane.d/dll.d/smfp-scanner.conf";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.37.nix b/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.37.nix
new file mode 100644
index 000000000000..59a210e6f534
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/samsung/1.00.37.nix
@@ -0,0 +1,102 @@
+{ lib, stdenv, fetchurl, cups, libusb-compat-0_1, libxml2 }:
+
+let
+
+    arch = if stdenv.hostPlatform.system == "x86_64-linux"
+      then "x86_64"
+      else "i386";
+
+in stdenv.mkDerivation rec {
+  pname = "samsung-unified-linux-driver";
+  version = "1.00.37";
+
+  src = fetchurl {
+    sha256 = "0r66l9zp0p1qgakh4j08hynwsr4lsgq5yrpxyr0x4ldvl0z2b1bb";
+    url = "http://www.bchemnet.com/suldr/driver/UnifiedLinuxDriver-${version}.tar.gz";
+  };
+
+  buildInputs = [
+    cups
+    libusb-compat-0_1
+    libxml2
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp -R ${arch}/{gettext,pstosecps,rastertospl,smfpnetdiscovery,usbresetter} $out/bin
+
+    mkdir -p $out/etc/sane.d/dll.d/
+    install -m644 noarch/etc/smfp.conf $out/etc/sane.d
+    echo smfp >> $out/etc/sane.d/dll.d/smfp-scanner.conf
+
+    mkdir -p $out/lib
+    install -m755 ${arch}/libscmssc.so* $out/lib
+
+    mkdir -p $out/lib/cups/backend
+    ln -s $out/bin/smfpnetdiscovery $out/lib/cups/backend
+
+    mkdir -p $out/lib/cups/filter
+    ln -s $out/bin/{pstosecps,rastertospl} $out/lib/cups/filter
+    ln -s $ghostscript/bin/gs $out/lib/cups/filter
+
+    mkdir -p $out/lib/sane
+    install -m755 ${arch}/libsane-smfp.so* $out/lib/sane
+    ln -s libsane-smfp.so.1.0.1 $out/lib/sane/libsane-smfp.so.1
+    ln -s libsane-smfp.so.1     $out/lib/sane/libsane-smfp.so
+
+    mkdir -p $out/lib/udev/rules.d
+    (
+      OEM_FILE=noarch/oem.conf
+      INSTALL_LOG_FILE=/dev/null
+      . noarch/scripting_utils
+      . noarch/package_utils
+      . noarch/scanner-script.pkg
+      fill_full_template noarch/etc/smfp.rules.in $out/lib/udev/rules.d/60_smfp_samsung.rules
+      chmod -x $out/lib/udev/rules.d/60_smfp_samsung.rules
+    )
+
+    mkdir -p $out/share
+    cp -R noarch/share/* $out/share
+    gzip -9 $out/share/ppd/*.ppd
+    rm -r $out/share/locale/*/*/install.mo
+
+    mkdir -p $out/share/cups
+    cd $out/share/cups
+    ln -s ../ppd .
+    ln -s ppd model
+
+    runHook postInstall
+  '';
+
+  preFixup = ''
+    for bin in "$out/bin/"*; do
+      patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$bin"
+      patchelf --set-rpath "$out/lib:${lib.getLib cups}/lib" "$bin"
+    done
+
+    patchelf --set-rpath "$out/lib:${lib.getLib cups}/lib" "$out/lib/libscmssc.so"
+    patchelf --set-rpath "$out/lib:${libxml2.out}/lib:${libusb-compat-0_1.out}/lib" "$out/lib/sane/libsane-smfp.so.1.0.1"
+
+    ln -s ${stdenv.cc.cc.lib}/lib/libstdc++.so.6 $out/lib/
+  '';
+
+  # all binaries are already stripped
+  dontStrip = true;
+
+  # we did this in prefixup already
+  dontPatchELF = true;
+
+  meta = with lib; {
+    description = "Unified Linux Driver for Samsung printers and scanners";
+    homepage = "http://www.bchemnet.com/suldr";
+    downloadPage = "http://www.bchemnet.com/suldr/driver/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+
+    # Tested on linux-x86_64. Might work on linux-i386.
+    # Probably won't work on anything else.
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/samsung/4.00.39/builder.sh b/nixpkgs/pkgs/misc/cups/drivers/samsung/4.00.39/builder.sh
new file mode 100644
index 000000000000..bdb522744182
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/samsung/4.00.39/builder.sh
@@ -0,0 +1,36 @@
+if [ -e .attrs.sh ]; then source .attrs.sh; fi
+source $stdenv/setup
+
+arch=$(uname -m)
+echo "$arch" | egrep -q '^i[3456]86$' && arch=i386
+echo "Installing for $arch"
+
+unpackPhase
+patchPhase
+
+set -v
+
+cd cdroot/Linux
+mkdir -p $out/opt
+cp -r $arch/at_root/* $out
+cp -r $arch/at_opt/* $out/opt
+#cp -r noarch/at_root/* $out
+cp -r noarch/at_opt/* $out/opt
+
+cd $out
+test -d usr/lib64 && ln -s usr/lib64 lib ||
+    ln -s usr/lib lib
+mkdir -p share/cups
+cd share/cups
+ln -s ../../opt/share/* .
+ln -s ppd model
+
+cd $out/lib/cups/filter
+for i in $(ls); do
+    echo "Patching $i..."
+    patchelf --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) $i ||
+      echo "Couldn't set interpreter!"
+    patchelf --set-rpath $cups/lib:$gcc/lib:$glibc/lib $i  # This might not be necessary.
+done
+
+ln -s $ghostscript/bin/gs $out/lib/cups/filter
diff --git a/nixpkgs/pkgs/misc/cups/drivers/samsung/4.01.17.nix b/nixpkgs/pkgs/misc/cups/drivers/samsung/4.01.17.nix
new file mode 100644
index 000000000000..eaba99839f61
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/samsung/4.01.17.nix
@@ -0,0 +1,96 @@
+# Tested on linux-x86_64.  Might work on linux-i386.  Probably won't work on anything else.
+
+# To use this driver in NixOS, add it to printing.drivers in configuration.nix.
+# configuration.nix might look like this when you're done:
+# { pkgs, ... }: {
+#   printing = {
+#     enable = true;
+#     drivers = [ pkgs.samsung-unified-linux-driver_4_01_17 ];
+#   };
+#   (more stuff)
+# }
+# (This advice was tested on the 1st November 2016.)
+
+{ lib
+, stdenv
+, cups
+, libusb-compat-0_1
+, fetchurl
+, patchPpdFilesHook
+}:
+
+# Do not bump lightly! Visit <http://www.bchemnet.com/suldr/supported.html>
+# to see what will break when upgrading. Consider a new versioned attribute.
+let
+  installationPath = if stdenv.hostPlatform.system == "x86_64-linux" then "x86_64" else "i386";
+  appendPath = lib.optionalString (stdenv.hostPlatform.system == "x86_64-linux") "64";
+  libPath = lib.makeLibraryPath [ cups libusb-compat-0_1 ] + ":$out/lib:${stdenv.cc.cc.lib}/lib${appendPath}";
+in stdenv.mkDerivation rec {
+  pname = "samsung-UnifiedLinuxDriver";
+  version = "4.01.17";
+
+  src = fetchurl {
+    url = "http://www.bchemnet.com/suldr/driver/UnifiedLinuxDriver-${version}.tar.gz";
+    sha256 = "1vv3pzvqpg1dq3xjr8161x2yp3v7ca75vil56ranhw5pkjwq66x0";
+  };
+
+  nativeBuildInputs = [ patchPpdFilesHook ];
+
+  dontPatchELF = true;
+  dontStrip = true;
+
+  installPhase = ''
+    runHook preInstall
+
+    cd Linux/${installationPath}
+    mkdir -p $out/lib/cups/{backend,filter}
+    install -Dm755 mfp $out/lib/cups/backend/
+    install -Dm755 pstosecps pstospl pstosplc rastertospl rastertosplc $out/lib/cups/filter/
+    install -Dm755 libscmssc.so $out/lib/
+
+    GLOBIGNORE=*.so
+    for exe in $out/lib/cups/**/*; do
+      echo "Patching $exe"
+      patchelf \
+        --set-rpath ${libPath} \
+        --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+        $exe
+    done
+    unset GLOBIGNORE
+
+    install -v at_root/usr/lib${appendPath}/libmfp.so.1.0.1 $out/lib
+    cd $out/lib
+    ln -s -f libmfp.so.1.0.1 libmfp.so.1
+    ln -s -f libmfp.so.1 libmfp.so
+
+    for lib in $out/lib/*.so; do
+      echo "Patching $lib"
+      patchelf \
+        --set-rpath ${libPath} \
+        $lib
+    done
+
+    mkdir -p $out/share/cups/model/samsung
+    cd -
+    cd ../noarch/at_opt/share/ppd
+    cp -r ./* $out/share/cups/model/samsung
+
+    runHook postInstall
+  '';
+
+  ppdFileCommands = [
+    "pstosecps"
+    "pstospl"
+    "pstosplc"
+    "rastertospl"
+  ];
+
+  meta = with lib; {
+    description = "Samsung's Linux printing drivers; includes binaries without source code";
+    homepage = "http://www.samsung.com/";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ joko ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/splix/default.nix b/nixpkgs/pkgs/misc/cups/drivers/splix/default.nix
new file mode 100644
index 000000000000..f43f3fc4f3a6
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/splix/default.nix
@@ -0,0 +1,54 @@
+{ lib, stdenv, fetchsvn, fetchurl, cups, cups-filters, jbigkit, zlib }:
+
+let
+
+  color-profiles = stdenv.mkDerivation {
+    pname = "splix-color-profiles";
+    version = "unstable-2007-06-25";
+
+    src = fetchurl {
+      url = "http://splix.ap2c.org/samsung_cms.tar.bz2";
+      sha256 = "1156flics5m9m7a4hdmcc2nphbdyary6dfmbcrmsp9xb7ivsypdl";
+    };
+
+    installPhase = ''
+      mkdir -p $out/share/cups/profiles/samsung
+      cp * $out/share/cups/profiles/samsung/
+    '';
+  };
+
+in stdenv.mkDerivation rec {
+  pname = "splix-svn";
+  version = "315";
+
+  src = fetchsvn {
+    # We build this from svn, because splix hasn't been in released in several years
+    # although the community has been adding some new printer models.
+    url = "svn://svn.code.sf.net/p/splix/code/splix";
+    rev = version;
+    sha256 = "16wbm4xnz35ca3mw2iggf5f4jaxpyna718ia190ka6y4ah932jxl";
+  };
+
+  postPatch = ''
+    mv -v *.ppd ppd/
+    substituteInPlace src/pstoqpdl.cpp \
+      --replace "RASTERDIR \"/\" RASTERTOQPDL" "\"$out/lib/cups/filter/rastertoqpdl\"" \
+      --replace "RASTERDIR" "\"${cups-filters}/lib/cups/filter\"" \
+  '';
+
+  makeFlags = [
+    "CUPSFILTER=$(out)/lib/cups/filter"
+    "CUPSPPD=$(out)/share/cups/model"
+    "CUPSPROFILE=${color-profiles}/share/cups/profiles"
+  ];
+
+  buildInputs = [ cups zlib jbigkit ];
+
+  meta = with lib; {
+    description = "CUPS drivers for SPL (Samsung Printer Language) printers";
+    homepage = "http://splix.ap2c.org";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ jfrankenau ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/drivers/zj-58/default.nix b/nixpkgs/pkgs/misc/cups/drivers/zj-58/default.nix
new file mode 100644
index 000000000000..0e2534997e35
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/drivers/zj-58/default.nix
@@ -0,0 +1,28 @@
+{lib, stdenv, fetchFromGitHub, cups}:
+
+stdenv.mkDerivation {
+  pname = "cups-zj-58";
+  version = "2018-02-22";
+
+  src = fetchFromGitHub {
+    owner = "klirichek";
+    repo = "zj-58";
+    rev = "e4212cd";
+    sha256 = "1w2qkspm4qqg5h8n6gmakzhiww7gag64chvy9kf89xsl3wsyp6pi";
+  };
+
+  buildInputs = [ cups ];
+
+  installPhase = ''
+    install -D rastertozj $out/lib/cups/filter/rastertozj
+    install -D ZJ-58.ppd $out/share/cups/model/zjiang/ZJ-58.ppd
+  '';
+
+  meta = with lib; {
+    description = "CUPS filter for thermal printer Zjiang ZJ-58";
+    homepage = "https://github.com/klirichek/zj-58";
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ makefu ];
+    license = licenses.bsd2;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/cups/filters.nix b/nixpkgs/pkgs/misc/cups/filters.nix
new file mode 100644
index 000000000000..c1654782db26
--- /dev/null
+++ b/nixpkgs/pkgs/misc/cups/filters.nix
@@ -0,0 +1,122 @@
+{ lib
+, avahi
+, bc
+, coreutils
+, cups
+, dbus
+, dejavu_fonts
+, fetchurl
+, fetchpatch
+, fontconfig
+, gawk
+, ghostscript
+, gnugrep
+, gnused
+, ijs
+, libexif
+, libjpeg
+, liblouis
+, libpng
+, makeWrapper
+, mupdf
+, perl
+, pkg-config
+, poppler
+, poppler_utils
+, qpdf
+, stdenv
+, which
+, withAvahi ? true
+}:
+
+let
+  binPath = lib.makeBinPath [ bc coreutils gawk gnused gnugrep which ];
+
+in
+stdenv.mkDerivation rec {
+  pname = "cups-filters";
+  version = "1.28.17";
+
+  src = fetchurl {
+    url = "https://github.com/OpenPrinting/cups-filters/releases/download/${version}/${pname}-${version}.tar.xz";
+    hash = "sha256-Jwo3UqlgNoqpnUMftdNPQDmyrJQ8V22EBhLR2Bhcm7k=";
+  };
+
+  patches = [
+    (fetchpatch {
+      name = "CVE-2023-24805.patch";
+      url = "https://github.com/OpenPrinting/cups-filters/commit/93e60d3df358c0ae6f3dba79e1c9684657683d89.patch";
+      hash = "sha256-KgWTYFr2uShL040azzE+KaNyBPy7Gs/hCnEgQmmPCys=";
+    })
+  ];
+
+  nativeBuildInputs = [ pkg-config makeWrapper ];
+
+  buildInputs = [
+    cups
+    dbus
+    fontconfig
+    ghostscript
+    ijs
+    libexif
+    libjpeg
+    liblouis # braille embosser support
+    libpng
+    mupdf
+    perl
+    poppler
+    poppler_utils
+    qpdf
+  ] ++ lib.optionals withAvahi [ avahi ];
+
+  configureFlags = [
+    "--with-mutool-path=${mupdf}/bin/mutool"
+    "--with-pdftops=pdftops"
+    "--with-pdftops-path=${poppler_utils}/bin/pdftops"
+    "--with-gs-path=${ghostscript}/bin/gs"
+    "--with-pdftocairo-path=${poppler_utils}/bin/pdftocairo"
+    "--with-ippfind-path=${cups}/bin/ippfind"
+    "--enable-imagefilters"
+    "--with-rcdir=no"
+    "--with-shell=${stdenv.shell}"
+    "--with-test-font-path=${dejavu_fonts}/share/fonts/truetype/DejaVuSans.ttf"
+    "--localstatedir=/var"
+    "--sysconfdir=/etc"
+  ] ++ lib.optionals (!withAvahi) [ "--disable-avahi" ];
+
+  makeFlags = [ "CUPS_SERVERBIN=$(out)/lib/cups" "CUPS_DATADIR=$(out)/share/cups" "CUPS_SERVERROOT=$(out)/etc/cups" ];
+
+  # https://github.com/OpenPrinting/cups-filters/issues/512
+  env.NIX_CFLAGS_COMPILE = "-std=c++17";
+
+  postConfigure =
+    ''
+      # Ensure that bannertopdf can find the PDF templates in
+      # $out. (By default, it assumes that cups and cups-filters are
+      # installed in the same prefix.)
+      substituteInPlace config.h --replace ${cups.out}/share/cups/data $out/share/cups/data
+
+      # Ensure that gstoraster can find gs in $PATH.
+      substituteInPlace filter/gstoraster.c --replace execve execvpe
+
+      # Patch shebangs of generated build scripts
+      patchShebangs filter
+    '';
+
+  postInstall =
+    ''
+      for i in $out/lib/cups/filter/*; do
+        wrapProgram "$i" --prefix PATH ':' ${binPath}
+      done
+    '';
+
+  enableParallelBuilding = true;
+  doCheck = true;
+
+  meta = {
+    homepage = "http://www.linuxfoundation.org/collaborate/workgroups/openprinting/cups-filters";
+    description = "Backends, filters, and other software that was once part of the core CUPS distribution but is no longer maintained by Apple Inc";
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/dart-sass-embedded/default.nix b/nixpkgs/pkgs/misc/dart-sass-embedded/default.nix
new file mode 100644
index 000000000000..30ea1395dad3
--- /dev/null
+++ b/nixpkgs/pkgs/misc/dart-sass-embedded/default.nix
@@ -0,0 +1,74 @@
+{ lib
+, stdenvNoCC
+, fetchFromGitHub
+, dart
+, buf
+, callPackage
+, runtimeShell
+}:
+
+let
+  embedded-protocol = fetchFromGitHub {
+    owner = "sass";
+    repo = "embedded-protocol";
+    rev = "refs/tags/1.2.0";
+    hash = "sha256-OHOWotI+cXjDhEYUNXa36FpMEW7hSIu8gVX3gVRvw2Y=";
+  };
+
+  libExt = stdenvNoCC.hostPlatform.extensions.sharedLibrary;
+in
+stdenvNoCC.mkDerivation (finalAttrs: {
+  pname = "dart-sass-embedded";
+  version = "1.62.1";
+
+  src = fetchFromGitHub {
+    owner = "sass";
+    repo = "dart-sass-embedded";
+    rev = "refs/tags/${finalAttrs.version}";
+    hash = "sha256-GpSus5/QItbzCrOImMvrO6DTAQeODABRNiSYHJlLlIA=";
+  };
+
+  nativeBuildInputs = [
+    buf
+    dart
+    (callPackage ../../build-support/dart/fetch-dart-deps { } {
+      buildDrvArgs = finalAttrs;
+      vendorHash = "sha256-aEBE+z8M5ivMR9zL7kleBJ8c9T+4PGXoec56iwHVT+c=";
+    })
+  ];
+
+  strictDeps = true;
+
+  configurePhase = ''
+    runHook preConfigure
+    doPubGet dart pub get --offline
+    mkdir build
+    ln -s ${embedded-protocol} build/embedded-protocol
+    runHook postConfigure
+  '';
+
+  buildPhase = ''
+    runHook preBuild
+    UPDATE_SASS_PROTOCOL=false HOME="$TMPDIR" dart run grinder protobuf
+    dart run grinder pkg-compile-native
+    runHook postBuild
+  '';
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p "$out/lib" "$out/bin"
+    cp build/dart-sass-embedded.native "$out/lib/dart-sass-embedded${libExt}"
+    echo '#!${runtimeShell}' > "$out/bin/dart-sass-embedded"
+    echo "exec ${dart}/bin/dartaotruntime $out/lib/dart-sass-embedded${libExt} \"\$@\"" >> "$out/bin/dart-sass-embedded"
+    chmod +x "$out/bin/dart-sass-embedded"
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "A wrapper for Dart Sass that implements the compiler side of the Embedded Sass protocol";
+    homepage = "https://github.com/sass/dart-sass-embedded";
+    changelog = "https://github.com/sass/dart-sass-embedded/blob/${finalAttrs.version}/CHANGELOG.md";
+    license = licenses.mit;
+    maintainers = with maintainers; [ shyim ];
+  };
+})
diff --git a/nixpkgs/pkgs/misc/documentation-highlighter/LICENSE b/nixpkgs/pkgs/misc/documentation-highlighter/LICENSE
new file mode 100644
index 000000000000..422deb7350fe
--- /dev/null
+++ b/nixpkgs/pkgs/misc/documentation-highlighter/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2006, Ivan Sagalaev
+All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of highlight.js nor the names of its contributors 
+      may be used to endorse or promote products derived from this software 
+      without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/nixpkgs/pkgs/misc/documentation-highlighter/README.md b/nixpkgs/pkgs/misc/documentation-highlighter/README.md
new file mode 100644
index 000000000000..f4baa3c8e001
--- /dev/null
+++ b/nixpkgs/pkgs/misc/documentation-highlighter/README.md
@@ -0,0 +1,152 @@
+This file was generated with pkgs/misc/documentation-highlighter/update.sh
+
+# Highlight.js
+
+[![Build Status](https://travis-ci.org/isagalaev/highlight.js.svg?branch=master)](https://travis-ci.org/isagalaev/highlight.js)
+
+Highlight.js is a syntax highlighter written in JavaScript. It works in
+the browser as well as on the server. It works with pretty much any
+markup, doesn’t depend on any framework and has automatic language
+detection.
+
+## Getting Started
+
+The bare minimum for using highlight.js on a web page is linking to the
+library along with one of the styles and calling
+[`initHighlightingOnLoad`][1]:
+
+```html
+<link rel="stylesheet" href="/path/to/styles/default.css">
+<script src="/path/to/highlight.pack.js"></script>
+<script>hljs.initHighlightingOnLoad();</script>
+```
+
+This will find and highlight code inside of `<pre><code>` tags; it tries
+to detect the language automatically. If automatic detection doesn’t
+work for you, you can specify the language in the `class` attribute:
+
+```html
+<pre><code class="html">...</code></pre>
+```
+
+The list of supported language classes is available in the [class
+reference][2].  Classes can also be prefixed with either `language-` or
+`lang-`.
+
+To disable highlighting altogether use the `nohighlight` class:
+
+```html
+<pre><code class="nohighlight">...</code></pre>
+```
+
+## Custom Initialization
+
+When you need a bit more control over the initialization of
+highlight.js, you can use the [`highlightBlock`][3] and [`configure`][4]
+functions. This allows you to control *what* to highlight and *when*.
+
+Here’s an equivalent way to calling [`initHighlightingOnLoad`][1] using
+jQuery:
+
+```javascript
+$(document).ready(function() {
+  $('pre code').each(function(i, block) {
+    hljs.highlightBlock(block);
+  });
+});
+```
+
+You can use any tags instead of `<pre><code>` to mark up your code. If
+you don't use a container that preserve line breaks you will need to
+configure highlight.js to use the `<br>` tag:
+
+```javascript
+hljs.configure({useBR: true});
+
+$('div.code').each(function(i, block) {
+  hljs.highlightBlock(block);
+});
+```
+
+For other options refer to the documentation for [`configure`][4].
+
+
+## Web Workers
+
+You can run highlighting inside a web worker to avoid freezing the browser
+window while dealing with very big chunks of code.
+
+In your main script:
+
+```javascript
+addEventListener('load', function() {
+  var code = document.querySelector('#code');
+  var worker = new Worker('worker.js');
+  worker.onmessage = function(event) { code.innerHTML = event.data; }
+  worker.postMessage(code.textContent);
+})
+```
+
+In worker.js:
+
+```javascript
+onmessage = function(event) {
+  importScripts('<path>/highlight.pack.js');
+  var result = self.hljs.highlightAuto(event.data);
+  postMessage(result.value);
+}
+```
+
+
+## Getting the Library
+
+You can get highlight.js as a hosted, or custom-build, browser script or
+as a server module. Right out of the box the browser script supports
+both AMD and CommonJS, so if you wish you can use RequireJS or
+Browserify without having to build from source. The server module also
+works perfectly fine with Browserify, but there is the option to use a
+build specific to browsers rather than something meant for a server.
+Head over to the [download page][5] for all the options.
+
+**Don't link to GitHub directly.** The library is not supposed to work straight
+from the source, it requires building. If none of the pre-packaged options
+work for you refer to the [building documentation][6].
+
+**The CDN-hosted package doesn't have all the languages.** Otherwise it'd be
+too big. If you don't see the language you need in the ["Common" section][5],
+it can be added manually:
+
+```html
+<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.4.0/languages/go.min.js"></script>
+```
+
+**On Almond.** You need to use the optimizer to give the module a name. For
+example:
+
+```
+r.js -o name=hljs paths.hljs=/path/to/highlight out=highlight.js
+```
+
+
+## License
+
+Highlight.js is released under the BSD License. See [LICENSE][7] file
+for details.
+
+## Links
+
+The official site for the library is at <https://highlightjs.org/>.
+
+Further in-depth documentation for the API and other topics is at
+<http://highlightjs.readthedocs.io/>.
+
+Authors and contributors are listed in the [AUTHORS.en.txt][8] file.
+
+[1]: http://highlightjs.readthedocs.io/en/latest/api.html#inithighlightingonload
+[2]: http://highlightjs.readthedocs.io/en/latest/css-classes-reference.html
+[3]: http://highlightjs.readthedocs.io/en/latest/api.html#highlightblock-block
+[4]: http://highlightjs.readthedocs.io/en/latest/api.html#configure-options
+[5]: https://highlightjs.org/download/
+[6]: http://highlightjs.readthedocs.io/en/latest/building-testing.html
+[7]: https://github.com/isagalaev/highlight.js/blob/master/LICENSE
+[8]: https://github.com/isagalaev/highlight.js/blob/master/AUTHORS.en.txt
diff --git a/nixpkgs/pkgs/misc/documentation-highlighter/default.nix b/nixpkgs/pkgs/misc/documentation-highlighter/default.nix
new file mode 100644
index 000000000000..3a7f5b21c69e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/documentation-highlighter/default.nix
@@ -0,0 +1,22 @@
+{ lib, runCommand }:
+runCommand "documentation-highlighter" {
+  meta = {
+    description = "Highlight.js sources for the Nix Ecosystem's documentation";
+    homepage = "https://highlightjs.org";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.all;
+    maintainers = [ lib.maintainers.grahamc ];
+  };
+  src = lib.sources.cleanSourceWith {
+    src = ./.;
+    filter = path: type: lib.elem (baseNameOf path) ([
+      "highlight.pack.js"
+      "LICENSE"
+      "loader.js"
+      "mono-blue.css"
+      "README.md"
+    ]);
+  };
+} ''
+  cp -r "$src" "$out"
+''
diff --git a/nixpkgs/pkgs/misc/documentation-highlighter/highlight.pack.js b/nixpkgs/pkgs/misc/documentation-highlighter/highlight.pack.js
new file mode 100644
index 000000000000..f909702367ec
--- /dev/null
+++ b/nixpkgs/pkgs/misc/documentation-highlighter/highlight.pack.js
@@ -0,0 +1,2 @@
+/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */
+!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset<r[0].offset?e:r:"start"===r[0].event?e:r:e.length?e:r}function o(e){function r(e){return" "+e.nodeName+'="'+n(e.value).replace('"',"&quot;")+'"'}s+="<"+t(e)+E.map.call(e.attributes,r).join("")+">"}function u(e){s+="</"+t(e)+">"}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='<span class="'+a,o=t?"":C;return i+=e+'">',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"<unnamed>")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"<br>":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="</span>",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("nix",function(e){var r={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},t={cN:"subst",b:/\$\{/,e:/}/,k:r},i={b:/[a-zA-Z0-9-_]+(\s*=)/,rB:!0,r:0,c:[{cN:"attr",b:/\S+/}]},s={cN:"string",c:[t],v:[{b:"''",e:"''"},{b:'"',e:'"'}]},a=[e.NM,e.HCM,e.CBCM,s,i];return t.c=a,{aliases:["nixos"],k:r,c:a}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});
\ No newline at end of file
diff --git a/nixpkgs/pkgs/misc/documentation-highlighter/loader.js b/nixpkgs/pkgs/misc/documentation-highlighter/loader.js
new file mode 100644
index 000000000000..4ad7dbf24b51
--- /dev/null
+++ b/nixpkgs/pkgs/misc/documentation-highlighter/loader.js
@@ -0,0 +1,7 @@
+/* This file is NOT part of highlight.js */
+document.onreadystatechange = function () {
+    var listings = document.querySelectorAll('.programlisting, .screen');
+    for (i = 0; i < listings.length; ++i) {
+        hljs.highlightBlock(listings[i]);
+    }
+}
diff --git a/nixpkgs/pkgs/misc/documentation-highlighter/mono-blue.css b/nixpkgs/pkgs/misc/documentation-highlighter/mono-blue.css
new file mode 100644
index 000000000000..884c97c7673f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/documentation-highlighter/mono-blue.css
@@ -0,0 +1,59 @@
+/*
+  Five-color theme from a single blue hue.
+*/
+.hljs {
+  display: block;
+  overflow-x: auto;
+  padding: 0.5em;
+  background: #eaeef3;
+}
+
+.hljs {
+  color: #00193a;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-title,
+.hljs-section,
+.hljs-doctag,
+.hljs-name,
+.hljs-strong {
+  font-weight: bold;
+}
+
+.hljs-comment {
+  color: #738191;
+}
+
+.hljs-string,
+.hljs-title,
+.hljs-section,
+.hljs-built_in,
+.hljs-literal,
+.hljs-type,
+.hljs-addition,
+.hljs-tag,
+.hljs-quote,
+.hljs-name,
+.hljs-selector-id,
+.hljs-selector-class {
+  color: #0048ab;
+}
+
+.hljs-meta,
+.hljs-subst,
+.hljs-symbol,
+.hljs-regexp,
+.hljs-attribute,
+.hljs-deletion,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-link,
+.hljs-bullet {
+  color: #4c81c9;
+}
+
+.hljs-emphasis {
+  font-style: italic;
+}
diff --git a/nixpkgs/pkgs/misc/documentation-highlighter/update.sh b/nixpkgs/pkgs/misc/documentation-highlighter/update.sh
new file mode 100755
index 000000000000..3b77af4af416
--- /dev/null
+++ b/nixpkgs/pkgs/misc/documentation-highlighter/update.sh
@@ -0,0 +1,42 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p curl -p unzip
+
+set -eu
+set -o pipefail
+
+root=$(pwd)
+
+if [ ! -f "./update.sh" ]; then
+    echo "Please run this script from within pkgs/misc/documentation-highlighter/!"
+    exit 1
+fi
+
+scratch=$(mktemp -d -t tmp.XXXXXXXXXX)
+function finish {
+  rm -rf "$scratch"
+}
+trap finish EXIT
+
+
+mkdir $scratch/src
+cd $scratch/src
+
+token=$(curl https://highlightjs.org/download/ -c "$scratch/jar" \
+    | grep csrf \
+    | cut -d"'" -f6)
+
+curl --header "Referer: https://highlightjs.org/download/"\
+    -b "$scratch/jar" \
+    --data "csrfmiddlewaretoken=$token&nix.js=on&bash.js=on" \
+    https://highlightjs.org/download/ > $scratch/out.zip
+
+unzip "$scratch/out.zip"
+out="$root/"
+mkdir -p "$out"
+cp ./{highlight.pack.js,LICENSE,styles/mono-blue.css} "$out"
+
+(
+    echo "This file was generated with pkgs/misc/documentation-highlighter/update.sh"
+    echo ""
+    cat README.md
+) > "$out/README.md"
diff --git a/nixpkgs/pkgs/misc/doge/default.nix b/nixpkgs/pkgs/misc/doge/default.nix
new file mode 100644
index 000000000000..c82456d8ee53
--- /dev/null
+++ b/nixpkgs/pkgs/misc/doge/default.nix
@@ -0,0 +1,18 @@
+{ lib, python3Packages, fetchPypi }:
+
+python3Packages.buildPythonPackage rec {
+  pname = "doge";
+  version = "3.5.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "0lwdl06lbpnaqqjk8ap9dsags3bzma30z17v0zc7spng1gz8m6xj";
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/thiderman/doge";
+    description = "wow very terminal doge";
+    license = licenses.mit;
+    maintainers = with maintainers; [ Gonzih ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/argononed/default.nix b/nixpkgs/pkgs/misc/drivers/argononed/default.nix
new file mode 100644
index 000000000000..5fa28c17c529
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/argononed/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchFromGitLab, dtc, installShellFiles }:
+
+stdenv.mkDerivation rec {
+  pname = "argononed";
+  version = "unstable-2022-03-26";
+
+  src = fetchFromGitLab {
+    owner = "DarkElvenAngel";
+    repo = pname;
+    rev = "97c4fa07fc2c09ffc3bd86e0f6319d50fa639578";
+    sha256 = "sha256-5/xUYbprRiwD+FN8V2cUpHxnTbBkEsFG2wfsEXrCrgQ=";
+  };
+
+  patches = [ ./fix-hardcoded-reboot-poweroff-paths.patch ];
+
+  postPatch = ''
+    patchShebangs configure
+  '';
+
+  nativeBuildInputs = [ installShellFiles ];
+
+  buildInputs = [ dtc ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -Dm755 build/argononed $out/bin/argononed
+    install -Dm755 build/argonone-cli $out/bin/argonone-cli
+    install -Dm755 build/argonone-shutdown $out/lib/systemd/system-shutdown/argonone-shutdown
+    install -Dm644 build/argonone.dtbo $out/boot/overlays/argonone.dtbo
+
+    install -Dm644 OS/_common/argononed.service $out/lib/systemd/system/argononed.service
+    install -Dm644 OS/_common/argononed.logrotate $out/etc/logrotate.d/argononed
+    install -Dm644 LICENSE $out/share/argononed/LICENSE
+
+    installShellCompletion --bash --name argonone-cli OS/_common/argonone-cli-complete.bash
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    homepage = "https://gitlab.com/DarkElvenAngel/argononed";
+    description = "A replacement daemon for the Argon One Raspberry Pi case";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.misterio77 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/argononed/fix-hardcoded-reboot-poweroff-paths.patch b/nixpkgs/pkgs/misc/drivers/argononed/fix-hardcoded-reboot-poweroff-paths.patch
new file mode 100644
index 000000000000..88bcb6ddd25e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/argononed/fix-hardcoded-reboot-poweroff-paths.patch
@@ -0,0 +1,18 @@
+--- a/src/argononed.c
++++ b/src/argononed.c
+@@ -783,13 +783,13 @@
+     {
+         log_message(LOG_DEBUG, "EXEC REBOOT");
+         sync();
+-        system("/sbin/reboot");
++        system("/run/current-system/sw/bin/reboot");
+     }
+     if (count >= 39 && count <= 41)
+     {
+         log_message(LOG_DEBUG, "EXEC SHUTDOWN");
+         sync();
+-        system("/sbin/poweroff");
++        system("/run/current-system/sw/bin/poweroff");
+     }
+ #else
+     log_message(LOG_INFO,"Daemon Ready");
diff --git a/nixpkgs/pkgs/misc/drivers/dell-530cdn/default.nix b/nixpkgs/pkgs/misc/drivers/dell-530cdn/default.nix
new file mode 100644
index 000000000000..9cabd8fa3396
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/dell-530cdn/default.nix
@@ -0,0 +1,13 @@
+{ runCommand, fetchurl, rpm, cpio }: let
+  version = "1.3-1";
+
+  src = fetchurl {
+    url = "http://downloads.dell.com/printer/Dell-5130cdn-Color-Laser-${version}.noarch.rpm";
+    sha256 = "0pj32sj6jcdnpa5v75af0hnvx4z0ky0m1k2522cfdx4cb1r2lna9";
+  };
+in runCommand "Dell-5130cdn-Color-Laser-1.3-1" {} ''
+  mkdir -p usr/share/cups/model
+  ${rpm}/bin/rpm2cpio ${src} | ${cpio}/bin/cpio -i
+  mkdir -p $out/share/ppd
+  mv usr/share/cups/model/Dell $out/share/ppd
+''
diff --git a/nixpkgs/pkgs/misc/drivers/epkowa/default.nix b/nixpkgs/pkgs/misc/drivers/epkowa/default.nix
new file mode 100644
index 000000000000..cf54b048f591
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epkowa/default.nix
@@ -0,0 +1,417 @@
+{ lib, stdenv
+, fetchurl
+, fetchpatch
+, makeWrapper
+, symlinkJoin
+, pkg-config
+, libtool
+, gtk2
+, libxml2
+, libxslt
+, libusb-compat-0_1
+, sane-backends
+, rpm
+, cpio
+, getopt
+, autoPatchelfHook
+, gcc
+}:
+let common_meta = {
+  homepage = "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX";
+  sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+  license = with lib.licenses; epson;
+  platforms = with lib.platforms; linux;
+};
+in
+############################
+#
+#  PLUGINS
+#
+############################
+
+# adding a plugin for another printer shouldn't be too difficult, but you need the firmware to test...
+let plugins = {
+  v330 = stdenv.mkDerivation rec {
+    name = "iscan-v330-bundle";
+    version = "2.30.4";
+
+    src = fetchurl {
+      # To find new versions, visit
+      # http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX and search for
+      # some printer like for instance "WF-7210" to get to the most recent
+      # version.
+      # NOTE: Don't forget to update the webarchive link too!
+      urls = [
+        "https://download2.ebz.epson.net/iscan/plugin/perfection-v330/rpm/x64/iscan-perfection-v330-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/plugin/perfection-v330/rpm/x64/iscan-perfection-v330-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "056c04pfsf98nnknphg28l489isqb6y4l2c8g7wqhclwgj7m338i";
+    };
+
+    nativeBuildInputs = [ autoPatchelfHook rpm ];
+
+    installPhase = ''
+      ${rpm}/bin/rpm2cpio plugins/esci-interpreter-perfection-v330-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+      mkdir $out{,/share,/lib}
+      cp -r ./usr/share/{iscan-data,esci}/ $out/share/
+      cp -r ./usr/lib64/esci $out/lib
+    '';
+
+    passthru = {
+      registrationCommand = ''
+        $registry --add interpreter usb 0x04b8 0x0142 "$plugin/lib/esci/libesci-interpreter-perfection-v330 $plugin/share/esci/esfwad.bin"
+      '';
+      hw = "Perfection V330 Photo";
+    };
+    meta = common_meta // { description = "Plugin to support " + passthru.hw + " scanner in sane"; };
+  };
+  v370 = stdenv.mkDerivation rec {
+    name = "iscan-v370-bundle";
+    version = "2.30.4";
+
+    src = fetchurl {
+      urls = [
+        "https://download2.ebz.epson.net/iscan/plugin/perfection-v370/rpm/x64/iscan-perfection-v370-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/plugin/perfection-v370/rpm/x64/iscan-perfection-v370-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "1ff7adp9mha1i2ibllz540xkagpy8r757h4s3h60bgxbyzv2yggr";
+    };
+
+    nativeBuildInputs = [ autoPatchelfHook rpm ];
+
+    installPhase = ''
+      cd plugins
+      ${rpm}/bin/rpm2cpio iscan-plugin-perfection-v370-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+
+
+      mkdir -p $out/share $out/lib
+      cp -r usr/share/{iscan-data,iscan}/ $out/share
+      cp -r usr/lib64/iscan $out/lib
+      mv $out/share/iscan $out/share/esci
+      mv $out/lib/iscan $out/lib/esci
+    '';
+
+    passthru = {
+      registrationCommand = ''
+        $registry --add interpreter usb 0x04b8 0x014a "$plugin/lib/esci/libiscan-plugin-perfection-v370 $plugin/share/esci/esfwdd.bin"
+      '';
+      hw = "Perfection V37/V370";
+    };
+    meta = common_meta // { description = "Plugin to support " + passthru.hw + " scanner in sane"; };
+  };
+  v600 = stdenv.mkDerivation rec {
+    pname = "iscan-gt-x820-bundle";
+    version = "2.30.4";
+
+    nativeBuildInputs = [ autoPatchelfHook rpm ];
+    src = fetchurl {
+      urls = [
+        "https://download2.ebz.epson.net/iscan/plugin/gt-x820/rpm/x64/iscan-gt-x820-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/plugin/gt-x820/rpm/x64/iscan-gt-x820-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "1vlba7dsgpk35nn3n7is8nwds3yzlk38q43mppjzwsz2d2n7sr33";
+    };
+    installPhase = ''
+      cd plugins
+      ${rpm}/bin/rpm2cpio iscan-plugin-gt-x820-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+      mkdir $out
+      cp -r usr/share $out
+      cp -r usr/lib64 $out/lib
+      mv $out/share/iscan $out/share/esci
+      mv $out/lib/iscan $out/lib/esci
+    '';
+    passthru = {
+      registrationCommand = ''
+        $registry --add interpreter usb 0x04b8 0x013a "$plugin/lib/esci/libesintA1 $plugin/share/esci/esfwA1.bin"
+      '';
+      hw = "Perfection V600 Photo";
+    };
+    meta = common_meta // { description = "iscan esci x820 plugin for " + passthru.hw; };
+  };
+  x770 = stdenv.mkDerivation rec {
+    pname = "iscan-gt-x770-bundle";
+    version = "2.30.4";
+
+    nativeBuildInputs = [ autoPatchelfHook rpm ];
+    src = fetchurl {
+      urls = [
+        "https://download2.ebz.epson.net/iscan/plugin/gt-x770/rpm/x64/iscan-gt-x770-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/plugin/gt-x770/rpm/x64/iscan-gt-x770-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "1chxdm6smv2d14pn2jl9xyd0vr42diy7vpskd3b9a61gf5h3gj03";
+    };
+    installPhase = ''
+      cd plugins
+      ${rpm}/bin/rpm2cpio iscan-plugin-gt-x770-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+      mkdir $out
+      cp -r usr/share $out
+      cp -r usr/lib64 $out/lib
+      mv $out/share/iscan $out/share/esci
+      mv $out/lib/iscan $out/lib/esci
+    '';
+    passthru = {
+      registrationCommand = ''
+        $registry --add interpreter usb 0x04b8 0x0130 "$plugin/lib/esci/libesint7C $plugin/share/esci/esfw7C.bin"
+      '';
+      hw = "Perfection V500 Photo";
+    };
+    meta = common_meta // { description = "iscan esci x770 plugin for " + passthru.hw; };
+  };
+  f720 = stdenv.mkDerivation rec {
+    pname = "iscan-gt-f720-bundle";
+    version = "2.30.4";
+
+    nativeBuildInputs = [ autoPatchelfHook ];
+    buildInputs = [ gcc.cc.lib ];
+    src = fetchurl {
+      urls = [
+        "https://download2.ebz.epson.net/iscan/plugin/gt-f720/rpm/x64/iscan-gt-f720-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/plugin/gt-f720/rpm/x64/iscan-gt-f720-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "1xnbmb2rn610kqpg1x6k1cc13zlmx2f3l2xnj6809rnhg96qqn20";
+    };
+    installPhase = ''
+      cd plugins
+      ${rpm}/bin/rpm2cpio esci-interpreter-gt-f720-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+      mkdir $out
+      cp -r usr/share $out
+      cp -r usr/lib64 $out/lib
+    '';
+
+    passthru = {
+      registrationCommand = ''
+        $registry --add interpreter usb 0x04b8 0x0131 "$plugin/lib/esci/libesci-interpreter-gt-f720 $plugin/share/esci/esfw8b.bin"
+      '';
+      hw = "GT-F720, GT-S620, Perfection V30, Perfection V300 Photo";
+    };
+
+    meta = common_meta // { description = "iscan esci f720 plugin for " + passthru.hw; };
+  };
+  s80 = stdenv.mkDerivation rec {
+    pname = "iscan-gt-s80-bundle";
+    version = "2.30.4";
+
+    nativeBuildInputs = [ autoPatchelfHook ];
+    buildInputs = [ gcc.cc.lib libtool ];
+    src = fetchurl {
+      urls = [
+        "https://download2.ebz.epson.net/iscan/plugin/gt-s80/rpm/x64/iscan-gt-s80-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/plugin/gt-s80/rpm/x64/iscan-gt-s80-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "00qfdgs03k7bbs67zjrk8hbxvlyinsmk890amp9cmpfjfzdxgg58";
+    };
+    installPhase = ''
+      cd plugins
+      ${rpm}/bin/rpm2cpio esci-interpreter-gt-s80-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+      ${rpm}/bin/rpm2cpio iscan-plugin-esdip-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+      mkdir $out
+      cp -r usr/share $out
+      cp -r usr/lib64 $out/lib
+      mkdir $out/share/esci
+    '';
+
+    passthru = {
+      registrationCommand = ''
+        $registry --add interpreter usb 0x04b8 0x0136 "$plugin/lib/esci/libesci-interpreter-gt-s80.so"
+        $registry --add interpreter usb 0x04b8 0x0137 "$plugin/lib/esci/libesci-interpreter-gt-s50.so"
+        $registry --add interpreter usb 0x04b8 0x0143 "$plugin/lib/esci/libesci-interpreter-gt-s50.so"
+        $registry --add interpreter usb 0x04b8 0x0144 "$plugin/lib/esci/libesci-interpreter-gt-s80.so"
+      '';
+      hw = "ES-D200, ED-D350, ES-D400, GT-S50, GT-S55, GT-S80, GT-S85";
+    };
+
+    meta = common_meta // { description = "iscan esci s80 plugin for " + passthru.hw; };
+  };
+  s650 = stdenv.mkDerivation rec {
+    name = "iscan-gt-s650-bundle";
+    version = "2.30.4";
+
+    src = fetchurl {
+      urls = [
+        "https://download2.ebz.epson.net/iscan/plugin/gt-s650/rpm/x64/iscan-gt-s650-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/plugin/gt-s650/rpm/x64/iscan-gt-s650-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "0fn4lz4g0a8l301v6yv7fwl37wgwhz5y90nf681f655xxc91hqh7";
+    };
+
+    nativeBuildInputs = [ autoPatchelfHook rpm ];
+
+    installPhase = ''
+      cd plugins
+      ${rpm}/bin/rpm2cpio iscan-plugin-gt-s650-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+      mkdir $out
+      cp -r usr/share $out
+      cp -r usr/lib64 $out/lib
+      mv $out/share/iscan $out/share/esci
+      mv $out/lib/iscan $out/lib/esci
+    '';
+
+    passthru = {
+      registrationCommand = ''
+        $registry --add interpreter usb 0x04b8 0x013c "$plugin/lib/esci/libiscan-plugin-gt-s650 $plugin/share/esci/esfw010c.bin"
+        $registry --add interpreter usb 0x04b8 0x013d "$plugin/lib/esci/libiscan-plugin-gt-s650 $plugin/share/esci/esfw010c.bin"
+      '';
+      hw = "GT-S650, Perfection V19, Perfection V39";
+    };
+    meta = common_meta // { description = "iscan GT-S650 for " + passthru.hw; };
+  };
+  x750 = stdenv.mkDerivation rec {
+    name = "iscan-gt-x750-bundle";
+    version = "2.30.4";
+
+    src = fetchurl {
+      urls = [
+        "https://download2.ebz.epson.net/iscan/plugin/gt-x750/rpm/x64/iscan-gt-x750-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/plugin/gt-x750/rpm/x64/iscan-gt-x750-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "sha256-9EeBHmh1nwSxnTnevPP8RZ4WBdyY+itR3VXo2I7f5N0=";
+    };
+
+    nativeBuildInputs = [ autoPatchelfHook rpm ];
+
+    installPhase = ''
+      cd plugins
+      ${rpm}/bin/rpm2cpio iscan-plugin-gt-x750-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+      mkdir $out
+      cp -r usr/share $out
+      cp -r usr/lib64 $out/lib
+      mv $out/share/iscan $out/share/esci
+      mv $out/lib/iscan $out/lib/esci
+    '';
+
+    passthru = {
+      registrationCommand = ''
+        $registry --add interpreter usb 0x04b8 0x0119 "$plugin/lib/esci/libesint54 $plugin/share/esci/esfw54.bin"
+      '';
+      hw = "GT-X750, Perfection 4490";
+    };
+    meta = common_meta // { description = "iscan GT-X750 for " + passthru.hw; };
+  };
+  network = stdenv.mkDerivation rec {
+    pname = "iscan-nt-bundle";
+    # for the version, look for the driver of XP-750 in the search page
+    version = "2.30.4";
+
+    buildInputs = [ stdenv.cc.cc.lib ];
+    nativeBuildInputs = [ autoPatchelfHook ];
+
+    src = fetchurl {
+      urls = [
+        "https://download2.ebz.epson.net/iscan/general/rpm/x64/iscan-bundle-${version}.x64.rpm.tar.gz"
+        "https://web.archive.org/web/https://download2.ebz.epson.net/iscan/general/rpm/x64/iscan-bundle-${version}.x64.rpm.tar.gz"
+      ];
+      sha256 = "0jssigsgkxb9i7qa7db291a1gbvwl795i4ahvb7bnqp33czkj85k";
+    };
+    installPhase = ''
+      cd plugins
+      ${rpm}/bin/rpm2cpio iscan-network-nt-*.x86_64.rpm | ${cpio}/bin/cpio -idmv
+
+      mkdir $out
+      cp -r usr/share $out
+      cp -r usr/lib64 $out/lib
+      mkdir $out/share/esci
+    '';
+    passthru = {
+      registrationCommand = "";
+      hw = "network";
+    };
+
+    meta = common_meta // { description = "iscan network plugin"; };
+  };
+};
+in
+let fwdir = symlinkJoin {
+  name = "esci-firmware-dir";
+  paths = lib.mapAttrsToList (name: value: value + /share/esci) plugins;
+};
+in
+let iscan-data = stdenv.mkDerivation rec {
+  pname = "iscan-data";
+  version = "1.39.2-1";
+
+  src = fetchurl {
+    urls = [
+      "http://support.epson.net/linux/src/scanner/iscan/iscan-data_${version}.tar.gz"
+      "https://web.archive.org/web/http://support.epson.net/linux/src/scanner/iscan/iscan-data_${version}.tar.gz"
+    ];
+    sha256 = "092qhlnjjgz11ifx6mng7mz20i44gc0nlccrbmw18xr5hipbqqka";
+  };
+
+  buildInputs = [
+    libxslt
+  ];
+
+  meta = common_meta;
+};
+in
+stdenv.mkDerivation rec {
+  pname = "iscan";
+  version = "2.30.4-2";
+
+  src = fetchurl {
+    urls = [
+      "http://support.epson.net/linux/src/scanner/iscan/iscan_${version}.tar.gz"
+      "https://web.archive.org/web/http://support.epson.net/linux/src/scanner/iscan/iscan_${version}.tar.gz"
+    ];
+    sha256 = "1ma76jj0k3bz0fy06fiyl4di4y77rcryb0mwjmzs5ms2vq9rjysr";
+  };
+
+  nativeBuildInputs = [ pkg-config libtool makeWrapper ];
+  buildInputs = [
+    gtk2
+    libxml2
+    libusb-compat-0_1
+    sane-backends
+  ];
+
+  patches = [
+    # Patch for compatibility with libpng versions greater than 10499
+    (fetchpatch {
+      urls = [
+        "https://gitweb.gentoo.org/repo/gentoo.git/plain/media-gfx/iscan/files/iscan-2.28.1.3+libpng-1.5.patch?h=b6e4c805d53b49da79a0f64ef16bb82d6d800fcf"
+        "https://web.archive.org/web/https://gitweb.gentoo.org/repo/gentoo.git/plain/media-gfx/iscan/files/iscan-2.28.1.3+libpng-1.5.patch?h=b6e4c805d53b49da79a0f64ef16bb82d6d800fcf"
+      ];
+      sha256 = "04y70qjd220dpyh771fiq50lha16pms98mfigwjczdfmx6kpj1jd";
+    })
+    # Patch iscan to search appropriate folders for firmware files
+    ./firmware_location.patch
+    # Patch deprecated use of sscanf code to use a more modern C99 compatible version
+    ./sscanf.patch
+  ];
+  patchFlags = [ "-p0" ];
+
+  configureFlags = [ "--enable-dependency-reduction" "--disable-frontend" ];
+
+  postConfigure = ''
+    echo '#define NIX_ESCI_PREFIX "'${fwdir}'"' >> config.h
+  '';
+
+  postInstall = ''
+    mkdir -p $out/etc/sane.d
+    cp backend/epkowa.conf $out/etc/sane.d
+    echo "epkowa" > $out/etc/sane.d/dll.conf
+    ln -s ${iscan-data}/share/iscan-data $out/share/iscan-data
+    mkdir -p $out/lib/iscan
+    ln -s ${plugins.network}/lib/iscan/network $out/lib/iscan/network
+  '';
+  postFixup = ''
+    # iscan-registry is a shell script requiring getopt
+    wrapProgram $out/bin/iscan-registry --prefix PATH : ${getopt}/bin
+    registry=$out/bin/iscan-registry;
+  '' +
+  lib.concatStrings (lib.mapAttrsToList
+    (name: value: ''
+      plugin=${value};
+      ${value.passthru.registrationCommand}
+    '')
+    plugins);
+  meta = common_meta // {
+    description = "sane-epkowa backend for some epson scanners";
+    longDescription = ''
+      Includes gui-less iscan (aka. Image Scan! for Linux).
+      Supported hardware: at least :
+    '' +
+    lib.concatStringsSep ", " (lib.mapAttrsToList (name: value: value.passthru.hw) plugins);
+    maintainers = with lib.maintainers; [ symphorien dominikh ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/epkowa/firmware_location.patch b/nixpkgs/pkgs/misc/drivers/epkowa/firmware_location.patch
new file mode 100644
index 000000000000..0f723a4ff9d7
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epkowa/firmware_location.patch
@@ -0,0 +1,21 @@
+Explanation:
+in libesci-interpreter-gt-f720.so in
+libesci_interpreter_gt_f720_342::libesci_interpreter_gt_f720_348 at 0xdf74: the
+binary blob esfw8b.bin is searched either in /usr/share/esci/ or in
+$ESCI_FIRMWARE_DIR. But since this library is to be used wia libsane.so in
+every binary in the system, we can't wrapProgram the relevant executables to
+set this environment variable. Instead, we patch iscan to set this variable
+before loading libesci-interpreter-gt-f720.so.
+--- backend/channel-usb.c.orig	2017-08-14 11:24:27.669582456 +0200
++++ backend/channel-usb.c	2017-08-14 11:31:40.509010897 +0200
+@@ -169,6 +169,10 @@
+ {
+   SANE_Status s;
+ 
++  setenv("ESCI_FIRMWARE_DIR", NIX_ESCI_PREFIX, 1);
++  setenv("ISCAN_FW_DIR", NIX_ESCI_PREFIX, 1);
++  setenv("ISCAN_FIRMWARE_DIR", NIX_ESCI_PREFIX, 1);
++
+   s = sanei_usb_open (self->name, &self->fd);
+ 
+   if (SANE_STATUS_GOOD == s)
diff --git a/nixpkgs/pkgs/misc/drivers/epkowa/sscanf.patch b/nixpkgs/pkgs/misc/drivers/epkowa/sscanf.patch
new file mode 100644
index 000000000000..7bee9cae5180
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epkowa/sscanf.patch
@@ -0,0 +1,29 @@
+The "%as" verb requests sscanf to allocate a buffer for us. However,
+this use of 'a' has been long deprecated, and gcc doesn't support it
+in this manner when using -std=c99. The modern replacement is "%ms".
+
+Without this change, iscan couldn't read the interpreter file, in turn
+breaking all scanners that require plugins.
+--- backend/cfg-obj.c.orig	2020-03-19 01:27:17.254762077 +0100
++++ backend/cfg-obj.c	2020-03-19 02:01:52.293329873 +0100
+@@ -1026,7 +1026,7 @@
+       char *vendor = NULL;
+       char *model  = NULL;
+ 
+-      sscanf (string, "%*s %as %as", &vendor, &model);
++      sscanf (string, "%*s %ms %ms", &vendor, &model);
+ 
+       if (list_append (_cfg->seen[CFG_KEY_SCSI], info))
+         {
+@@ -1108,10 +1112,10 @@
+       char *library  = NULL;
+       char *firmware = NULL;
+ 
+-      sscanf (string, "%*s %*s %x %x %as %as",
++      sscanf (string, "%*s %*s %x %x %ms %ms",
+               &vendor, &product, &library, &firmware);
+ 
+       if (library && _cfg_have_interpreter (library, firmware)
+           && list_append (_cfg->seen[CFG_KEY_INTERPRETER], info))
+         {
+ 
diff --git a/nixpkgs/pkgs/misc/drivers/epson-201106w/default.nix b/nixpkgs/pkgs/misc/drivers/epson-201106w/default.nix
new file mode 100644
index 000000000000..a5a32644c3a5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-201106w/default.nix
@@ -0,0 +1,77 @@
+{ lib, stdenv, fetchurl, rpmextract, autoreconfHook, file, libjpeg, cups }:
+
+let
+  version = "1.0.1";
+  filterVersion = "1.0.0";
+in
+  stdenv.mkDerivation {
+
+    pname = "epson-201106w";
+    inherit version;
+
+    src = fetchurl {
+      # NOTE: Don't forget to update the webarchive link too!
+      urls = [
+        "https://download.ebz.epson.net/dsc/op/stable/SRPMS/epson-inkjet-printer-201106w-${version}-1lsb3.2.src.rpm"
+        "https://web.archive.org/web/https://download.ebz.epson.net/dsc/op/stable/SRPMS/epson-inkjet-printer-201106w-${version}-1lsb3.2.src.rpm"
+      ];
+
+      sha256 = "1yig1xrh1ikblbp7sx706n5nnc237wy4mbch23ymy6akbgqg4aig";
+    };
+
+    nativeBuildInputs = [ rpmextract autoreconfHook file ];
+
+    buildInputs = [ libjpeg cups ];
+
+    unpackPhase = ''
+      rpmextract $src
+      tar -zxf epson-inkjet-printer-201106w-${version}.tar.gz
+      tar -zxf epson-inkjet-printer-filter-${filterVersion}.tar.gz
+      for ppd in epson-inkjet-printer-201106w-${version}/ppds/*; do
+        substituteInPlace $ppd --replace "/opt/epson-inkjet-printer-201106w" "$out"
+        substituteInPlace $ppd --replace "/cups/lib" "/lib/cups"
+      done
+      cd epson-inkjet-printer-filter-${filterVersion}
+    '';
+
+    preConfigure = ''
+      chmod +x configure
+      export LDFLAGS="$LDFLAGS -Wl,--no-as-needed"
+    '';
+
+    postInstall = ''
+      cd ../epson-inkjet-printer-201106w-${version}
+      cp -a lib64 resource watermark $out
+      mkdir -p $out/share/cups/model/epson-inkjet-printer-201106w
+      cp -a ppds $out/share/cups/model/epson-inkjet-printer-201106w/
+      cp -a Manual.txt $out/doc/
+      cp -a README $out/doc/README.driver
+    '';
+
+    meta = with lib; {
+      homepage = "https://www.openprinting.org/driver/epson-201106w";
+      description = "Epson printer driver (BX535WD, BX630FW, BX635FWD, ME940FW, NX530, NX635, NX635, SX535WD, WorkForce 545, WorkForce 645";
+      longDescription = ''
+        This software is a filter program used with the Common UNIX Printing
+        System (CUPS) under Linux. It supplies high quality printing with
+        Seiko Epson Color Ink Jet Printers.
+        List of printers supported by this package:
+          Epson BX535WD Series
+          Epson BX630FW Series
+          Epson BX635FWD Series
+          Epson ME940FW Series
+          Epson NX530 Series
+          Epson SX535WD Series
+          Epson WorkForce 545 Series
+          Epson WorkForce 645 Series
+        To use the driver adjust your configuration.nix file:
+          services.printing = {
+            enable = true;
+            drivers = [ pkgs.epson-201106w ];
+          };
+      '';
+      license = with licenses; [ lgpl21 epson ];
+      platforms = platforms.linux;
+      maintainers = [ maintainers.nphilou ];
+    };
+  }
diff --git a/nixpkgs/pkgs/misc/drivers/epson-201401w/default.nix b/nixpkgs/pkgs/misc/drivers/epson-201401w/default.nix
new file mode 100644
index 000000000000..cffa631cfe33
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-201401w/default.nix
@@ -0,0 +1,67 @@
+{ lib, stdenv, fetchurl, rpmextract, autoreconfHook, file, libjpeg, cups }:
+
+let
+  version = "1.0.0";
+  filterVersion = "1.0.0";
+in stdenv.mkDerivation {
+  pname = "epson-201401w";
+  inherit version;
+
+  src = fetchurl {
+    # NOTE: Don't forget to update the webarchive link too!
+    urls = [
+      "https://download3.ebz.epson.net/dsc/f/03/00/03/45/41/92e9c9254f0ee4230a069545ba27ec2858a2c457/epson-inkjet-printer-201401w-1.0.0-1lsb3.2.src.rpm"
+      "https://web.archive.org/web/20200725175832/https://download3.ebz.epson.net/dsc/f/03/00/03/45/41/92e9c9254f0ee4230a069545ba27ec2858a2c457/epson-inkjet-printer-201401w-1.0.0-1lsb3.2.src.rpm"
+    ];
+    sha256 = "0c60m1sd59s4sda38dc5nniwa7dh1b0kv1maajr0x9d38gqlyk3x";
+  };
+  patches = [ ./fixbuild.patch ];
+
+  nativeBuildInputs = [ rpmextract autoreconfHook file ];
+
+  buildInputs = [ libjpeg cups ];
+
+  unpackPhase = ''
+    rpmextract $src
+    tar -zxf epson-inkjet-printer-201401w-${version}.tar.gz
+    tar -zxf epson-inkjet-printer-filter-${filterVersion}.tar.gz
+    for ppd in epson-inkjet-printer-201401w-${version}/ppds/*; do
+      substituteInPlace $ppd --replace "/opt/epson-inkjet-printer-201401w" "$out"
+      substituteInPlace $ppd --replace "/cups/lib" "/lib/cups"
+    done
+    cd epson-inkjet-printer-filter-${filterVersion}
+  '';
+
+  preConfigure = ''
+    chmod +x configure
+  '';
+
+  postInstall = ''
+    cd ../epson-inkjet-printer-201401w-${version}
+    cp -a lib64 resource watermark $out
+    mkdir -p $out/share/cups/model/epson-inkjet-printer-201401w
+    cp -a ppds $out/share/cups/model/epson-inkjet-printer-201401w/
+    cp -a Manual.txt $out/doc/
+    cp -a README $out/doc/README.driver
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.openprinting.org/driver/epson-201401w";
+    description =
+      "Epson printer driver (L456, L455, L366, L365, L362, L360, L312, L310, L222, L220, L132, L130)";
+    longDescription = ''
+      This software is a filter program used with the Common UNIX Printing
+      System (CUPS) under Linux. It supplies high quality printing with
+      Seiko Epson Color Ink Jet Printers.
+
+      To use the driver adjust your configuration.nix file:
+        services.printing = {
+          enable = true;
+          drivers = [ pkgs.epson-201401w ];
+        };
+    '';
+    license = with licenses; [ lgpl21 epson ];
+    platforms = platforms.linux;
+    maintainers = [ maintainers.lunarequest ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/epson-201401w/fixbuild.patch b/nixpkgs/pkgs/misc/drivers/epson-201401w/fixbuild.patch
new file mode 100644
index 000000000000..4baa029a5739
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-201401w/fixbuild.patch
@@ -0,0 +1,101 @@
+diff --git a/src/pagemanager/pagemanager.c b/src/pagemanager/pagemanager.c
+index 029e6d3..3c1f450 100644
+--- a/src/pagemanager/pagemanager.c
++++ b/src/pagemanager/pagemanager.c
+@@ -22,7 +22,7 @@
+ #include "epcgdef.h"
+ #include "debuglog.h"
+ #include "memory.h"
+-#include "raster.h"
++#include "raster-helper.h"
+ #include "pagemanager.h"
+
+ extern int JobCanceled;
+@@ -45,7 +45,7 @@ fetchRaster(EpsPageManager *pageManager)
+ 	int error = 0;
+ 	int did_fetch = 0;
+ 	int read_bytes = 0;
+-	int nraster;
++	size_t nraster;
+
+ 	while (error == 0 && did_fetch == 0 && JobCanceled == 0) {
+ 		eps_raster_fetch(privateData->raster_h, NULL, 0, 0, &status);
+@@ -212,7 +212,7 @@ int pageManagerGetPageRegion(EpsPageManager *pageManager, EpsPageRegion *pageReg
+ 	return EPS_OK;
+ }
+
+-int pageManagerGetRaster(EpsPageManager *pageManager, char *buf, int bufSize)
++size_t pageManagerGetRaster(EpsPageManager *pageManager, char *buf, int bufSize)
+ {
+ 	PageManagerPrivateData  *privateData = NULL;
+ 	int error = EPS_OK;
+diff --git a/src/pagemanager/pagemanager.h b/src/pagemanager/pagemanager.h
+index 87fbbd5..c9743fb 100644
+--- a/src/pagemanager/pagemanager.h
++++ b/src/pagemanager/pagemanager.h
+@@ -31,7 +31,7 @@ extern "C"
+ #define	EPS_ERROR	-1
+ #define	EPS_OK		0
+
+-typedef int (*EpsRasterSource)(char *buf, int bufSize);
++typedef size_t (*EpsRasterSource)(char *buf, int bufSize);
+
+ typedef struct {
+ 	EpsRasterSource		rasterSource;
+@@ -47,7 +47,7 @@ typedef struct {
+ EpsPageManager* pageManagerCreate(EpsPageRegion pageRegion, EpsFilterPrintOption filterPrintOption, EpsRasterSource rasterSource);
+ void pageManagerDestroy(EpsPageManager *pageManager);
+ int pageManagerGetPageRegion(EpsPageManager *pageManager, EpsPageRegion *pageRegion);
+-int pageManagerGetRaster(EpsPageManager *pageManager, char *buf, int bufSize);
++size_t pageManagerGetRaster(EpsPageManager *pageManager, char *buf, int bufSize);
+ int pageManagerIsNextPage(EpsPageManager *pageManager);
+
+ #ifdef __cplusplus
+diff --git a/src/raster/raster.c b/src/raster/raster.c
+index 7e4946b..dd5aef6 100644
+--- a/src/raster/raster.c
++++ b/src/raster/raster.c
+@@ -218,7 +218,7 @@ eps_raster_init (RASTER * handle, EpsRasterOpt * data, EpsRasterPipeline * pipel
+
+ /* if raster_p equals NULL means that it is need to flush a page. */
+ int
+-eps_raster_print (RASTER handle, char * raster_p, int raster_bytes, int pixel_num, int * outraster)
++eps_raster_print (RASTER handle, char * raster_p, int raster_bytes, int pixel_num, size_t * outraster)
+ {
+ 	EpsRaster * raster = (EpsRaster *) handle;
+ 	EpsRasterPipeline * pipeline = NULL;
+diff --git a/src/raster/raster.h b/src/raster/raster.h
+index 9be0977..cc5054d 100644
+--- a/src/raster/raster.h
++++ b/src/raster/raster.h
+@@ -143,7 +143,7 @@ typedef enum {
+ } EpsRasterFetchStatus;
+
+ int eps_raster_init (RASTER *, EpsRasterOpt *, EpsRasterPipeline *);
+-int eps_raster_print (RASTER, char *, int, int, int *);
++int eps_raster_print (RASTER, char *, int, int, size_t *);
+ int eps_raster_fetch (RASTER, char *, int, int, EpsRasterFetchStatus *);
+ int eps_raster_free (RASTER);
+
+diff --git a/src/raster_to_epson.c b/src/raster_to_epson.c
+index 6e621c8..a0811d6 100644
+--- a/src/raster_to_epson.c
++++ b/src/raster_to_epson.c
+@@ -33,7 +33,7 @@
+ #include <cups/ppd.h>
+ #include <cups/raster.h>
+
+-#include "raster.h"
++#include "raster-helper.h"
+ #include "memory.h"
+ #include "raster_to_epson.h"
+ #include "pagemanager.h"
+@@ -75,7 +75,7 @@ static int page_no = 0;
+ static int pageHeight = 0;
+ #endif
+
+-int rasterSource(char *buf, int bufSize)
++size_t rasterSource(char *buf, int bufSize)
+ {
+ 	int readBytes = 0;
+ 	if (JobCanceled == 0) {
diff --git a/nixpkgs/pkgs/misc/drivers/epson-alc1100/cups-data-dir.patch b/nixpkgs/pkgs/misc/drivers/epson-alc1100/cups-data-dir.patch
new file mode 100644
index 000000000000..2277a9afcccf
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-alc1100/cups-data-dir.patch
@@ -0,0 +1,13 @@
+diff --git a/configure b/configure
+index 0053441..9a6b855 100755
+--- a/configure
++++ b/configure
+@@ -2833,7 +2833,7 @@ if test $have_cups_config = yes; then
+    CUPS_LIBS=`cups-config --libs`
+    CUPS_IMAGE_LIBS=`cups-config --image --libs`
+    CUPS_SERVER_DIR=`cups-config --serverbin`
+-   CUPS_DATA_DIR=`cups-config --datadir`
++   CUPS_DATA_DIR="${prefix}/share/cups"
+ else
+    { { echo "$as_me:$LINENO: error: *** 'cups-config' missing, please install CUPS or fix your \$PATH ***" >&5
+ echo "$as_me: error: *** 'cups-config' missing, please install CUPS or fix your \$PATH ***" >&2;}
diff --git a/nixpkgs/pkgs/misc/drivers/epson-alc1100/default.nix b/nixpkgs/pkgs/misc/drivers/epson-alc1100/default.nix
new file mode 100644
index 000000000000..f39fb0ad1704
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-alc1100/default.nix
@@ -0,0 +1,72 @@
+{ lib, stdenv, fetchurl, cups, pkgsi686Linux, dpkg, psutils, makeWrapper, ghostscript, bash }:
+
+let
+  version = "1.2-0";
+
+  libstdcpp5 = fetchurl {
+    url = "mirror://ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-17ubuntu1_i386.deb";
+    sha256 = "10f8zcmqaa7skvg2bz94mnlgqpan4iscvi8913r6iawjh7hiisjy";
+  };
+in
+  stdenv.mkDerivation {
+    pname = "epson-alc1100";
+    inherit version;
+
+    src = fetchurl {
+      url = "https://download3.ebz.epson.net/dsc/f/03/00/11/33/07/4027e99517b5c388d444b8444d719b4b77f7e9db/Epson-ALC1100-filter-1.2.tar.gz";
+      sha256 = "1dfw75a3kj2aa4iicvlk9kz3jarrsikpnpd4cdpw79scfc5mwm2p";
+    };
+
+    patches = [ ./cups-data-dir.patch ./ppd.patch ];
+
+    nativeBuildInputs = [ dpkg makeWrapper ];
+
+    buildInputs = [ cups pkgsi686Linux.glibc psutils ghostscript bash ];
+
+    postUnpack = ''
+      dpkg -x ${libstdcpp5} libstdcpp5_i386;
+
+      mkdir -p $out/lib;
+
+      mv libstdcpp5_i386/usr/lib/* $out/lib;
+    '';
+
+    postFixup = ''
+      patchelf --set-interpreter ${pkgsi686Linux.glibc}/lib/ld-linux.so.2 \
+        --set-rpath "${lib.makeLibraryPath [
+          pkgsi686Linux.glibc
+          "$out"
+        ]}" $out/bin/alc1100
+
+      patchelf --set-rpath "${lib.makeLibraryPath [
+          pkgsi686Linux.glibc
+        ]}" $out/lib/libstdc++.so.5.0.7
+
+      wrapProgram $out/bin/alc1100_lprwrapper.sh \
+        --suffix PATH : "\$PATH:${psutils}/bin:/var/lib/cups/path/bin"
+
+      wrapProgram $out/bin/pstoalc1100.sh \
+        --suffix PATH : "\$PATH:${psutils}/bin:${ghostscript}/bin:${bash}/bin:/var/lib/cups/path/bin"
+    '';
+
+    meta = with lib; {
+      homepage = "http://download.ebz.epson.net/dsc/search/01/search/";
+      description = "Epson AcuLaser C1100 Driver";
+      longDescription = ''
+        This package provides a print filter for printing to EPSON AL-C1100
+        printers on Linux systems.
+
+        To use the driver adjust your configuration.nix file:
+          services.printing = {
+            enable = true;
+            drivers = [ pkgs.epson-alc1100 ];
+          };
+      '';
+
+      sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+      license = with licenses; [ mit eapl ];
+      maintainers = [ maintainers.eperuffo ];
+      platforms = platforms.linux;
+    };
+
+  }
diff --git a/nixpkgs/pkgs/misc/drivers/epson-alc1100/ppd.patch b/nixpkgs/pkgs/misc/drivers/epson-alc1100/ppd.patch
new file mode 100644
index 000000000000..71d86668f53d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-alc1100/ppd.patch
@@ -0,0 +1,13 @@
+diff --git a/ppd/Epson-AL-C1100-fm3.ppd b/ppd/Epson-AL-C1100-fm3.ppd
+index 75c7fff..ecd04c8 100644
+--- a/ppd/Epson-AL-C1100-fm3.ppd
++++ b/ppd/Epson-AL-C1100-fm3.ppd
+@@ -68,7 +68,7 @@
+ *%*********** Foomatic Configulations ************
+ *%pprRIP:        foomatic-rip other
+ *FoomaticIDs: Epson-AL-C1100 alc1100
+-*FoomaticRIPCommandLine: "pstoalc1100.sh %C"
++*FoomaticRIPCommandLine: "/var/lib/cups/path/bin/pstoalc1100.sh %C"
+ 
+ *%**************** Paper Handling ******************
+ 
diff --git a/nixpkgs/pkgs/misc/drivers/epson-escpr/cups-filter-ppd-dirs.patch b/nixpkgs/pkgs/misc/drivers/epson-escpr/cups-filter-ppd-dirs.patch
new file mode 100644
index 000000000000..b9f198b14b74
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-escpr/cups-filter-ppd-dirs.patch
@@ -0,0 +1,62 @@
+diff --git a/configure b/configure_new
+index 12b4662..6ec641c 100755
+--- a/configure
++++ b/configure_new
+@@ -12162,55 +12162,8 @@ else
+ $as_echo "no" >&6; }
+ fi
+ 
+-
+-
+-if test "xNONE" != "x${prefix}" ; then
+-   cups_default_prefix="${prefix}"
+-else
+-   cups_default_prefix="${ac_default_prefix}"
+-fi
+-
+-
+-# Check whether --with-cupsfilterdir was given.
+-if test "${with_cupsfilterdir+set}" = set; then :
+-  withval=$with_cupsfilterdir;
+-else
+-  with_cupsfilterdir=no
+-fi
+-
+-if test "xno" = "x${with_cupsfilterdir}"; then
+-   if test "xyes" = "x$have_cups_config" ; then
+-            CUPS_FILTER_DIR="${cups_default_prefix}`cups-config --serverbin | sed -e 's,^/[^/][^/]*,,'`/filter"
+-   else
+-      CUPS_FILTER_DIR="${cups_default_prefix}/lib/cups/filter"
+-   fi
+-else
+-   CUPS_FILTER_DIR="${with_cupsfilterdir}"
+-fi
+-
+-
+-# Check whether --with-cupsppddir was given.
+-if test "${with_cupsppddir+set}" = set; then :
+-  withval=$with_cupsppddir;
+-else
+-  with_cupsppddir=no
+-fi
+-
+-if test "xno" = "x${with_cupsppddir}"; then
+-   if test -d "${cups_default_prefix}/share/ppd" ; then
+-      CUPS_PPD_DIR="${cups_default_prefix}/share/ppd"
+-   elif test "xyes" = "x$have_cups_config" ; then
+-            CUPS_PPD_DIR="${cups_default_prefix}`cups-config --datadir | sed -e 's,^/[^/][^/]*,,'`/model"
+-   else
+-      CUPS_PPD_DIR="${cups_default_prefix}/share/cups/model"
+-   fi
+-else
+-   CUPS_PPD_DIR="${with_cupsppddir}"
+-fi
+-
+-
+-
+-
++CUPS_FILTER_DIR="${prefix}/lib/cups/filter"
++CUPS_PPD_DIR="${prefix}/share/cups/model"
+ 
+ # Check whether --enable-lsb was given.
+ if test "${enable_lsb+set}" = set; then :
diff --git a/nixpkgs/pkgs/misc/drivers/epson-escpr/default.nix b/nixpkgs/pkgs/misc/drivers/epson-escpr/default.nix
new file mode 100644
index 000000000000..40e6c7b3b18b
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-escpr/default.nix
@@ -0,0 +1,51 @@
+{ lib, stdenv, fetchurl, cups }:
+
+let version = "1.7.20";
+in stdenv.mkDerivation {
+  pname = "epson-escpr";
+  inherit version;
+
+  src = fetchurl {
+    # To find new versions, visit
+    # http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX and search for
+    # some printer like for instance "WF-7110" to get to the most recent
+    # version.
+    # NOTE: Don't forget to update the webarchive link too!
+    urls = [
+      "https://download3.ebz.epson.net/dsc/f/03/00/13/76/45/5ac2ea8f9cf94a48abd64afd0f967f98c4fc24aa/epson-inkjet-printer-escpr-${version}-1lsb3.2.tar.gz"
+
+      "https://web.archive.org/web/https://download3.ebz.epson.net/dsc/f/03/00/13/76/45/5ac2ea8f9cf94a48abd64afd0f967f98c4fc24aa/epson-inkjet-printer-escpr-${version}-1lsb3.2.tar.gz"
+    ];
+    sha256 = "sha256:09rscpm557dgaflylr93wcwmyn6fnvr8nc77abwnq97r6hxwrkhk";
+  };
+
+  patches = [ ./cups-filter-ppd-dirs.patch ];
+
+  buildInputs = [ cups ];
+
+  meta = with lib; {
+    homepage = "http://download.ebz.epson.net/dsc/search/01/search/";
+    description = "ESC/P-R Driver (generic driver)";
+    longDescription = ''
+      Epson Inkjet Printer Driver (ESC/P-R) for Linux and the
+      corresponding PPD files. The list of supported printers
+      can be found at http://www.openprinting.org/driver/epson-escpr/ .
+
+      To use the driver adjust your configuration.nix file:
+        services.printing = {
+          enable = true;
+          drivers = [ pkgs.epson-escpr ];
+        };
+
+      To setup a wireless printer, enable Avahi which provides
+      printer's hostname to CUPS and nss-mdns to make this
+      hostname resolvable:
+        services.avahi = {
+          enable = true;
+          nssmdns = true;
+        };'';
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ artuuge ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/epson-escpr2/cups-filter-ppd-dirs.patch b/nixpkgs/pkgs/misc/drivers/epson-escpr2/cups-filter-ppd-dirs.patch
new file mode 100644
index 000000000000..02897f4f44d9
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-escpr2/cups-filter-ppd-dirs.patch
@@ -0,0 +1,55 @@
+diff --git a/configure.orig b/configure
+index e9d400f..dac1943 100755
+--- a/configure.orig
++++ b/configure
+@@ -12184,48 +12184,8 @@ esac
+ #	*)		ESCPR_LIB_NAME="escpr2_32" ;;
+ #esac
+ 
+-
+-
+-# Check whether --with-cupsfilterdir was given.
+-if test "${with_cupsfilterdir+set}" = set; then :
+-  withval=$with_cupsfilterdir;
+-else
+-  with_cupsfilterdir=no
+-fi
+-
+-if test "xno" = "x${with_cupsfilterdir}"; then
+-   if test "xyes" = "x$have_cups_config" ; then
+-            CUPS_FILTER_DIR="${cups_default_prefix}`cups-config --serverbin | sed -e 's,^/[^/][^/]*,,'`/filter"
+-   else
+-      CUPS_FILTER_DIR="${cups_default_prefix}/lib/cups/filter"
+-   fi
+-else
+-   CUPS_FILTER_DIR="${with_cupsfilterdir}"
+-fi
+-
+-
+-# Check whether --with-cupsppddir was given.
+-if test "${with_cupsppddir+set}" = set; then :
+-  withval=$with_cupsppddir;
+-else
+-  with_cupsppddir=no
+-fi
+-
+-if test "xno" = "x${with_cupsppddir}"; then
+-   if test -d "${cups_default_prefix}/share/ppd" ; then
+-      CUPS_PPD_DIR="${cups_default_prefix}/share/ppd"
+-   elif test "xyes" = "x$have_cups_config" ; then
+-            CUPS_PPD_DIR="${cups_default_prefix}`cups-config --datadir | sed -e 's,^/[^/][^/]*,,'`/model"
+-   else
+-      CUPS_PPD_DIR="${cups_default_prefix}/share/cups/model"
+-   fi
+-else
+-   CUPS_PPD_DIR="${with_cupsppddir}"
+-fi
+-
+-
+-
+-
++CUPS_FILTER_DIR="${prefix}/lib/cups/filter"
++CUPS_PPD_DIR="${prefix}/share/cups/model"
+ 
+ # Check whether --enable-lsb was given.
+ if test "${enable_lsb+set}" = set; then :
diff --git a/nixpkgs/pkgs/misc/drivers/epson-escpr2/default.nix b/nixpkgs/pkgs/misc/drivers/epson-escpr2/default.nix
new file mode 100644
index 000000000000..02553d5a9ebf
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-escpr2/default.nix
@@ -0,0 +1,44 @@
+{ lib, stdenv, fetchurl, cups, busybox }:
+
+stdenv.mkDerivation rec {
+  pname = "epson-inkjet-printer-escpr2";
+  version = "1.1.49";
+
+  src = fetchurl {
+    # To find new versions, visit
+    # http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX and search for
+    # some printer like for instance "WF-7210" to get to the most recent
+    # version.
+    url = "https://download3.ebz.epson.net/dsc/f/03/00/13/76/47/16f624dc1dfad10c3b4eb141c50c651a6360f69a/epson-inkjet-printer-escpr2-1.1.49-1lsb3.2.src.rpm";
+    sha256 = "sha256-WKDOpS7YL7J/IaNQcTjcoyXNXJGOuEexopdhYFubf50=";
+  };
+
+  unpackPhase = ''
+    runHook preUnpack
+
+    rpm2cpio $src | cpio -idmv
+    tar xvf ${pname}-${version}-1lsb3.2.tar.gz
+    cd ${pname}-${version}
+
+    runHook postUnpack
+  '';
+
+  patches = [ ./cups-filter-ppd-dirs.patch ];
+
+  buildInputs = [ cups ];
+  nativeBuildInputs = [ busybox ];
+
+  meta = with lib; {
+    homepage = "http://download.ebz.epson.net/dsc/search/01/search/";
+    description = "ESC/P-R 2 Driver (generic driver)";
+    longDescription = ''
+      Epson Inkjet Printer Driver 2 (ESC/P-R 2) for Linux and the
+      corresponding PPD files.
+
+      Refer to the description of epson-escpr for usage.
+    '';
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ ma9e ma27 ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/epson-workforce-635-nx625-series/default.nix b/nixpkgs/pkgs/misc/drivers/epson-workforce-635-nx625-series/default.nix
new file mode 100644
index 000000000000..7a467ac1ad39
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson-workforce-635-nx625-series/default.nix
@@ -0,0 +1,102 @@
+{
+  autoreconfHook, cups, libjpeg, rpmextract,
+  fetchurl, lib, stdenv
+}:
+
+let
+  srcdirs = {
+    filter = "epson-inkjet-printer-filter-1.0.0";
+    driver = "epson-inkjet-printer-workforce-635-nx625-series-1.0.1";
+  };
+in stdenv.mkDerivation rec {
+  pname = "epson-inkjet-printer-workforce-635-nx625-series";
+  version = "1.0.1";
+
+  src = fetchurl {
+    # NOTE: Don't forget to update the webarchive link too!
+    urls = [
+      "https://download.ebz.epson.net/dsc/op/stable/SRPMS/${pname}-${version}-1lsb3.2.src.rpm"
+      "https://web.archive.org/web/https://download.ebz.epson.net/dsc/op/stable/SRPMS/${pname}-${version}-1lsb3.2.src.rpm"
+    ];
+    sha256 = "19nb2h0y9rvv6rg7j262f8sqap9kjvz8kmisxnjg1w0v19zb9zf2";
+  };
+  sourceRoot = srcdirs.filter;
+
+  nativeBuildInputs = [ autoreconfHook rpmextract ];
+  buildInputs = [ cups libjpeg ];
+
+  unpackPhase = ''
+    rpmextract "$src"
+    for i in ${lib.concatStringsSep " " (builtins.attrValues srcdirs)}; do
+        tar xvf "$i".tar.gz
+    done
+  '';
+
+  preConfigure = ''
+    chmod u+x configure
+  '';
+
+  installPhase =
+    let
+      filterdir = "$out/cups/lib/filter";
+      docdir  = "$out/share/doc";
+      ppddir  = "$out/share/cups/model/${pname}";
+      libdir =
+        if stdenv.system == "x86_64-linux"    then "lib64"
+        else if stdenv.system == "i686_linux" then "lib"
+        else throw "other platforms than i686_linux and x86_64-linux are not yet supported";
+    in ''
+      mkdir -p "$out" "${docdir}" "${filterdir}" "${ppddir}"
+      cp src/epson_inkjet_printer_filter "${filterdir}"
+
+      cd ../${srcdirs.driver}
+      for ppd in ppds/*; do
+          substituteInPlace "$ppd" --replace '/opt/${pname}' "$out"
+          gzip -c "$ppd" > "${ppddir}/''${ppd#*/}"
+      done
+      cp COPYING.EPSON README "${docdir}"
+      cp -r resource watermark ${libdir} "$out"
+    '';
+
+  meta = {
+    description = "Proprietary CUPS drivers for Epson inkjet printers";
+    longDescription = ''
+      This software is a filter program used with Common UNIX Printing
+      System (CUPS) from the Linux. This can supply the high quality print
+      with Seiko Epson Color Ink Jet Printers.
+
+      This printer driver is supporting the following printers.
+
+      WorkForce 60
+      WorkForce 625
+      WorkForce 630
+      WorkForce 633
+      WorkForce 635
+      WorkForce T42WD
+      Epson Stylus NX625
+      Epson Stylus SX525WD
+      Epson Stylus SX620FW
+      Epson Stylus TX560WD
+      Epson Stylus Office B42WD
+      Epson Stylus Office BX525WD
+      Epson Stylus Office BX625FWD
+      Epson Stylus Office TX620FWD
+      Epson ME OFFICE 82WD
+      Epson ME OFFICE 85ND
+      Epson ME OFFICE 900WD
+      Epson ME OFFICE 960FWD
+
+      License: LGPL and SEIKO EPSON CORPORATION SOFTWARE LICENSE AGREEMENT
+
+      To use the driver adjust your configuration.nix file:
+        services.printing = {
+          enable = true;
+          drivers = [ pkgs.${pname} ];
+        };
+    '';
+    downloadPage = "https://download.ebz.epson.net/dsc/du/02/DriverDownloadInfo.do?LG2=EN&CN2=&DSCMI=16857&DSCCHK=4334d3487503d7f916ccf5d58071b05b7687294f";
+    license = with lib.licenses; [ lgpl21 epson ];
+    maintainers = [ lib.maintainers.jorsn ];
+    platforms = [ "x86_64-linux" "i686-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/epson_201207w/default.nix b/nixpkgs/pkgs/misc/drivers/epson_201207w/default.nix
new file mode 100644
index 000000000000..d5c57b35c32e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epson_201207w/default.nix
@@ -0,0 +1,77 @@
+{ lib, stdenv, fetchurl, rpmextract, autoreconfHook, file, libjpeg, cups }:
+
+let
+  version = "1.0.0";
+in
+  stdenv.mkDerivation {
+
+    pname = "epson_201207w";
+    inherit version;
+
+    src = fetchurl {
+      # NOTE: Don't forget to update the webarchive link too!
+      urls = [
+        "https://download.ebz.epson.net/dsc/op/stable/SRPMS/epson-inkjet-printer-201207w-${version}-1lsb3.2.src.rpm"
+        "https://web.archive.org/web/https://download.ebz.epson.net/dsc/op/stable/SRPMS/epson-inkjet-printer-201207w-${version}-1lsb3.2.src.rpm"
+      ];
+      sha256 = "1ixnhn2dk83nh9v8sdivzgc2bm9z2phvsbx8bc6ainbjq6vn7lns";
+    };
+
+    nativeBuildInputs = [ rpmextract autoreconfHook file ];
+
+    buildInputs = [ libjpeg cups ];
+
+    unpackPhase = ''
+      rpmextract $src
+      tar -zxf epson-inkjet-printer-201207w-${version}.tar.gz
+      tar -zxf epson-inkjet-printer-filter-${version}.tar.gz
+      for ppd in epson-inkjet-printer-201207w-${version}/ppds/*; do
+        substituteInPlace $ppd --replace "/opt/epson-inkjet-printer-201207w" "$out"
+        substituteInPlace $ppd --replace "/cups/lib" "/lib/cups"
+      done
+      cd epson-inkjet-printer-filter-${version}
+    '';
+
+    preConfigure = ''
+      chmod +x configure
+      export LDFLAGS="$LDFLAGS -Wl,--no-as-needed"
+    '';
+
+    postInstall = ''
+      cd ../epson-inkjet-printer-201207w-${version}
+      cp -a lib64 resource watermark $out
+      mkdir -p $out/share/cups/model/epson-inkjet-printer-201207w
+      cp -a ppds $out/share/cups/model/epson-inkjet-printer-201207w/
+      cp -a Manual.txt $out/doc/
+      cp -a README $out/doc/README.driver
+    '';
+
+    meta = with lib; {
+      homepage = "https://www.openprinting.org/driver/epson-201207w";
+      description = "Epson printer driver (L110, L210, L300, L350, L355, L550, L555)";
+      longDescription = ''
+        This software is a filter program used with the Common UNIX Printing
+        System (CUPS) under Linux. It supplies high quality printing with
+        Seiko Epson Color Ink Jet Printers.
+
+        List of printers supported by this package:
+           Epson L110 Series
+           Epson L210 Series
+           Epson L300 Series
+           Epson L350 Series
+           Epson L355 Series
+           Epson L550 Series
+           Epson L555 Series
+
+        To use the driver adjust your configuration.nix file:
+          services.printing = {
+            enable = true;
+            drivers = [ pkgs.epson_201207w ];
+          };
+      '';
+      license = with licenses; [ lgpl21 epson ];
+      maintainers = [ maintainers.romildo ];
+      platforms = [ "x86_64-linux" ];
+    };
+
+  }
diff --git a/nixpkgs/pkgs/misc/drivers/epsonscan2/build.patch b/nixpkgs/pkgs/misc/drivers/epsonscan2/build.patch
new file mode 100644
index 000000000000..6a916511b84a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epsonscan2/build.patch
@@ -0,0 +1,91 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index a9daee7..7c6da08 100755
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -17,7 +17,6 @@
+ #  CMakeLists.txt -- template and derived ESC/I ESC/I-2 protocol commands
+ 
+ project (epsonscan2)
+-set (CMAKE_INSTALL_PREFIX "/usr")
+ cmake_minimum_required (VERSION 2.8.12.2)
+ 
+ include(GNUInstallDirs)
+@@ -86,7 +85,6 @@ set(COMMON_ETC_PATH ${CMAKE_INSTALL_FULL_SYSCONFDIR})
+ set(EPSON_WORK_PATH /tmp/epsonWork/)
+ set(EPSON_SETTINGS_PATH $ENV{HOME}/.epsonscan2/)
+ 
+-SET (CMAKE_INSTALL_PREFIX /usr)
+ set(EPSON_INSTALL_PATH ${CMAKE_INSTALL_FULL_LIBDIR}/epsonscan2/)
+ set(COMMON_SHARE_PATH ${CMAKE_INSTALL_FULL_DATAROOTDIR})
+ 
+@@ -113,8 +111,8 @@ add_subdirectory(src)
+ 
+ install(DIRECTORY Resources DESTINATION ${EPSON_INSTALL_ROOT}${EPSON_INSTALL_PATH})
+ 
+-install(FILES epsonscan2.rules DESTINATION ${EPSON_INSTALL_ROOT}/lib/udev/rules.d/ RENAME 60-epsonscan2.rules)
+-install(FILES epsonscan2 DESTINATION ${EPSON_INSTALL_ROOT}/etc/sane.d/dll.d)
++install(FILES epsonscan2.rules DESTINATION ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_PREFIX}/lib/udev/rules.d/ RENAME 60-epsonscan2.rules)
++install(FILES epsonscan2 DESTINATION ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_PREFIX}/etc/sane.d/dll.d)
+ install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_FULL_LIBDIR}/sane/)")
+ install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../epsonscan2/libsane-epsonscan2.so ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_FULL_LIBDIR}/sane/libsane-epsonscan2.so.1)")
+ install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink ../epsonscan2/libsane-epsonscan2.so ${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_FULL_LIBDIR}/sane/libsane-epsonscan2.so.1.0.0)")
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
+index c884d83..5ddff0c 100644
+--- a/src/CMakeLists.txt
++++ b/src/CMakeLists.txt
+@@ -26,7 +26,9 @@ add_subdirectory(ES2Command/Linux)
+ add_subdirectory(ES2FileFormat/Linux)
+ add_subdirectory(Controller)
+ add_subdirectory(SaneWrapper/Linux)
++if (NOT DEFINED NO_GUI)
+ add_subdirectory(Standalone)
+ add_subdirectory(DetectAlert)
++endif ()
+ add_subdirectory(ScanSDK)
+ 
+diff --git a/src/Controller/Src/Filter/GetOrientation.cpp b/src/Controller/Src/Filter/GetOrientation.cpp
+index 387561e..15448ad 100644
+--- a/src/Controller/Src/Filter/GetOrientation.cpp
++++ b/src/Controller/Src/Filter/GetOrientation.cpp
+@@ -12,14 +12,7 @@ namespace epsonscan
+ 
+ static std::string GetExecPath()
+ {
+-#ifdef AKBMODE
+-    std::string strDst = "/usr/libexec/";
+-    strDst = strDst + DRIVER_NAME;
+-    strDst = strDst + "-ocr/ocr-engine-getrotate";
+-    return strDst.c_str() ;
+-#else
+-    return "/usr/libexec/epsonscan2-ocr/ocr-engine-getrotate" ;
+-#endif
++    return "@OCR_ENGINE_GETROTATE@";
+ }
+ static const int kMaxBuf = 256;
+ 
+diff --git a/src/Controller/Src/Scanner/Engine.cpp b/src/Controller/Src/Scanner/Engine.cpp
+index 9489d4b..670bad9 100644
+--- a/src/Controller/Src/Scanner/Engine.cpp
++++ b/src/Controller/Src/Scanner/Engine.cpp
+@@ -263,8 +263,8 @@ SDIError Engine::Open()
+ 	//kill es2netif
+ 	//kill es2intif
+ 
+-	system("killall -9 -q es2netif > /dev/null");
+-	system("killall -9 -q es2intif > /dev/null");
++	system("@KILLALL@ -9 -q es2netif > /dev/null");
++	system("@KILLALL@ -9 -q es2intif > /dev/null");
+ 
+ 	if (engine_) {
+ 		return ExchangeError(engine_->Open());
+diff --git a/src/Standalone/CMakeLists.txt b/src/Standalone/CMakeLists.txt
+index eff3dd3..c2b3803 100644
+--- a/src/Standalone/CMakeLists.txt
++++ b/src/Standalone/CMakeLists.txt
+@@ -167,5 +167,5 @@ target_link_libraries(es2standalone ${QT_LIBRARIES}
+ )
+ 
+ QT5_USE_MODULES(es2standalone Widgets)
+-install(TARGETS es2standalone DESTINATION "${EPSON_INSTALL_ROOT}/usr/bin")
++install(TARGETS es2standalone DESTINATION "${EPSON_INSTALL_ROOT}${CMAKE_INSTALL_FULL_BINDIR}")
+ 
diff --git a/nixpkgs/pkgs/misc/drivers/epsonscan2/default.nix b/nixpkgs/pkgs/misc/drivers/epsonscan2/default.nix
new file mode 100644
index 000000000000..325cbbd8707c
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/epsonscan2/default.nix
@@ -0,0 +1,162 @@
+{ lib
+, stdenv
+, autoPatchelfHook
+, boost
+, cmake
+, copyDesktopItems
+, imagemagick
+, fetchpatch
+, fetchzip
+, killall
+, libjpeg
+, libpng
+, libtiff
+, libtool
+, libusb1
+, makeDesktopItem
+, qtbase
+, wrapQtAppsHook
+
+, withGui ? true
+, withNonFreePlugins ? false
+}:
+
+let
+  pname = "epsonscan2";
+  description = "Epson Scan 2 scanner driver for many modern Epson scanners and multifunction printers";
+  version = "6.7.61.0";
+
+  system = stdenv.hostPlatform.system;
+
+  src = fetchzip {
+    url = "https://download3.ebz.epson.net/dsc/f/03/00/14/53/67/1a6447b4acc5568dfd970feba0518fabea35bca2/epsonscan2-${version}-1.src.tar.gz";
+    hash = "sha256-xwvdgmV6Mrs1RC18U2mA+HlTYybeYb0V5lz5hCvC7+8=";
+  };
+  bundle = {
+    "i686-linux" = fetchzip {
+      name = "${pname}-bundle";
+      url = "https://download3.ebz.epson.net/dsc/f/03/00/14/53/69/3151031c0fb4deea3f48781fd051411b983ccee4/epsonscan2-bundle-${version}.i686.deb.tar.gz";
+      hash = "sha256-nq3Nqunt8aMcCf7U7JBYrVscvrhhcwcn8RlhYXLmC2c=";
+    };
+
+    "x86_64-linux" = fetchzip {
+      name = "${pname}-bundle";
+      url = "https://download3.ebz.epson.net/dsc/f/03/00/14/53/68/a5e06101ba3f328dd747888e3dddebbb677bb8c8/epsonscan2-bundle-${version}.x86_64.deb.tar.gz";
+      hash = "sha256-cFx54CKkZtvhZ5ABuBwB8+IzhT2lu8D3+GZFaMuWf3Y=";
+    };
+  }."${system}" or (throw "Unsupported system: ${system}");
+
+in
+stdenv.mkDerivation {
+  inherit pname src version;
+
+  patches = [
+    ./build.patch
+    (fetchpatch {
+      url = "https://github.com/flathub/net.epson.epsonscan2/raw/master/patches/epsonscan2-crash.patch";
+      hash = "sha256-srMxlFfnZuJ3ed5veFcJIiZuW27F/3xOS0yr4ywn4FI=";
+    })
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/flathub/net.epson.epsonscan2/master/patches/epsonscan2-oob-container.patch";
+      hash = "sha256-FhXZT0bIBYwdFow2USRJl8Q7j2eqpq98Hh0lHFQlUQY=";
+    })
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/flathub/net.epson.epsonscan2/master/patches/epsonscan2-xdg-open.patch";
+      hash = "sha256-4ih3vZjPwWiiAxKfpLIwbbsk1K2oXSuxGbT5PVwfUsc=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace src/Controller/Src/Scanner/Engine.cpp \
+      --replace '@KILLALL@' ${killall}/bin/killall
+
+    substituteInPlace src/Controller/Src/Filter/GetOrientation.cpp \
+      --replace '@OCR_ENGINE_GETROTATE@' $out/libexec/epsonscan2-ocr/ocr-engine-getrotate
+  '';
+
+  nativeBuildInputs = [
+    cmake
+  ] ++ lib.optionals withGui [
+    imagemagick # to make icons
+    wrapQtAppsHook
+  ] ++ lib.optionals withNonFreePlugins [
+    autoPatchelfHook
+  ];
+
+  buildInputs = [
+    boost
+    libjpeg
+    libpng
+    libtiff
+    libusb1
+  ] ++ lib.optionals withGui [
+    copyDesktopItems
+    qtbase
+  ] ++ lib.optionals withNonFreePlugins [
+    libtool.lib
+  ];
+
+  cmakeFlags = [
+    "-DCMAKE_BUILD_TYPE=Release"
+    # The non-free (Debian) packages uses this directory structure so do the same when compiling
+    # from source so we can easily merge them.
+    "-DCMAKE_INSTALL_LIBDIR=lib/${system}-gnu"
+  ] ++ lib.optionals (!withGui) [
+    "-DNO_GUI=ON"
+  ];
+
+  postInstall = ''
+    # But when we put all the libraries in lib/${system}-gnu, then SANE can't find the
+    # required libraries so create a symlink to where it expects them to be.
+    mkdir -p $out/lib/sane
+    for file in $out/lib/${system}-gnu/sane/*.so.*; do
+      ln -s $file $out/lib/sane/
+    done
+  '' + lib.optionalString withGui ''
+    # The icon file extension is .ico but it's actually a png!
+    mkdir -p $out/share/icons/hicolor/{48x48,128x128}/apps
+    convert $src/Resources/Icons/escan2_app.ico -resize 48x48 $out/share/icons/hicolor/48x48/apps/epsonscan2.png
+    convert $src/Resources/Icons/escan2_app.ico -resize 128x128 $out/share/icons/hicolor/128x128/apps/epsonscan2.png
+  '' + lib.optionalString withNonFreePlugins ''
+    ar xf ${bundle}/plugins/epsonscan2-non-free-plugin_*.deb
+    tar Jxf data.tar.xz
+    cp -r usr/* $out
+  '';
+
+  desktopItems = lib.optionals withGui [
+    (makeDesktopItem {
+      name = pname;
+      exec = "epsonscan2";
+      icon = "epsonscan2";
+      desktopName = "Epson Scan 2";
+      genericName = "Epson Scan 2";
+      comment = description;
+      categories = [ "Graphics" "Scanning" ];
+    })
+  ];
+
+  meta = {
+    inherit description;
+    longDescription = ''
+      Epson Scan 2 scanner driver including optional non-free plugins such as OCR and network
+      scanning.
+
+      To use the SANE backend:
+      <literal>
+      hardware.sane.extraBackends = [ pkgs.epsonscan2 ];
+      </literal>
+
+      Overrides can be used to customise this package. For example, to enable non-free plugins and
+      disable the Epson GUI:
+      <literal>
+      pkgs.epsonscan2.override { withNonFreePlugins = true; withGui = false; }
+      </literal>
+    '';
+    homepage = "https://support.epson.net/linux/en/epsonscan2.php";
+    platforms = [ "i686-linux" "x86_64-linux" ];
+    sourceProvenance = with lib.sourceTypes; [ fromSource ] ++ lib.optionals withNonFreePlugins [ binaryNativeCode ];
+    license = with lib.licenses; if withNonFreePlugins then unfree else lgpl21Plus;
+    maintainers = with lib.maintainers; [ james-atkins ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/misc/drivers/foo2zjs/default.nix b/nixpkgs/pkgs/misc/drivers/foo2zjs/default.nix
new file mode 100644
index 000000000000..91f6d98e9d55
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/foo2zjs/default.nix
@@ -0,0 +1,76 @@
+{ lib, stdenv, fetchurl, foomatic-filters, bc, ghostscript, systemd, vim, time }:
+
+stdenv.mkDerivation rec {
+  pname = "foo2zjs";
+  version = "20210116";
+
+  src = fetchurl {
+    url = "http://www.loegria.net/mirrors/foo2zjs/foo2zjs-${version}.tar.gz";
+    sha256 = "14x3wizvncdy0xgvmcx541qanwb7bg76abygqy17bxycn1zh5r1x";
+  };
+
+  buildInputs = [ foomatic-filters bc ghostscript systemd vim ];
+
+  patches = [
+    ./no-hardcode-fw.diff
+    # Support HBPL1 printers. Updated patch based on
+    # https://www.dechifro.org/hbpl/
+    ./hbpl1.patch
+    # Fix "Unimplemented paper code" error for hbpl1 printers
+    # https://github.com/mikerr/foo2zjs/pull/2
+    ./papercode-format-fix.patch
+    # Fix AirPrint color printing for Dell 1250c
+    # See https://github.com/OpenPrinting/cups/issues/272
+    ./dell1250c-color-fix.patch
+  ];
+
+  makeFlags = [
+    "PREFIX=$(out)"
+    "APPL=$(out)/share/applications"
+    "PIXMAPS=$(out)/share/pixmaps"
+    "UDEVBIN=$(out)/bin"
+    "UDEVDIR=$(out)/etc/udev/rules.d"
+    "UDEVD=${systemd}/sbin/udevd"
+    "LIBUDEVDIR=$(out)/lib/udev/rules.d"
+    "USBDIR=$(out)/etc/hotplug/usb"
+    "FOODB=$(out)/share/foomatic/db/source"
+    "MODEL=$(out)/share/cups/model"
+  ];
+
+  installFlags = [ "install-hotplug" ];
+
+  postPatch = ''
+    touch all-test
+    sed -e "/BASENAME=/iPATH=$out/bin:$PATH" -i *-wrapper *-wrapper.in
+    sed -e "s@PREFIX=/usr@PREFIX=$out@" -i *-wrapper{,.in}
+    sed -e "s@/usr/share@$out/share@" -i hplj10xx_gui.tcl
+    sed -e "s@\[.*-x.*/usr/bin/logger.*\]@type logger >/dev/null 2>\&1@" -i *wrapper{,.in}
+    sed -e '/install-usermap/d' -i Makefile
+    sed -e "s@/etc/hotplug/usb@$out&@" -i *rules*
+    sed -e "s@/usr@$out@g" -i hplj1020.desktop
+    sed -e "/PRINTERID=/s@=.*@=$out/bin/usb_printerid@" -i hplj1000
+  '';
+
+  nativeCheckInputs = [ time ];
+  doCheck = false; # fails to find its own binary. Also says "Tests will pass only if you are using ghostscript-8.71-16.fc14".
+
+  preInstall = ''
+    mkdir -pv $out/{etc/udev/rules.d,lib/udev/rules.d,etc/hotplug/usb}
+    mkdir -pv $out/share/foomatic/db/source/{opt,printer,driver}
+    mkdir -pv $out/share/cups/model
+    mkdir -pv $out/share/{applications,pixmaps}
+
+    mkdir -pv "$out/bin"
+    cp -v getweb arm2hpdl "$out/bin"
+  '';
+
+  meta = with lib; {
+    description = "ZjStream printer drivers";
+    maintainers = with maintainers;
+    [
+      raskin
+    ];
+    platforms = platforms.linux;
+    license = licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/foo2zjs/dell1250c-color-fix.patch b/nixpkgs/pkgs/misc/drivers/foo2zjs/dell1250c-color-fix.patch
new file mode 100644
index 000000000000..4cef4f00ab57
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/foo2zjs/dell1250c-color-fix.patch
@@ -0,0 +1,29 @@
+diff --git a/PPD/Dell-1250c.ppd b/PPD/Dell-1250c.ppd
+index 828ecd6..98f49e1 100644
+--- a/PPD/Dell-1250c.ppd
++++ b/PPD/Dell-1250c.ppd
+@@ -92,15 +92,15 @@
+ *FoomaticRIPOptionSetting Quality=normal: "  "
+ *CloseUI: *Quality
+ 
+-*OpenUI *ColorMode/Color Mode: PickOne
+-*FoomaticRIPOption ColorMode: enum CmdLine A
+-*OrderDependency: 120 AnySetup *ColorMode
+-*DefaultColorMode: Monochrome
+-*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
+-*FoomaticRIPOptionSetting ColorMode=Color: "-c "
+-*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
+-*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
+-*CloseUI: *ColorMode
++*OpenUI *ColorModel/Color Mode: PickOne
++*FoomaticRIPOption ColorModel: enum CmdLine A
++*OrderDependency: 120 AnySetup *ColorModel
++*DefaultColorModel: RGB
++*ColorModel RGB/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
++*FoomaticRIPOptionSetting ColorModel=RGB: "-c "
++*ColorModel Gray/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
++*FoomaticRIPOptionSetting ColorModel=Gray: " "
++*CloseUI: *ColorModel
+ 
+ *OpenUI *PageSize/Page Size: PickOne
+ *FoomaticRIPOption PageSize: enum CmdLine A
diff --git a/nixpkgs/pkgs/misc/drivers/foo2zjs/hbpl1.patch b/nixpkgs/pkgs/misc/drivers/foo2zjs/hbpl1.patch
new file mode 100644
index 000000000000..7372e164affa
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/foo2zjs/hbpl1.patch
@@ -0,0 +1,4676 @@
+--- foo2zjs/ChangeLog	2021-09-27 16:25:00.735904476 +0200
++++ foo2zjs/ChangeLog	2021-09-27 16:34:10.661647070 +0200
+@@ -89,10 +89,35 @@
+ 2014-04-08	Rick Richardson <rick.richardson@comcast.net>
+ 	* Upgrade to JBIGKIT 2.1
+ 
++2014-04-04	Dave Coffin <dcoffin@cybercom.net>
++	* fixed all known bugs in foo2hbpl1.c.  It now print multi-page
++	  color and grayscale documents without resetting printer.
++
+ 2014-04-01	Rick Richardson <rick.richardson@comcast.net>
+-	* foo2hbpl2 foomatic-db files and PPDs:
++	* foo2hbpl1, foo2hbpl2 foomatic-db files and PPDs:
+ 	    Bug with default PageSize.
+-	    PLEASE delete and recreate the foo2hbpl2 printers.
++	    PLEASE delete and recreate the foo2hbpl1, foo2hbpl2 printers.
++
++2014-03-30	Rick Richardson <rick.richardson@comcast.net>
++	* foo2hbpl1.c: Cleanup the code
++
++2014-03-25	Rick Richardson <rick.richardson@comcast.net>
++	* foomatic and PPD stuff for foo2hbpl1 printers: Halftone and ICM
++
++2014-03-24	Rick Richardson <rick.richardson@comcast.net>
++	* foomatic and PPD stuff for foo2hbpl1 printers
++	    preliminary for: Dell 1250c, Dell C1660w, Dell C1760nw,
++	    Epson AcuLaser C1700, Fuji-Xerox DocuPrint CP105b
++	* foo2hbpl1-wrapper: allow for gs 7.x or gs 8.x
++
++2014-03-24	Dave Coffin <dcoffin@cybercom.net>
++	* foo2hbpl1, foo2hbpl1-wrapper, et al: first cut at revision 1
++	    stuff.  Color works, mono doesn't. No multiple pages. Printer
++	    shows:
++		        Restart Printer
++			Contact Support
++			IfMessageReturns
++			016-313
+ 
+ 2014-03-22	Rick Richardson <rick.richardson@comcast.net>
+ 	* hbpldecode: another redundancy from Dave Coffin
+--- foo2zjs/Makefile	2020-11-27 20:57:33.000000000 +0100
++++ foo2zjs/Makefile	2021-09-27 16:56:23.363346705 +0200
+@@ -148,6 +148,8 @@
+ 		foo2hiperc.c \
+ 		foo2hiperc.1in \
+ 		hbpl.h \
++		foo2hbpl1.c \
++		foo2hbpl1.1in \
+ 		foo2hbpl2.c \
+ 		foo2hbpl2.1in \
+ 		foo2ddst.c \
+@@ -187,6 +189,8 @@
+ 		foo2slx-wrapper.1in \
+ 		foo2hiperc-wrapper.in \
+ 		foo2hiperc-wrapper.1in \
++		foo2hbpl1-wrapper.in \
++		foo2hbpl1-wrapper.1in \
+ 		foo2hbpl2-wrapper.in \
+ 		foo2hbpl2-wrapper.1in \
+ 		foo2ddst-wrapper.in \
+@@ -267,7 +271,7 @@
+ PROGS+=		foo2oak oakdecode
+ PROGS+=		foo2slx slxdecode
+ PROGS+=		foo2hiperc hipercdecode
+-PROGS+=		foo2hbpl2 hbpldecode
++PROGS+=		foo2hbpl1 foo2hbpl2 hbpldecode
+ PROGS+=		gipddecode
+ PROGS+=		foo2ddst ddstdecode
+ ifneq ($(CUPS_SERVERBIN),)
+@@ -279,7 +283,7 @@
+ endif
+ SHELLS=		foo2zjs-wrapper foo2oak-wrapper foo2hp2600-wrapper \
+ 		foo2xqx-wrapper foo2lava-wrapper foo2qpdl-wrapper \
+-		foo2slx-wrapper foo2hiperc-wrapper foo2hbpl2-wrapper \
++		foo2slx-wrapper foo2hiperc-wrapper foo2hbpl1-wrapper foo2hbpl2-wrapper \
+ 		foo2ddst-wrapper
+ SHELLS+=	foo2zjs-pstops
+ SHELLS+=	printer-profile
+@@ -291,7 +295,7 @@
+ MANPAGES+=	foo2qpdl-wrapper.1 foo2qpdl.1 qpdldecode.1
+ MANPAGES+=	foo2slx-wrapper.1 foo2slx.1 slxdecode.1
+ MANPAGES+=	foo2hiperc-wrapper.1 foo2hiperc.1 hipercdecode.1
+-MANPAGES+=	foo2hbpl2-wrapper.1 foo2hbpl2.1 hbpldecode.1
++MANPAGES+=	foo2hbpl1-wrapper.1 foo2hbpl1.1 foo2hbpl2-wrapper.1 foo2hbpl2.1 hbpldecode.1
+ MANPAGES+=	foo2ddst-wrapper.1 foo2ddst.1 ddstdecode.1
+ MANPAGES+=	gipddecode.1
+ MANPAGES+=	foo2zjs-pstops.1 arm2hpdl.1 usb_printerid.1
+@@ -485,6 +489,9 @@
+ foo2ddst: foo2ddst.o $(LIBJBG)
+ 	$(CC) $(CFLAGS) -o $@ foo2ddst.o $(LIBJBG)
+ 
++foo2hbpl1: foo2hbpl1.o
++	$(CC) $(CFLAGS) -o $@ foo2hbpl1.o
++
+ foo2hbpl2: foo2hbpl2.o $(LIBJBG)
+ 	$(CC) $(CFLAGS) -o $@ foo2hbpl2.o $(LIBJBG)
+ 
+@@ -519,6 +526,12 @@
+ 	    -e 's@^PREFIX=.*@PREFIX=$(PREFIX)@' || (rm -f $@ && exit 1)
+ 	chmod 555 $@
+ 
++foo2hbpl1-wrapper: foo2hbpl1-wrapper.in Makefile
++	[ ! -f $@ ] || chmod +w $@
++	sed < $@.in > $@ \
++	    -e 's@^PREFIX=.*@PREFIX=$(PREFIX)@' || (rm -f $@ && exit 1)
++	chmod 555 $@
++
+ foo2hbpl2-wrapper: foo2hbpl2-wrapper.in Makefile
+ 	[ ! -f $@ ] || chmod +w $@
+ 	sed < $@.in > $@ \
+@@ -1231,6 +1244,7 @@
+ 	-rm -f /usr/bin/foo2slx-wrapper /usr/bin/foo2slx /usr/bin/slxdecode
+ 	-rm -f /usr/bin/foo2hiperc-wrapper /usr/bin/foo2hiperc
+ 	-rm -f /usr/bin/hipercdecode
++	-rm -f /usr/bin/foo2hbpl1-wrapper /usr/bin/foo2hbpl1
+ 	-rm -f /usr/bin/foo2hbpl2-wrapper /usr/bin/foo2hbpl2
+ 	-rm -f /usr/bin/hbpldecode
+ 	-rm -f /usr/bin/foo2ddst-wrapper /usr/bin/foo2ddst /usr/bin/ddstdecode
+@@ -1265,7 +1279,7 @@
+ 	-rm -f foo2qpdl.o qpdldecode.o
+ 	-rm -f foo2slx.o slxdecode.o
+ 	-rm -f foo2hiperc.o hipercdecode.o
+-	-rm -f foo2hbpl2.o hbpldecode.o
++	-rm -f foo2hbpl1.o foo2hbpl2.o hbpldecode.o
+ 	-rm -f opldecode.o gipddecode.o
+ 	-rm -f foo2dsst.o ddstdecode.o
+ 	-rm -f command2foo2lava-pjl.o
+@@ -1513,6 +1527,10 @@
+ 	    *C3530*)	        driver=foo2hiperc;; \
+ 	    *C5[12568][05]0*)   driver=foo2hiperc;; \
+ 	    *CLP*|*CLX*|*6110*) driver=foo2qpdl;; \
++	    *1250*)		driver=foo2hbpl1;; \
++	    *1660*|*1760*)	driver=foo2hbpl1;; \
++	    *C1700*)		driver=foo2hbpl1;; \
++	    *CP105*)		driver=foo2hbpl1;; \
+ 	    *ML-167*)		driver=foo2qpdl;; \
+ 	    *6015*|*1355*)	driver=foo2hbpl2;; \
+ 	    *C1765*)		driver=foo2hbpl2;; \
+@@ -1607,6 +1625,8 @@
+ 	$(INSTALL) -c -m 644 foo2hiperc.1 $(MANDIR)/man1/
+ 	$(INSTALL) -c -m 644 foo2hiperc-wrapper.1 $(MANDIR)/man1/
+ 	$(INSTALL) -c -m 644 hipercdecode.1 $(MANDIR)/man1/
++	$(INSTALL) -c -m 644 foo2hbpl1.1 $(MANDIR)/man1/
++	$(INSTALL) -c -m 644 foo2hbpl1-wrapper.1 $(MANDIR)/man1/
+ 	$(INSTALL) -c -m 644 foo2hbpl2.1 $(MANDIR)/man1/
+ 	$(INSTALL) -c -m 644 foo2hbpl2-wrapper.1 $(MANDIR)/man1/
+ 	$(INSTALL) -c -m 644 hbpldecode.1 $(MANDIR)/man1/
+--- foo2zjs/PPD/Dell-1250c.ppd	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/PPD/Dell-1250c.ppd	2014-04-01 11:06:30.000000000 +0000
+@@ -0,0 +1,433 @@
++*PPD-Adobe: "4.3"
++*%
++*% For information on using this, and to obtain the required backend
++*% script, consult http://www.openprinting.org/
++*%
++*% This file is published under the GNU General Public License
++*%
++*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with 
++*% all programs and environments which use PPD files for dealing with
++*% printer capability information. The printer must be configured with the
++*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This 
++*% file and "foomatic-rip" work together to support PPD-controlled printer
++*% driver option access with arbitrary free software printer drivers and
++*% printing spoolers.
++*%
++*% To save this file on your disk, wait until the download has completed
++*% (the animation of the browser logo must stop) and then use the
++*% "Save as..." command in the "File" menu of your browser or in the 
++*% pop-up manu when you click on this document with the right mouse button.
++*% DO NOT cut and paste this file into an editor with your mouse. This can
++*% introduce additional line breaks which lead to unexpected results.
++*%
++*% You may save this file as 'Dell-1250c-foo2hbpl1.ppd'
++*%
++*%
++*FormatVersion:	"4.3"
++*FileVersion:	"1.1"
++*LanguageVersion: English 
++*LanguageEncoding: ISOLatin1
++*PCFileName:	"FOO2HBPL.PPD"
++*Manufacturer:	"Dell"
++*Product:	"(1250c)"
++*cupsVersion:	1.0
++*cupsManualCopies: True
++*cupsModelNumber:  2
++*cupsFilter:	"application/vnd.cups-postscript 0 foomatic-rip"
++*%pprRIP:        foomatic-rip other
++*ModelName:     "Dell 1250c"
++*ShortNickName: "Dell 1250c foo2hbpl1"
++*NickName:      "Dell 1250c Foomatic/foo2hbpl1 (recommended)"
++*PSVersion:	"(3010.000) 550"
++*PSVersion:	"(3010.000) 651"
++*PSVersion:	"(3010.000) 652"
++*PSVersion:	"(3010.000) 653"
++*PSVersion:	"(3010.000) 704"
++*PSVersion:	"(3010.000) 705"
++*PSVersion:	"(3010.000) 800"
++*LanguageLevel:	"3"
++*ColorDevice:	True
++*DefaultColorSpace: RGB
++*FileSystem:	False
++*Throughput:	"1"
++*LandscapeOrientation: Plus90
++*TTRasterizer:	Type42
++*1284DeviceID: "DRV:Dfoo2hbpl1,R1,M0,TF;"
++
++*driverName foo2hbpl1/foo2hbpl1: ""
++*driverType F/Filter: ""
++*driverUrl: "http://foo2hbpl.rkkda.com/"
++*driverObsolete: False
++
++
++
++
++*HWMargins: 9 12.00 9 12
++*VariablePaperSize: True
++*MaxMediaWidth: 100000
++*MaxMediaHeight: 100000
++*NonUIOrderDependency: 135 AnySetup *CustomPageSize
++*CustomPageSize True: "pop pop pop pop pop
++%% FoomaticRIPOptionSetting: PageSize=Custom"
++*End
++*FoomaticRIPOptionSetting PageSize=Custom: "-pCustom.%0x%1 "
++*ParamCustomPageSize Width: 1 points 36 100000
++*ParamCustomPageSize Height: 2 points 36 100000
++*ParamCustomPageSize Orientation: 3 int 0 0
++*ParamCustomPageSize WidthOffset: 4 points 0 0
++*ParamCustomPageSize HeightOffset: 5 points 0 0
++
++*FoomaticIDs: Dell-1250c foo2hbpl1
++*FoomaticRIPCommandLine: "foo2hbpl1-wrapper %A"
++
++*OpenGroup: General/General
++
++*OpenUI *Quality/Printing Quality: PickOne
++*FoomaticRIPOption Quality: enum CmdLine A
++*OrderDependency: 110 AnySetup *Quality
++*DefaultQuality: normal
++*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
++*FoomaticRIPOptionSetting Quality=draft: " -t  "
++*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
++*FoomaticRIPOptionSetting Quality=normal: "  "
++*CloseUI: *Quality
++
++*OpenUI *ColorMode/Color Mode: PickOne
++*FoomaticRIPOption ColorMode: enum CmdLine A
++*OrderDependency: 120 AnySetup *ColorMode
++*DefaultColorMode: Monochrome
++*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
++*FoomaticRIPOptionSetting ColorMode=Color: "-c "
++*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
++*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
++*CloseUI: *ColorMode
++
++*OpenUI *PageSize/Page Size: PickOne
++*FoomaticRIPOption PageSize: enum CmdLine A
++*OrderDependency: 135 AnySetup *PageSize
++*DefaultPageSize: Letter
++*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*FoomaticRIPOptionSetting PageSize=Letter: "-p4 "
++*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*FoomaticRIPOptionSetting PageSize=A4: "-p1 "
++*PageSize B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*FoomaticRIPOptionSetting PageSize=B5jis: "-p2 "
++*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*FoomaticRIPOptionSetting PageSize=Env10: "-p9 "
++*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*FoomaticRIPOptionSetting PageSize=EnvC5: "-p11 "
++*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*FoomaticRIPOptionSetting PageSize=EnvDL: "-p12 "
++*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p10 "
++*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*FoomaticRIPOptionSetting PageSize=Executive: "-p5 "
++*PageSize FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*FoomaticRIPOptionSetting PageSize=FanfoldGermanLegal: "-p6 "
++*PageSize Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*FoomaticRIPOptionSetting PageSize=Folio: "-p6 "
++*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*FoomaticRIPOptionSetting PageSize=Legal: "-p7 "
++*CloseUI: *PageSize
++
++*OpenUI *PageRegion: PickOne
++*OrderDependency: 135 AnySetup *PageRegion
++*DefaultPageRegion: Letter
++*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*PageRegion B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*PageRegion FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*PageRegion Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*CloseUI: *PageRegion
++
++*DefaultImageableArea: Letter
++*ImageableArea Letter/Letter: "9 12.00 603 780.00"
++*ImageableArea A4/A4: "9 12.00 586 830.00"
++*ImageableArea B5jis/B5 (JIS): "9 12.00 509 715.00"
++*ImageableArea Env10/Env #10: "9 12.00 288 672.00"
++*ImageableArea EnvC5/Env C5: "9 12.00 450 637.00"
++*ImageableArea EnvDL/Env DL: "9 12.00 302 611.00"
++*ImageableArea EnvMonarch/Env Monarch: "9 12.00 270 528.00"
++*ImageableArea Executive/Executive: "9 12.00 513 744.00"
++*ImageableArea FanfoldGermanLegal/Fanfold German Legal: "9 12.00 603 996.00"
++*ImageableArea Folio/Folio: "9 12.00 603 924.00"
++*ImageableArea Legal/Legal: "9 12.00 603 996.00"
++
++*DefaultPaperDimension: Letter
++*PaperDimension Letter/Letter: "612 792"
++*PaperDimension A4/A4: "595 842"
++*PaperDimension B5jis/B5 (JIS): "518 727"
++*PaperDimension Env10/Env #10: "297 684"
++*PaperDimension EnvC5/Env C5: "459 649"
++*PaperDimension EnvDL/Env DL: "311 623"
++*PaperDimension EnvMonarch/Env Monarch: "279 540"
++*PaperDimension Executive/Executive: "522 756"
++*PaperDimension FanfoldGermanLegal/Fanfold German Legal: "612 1008"
++*PaperDimension Folio/Folio: "612 936"
++*PaperDimension Legal/Legal: "612 1008"
++
++*OpenUI *MediaType/Media Type: PickOne
++*FoomaticRIPOption MediaType: enum CmdLine A
++*OrderDependency: 150 AnySetup *MediaType
++*DefaultMediaType: plain
++*MediaType plain/Plain Paper: "%% FoomaticRIPOptionSetting: MediaType=plain"
++*FoomaticRIPOptionSetting MediaType=plain: "-m1 "
++*MediaType plain2/Plain Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=plain2"
++*FoomaticRIPOptionSetting MediaType=plain2: "-m8 "
++*MediaType bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=bond"
++*FoomaticRIPOptionSetting MediaType=bond: "-m2 "
++*MediaType bond2/Bond Side 2: "%% FoomaticRIPOptionSetting: MediaType=bond2"
++*FoomaticRIPOptionSetting MediaType=bond2: "-m9 "
++*MediaType envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=envelope"
++*FoomaticRIPOptionSetting MediaType=envelope: "-m6 "
++*MediaType labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=labels"
++*FoomaticRIPOptionSetting MediaType=labels: "-m5 "
++*MediaType lwcard/Light Weight Card: "%% FoomaticRIPOptionSetting: MediaType=lwcard"
++*FoomaticRIPOptionSetting MediaType=lwcard: "-m3 "
++*MediaType lwcard2/Light Weight Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwcard2"
++*FoomaticRIPOptionSetting MediaType=lwcard2: "-m10 "
++*MediaType lwgcard/Light Weight Glossy Card: "%% FoomaticRIPOptionSetting: MediaType=lwgcard"
++*FoomaticRIPOptionSetting MediaType=lwgcard: "-m4 "
++*MediaType lwgcard2/Light Weight Glossy Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwgcard2"
++*FoomaticRIPOptionSetting MediaType=lwgcard2: "-m11 "
++*MediaType recycled/Recycled Paper: "%% FoomaticRIPOptionSetting: MediaType=recycled"
++*FoomaticRIPOptionSetting MediaType=recycled: "-m7 "
++*MediaType recycled2/Recycled Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=recycled2"
++*FoomaticRIPOptionSetting MediaType=recycled2: "-m12 "
++*CloseUI: *MediaType
++
++*OpenUI *Copies/Copies: PickOne
++*FoomaticRIPOption Copies: int CmdLine A
++*FoomaticRIPOptionPrototype Copies: "-n%s "
++*FoomaticRIPOptionRange Copies: 1 100
++*OrderDependency: 220 AnySetup *Copies
++*DefaultCopies: 1
++*FoomaticRIPDefaultCopies: 1
++*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
++*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
++*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
++*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
++*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
++*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
++*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
++*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
++*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
++*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
++*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
++*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
++*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
++*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
++*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
++*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
++*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
++*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
++*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
++*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
++*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
++*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
++*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
++*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
++*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
++*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
++*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
++*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
++*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
++*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
++*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
++*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
++*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
++*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
++*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
++*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
++*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
++*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
++*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
++*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
++*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
++*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
++*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
++*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
++*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
++*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
++*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
++*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
++*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
++*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
++*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
++*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
++*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
++*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
++*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
++*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
++*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
++*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
++*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
++*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
++*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
++*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
++*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
++*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
++*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
++*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
++*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
++*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
++*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
++*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
++*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
++*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
++*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
++*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
++*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
++*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
++*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
++*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
++*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
++*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
++*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
++*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
++*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
++*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
++*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
++*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
++*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
++*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
++*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
++*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
++*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
++*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
++*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
++*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
++*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
++*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
++*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
++*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
++*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
++*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
++*CloseUI: *Copies
++
++*CloseGroup: General
++
++*OpenGroup: Adjustment/Adjustment
++
++*OpenUI *halftone/Halftone Algorithm: PickOne
++*FoomaticRIPOption halftone: enum CmdLine A
++*OrderDependency: 110 AnySetup *halftone
++*Defaulthalftone: default
++*halftone default/Default: "%% FoomaticRIPOptionSetting: halftone=default"
++*FoomaticRIPOptionSetting halftone=default: "  "
++*halftone as/Accurate Screens (better): "%% FoomaticRIPOptionSetting: halftone=as"
++*FoomaticRIPOptionSetting halftone=as: " -qas  "
++*halftone standard/Standard: "%% FoomaticRIPOptionSetting: halftone=standard"
++*FoomaticRIPOptionSetting halftone=standard: " -q1  "
++*halftone wts/Well Tempered Screens (best): "%% FoomaticRIPOptionSetting: halftone=wts"
++*FoomaticRIPOptionSetting halftone=wts: " -qwts  "
++*CloseUI: *halftone
++
++*OpenUI *ICM/ICM Color Profile: PickOne
++*FoomaticRIPOption ICM: enum CmdLine A
++*OrderDependency: 300 AnySetup *ICM
++*DefaultICM: none
++*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
++*FoomaticRIPOptionSetting ICM=none: "-C10 -Gnone.icm "
++*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
++*FoomaticRIPOptionSetting ICM=testing: "-C10 -Gtesting.icm "
++*ICM testing2/File testing2.icm: "%% FoomaticRIPOptionSetting: ICM=testing2"
++*FoomaticRIPOptionSetting ICM=testing2: "-C10 -Gtesting2.icm "
++*ICM testing3/File testing3.icm: "%% FoomaticRIPOptionSetting: ICM=testing3"
++*FoomaticRIPOptionSetting ICM=testing3: "-C10 -Gtesting3.icm "
++*CloseUI: *ICM
++
++*CloseGroup: Adjustment
++
++*OpenGroup: Miscellaneous/Miscellaneous
++
++*OpenUI *NupOrient/N-up Orientation: PickOne
++*FoomaticRIPOption NupOrient: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupOrient
++*DefaultNupOrient: port
++*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
++*FoomaticRIPOptionSetting NupOrient=land: "-ol "
++*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
++*FoomaticRIPOptionSetting NupOrient=port: " "
++*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
++*FoomaticRIPOptionSetting NupOrient=sea: "-os "
++*CloseUI: *NupOrient
++
++*OpenUI *NupPages/N-up Printing: PickOne
++*FoomaticRIPOption NupPages: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupPages
++*DefaultNupPages: 1up
++*NupPages 1up/1-up: "%% FoomaticRIPOptionSetting: NupPages=1up"
++*FoomaticRIPOptionSetting NupPages=1up: " "
++*NupPages 2up/2-up: "%% FoomaticRIPOptionSetting: NupPages=2up"
++*FoomaticRIPOptionSetting NupPages=2up: "-2 "
++*NupPages 3up/3-up: "%% FoomaticRIPOptionSetting: NupPages=3up"
++*FoomaticRIPOptionSetting NupPages=3up: "-3 "
++*NupPages 4up/4-up: "%% FoomaticRIPOptionSetting: NupPages=4up"
++*FoomaticRIPOptionSetting NupPages=4up: "-4 "
++*NupPages 6up/6-up: "%% FoomaticRIPOptionSetting: NupPages=6up"
++*FoomaticRIPOptionSetting NupPages=6up: "-6 "
++*NupPages 8up/8-up: "%% FoomaticRIPOptionSetting: NupPages=8up"
++*FoomaticRIPOptionSetting NupPages=8up: "-8 "
++*NupPages 10up/10-up: "%% FoomaticRIPOptionSetting: NupPages=10up"
++*FoomaticRIPOptionSetting NupPages=10up: "-10 "
++*NupPages 12up/12-up: "%% FoomaticRIPOptionSetting: NupPages=12up"
++*FoomaticRIPOptionSetting NupPages=12up: "-12 "
++*NupPages 14up/14-up: "%% FoomaticRIPOptionSetting: NupPages=14up"
++*FoomaticRIPOptionSetting NupPages=14up: "-14 "
++*NupPages 15up/15-up: "%% FoomaticRIPOptionSetting: NupPages=15up"
++*FoomaticRIPOptionSetting NupPages=15up: "-15 "
++*NupPages 16up/16-up: "%% FoomaticRIPOptionSetting: NupPages=16up"
++*FoomaticRIPOptionSetting NupPages=16up: "-16 "
++*NupPages 18up/18-up: "%% FoomaticRIPOptionSetting: NupPages=18up"
++*FoomaticRIPOptionSetting NupPages=18up: "-18 "
++*CloseUI: *NupPages
++
++*CloseGroup: Miscellaneous
++
++
++*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
++
++*DefaultFont: Courier
++*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
++*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
++*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
++*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
++*Font Bookman-Light: Standard "(001.004S)" Standard ROM
++*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
++*Font Courier: Standard "(002.004S)" Standard ROM
++*Font Courier-Bold: Standard "(002.004S)" Standard ROM
++*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
++*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
++*Font Helvetica: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
++*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
++*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
++*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
++*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
++*Font Symbol: Special "(001.007S)" Special ROM
++*Font Times-Bold: Standard "(001.007S)" Standard ROM
++*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
++*Font Times-Italic: Standard "(001.007S)" Standard ROM
++*Font Times-Roman: Standard "(001.007S)" Standard ROM
++*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
++*Font ZapfDingbats: Special "(001.004S)" Standard ROM
++
+--- foo2zjs/PPD/Dell-C1660.ppd	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/PPD/Dell-C1660.ppd	2014-04-01 11:06:30.000000000 +0000
+@@ -0,0 +1,433 @@
++*PPD-Adobe: "4.3"
++*%
++*% For information on using this, and to obtain the required backend
++*% script, consult http://www.openprinting.org/
++*%
++*% This file is published under the GNU General Public License
++*%
++*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with 
++*% all programs and environments which use PPD files for dealing with
++*% printer capability information. The printer must be configured with the
++*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This 
++*% file and "foomatic-rip" work together to support PPD-controlled printer
++*% driver option access with arbitrary free software printer drivers and
++*% printing spoolers.
++*%
++*% To save this file on your disk, wait until the download has completed
++*% (the animation of the browser logo must stop) and then use the
++*% "Save as..." command in the "File" menu of your browser or in the 
++*% pop-up manu when you click on this document with the right mouse button.
++*% DO NOT cut and paste this file into an editor with your mouse. This can
++*% introduce additional line breaks which lead to unexpected results.
++*%
++*% You may save this file as 'Dell-C1660-foo2hbpl1.ppd'
++*%
++*%
++*FormatVersion:	"4.3"
++*FileVersion:	"1.1"
++*LanguageVersion: English 
++*LanguageEncoding: ISOLatin1
++*PCFileName:	"FOO2HBPL.PPD"
++*Manufacturer:	"Dell"
++*Product:	"(C1660)"
++*cupsVersion:	1.0
++*cupsManualCopies: True
++*cupsModelNumber:  2
++*cupsFilter:	"application/vnd.cups-postscript 0 foomatic-rip"
++*%pprRIP:        foomatic-rip other
++*ModelName:     "Dell C1660"
++*ShortNickName: "Dell C1660 foo2hbpl1"
++*NickName:      "Dell C1660 Foomatic/foo2hbpl1 (recommended)"
++*PSVersion:	"(3010.000) 550"
++*PSVersion:	"(3010.000) 651"
++*PSVersion:	"(3010.000) 652"
++*PSVersion:	"(3010.000) 653"
++*PSVersion:	"(3010.000) 704"
++*PSVersion:	"(3010.000) 705"
++*PSVersion:	"(3010.000) 800"
++*LanguageLevel:	"3"
++*ColorDevice:	True
++*DefaultColorSpace: RGB
++*FileSystem:	False
++*Throughput:	"1"
++*LandscapeOrientation: Plus90
++*TTRasterizer:	Type42
++*1284DeviceID: "DRV:Dfoo2hbpl1,R1,M0,TF;"
++
++*driverName foo2hbpl1/foo2hbpl1: ""
++*driverType F/Filter: ""
++*driverUrl: "http://foo2hbpl.rkkda.com/"
++*driverObsolete: False
++
++
++
++
++*HWMargins: 9 12.00 9 12
++*VariablePaperSize: True
++*MaxMediaWidth: 100000
++*MaxMediaHeight: 100000
++*NonUIOrderDependency: 135 AnySetup *CustomPageSize
++*CustomPageSize True: "pop pop pop pop pop
++%% FoomaticRIPOptionSetting: PageSize=Custom"
++*End
++*FoomaticRIPOptionSetting PageSize=Custom: "-pCustom.%0x%1 "
++*ParamCustomPageSize Width: 1 points 36 100000
++*ParamCustomPageSize Height: 2 points 36 100000
++*ParamCustomPageSize Orientation: 3 int 0 0
++*ParamCustomPageSize WidthOffset: 4 points 0 0
++*ParamCustomPageSize HeightOffset: 5 points 0 0
++
++*FoomaticIDs: Dell-C1660 foo2hbpl1
++*FoomaticRIPCommandLine: "foo2hbpl1-wrapper %A"
++
++*OpenGroup: General/General
++
++*OpenUI *Quality/Printing Quality: PickOne
++*FoomaticRIPOption Quality: enum CmdLine A
++*OrderDependency: 110 AnySetup *Quality
++*DefaultQuality: normal
++*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
++*FoomaticRIPOptionSetting Quality=draft: " -t  "
++*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
++*FoomaticRIPOptionSetting Quality=normal: "  "
++*CloseUI: *Quality
++
++*OpenUI *ColorMode/Color Mode: PickOne
++*FoomaticRIPOption ColorMode: enum CmdLine A
++*OrderDependency: 120 AnySetup *ColorMode
++*DefaultColorMode: Monochrome
++*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
++*FoomaticRIPOptionSetting ColorMode=Color: "-c "
++*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
++*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
++*CloseUI: *ColorMode
++
++*OpenUI *PageSize/Page Size: PickOne
++*FoomaticRIPOption PageSize: enum CmdLine A
++*OrderDependency: 135 AnySetup *PageSize
++*DefaultPageSize: Letter
++*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*FoomaticRIPOptionSetting PageSize=Letter: "-p4 "
++*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*FoomaticRIPOptionSetting PageSize=A4: "-p1 "
++*PageSize B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*FoomaticRIPOptionSetting PageSize=B5jis: "-p2 "
++*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*FoomaticRIPOptionSetting PageSize=Env10: "-p9 "
++*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*FoomaticRIPOptionSetting PageSize=EnvC5: "-p11 "
++*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*FoomaticRIPOptionSetting PageSize=EnvDL: "-p12 "
++*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p10 "
++*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*FoomaticRIPOptionSetting PageSize=Executive: "-p5 "
++*PageSize FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*FoomaticRIPOptionSetting PageSize=FanfoldGermanLegal: "-p6 "
++*PageSize Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*FoomaticRIPOptionSetting PageSize=Folio: "-p6 "
++*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*FoomaticRIPOptionSetting PageSize=Legal: "-p7 "
++*CloseUI: *PageSize
++
++*OpenUI *PageRegion: PickOne
++*OrderDependency: 135 AnySetup *PageRegion
++*DefaultPageRegion: Letter
++*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*PageRegion B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*PageRegion FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*PageRegion Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*CloseUI: *PageRegion
++
++*DefaultImageableArea: Letter
++*ImageableArea Letter/Letter: "9 12.00 603 780.00"
++*ImageableArea A4/A4: "9 12.00 586 830.00"
++*ImageableArea B5jis/B5 (JIS): "9 12.00 509 715.00"
++*ImageableArea Env10/Env #10: "9 12.00 288 672.00"
++*ImageableArea EnvC5/Env C5: "9 12.00 450 637.00"
++*ImageableArea EnvDL/Env DL: "9 12.00 302 611.00"
++*ImageableArea EnvMonarch/Env Monarch: "9 12.00 270 528.00"
++*ImageableArea Executive/Executive: "9 12.00 513 744.00"
++*ImageableArea FanfoldGermanLegal/Fanfold German Legal: "9 12.00 603 996.00"
++*ImageableArea Folio/Folio: "9 12.00 603 924.00"
++*ImageableArea Legal/Legal: "9 12.00 603 996.00"
++
++*DefaultPaperDimension: Letter
++*PaperDimension Letter/Letter: "612 792"
++*PaperDimension A4/A4: "595 842"
++*PaperDimension B5jis/B5 (JIS): "518 727"
++*PaperDimension Env10/Env #10: "297 684"
++*PaperDimension EnvC5/Env C5: "459 649"
++*PaperDimension EnvDL/Env DL: "311 623"
++*PaperDimension EnvMonarch/Env Monarch: "279 540"
++*PaperDimension Executive/Executive: "522 756"
++*PaperDimension FanfoldGermanLegal/Fanfold German Legal: "612 1008"
++*PaperDimension Folio/Folio: "612 936"
++*PaperDimension Legal/Legal: "612 1008"
++
++*OpenUI *MediaType/Media Type: PickOne
++*FoomaticRIPOption MediaType: enum CmdLine A
++*OrderDependency: 150 AnySetup *MediaType
++*DefaultMediaType: plain
++*MediaType plain/Plain Paper: "%% FoomaticRIPOptionSetting: MediaType=plain"
++*FoomaticRIPOptionSetting MediaType=plain: "-m1 "
++*MediaType plain2/Plain Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=plain2"
++*FoomaticRIPOptionSetting MediaType=plain2: "-m8 "
++*MediaType bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=bond"
++*FoomaticRIPOptionSetting MediaType=bond: "-m2 "
++*MediaType bond2/Bond Side 2: "%% FoomaticRIPOptionSetting: MediaType=bond2"
++*FoomaticRIPOptionSetting MediaType=bond2: "-m9 "
++*MediaType envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=envelope"
++*FoomaticRIPOptionSetting MediaType=envelope: "-m6 "
++*MediaType labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=labels"
++*FoomaticRIPOptionSetting MediaType=labels: "-m5 "
++*MediaType lwcard/Light Weight Card: "%% FoomaticRIPOptionSetting: MediaType=lwcard"
++*FoomaticRIPOptionSetting MediaType=lwcard: "-m3 "
++*MediaType lwcard2/Light Weight Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwcard2"
++*FoomaticRIPOptionSetting MediaType=lwcard2: "-m10 "
++*MediaType lwgcard/Light Weight Glossy Card: "%% FoomaticRIPOptionSetting: MediaType=lwgcard"
++*FoomaticRIPOptionSetting MediaType=lwgcard: "-m4 "
++*MediaType lwgcard2/Light Weight Glossy Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwgcard2"
++*FoomaticRIPOptionSetting MediaType=lwgcard2: "-m11 "
++*MediaType recycled/Recycled Paper: "%% FoomaticRIPOptionSetting: MediaType=recycled"
++*FoomaticRIPOptionSetting MediaType=recycled: "-m7 "
++*MediaType recycled2/Recycled Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=recycled2"
++*FoomaticRIPOptionSetting MediaType=recycled2: "-m12 "
++*CloseUI: *MediaType
++
++*OpenUI *Copies/Copies: PickOne
++*FoomaticRIPOption Copies: int CmdLine A
++*FoomaticRIPOptionPrototype Copies: "-n%s "
++*FoomaticRIPOptionRange Copies: 1 100
++*OrderDependency: 220 AnySetup *Copies
++*DefaultCopies: 1
++*FoomaticRIPDefaultCopies: 1
++*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
++*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
++*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
++*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
++*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
++*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
++*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
++*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
++*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
++*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
++*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
++*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
++*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
++*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
++*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
++*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
++*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
++*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
++*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
++*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
++*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
++*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
++*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
++*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
++*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
++*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
++*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
++*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
++*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
++*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
++*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
++*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
++*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
++*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
++*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
++*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
++*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
++*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
++*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
++*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
++*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
++*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
++*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
++*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
++*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
++*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
++*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
++*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
++*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
++*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
++*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
++*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
++*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
++*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
++*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
++*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
++*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
++*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
++*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
++*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
++*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
++*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
++*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
++*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
++*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
++*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
++*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
++*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
++*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
++*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
++*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
++*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
++*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
++*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
++*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
++*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
++*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
++*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
++*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
++*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
++*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
++*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
++*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
++*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
++*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
++*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
++*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
++*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
++*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
++*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
++*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
++*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
++*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
++*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
++*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
++*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
++*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
++*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
++*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
++*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
++*CloseUI: *Copies
++
++*CloseGroup: General
++
++*OpenGroup: Adjustment/Adjustment
++
++*OpenUI *halftone/Halftone Algorithm: PickOne
++*FoomaticRIPOption halftone: enum CmdLine A
++*OrderDependency: 110 AnySetup *halftone
++*Defaulthalftone: default
++*halftone default/Default: "%% FoomaticRIPOptionSetting: halftone=default"
++*FoomaticRIPOptionSetting halftone=default: "  "
++*halftone as/Accurate Screens (better): "%% FoomaticRIPOptionSetting: halftone=as"
++*FoomaticRIPOptionSetting halftone=as: " -qas  "
++*halftone standard/Standard: "%% FoomaticRIPOptionSetting: halftone=standard"
++*FoomaticRIPOptionSetting halftone=standard: " -q1  "
++*halftone wts/Well Tempered Screens (best): "%% FoomaticRIPOptionSetting: halftone=wts"
++*FoomaticRIPOptionSetting halftone=wts: " -qwts  "
++*CloseUI: *halftone
++
++*OpenUI *ICM/ICM Color Profile: PickOne
++*FoomaticRIPOption ICM: enum CmdLine A
++*OrderDependency: 300 AnySetup *ICM
++*DefaultICM: none
++*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
++*FoomaticRIPOptionSetting ICM=none: "-C10 -Gnone.icm "
++*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
++*FoomaticRIPOptionSetting ICM=testing: "-C10 -Gtesting.icm "
++*ICM testing2/File testing2.icm: "%% FoomaticRIPOptionSetting: ICM=testing2"
++*FoomaticRIPOptionSetting ICM=testing2: "-C10 -Gtesting2.icm "
++*ICM testing3/File testing3.icm: "%% FoomaticRIPOptionSetting: ICM=testing3"
++*FoomaticRIPOptionSetting ICM=testing3: "-C10 -Gtesting3.icm "
++*CloseUI: *ICM
++
++*CloseGroup: Adjustment
++
++*OpenGroup: Miscellaneous/Miscellaneous
++
++*OpenUI *NupOrient/N-up Orientation: PickOne
++*FoomaticRIPOption NupOrient: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupOrient
++*DefaultNupOrient: port
++*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
++*FoomaticRIPOptionSetting NupOrient=land: "-ol "
++*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
++*FoomaticRIPOptionSetting NupOrient=port: " "
++*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
++*FoomaticRIPOptionSetting NupOrient=sea: "-os "
++*CloseUI: *NupOrient
++
++*OpenUI *NupPages/N-up Printing: PickOne
++*FoomaticRIPOption NupPages: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupPages
++*DefaultNupPages: 1up
++*NupPages 1up/1-up: "%% FoomaticRIPOptionSetting: NupPages=1up"
++*FoomaticRIPOptionSetting NupPages=1up: " "
++*NupPages 2up/2-up: "%% FoomaticRIPOptionSetting: NupPages=2up"
++*FoomaticRIPOptionSetting NupPages=2up: "-2 "
++*NupPages 3up/3-up: "%% FoomaticRIPOptionSetting: NupPages=3up"
++*FoomaticRIPOptionSetting NupPages=3up: "-3 "
++*NupPages 4up/4-up: "%% FoomaticRIPOptionSetting: NupPages=4up"
++*FoomaticRIPOptionSetting NupPages=4up: "-4 "
++*NupPages 6up/6-up: "%% FoomaticRIPOptionSetting: NupPages=6up"
++*FoomaticRIPOptionSetting NupPages=6up: "-6 "
++*NupPages 8up/8-up: "%% FoomaticRIPOptionSetting: NupPages=8up"
++*FoomaticRIPOptionSetting NupPages=8up: "-8 "
++*NupPages 10up/10-up: "%% FoomaticRIPOptionSetting: NupPages=10up"
++*FoomaticRIPOptionSetting NupPages=10up: "-10 "
++*NupPages 12up/12-up: "%% FoomaticRIPOptionSetting: NupPages=12up"
++*FoomaticRIPOptionSetting NupPages=12up: "-12 "
++*NupPages 14up/14-up: "%% FoomaticRIPOptionSetting: NupPages=14up"
++*FoomaticRIPOptionSetting NupPages=14up: "-14 "
++*NupPages 15up/15-up: "%% FoomaticRIPOptionSetting: NupPages=15up"
++*FoomaticRIPOptionSetting NupPages=15up: "-15 "
++*NupPages 16up/16-up: "%% FoomaticRIPOptionSetting: NupPages=16up"
++*FoomaticRIPOptionSetting NupPages=16up: "-16 "
++*NupPages 18up/18-up: "%% FoomaticRIPOptionSetting: NupPages=18up"
++*FoomaticRIPOptionSetting NupPages=18up: "-18 "
++*CloseUI: *NupPages
++
++*CloseGroup: Miscellaneous
++
++
++*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
++
++*DefaultFont: Courier
++*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
++*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
++*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
++*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
++*Font Bookman-Light: Standard "(001.004S)" Standard ROM
++*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
++*Font Courier: Standard "(002.004S)" Standard ROM
++*Font Courier-Bold: Standard "(002.004S)" Standard ROM
++*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
++*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
++*Font Helvetica: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
++*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
++*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
++*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
++*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
++*Font Symbol: Special "(001.007S)" Special ROM
++*Font Times-Bold: Standard "(001.007S)" Standard ROM
++*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
++*Font Times-Italic: Standard "(001.007S)" Standard ROM
++*Font Times-Roman: Standard "(001.007S)" Standard ROM
++*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
++*Font ZapfDingbats: Special "(001.004S)" Standard ROM
++
+--- foo2zjs/PPD/Dell-C1760.ppd	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/PPD/Dell-C1760.ppd	2014-04-01 11:06:30.000000000 +0000
+@@ -0,0 +1,433 @@
++*PPD-Adobe: "4.3"
++*%
++*% For information on using this, and to obtain the required backend
++*% script, consult http://www.openprinting.org/
++*%
++*% This file is published under the GNU General Public License
++*%
++*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with 
++*% all programs and environments which use PPD files for dealing with
++*% printer capability information. The printer must be configured with the
++*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This 
++*% file and "foomatic-rip" work together to support PPD-controlled printer
++*% driver option access with arbitrary free software printer drivers and
++*% printing spoolers.
++*%
++*% To save this file on your disk, wait until the download has completed
++*% (the animation of the browser logo must stop) and then use the
++*% "Save as..." command in the "File" menu of your browser or in the 
++*% pop-up manu when you click on this document with the right mouse button.
++*% DO NOT cut and paste this file into an editor with your mouse. This can
++*% introduce additional line breaks which lead to unexpected results.
++*%
++*% You may save this file as 'Dell-C1760-foo2hbpl1.ppd'
++*%
++*%
++*FormatVersion:	"4.3"
++*FileVersion:	"1.1"
++*LanguageVersion: English 
++*LanguageEncoding: ISOLatin1
++*PCFileName:	"FOO2HBPL.PPD"
++*Manufacturer:	"Dell"
++*Product:	"(C1760)"
++*cupsVersion:	1.0
++*cupsManualCopies: True
++*cupsModelNumber:  2
++*cupsFilter:	"application/vnd.cups-postscript 0 foomatic-rip"
++*%pprRIP:        foomatic-rip other
++*ModelName:     "Dell C1760"
++*ShortNickName: "Dell C1760 foo2hbpl1"
++*NickName:      "Dell C1760 Foomatic/foo2hbpl1 (recommended)"
++*PSVersion:	"(3010.000) 550"
++*PSVersion:	"(3010.000) 651"
++*PSVersion:	"(3010.000) 652"
++*PSVersion:	"(3010.000) 653"
++*PSVersion:	"(3010.000) 704"
++*PSVersion:	"(3010.000) 705"
++*PSVersion:	"(3010.000) 800"
++*LanguageLevel:	"3"
++*ColorDevice:	True
++*DefaultColorSpace: RGB
++*FileSystem:	False
++*Throughput:	"1"
++*LandscapeOrientation: Plus90
++*TTRasterizer:	Type42
++*1284DeviceID: "DRV:Dfoo2hbpl1,R1,M0,TF;"
++
++*driverName foo2hbpl1/foo2hbpl1: ""
++*driverType F/Filter: ""
++*driverUrl: "http://foo2hbpl.rkkda.com/"
++*driverObsolete: False
++
++
++
++
++*HWMargins: 9 12.00 9 12
++*VariablePaperSize: True
++*MaxMediaWidth: 100000
++*MaxMediaHeight: 100000
++*NonUIOrderDependency: 135 AnySetup *CustomPageSize
++*CustomPageSize True: "pop pop pop pop pop
++%% FoomaticRIPOptionSetting: PageSize=Custom"
++*End
++*FoomaticRIPOptionSetting PageSize=Custom: "-pCustom.%0x%1 "
++*ParamCustomPageSize Width: 1 points 36 100000
++*ParamCustomPageSize Height: 2 points 36 100000
++*ParamCustomPageSize Orientation: 3 int 0 0
++*ParamCustomPageSize WidthOffset: 4 points 0 0
++*ParamCustomPageSize HeightOffset: 5 points 0 0
++
++*FoomaticIDs: Dell-C1760 foo2hbpl1
++*FoomaticRIPCommandLine: "foo2hbpl1-wrapper %A"
++
++*OpenGroup: General/General
++
++*OpenUI *Quality/Printing Quality: PickOne
++*FoomaticRIPOption Quality: enum CmdLine A
++*OrderDependency: 110 AnySetup *Quality
++*DefaultQuality: normal
++*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
++*FoomaticRIPOptionSetting Quality=draft: " -t  "
++*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
++*FoomaticRIPOptionSetting Quality=normal: "  "
++*CloseUI: *Quality
++
++*OpenUI *ColorMode/Color Mode: PickOne
++*FoomaticRIPOption ColorMode: enum CmdLine A
++*OrderDependency: 120 AnySetup *ColorMode
++*DefaultColorMode: Monochrome
++*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
++*FoomaticRIPOptionSetting ColorMode=Color: "-c "
++*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
++*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
++*CloseUI: *ColorMode
++
++*OpenUI *PageSize/Page Size: PickOne
++*FoomaticRIPOption PageSize: enum CmdLine A
++*OrderDependency: 135 AnySetup *PageSize
++*DefaultPageSize: Letter
++*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*FoomaticRIPOptionSetting PageSize=Letter: "-p4 "
++*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*FoomaticRIPOptionSetting PageSize=A4: "-p1 "
++*PageSize B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*FoomaticRIPOptionSetting PageSize=B5jis: "-p2 "
++*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*FoomaticRIPOptionSetting PageSize=Env10: "-p9 "
++*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*FoomaticRIPOptionSetting PageSize=EnvC5: "-p11 "
++*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*FoomaticRIPOptionSetting PageSize=EnvDL: "-p12 "
++*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p10 "
++*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*FoomaticRIPOptionSetting PageSize=Executive: "-p5 "
++*PageSize FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*FoomaticRIPOptionSetting PageSize=FanfoldGermanLegal: "-p6 "
++*PageSize Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*FoomaticRIPOptionSetting PageSize=Folio: "-p6 "
++*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*FoomaticRIPOptionSetting PageSize=Legal: "-p7 "
++*CloseUI: *PageSize
++
++*OpenUI *PageRegion: PickOne
++*OrderDependency: 135 AnySetup *PageRegion
++*DefaultPageRegion: Letter
++*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*PageRegion B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*PageRegion FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*PageRegion Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*CloseUI: *PageRegion
++
++*DefaultImageableArea: Letter
++*ImageableArea Letter/Letter: "9 12.00 603 780.00"
++*ImageableArea A4/A4: "9 12.00 586 830.00"
++*ImageableArea B5jis/B5 (JIS): "9 12.00 509 715.00"
++*ImageableArea Env10/Env #10: "9 12.00 288 672.00"
++*ImageableArea EnvC5/Env C5: "9 12.00 450 637.00"
++*ImageableArea EnvDL/Env DL: "9 12.00 302 611.00"
++*ImageableArea EnvMonarch/Env Monarch: "9 12.00 270 528.00"
++*ImageableArea Executive/Executive: "9 12.00 513 744.00"
++*ImageableArea FanfoldGermanLegal/Fanfold German Legal: "9 12.00 603 996.00"
++*ImageableArea Folio/Folio: "9 12.00 603 924.00"
++*ImageableArea Legal/Legal: "9 12.00 603 996.00"
++
++*DefaultPaperDimension: Letter
++*PaperDimension Letter/Letter: "612 792"
++*PaperDimension A4/A4: "595 842"
++*PaperDimension B5jis/B5 (JIS): "518 727"
++*PaperDimension Env10/Env #10: "297 684"
++*PaperDimension EnvC5/Env C5: "459 649"
++*PaperDimension EnvDL/Env DL: "311 623"
++*PaperDimension EnvMonarch/Env Monarch: "279 540"
++*PaperDimension Executive/Executive: "522 756"
++*PaperDimension FanfoldGermanLegal/Fanfold German Legal: "612 1008"
++*PaperDimension Folio/Folio: "612 936"
++*PaperDimension Legal/Legal: "612 1008"
++
++*OpenUI *MediaType/Media Type: PickOne
++*FoomaticRIPOption MediaType: enum CmdLine A
++*OrderDependency: 150 AnySetup *MediaType
++*DefaultMediaType: plain
++*MediaType plain/Plain Paper: "%% FoomaticRIPOptionSetting: MediaType=plain"
++*FoomaticRIPOptionSetting MediaType=plain: "-m1 "
++*MediaType plain2/Plain Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=plain2"
++*FoomaticRIPOptionSetting MediaType=plain2: "-m8 "
++*MediaType bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=bond"
++*FoomaticRIPOptionSetting MediaType=bond: "-m2 "
++*MediaType bond2/Bond Side 2: "%% FoomaticRIPOptionSetting: MediaType=bond2"
++*FoomaticRIPOptionSetting MediaType=bond2: "-m9 "
++*MediaType envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=envelope"
++*FoomaticRIPOptionSetting MediaType=envelope: "-m6 "
++*MediaType labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=labels"
++*FoomaticRIPOptionSetting MediaType=labels: "-m5 "
++*MediaType lwcard/Light Weight Card: "%% FoomaticRIPOptionSetting: MediaType=lwcard"
++*FoomaticRIPOptionSetting MediaType=lwcard: "-m3 "
++*MediaType lwcard2/Light Weight Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwcard2"
++*FoomaticRIPOptionSetting MediaType=lwcard2: "-m10 "
++*MediaType lwgcard/Light Weight Glossy Card: "%% FoomaticRIPOptionSetting: MediaType=lwgcard"
++*FoomaticRIPOptionSetting MediaType=lwgcard: "-m4 "
++*MediaType lwgcard2/Light Weight Glossy Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwgcard2"
++*FoomaticRIPOptionSetting MediaType=lwgcard2: "-m11 "
++*MediaType recycled/Recycled Paper: "%% FoomaticRIPOptionSetting: MediaType=recycled"
++*FoomaticRIPOptionSetting MediaType=recycled: "-m7 "
++*MediaType recycled2/Recycled Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=recycled2"
++*FoomaticRIPOptionSetting MediaType=recycled2: "-m12 "
++*CloseUI: *MediaType
++
++*OpenUI *Copies/Copies: PickOne
++*FoomaticRIPOption Copies: int CmdLine A
++*FoomaticRIPOptionPrototype Copies: "-n%s "
++*FoomaticRIPOptionRange Copies: 1 100
++*OrderDependency: 220 AnySetup *Copies
++*DefaultCopies: 1
++*FoomaticRIPDefaultCopies: 1
++*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
++*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
++*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
++*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
++*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
++*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
++*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
++*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
++*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
++*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
++*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
++*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
++*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
++*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
++*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
++*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
++*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
++*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
++*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
++*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
++*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
++*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
++*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
++*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
++*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
++*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
++*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
++*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
++*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
++*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
++*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
++*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
++*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
++*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
++*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
++*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
++*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
++*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
++*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
++*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
++*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
++*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
++*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
++*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
++*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
++*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
++*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
++*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
++*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
++*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
++*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
++*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
++*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
++*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
++*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
++*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
++*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
++*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
++*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
++*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
++*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
++*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
++*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
++*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
++*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
++*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
++*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
++*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
++*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
++*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
++*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
++*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
++*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
++*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
++*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
++*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
++*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
++*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
++*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
++*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
++*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
++*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
++*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
++*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
++*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
++*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
++*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
++*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
++*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
++*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
++*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
++*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
++*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
++*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
++*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
++*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
++*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
++*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
++*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
++*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
++*CloseUI: *Copies
++
++*CloseGroup: General
++
++*OpenGroup: Adjustment/Adjustment
++
++*OpenUI *halftone/Halftone Algorithm: PickOne
++*FoomaticRIPOption halftone: enum CmdLine A
++*OrderDependency: 110 AnySetup *halftone
++*Defaulthalftone: default
++*halftone default/Default: "%% FoomaticRIPOptionSetting: halftone=default"
++*FoomaticRIPOptionSetting halftone=default: "  "
++*halftone as/Accurate Screens (better): "%% FoomaticRIPOptionSetting: halftone=as"
++*FoomaticRIPOptionSetting halftone=as: " -qas  "
++*halftone standard/Standard: "%% FoomaticRIPOptionSetting: halftone=standard"
++*FoomaticRIPOptionSetting halftone=standard: " -q1  "
++*halftone wts/Well Tempered Screens (best): "%% FoomaticRIPOptionSetting: halftone=wts"
++*FoomaticRIPOptionSetting halftone=wts: " -qwts  "
++*CloseUI: *halftone
++
++*OpenUI *ICM/ICM Color Profile: PickOne
++*FoomaticRIPOption ICM: enum CmdLine A
++*OrderDependency: 300 AnySetup *ICM
++*DefaultICM: none
++*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
++*FoomaticRIPOptionSetting ICM=none: "-C10 -Gnone.icm "
++*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
++*FoomaticRIPOptionSetting ICM=testing: "-C10 -Gtesting.icm "
++*ICM testing2/File testing2.icm: "%% FoomaticRIPOptionSetting: ICM=testing2"
++*FoomaticRIPOptionSetting ICM=testing2: "-C10 -Gtesting2.icm "
++*ICM testing3/File testing3.icm: "%% FoomaticRIPOptionSetting: ICM=testing3"
++*FoomaticRIPOptionSetting ICM=testing3: "-C10 -Gtesting3.icm "
++*CloseUI: *ICM
++
++*CloseGroup: Adjustment
++
++*OpenGroup: Miscellaneous/Miscellaneous
++
++*OpenUI *NupOrient/N-up Orientation: PickOne
++*FoomaticRIPOption NupOrient: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupOrient
++*DefaultNupOrient: port
++*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
++*FoomaticRIPOptionSetting NupOrient=land: "-ol "
++*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
++*FoomaticRIPOptionSetting NupOrient=port: " "
++*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
++*FoomaticRIPOptionSetting NupOrient=sea: "-os "
++*CloseUI: *NupOrient
++
++*OpenUI *NupPages/N-up Printing: PickOne
++*FoomaticRIPOption NupPages: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupPages
++*DefaultNupPages: 1up
++*NupPages 1up/1-up: "%% FoomaticRIPOptionSetting: NupPages=1up"
++*FoomaticRIPOptionSetting NupPages=1up: " "
++*NupPages 2up/2-up: "%% FoomaticRIPOptionSetting: NupPages=2up"
++*FoomaticRIPOptionSetting NupPages=2up: "-2 "
++*NupPages 3up/3-up: "%% FoomaticRIPOptionSetting: NupPages=3up"
++*FoomaticRIPOptionSetting NupPages=3up: "-3 "
++*NupPages 4up/4-up: "%% FoomaticRIPOptionSetting: NupPages=4up"
++*FoomaticRIPOptionSetting NupPages=4up: "-4 "
++*NupPages 6up/6-up: "%% FoomaticRIPOptionSetting: NupPages=6up"
++*FoomaticRIPOptionSetting NupPages=6up: "-6 "
++*NupPages 8up/8-up: "%% FoomaticRIPOptionSetting: NupPages=8up"
++*FoomaticRIPOptionSetting NupPages=8up: "-8 "
++*NupPages 10up/10-up: "%% FoomaticRIPOptionSetting: NupPages=10up"
++*FoomaticRIPOptionSetting NupPages=10up: "-10 "
++*NupPages 12up/12-up: "%% FoomaticRIPOptionSetting: NupPages=12up"
++*FoomaticRIPOptionSetting NupPages=12up: "-12 "
++*NupPages 14up/14-up: "%% FoomaticRIPOptionSetting: NupPages=14up"
++*FoomaticRIPOptionSetting NupPages=14up: "-14 "
++*NupPages 15up/15-up: "%% FoomaticRIPOptionSetting: NupPages=15up"
++*FoomaticRIPOptionSetting NupPages=15up: "-15 "
++*NupPages 16up/16-up: "%% FoomaticRIPOptionSetting: NupPages=16up"
++*FoomaticRIPOptionSetting NupPages=16up: "-16 "
++*NupPages 18up/18-up: "%% FoomaticRIPOptionSetting: NupPages=18up"
++*FoomaticRIPOptionSetting NupPages=18up: "-18 "
++*CloseUI: *NupPages
++
++*CloseGroup: Miscellaneous
++
++
++*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
++
++*DefaultFont: Courier
++*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
++*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
++*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
++*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
++*Font Bookman-Light: Standard "(001.004S)" Standard ROM
++*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
++*Font Courier: Standard "(002.004S)" Standard ROM
++*Font Courier-Bold: Standard "(002.004S)" Standard ROM
++*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
++*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
++*Font Helvetica: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
++*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
++*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
++*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
++*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
++*Font Symbol: Special "(001.007S)" Special ROM
++*Font Times-Bold: Standard "(001.007S)" Standard ROM
++*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
++*Font Times-Italic: Standard "(001.007S)" Standard ROM
++*Font Times-Roman: Standard "(001.007S)" Standard ROM
++*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
++*Font ZapfDingbats: Special "(001.004S)" Standard ROM
++
+--- foo2zjs/PPD/Epson-AcuLaser_C1700.ppd	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/PPD/Epson-AcuLaser_C1700.ppd	2014-04-01 11:06:31.000000000 +0000
+@@ -0,0 +1,433 @@
++*PPD-Adobe: "4.3"
++*%
++*% For information on using this, and to obtain the required backend
++*% script, consult http://www.openprinting.org/
++*%
++*% This file is published under the GNU General Public License
++*%
++*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with 
++*% all programs and environments which use PPD files for dealing with
++*% printer capability information. The printer must be configured with the
++*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This 
++*% file and "foomatic-rip" work together to support PPD-controlled printer
++*% driver option access with arbitrary free software printer drivers and
++*% printing spoolers.
++*%
++*% To save this file on your disk, wait until the download has completed
++*% (the animation of the browser logo must stop) and then use the
++*% "Save as..." command in the "File" menu of your browser or in the 
++*% pop-up manu when you click on this document with the right mouse button.
++*% DO NOT cut and paste this file into an editor with your mouse. This can
++*% introduce additional line breaks which lead to unexpected results.
++*%
++*% You may save this file as 'Epson-AcuLaser_C1700-foo2hbpl1.ppd'
++*%
++*%
++*FormatVersion:	"4.3"
++*FileVersion:	"1.1"
++*LanguageVersion: English 
++*LanguageEncoding: ISOLatin1
++*PCFileName:	"FOO2HBPL.PPD"
++*Manufacturer:	"Epson"
++*Product:	"(AcuLaser C1700)"
++*cupsVersion:	1.0
++*cupsManualCopies: True
++*cupsModelNumber:  2
++*cupsFilter:	"application/vnd.cups-postscript 0 foomatic-rip"
++*%pprRIP:        foomatic-rip other
++*ModelName:     "Epson AcuLaser C1700"
++*ShortNickName: "Epson AcuLaser C1700 foo2hbpl1"
++*NickName:      "Epson AcuLaser C1700 Foomatic/foo2hbpl1 (recommended)"
++*PSVersion:	"(3010.000) 550"
++*PSVersion:	"(3010.000) 651"
++*PSVersion:	"(3010.000) 652"
++*PSVersion:	"(3010.000) 653"
++*PSVersion:	"(3010.000) 704"
++*PSVersion:	"(3010.000) 705"
++*PSVersion:	"(3010.000) 800"
++*LanguageLevel:	"3"
++*ColorDevice:	True
++*DefaultColorSpace: RGB
++*FileSystem:	False
++*Throughput:	"1"
++*LandscapeOrientation: Plus90
++*TTRasterizer:	Type42
++*1284DeviceID: "DRV:Dfoo2hbpl1,R1,M0,TF;"
++
++*driverName foo2hbpl1/foo2hbpl1: ""
++*driverType F/Filter: ""
++*driverUrl: "http://foo2hbpl.rkkda.com/"
++*driverObsolete: False
++
++
++
++
++*HWMargins: 9 12.00 9 12
++*VariablePaperSize: True
++*MaxMediaWidth: 100000
++*MaxMediaHeight: 100000
++*NonUIOrderDependency: 135 AnySetup *CustomPageSize
++*CustomPageSize True: "pop pop pop pop pop
++%% FoomaticRIPOptionSetting: PageSize=Custom"
++*End
++*FoomaticRIPOptionSetting PageSize=Custom: "-pCustom.%0x%1 "
++*ParamCustomPageSize Width: 1 points 36 100000
++*ParamCustomPageSize Height: 2 points 36 100000
++*ParamCustomPageSize Orientation: 3 int 0 0
++*ParamCustomPageSize WidthOffset: 4 points 0 0
++*ParamCustomPageSize HeightOffset: 5 points 0 0
++
++*FoomaticIDs: Epson-AcuLaser_C1700 foo2hbpl1
++*FoomaticRIPCommandLine: "foo2hbpl1-wrapper %A"
++
++*OpenGroup: General/General
++
++*OpenUI *Quality/Printing Quality: PickOne
++*FoomaticRIPOption Quality: enum CmdLine A
++*OrderDependency: 110 AnySetup *Quality
++*DefaultQuality: normal
++*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
++*FoomaticRIPOptionSetting Quality=draft: " -t  "
++*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
++*FoomaticRIPOptionSetting Quality=normal: "  "
++*CloseUI: *Quality
++
++*OpenUI *ColorMode/Color Mode: PickOne
++*FoomaticRIPOption ColorMode: enum CmdLine A
++*OrderDependency: 120 AnySetup *ColorMode
++*DefaultColorMode: Monochrome
++*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
++*FoomaticRIPOptionSetting ColorMode=Color: "-c "
++*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
++*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
++*CloseUI: *ColorMode
++
++*OpenUI *PageSize/Page Size: PickOne
++*FoomaticRIPOption PageSize: enum CmdLine A
++*OrderDependency: 135 AnySetup *PageSize
++*DefaultPageSize: Letter
++*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*FoomaticRIPOptionSetting PageSize=Letter: "-p4 "
++*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*FoomaticRIPOptionSetting PageSize=A4: "-p1 "
++*PageSize B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*FoomaticRIPOptionSetting PageSize=B5jis: "-p2 "
++*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*FoomaticRIPOptionSetting PageSize=Env10: "-p9 "
++*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*FoomaticRIPOptionSetting PageSize=EnvC5: "-p11 "
++*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*FoomaticRIPOptionSetting PageSize=EnvDL: "-p12 "
++*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p10 "
++*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*FoomaticRIPOptionSetting PageSize=Executive: "-p5 "
++*PageSize FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*FoomaticRIPOptionSetting PageSize=FanfoldGermanLegal: "-p6 "
++*PageSize Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*FoomaticRIPOptionSetting PageSize=Folio: "-p6 "
++*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*FoomaticRIPOptionSetting PageSize=Legal: "-p7 "
++*CloseUI: *PageSize
++
++*OpenUI *PageRegion: PickOne
++*OrderDependency: 135 AnySetup *PageRegion
++*DefaultPageRegion: Letter
++*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*PageRegion B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*PageRegion FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*PageRegion Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*CloseUI: *PageRegion
++
++*DefaultImageableArea: Letter
++*ImageableArea Letter/Letter: "9 12.00 603 780.00"
++*ImageableArea A4/A4: "9 12.00 586 830.00"
++*ImageableArea B5jis/B5 (JIS): "9 12.00 509 715.00"
++*ImageableArea Env10/Env #10: "9 12.00 288 672.00"
++*ImageableArea EnvC5/Env C5: "9 12.00 450 637.00"
++*ImageableArea EnvDL/Env DL: "9 12.00 302 611.00"
++*ImageableArea EnvMonarch/Env Monarch: "9 12.00 270 528.00"
++*ImageableArea Executive/Executive: "9 12.00 513 744.00"
++*ImageableArea FanfoldGermanLegal/Fanfold German Legal: "9 12.00 603 996.00"
++*ImageableArea Folio/Folio: "9 12.00 603 924.00"
++*ImageableArea Legal/Legal: "9 12.00 603 996.00"
++
++*DefaultPaperDimension: Letter
++*PaperDimension Letter/Letter: "612 792"
++*PaperDimension A4/A4: "595 842"
++*PaperDimension B5jis/B5 (JIS): "518 727"
++*PaperDimension Env10/Env #10: "297 684"
++*PaperDimension EnvC5/Env C5: "459 649"
++*PaperDimension EnvDL/Env DL: "311 623"
++*PaperDimension EnvMonarch/Env Monarch: "279 540"
++*PaperDimension Executive/Executive: "522 756"
++*PaperDimension FanfoldGermanLegal/Fanfold German Legal: "612 1008"
++*PaperDimension Folio/Folio: "612 936"
++*PaperDimension Legal/Legal: "612 1008"
++
++*OpenUI *MediaType/Media Type: PickOne
++*FoomaticRIPOption MediaType: enum CmdLine A
++*OrderDependency: 150 AnySetup *MediaType
++*DefaultMediaType: plain
++*MediaType plain/Plain Paper: "%% FoomaticRIPOptionSetting: MediaType=plain"
++*FoomaticRIPOptionSetting MediaType=plain: "-m1 "
++*MediaType plain2/Plain Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=plain2"
++*FoomaticRIPOptionSetting MediaType=plain2: "-m8 "
++*MediaType bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=bond"
++*FoomaticRIPOptionSetting MediaType=bond: "-m2 "
++*MediaType bond2/Bond Side 2: "%% FoomaticRIPOptionSetting: MediaType=bond2"
++*FoomaticRIPOptionSetting MediaType=bond2: "-m9 "
++*MediaType envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=envelope"
++*FoomaticRIPOptionSetting MediaType=envelope: "-m6 "
++*MediaType labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=labels"
++*FoomaticRIPOptionSetting MediaType=labels: "-m5 "
++*MediaType lwcard/Light Weight Card: "%% FoomaticRIPOptionSetting: MediaType=lwcard"
++*FoomaticRIPOptionSetting MediaType=lwcard: "-m3 "
++*MediaType lwcard2/Light Weight Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwcard2"
++*FoomaticRIPOptionSetting MediaType=lwcard2: "-m10 "
++*MediaType lwgcard/Light Weight Glossy Card: "%% FoomaticRIPOptionSetting: MediaType=lwgcard"
++*FoomaticRIPOptionSetting MediaType=lwgcard: "-m4 "
++*MediaType lwgcard2/Light Weight Glossy Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwgcard2"
++*FoomaticRIPOptionSetting MediaType=lwgcard2: "-m11 "
++*MediaType recycled/Recycled Paper: "%% FoomaticRIPOptionSetting: MediaType=recycled"
++*FoomaticRIPOptionSetting MediaType=recycled: "-m7 "
++*MediaType recycled2/Recycled Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=recycled2"
++*FoomaticRIPOptionSetting MediaType=recycled2: "-m12 "
++*CloseUI: *MediaType
++
++*OpenUI *Copies/Copies: PickOne
++*FoomaticRIPOption Copies: int CmdLine A
++*FoomaticRIPOptionPrototype Copies: "-n%s "
++*FoomaticRIPOptionRange Copies: 1 100
++*OrderDependency: 220 AnySetup *Copies
++*DefaultCopies: 1
++*FoomaticRIPDefaultCopies: 1
++*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
++*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
++*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
++*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
++*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
++*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
++*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
++*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
++*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
++*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
++*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
++*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
++*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
++*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
++*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
++*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
++*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
++*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
++*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
++*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
++*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
++*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
++*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
++*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
++*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
++*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
++*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
++*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
++*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
++*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
++*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
++*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
++*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
++*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
++*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
++*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
++*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
++*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
++*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
++*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
++*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
++*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
++*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
++*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
++*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
++*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
++*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
++*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
++*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
++*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
++*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
++*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
++*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
++*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
++*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
++*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
++*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
++*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
++*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
++*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
++*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
++*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
++*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
++*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
++*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
++*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
++*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
++*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
++*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
++*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
++*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
++*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
++*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
++*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
++*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
++*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
++*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
++*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
++*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
++*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
++*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
++*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
++*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
++*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
++*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
++*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
++*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
++*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
++*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
++*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
++*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
++*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
++*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
++*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
++*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
++*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
++*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
++*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
++*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
++*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
++*CloseUI: *Copies
++
++*CloseGroup: General
++
++*OpenGroup: Adjustment/Adjustment
++
++*OpenUI *halftone/Halftone Algorithm: PickOne
++*FoomaticRIPOption halftone: enum CmdLine A
++*OrderDependency: 110 AnySetup *halftone
++*Defaulthalftone: default
++*halftone default/Default: "%% FoomaticRIPOptionSetting: halftone=default"
++*FoomaticRIPOptionSetting halftone=default: "  "
++*halftone as/Accurate Screens (better): "%% FoomaticRIPOptionSetting: halftone=as"
++*FoomaticRIPOptionSetting halftone=as: " -qas  "
++*halftone standard/Standard: "%% FoomaticRIPOptionSetting: halftone=standard"
++*FoomaticRIPOptionSetting halftone=standard: " -q1  "
++*halftone wts/Well Tempered Screens (best): "%% FoomaticRIPOptionSetting: halftone=wts"
++*FoomaticRIPOptionSetting halftone=wts: " -qwts  "
++*CloseUI: *halftone
++
++*OpenUI *ICM/ICM Color Profile: PickOne
++*FoomaticRIPOption ICM: enum CmdLine A
++*OrderDependency: 300 AnySetup *ICM
++*DefaultICM: none
++*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
++*FoomaticRIPOptionSetting ICM=none: "-C10 -Gnone.icm "
++*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
++*FoomaticRIPOptionSetting ICM=testing: "-C10 -Gtesting.icm "
++*ICM testing2/File testing2.icm: "%% FoomaticRIPOptionSetting: ICM=testing2"
++*FoomaticRIPOptionSetting ICM=testing2: "-C10 -Gtesting2.icm "
++*ICM testing3/File testing3.icm: "%% FoomaticRIPOptionSetting: ICM=testing3"
++*FoomaticRIPOptionSetting ICM=testing3: "-C10 -Gtesting3.icm "
++*CloseUI: *ICM
++
++*CloseGroup: Adjustment
++
++*OpenGroup: Miscellaneous/Miscellaneous
++
++*OpenUI *NupOrient/N-up Orientation: PickOne
++*FoomaticRIPOption NupOrient: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupOrient
++*DefaultNupOrient: port
++*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
++*FoomaticRIPOptionSetting NupOrient=land: "-ol "
++*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
++*FoomaticRIPOptionSetting NupOrient=port: " "
++*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
++*FoomaticRIPOptionSetting NupOrient=sea: "-os "
++*CloseUI: *NupOrient
++
++*OpenUI *NupPages/N-up Printing: PickOne
++*FoomaticRIPOption NupPages: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupPages
++*DefaultNupPages: 1up
++*NupPages 1up/1-up: "%% FoomaticRIPOptionSetting: NupPages=1up"
++*FoomaticRIPOptionSetting NupPages=1up: " "
++*NupPages 2up/2-up: "%% FoomaticRIPOptionSetting: NupPages=2up"
++*FoomaticRIPOptionSetting NupPages=2up: "-2 "
++*NupPages 3up/3-up: "%% FoomaticRIPOptionSetting: NupPages=3up"
++*FoomaticRIPOptionSetting NupPages=3up: "-3 "
++*NupPages 4up/4-up: "%% FoomaticRIPOptionSetting: NupPages=4up"
++*FoomaticRIPOptionSetting NupPages=4up: "-4 "
++*NupPages 6up/6-up: "%% FoomaticRIPOptionSetting: NupPages=6up"
++*FoomaticRIPOptionSetting NupPages=6up: "-6 "
++*NupPages 8up/8-up: "%% FoomaticRIPOptionSetting: NupPages=8up"
++*FoomaticRIPOptionSetting NupPages=8up: "-8 "
++*NupPages 10up/10-up: "%% FoomaticRIPOptionSetting: NupPages=10up"
++*FoomaticRIPOptionSetting NupPages=10up: "-10 "
++*NupPages 12up/12-up: "%% FoomaticRIPOptionSetting: NupPages=12up"
++*FoomaticRIPOptionSetting NupPages=12up: "-12 "
++*NupPages 14up/14-up: "%% FoomaticRIPOptionSetting: NupPages=14up"
++*FoomaticRIPOptionSetting NupPages=14up: "-14 "
++*NupPages 15up/15-up: "%% FoomaticRIPOptionSetting: NupPages=15up"
++*FoomaticRIPOptionSetting NupPages=15up: "-15 "
++*NupPages 16up/16-up: "%% FoomaticRIPOptionSetting: NupPages=16up"
++*FoomaticRIPOptionSetting NupPages=16up: "-16 "
++*NupPages 18up/18-up: "%% FoomaticRIPOptionSetting: NupPages=18up"
++*FoomaticRIPOptionSetting NupPages=18up: "-18 "
++*CloseUI: *NupPages
++
++*CloseGroup: Miscellaneous
++
++
++*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
++
++*DefaultFont: Courier
++*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
++*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
++*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
++*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
++*Font Bookman-Light: Standard "(001.004S)" Standard ROM
++*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
++*Font Courier: Standard "(002.004S)" Standard ROM
++*Font Courier-Bold: Standard "(002.004S)" Standard ROM
++*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
++*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
++*Font Helvetica: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
++*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
++*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
++*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
++*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
++*Font Symbol: Special "(001.007S)" Special ROM
++*Font Times-Bold: Standard "(001.007S)" Standard ROM
++*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
++*Font Times-Italic: Standard "(001.007S)" Standard ROM
++*Font Times-Roman: Standard "(001.007S)" Standard ROM
++*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
++*Font ZapfDingbats: Special "(001.004S)" Standard ROM
++
+--- foo2zjs/PPD/Fuji_Xerox-DocuPrint_CP105.ppd	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/PPD/Fuji_Xerox-DocuPrint_CP105.ppd	2014-04-01 11:06:31.000000000 +0000
+@@ -0,0 +1,433 @@
++*PPD-Adobe: "4.3"
++*%
++*% For information on using this, and to obtain the required backend
++*% script, consult http://www.openprinting.org/
++*%
++*% This file is published under the GNU General Public License
++*%
++*% PPD-O-MATIC (3.0.0 or newer) generated this PPD file. It is for use with 
++*% all programs and environments which use PPD files for dealing with
++*% printer capability information. The printer must be configured with the
++*% "foomatic-rip" backend filter script of Foomatic 3.0.0 or newer. This 
++*% file and "foomatic-rip" work together to support PPD-controlled printer
++*% driver option access with arbitrary free software printer drivers and
++*% printing spoolers.
++*%
++*% To save this file on your disk, wait until the download has completed
++*% (the animation of the browser logo must stop) and then use the
++*% "Save as..." command in the "File" menu of your browser or in the 
++*% pop-up manu when you click on this document with the right mouse button.
++*% DO NOT cut and paste this file into an editor with your mouse. This can
++*% introduce additional line breaks which lead to unexpected results.
++*%
++*% You may save this file as 'Fuji_Xerox-DocuPrint_CP105-foo2hbpl1.ppd'
++*%
++*%
++*FormatVersion:	"4.3"
++*FileVersion:	"1.1"
++*LanguageVersion: English 
++*LanguageEncoding: ISOLatin1
++*PCFileName:	"FOO2HBPL.PPD"
++*Manufacturer:	"Fuji Xerox"
++*Product:	"(DocuPrint CP105)"
++*cupsVersion:	1.0
++*cupsManualCopies: True
++*cupsModelNumber:  2
++*cupsFilter:	"application/vnd.cups-postscript 0 foomatic-rip"
++*%pprRIP:        foomatic-rip other
++*ModelName:     "Fuji Xerox DocuPrint CP105"
++*ShortNickName: "Fuji Xerox D.P. CP105 foo2hbpl1"
++*NickName:      "Fuji Xerox DocuPrint CP105 Foomatic/foo2hbpl1 (recommended)"
++*PSVersion:	"(3010.000) 550"
++*PSVersion:	"(3010.000) 651"
++*PSVersion:	"(3010.000) 652"
++*PSVersion:	"(3010.000) 653"
++*PSVersion:	"(3010.000) 704"
++*PSVersion:	"(3010.000) 705"
++*PSVersion:	"(3010.000) 800"
++*LanguageLevel:	"3"
++*ColorDevice:	True
++*DefaultColorSpace: RGB
++*FileSystem:	False
++*Throughput:	"1"
++*LandscapeOrientation: Plus90
++*TTRasterizer:	Type42
++*1284DeviceID: "DRV:Dfoo2hbpl1,R1,M0,TF;"
++
++*driverName foo2hbpl1/foo2hbpl1: ""
++*driverType F/Filter: ""
++*driverUrl: "http://foo2hbpl.rkkda.com/"
++*driverObsolete: False
++
++
++
++
++*HWMargins: 9 12.00 9 12
++*VariablePaperSize: True
++*MaxMediaWidth: 100000
++*MaxMediaHeight: 100000
++*NonUIOrderDependency: 135 AnySetup *CustomPageSize
++*CustomPageSize True: "pop pop pop pop pop
++%% FoomaticRIPOptionSetting: PageSize=Custom"
++*End
++*FoomaticRIPOptionSetting PageSize=Custom: "-pCustom.%0x%1 "
++*ParamCustomPageSize Width: 1 points 36 100000
++*ParamCustomPageSize Height: 2 points 36 100000
++*ParamCustomPageSize Orientation: 3 int 0 0
++*ParamCustomPageSize WidthOffset: 4 points 0 0
++*ParamCustomPageSize HeightOffset: 5 points 0 0
++
++*FoomaticIDs: Fuji_Xerox-DocuPrint_CP105 foo2hbpl1
++*FoomaticRIPCommandLine: "foo2hbpl1-wrapper %A"
++
++*OpenGroup: General/General
++
++*OpenUI *Quality/Printing Quality: PickOne
++*FoomaticRIPOption Quality: enum CmdLine A
++*OrderDependency: 110 AnySetup *Quality
++*DefaultQuality: normal
++*Quality draft/Draft: "%% FoomaticRIPOptionSetting: Quality=draft"
++*FoomaticRIPOptionSetting Quality=draft: " -t  "
++*Quality normal/Normal: "%% FoomaticRIPOptionSetting: Quality=normal"
++*FoomaticRIPOptionSetting Quality=normal: "  "
++*CloseUI: *Quality
++
++*OpenUI *ColorMode/Color Mode: PickOne
++*FoomaticRIPOption ColorMode: enum CmdLine A
++*OrderDependency: 120 AnySetup *ColorMode
++*DefaultColorMode: Monochrome
++*ColorMode Color/Color: "%% FoomaticRIPOptionSetting: ColorMode=Color"
++*FoomaticRIPOptionSetting ColorMode=Color: "-c "
++*ColorMode Monochrome/Monochrome: "%% FoomaticRIPOptionSetting: ColorMode=Monochrome"
++*FoomaticRIPOptionSetting ColorMode=Monochrome: " "
++*CloseUI: *ColorMode
++
++*OpenUI *PageSize/Page Size: PickOne
++*FoomaticRIPOption PageSize: enum CmdLine A
++*OrderDependency: 135 AnySetup *PageSize
++*DefaultPageSize: Letter
++*PageSize Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*FoomaticRIPOptionSetting PageSize=Letter: "-p4 "
++*PageSize A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*FoomaticRIPOptionSetting PageSize=A4: "-p1 "
++*PageSize B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*FoomaticRIPOptionSetting PageSize=B5jis: "-p2 "
++*PageSize Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*FoomaticRIPOptionSetting PageSize=Env10: "-p9 "
++*PageSize EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*FoomaticRIPOptionSetting PageSize=EnvC5: "-p11 "
++*PageSize EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*FoomaticRIPOptionSetting PageSize=EnvDL: "-p12 "
++*PageSize EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*FoomaticRIPOptionSetting PageSize=EnvMonarch: "-p10 "
++*PageSize Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*FoomaticRIPOptionSetting PageSize=Executive: "-p5 "
++*PageSize FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*FoomaticRIPOptionSetting PageSize=FanfoldGermanLegal: "-p6 "
++*PageSize Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*FoomaticRIPOptionSetting PageSize=Folio: "-p6 "
++*PageSize Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*FoomaticRIPOptionSetting PageSize=Legal: "-p7 "
++*CloseUI: *PageSize
++
++*OpenUI *PageRegion: PickOne
++*OrderDependency: 135 AnySetup *PageRegion
++*DefaultPageRegion: Letter
++*PageRegion Letter/Letter: "%% FoomaticRIPOptionSetting: PageSize=Letter"
++*PageRegion A4/A4: "%% FoomaticRIPOptionSetting: PageSize=A4"
++*PageRegion B5jis/B5 (JIS): "%% FoomaticRIPOptionSetting: PageSize=B5jis"
++*PageRegion Env10/Env #10: "%% FoomaticRIPOptionSetting: PageSize=Env10"
++*PageRegion EnvC5/Env C5: "%% FoomaticRIPOptionSetting: PageSize=EnvC5"
++*PageRegion EnvDL/Env DL: "%% FoomaticRIPOptionSetting: PageSize=EnvDL"
++*PageRegion EnvMonarch/Env Monarch: "%% FoomaticRIPOptionSetting: PageSize=EnvMonarch"
++*PageRegion Executive/Executive: "%% FoomaticRIPOptionSetting: PageSize=Executive"
++*PageRegion FanfoldGermanLegal/Fanfold German Legal: "%% FoomaticRIPOptionSetting: PageSize=FanfoldGermanLegal"
++*PageRegion Folio/Folio: "%% FoomaticRIPOptionSetting: PageSize=Folio"
++*PageRegion Legal/Legal: "%% FoomaticRIPOptionSetting: PageSize=Legal"
++*CloseUI: *PageRegion
++
++*DefaultImageableArea: Letter
++*ImageableArea Letter/Letter: "9 12.00 603 780.00"
++*ImageableArea A4/A4: "9 12.00 586 830.00"
++*ImageableArea B5jis/B5 (JIS): "9 12.00 509 715.00"
++*ImageableArea Env10/Env #10: "9 12.00 288 672.00"
++*ImageableArea EnvC5/Env C5: "9 12.00 450 637.00"
++*ImageableArea EnvDL/Env DL: "9 12.00 302 611.00"
++*ImageableArea EnvMonarch/Env Monarch: "9 12.00 270 528.00"
++*ImageableArea Executive/Executive: "9 12.00 513 744.00"
++*ImageableArea FanfoldGermanLegal/Fanfold German Legal: "9 12.00 603 996.00"
++*ImageableArea Folio/Folio: "9 12.00 603 924.00"
++*ImageableArea Legal/Legal: "9 12.00 603 996.00"
++
++*DefaultPaperDimension: Letter
++*PaperDimension Letter/Letter: "612 792"
++*PaperDimension A4/A4: "595 842"
++*PaperDimension B5jis/B5 (JIS): "518 727"
++*PaperDimension Env10/Env #10: "297 684"
++*PaperDimension EnvC5/Env C5: "459 649"
++*PaperDimension EnvDL/Env DL: "311 623"
++*PaperDimension EnvMonarch/Env Monarch: "279 540"
++*PaperDimension Executive/Executive: "522 756"
++*PaperDimension FanfoldGermanLegal/Fanfold German Legal: "612 1008"
++*PaperDimension Folio/Folio: "612 936"
++*PaperDimension Legal/Legal: "612 1008"
++
++*OpenUI *MediaType/Media Type: PickOne
++*FoomaticRIPOption MediaType: enum CmdLine A
++*OrderDependency: 150 AnySetup *MediaType
++*DefaultMediaType: plain
++*MediaType plain/Plain Paper: "%% FoomaticRIPOptionSetting: MediaType=plain"
++*FoomaticRIPOptionSetting MediaType=plain: "-m1 "
++*MediaType plain2/Plain Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=plain2"
++*FoomaticRIPOptionSetting MediaType=plain2: "-m8 "
++*MediaType bond/Bond: "%% FoomaticRIPOptionSetting: MediaType=bond"
++*FoomaticRIPOptionSetting MediaType=bond: "-m2 "
++*MediaType bond2/Bond Side 2: "%% FoomaticRIPOptionSetting: MediaType=bond2"
++*FoomaticRIPOptionSetting MediaType=bond2: "-m9 "
++*MediaType envelope/Envelope: "%% FoomaticRIPOptionSetting: MediaType=envelope"
++*FoomaticRIPOptionSetting MediaType=envelope: "-m6 "
++*MediaType labels/Labels: "%% FoomaticRIPOptionSetting: MediaType=labels"
++*FoomaticRIPOptionSetting MediaType=labels: "-m5 "
++*MediaType lwcard/Light Weight Card: "%% FoomaticRIPOptionSetting: MediaType=lwcard"
++*FoomaticRIPOptionSetting MediaType=lwcard: "-m3 "
++*MediaType lwcard2/Light Weight Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwcard2"
++*FoomaticRIPOptionSetting MediaType=lwcard2: "-m10 "
++*MediaType lwgcard/Light Weight Glossy Card: "%% FoomaticRIPOptionSetting: MediaType=lwgcard"
++*FoomaticRIPOptionSetting MediaType=lwgcard: "-m4 "
++*MediaType lwgcard2/Light Weight Glossy Card Side 2: "%% FoomaticRIPOptionSetting: MediaType=lwgcard2"
++*FoomaticRIPOptionSetting MediaType=lwgcard2: "-m11 "
++*MediaType recycled/Recycled Paper: "%% FoomaticRIPOptionSetting: MediaType=recycled"
++*FoomaticRIPOptionSetting MediaType=recycled: "-m7 "
++*MediaType recycled2/Recycled Paper Side 2: "%% FoomaticRIPOptionSetting: MediaType=recycled2"
++*FoomaticRIPOptionSetting MediaType=recycled2: "-m12 "
++*CloseUI: *MediaType
++
++*OpenUI *Copies/Copies: PickOne
++*FoomaticRIPOption Copies: int CmdLine A
++*FoomaticRIPOptionPrototype Copies: "-n%s "
++*FoomaticRIPOptionRange Copies: 1 100
++*OrderDependency: 220 AnySetup *Copies
++*DefaultCopies: 1
++*FoomaticRIPDefaultCopies: 1
++*Copies 1/1: "%% FoomaticRIPOptionSetting: Copies=1"
++*Copies 2/2: "%% FoomaticRIPOptionSetting: Copies=2"
++*Copies 3/3: "%% FoomaticRIPOptionSetting: Copies=3"
++*Copies 4/4: "%% FoomaticRIPOptionSetting: Copies=4"
++*Copies 5/5: "%% FoomaticRIPOptionSetting: Copies=5"
++*Copies 6/6: "%% FoomaticRIPOptionSetting: Copies=6"
++*Copies 7/7: "%% FoomaticRIPOptionSetting: Copies=7"
++*Copies 8/8: "%% FoomaticRIPOptionSetting: Copies=8"
++*Copies 9/9: "%% FoomaticRIPOptionSetting: Copies=9"
++*Copies 10/10: "%% FoomaticRIPOptionSetting: Copies=10"
++*Copies 11/11: "%% FoomaticRIPOptionSetting: Copies=11"
++*Copies 12/12: "%% FoomaticRIPOptionSetting: Copies=12"
++*Copies 13/13: "%% FoomaticRIPOptionSetting: Copies=13"
++*Copies 14/14: "%% FoomaticRIPOptionSetting: Copies=14"
++*Copies 15/15: "%% FoomaticRIPOptionSetting: Copies=15"
++*Copies 16/16: "%% FoomaticRIPOptionSetting: Copies=16"
++*Copies 17/17: "%% FoomaticRIPOptionSetting: Copies=17"
++*Copies 18/18: "%% FoomaticRIPOptionSetting: Copies=18"
++*Copies 19/19: "%% FoomaticRIPOptionSetting: Copies=19"
++*Copies 20/20: "%% FoomaticRIPOptionSetting: Copies=20"
++*Copies 21/21: "%% FoomaticRIPOptionSetting: Copies=21"
++*Copies 22/22: "%% FoomaticRIPOptionSetting: Copies=22"
++*Copies 23/23: "%% FoomaticRIPOptionSetting: Copies=23"
++*Copies 24/24: "%% FoomaticRIPOptionSetting: Copies=24"
++*Copies 25/25: "%% FoomaticRIPOptionSetting: Copies=25"
++*Copies 26/26: "%% FoomaticRIPOptionSetting: Copies=26"
++*Copies 27/27: "%% FoomaticRIPOptionSetting: Copies=27"
++*Copies 28/28: "%% FoomaticRIPOptionSetting: Copies=28"
++*Copies 29/29: "%% FoomaticRIPOptionSetting: Copies=29"
++*Copies 30/30: "%% FoomaticRIPOptionSetting: Copies=30"
++*Copies 31/31: "%% FoomaticRIPOptionSetting: Copies=31"
++*Copies 32/32: "%% FoomaticRIPOptionSetting: Copies=32"
++*Copies 33/33: "%% FoomaticRIPOptionSetting: Copies=33"
++*Copies 34/34: "%% FoomaticRIPOptionSetting: Copies=34"
++*Copies 35/35: "%% FoomaticRIPOptionSetting: Copies=35"
++*Copies 36/36: "%% FoomaticRIPOptionSetting: Copies=36"
++*Copies 37/37: "%% FoomaticRIPOptionSetting: Copies=37"
++*Copies 38/38: "%% FoomaticRIPOptionSetting: Copies=38"
++*Copies 39/39: "%% FoomaticRIPOptionSetting: Copies=39"
++*Copies 40/40: "%% FoomaticRIPOptionSetting: Copies=40"
++*Copies 41/41: "%% FoomaticRIPOptionSetting: Copies=41"
++*Copies 42/42: "%% FoomaticRIPOptionSetting: Copies=42"
++*Copies 43/43: "%% FoomaticRIPOptionSetting: Copies=43"
++*Copies 44/44: "%% FoomaticRIPOptionSetting: Copies=44"
++*Copies 45/45: "%% FoomaticRIPOptionSetting: Copies=45"
++*Copies 46/46: "%% FoomaticRIPOptionSetting: Copies=46"
++*Copies 47/47: "%% FoomaticRIPOptionSetting: Copies=47"
++*Copies 48/48: "%% FoomaticRIPOptionSetting: Copies=48"
++*Copies 49/49: "%% FoomaticRIPOptionSetting: Copies=49"
++*Copies 50/50: "%% FoomaticRIPOptionSetting: Copies=50"
++*Copies 51/51: "%% FoomaticRIPOptionSetting: Copies=51"
++*Copies 52/52: "%% FoomaticRIPOptionSetting: Copies=52"
++*Copies 53/53: "%% FoomaticRIPOptionSetting: Copies=53"
++*Copies 54/54: "%% FoomaticRIPOptionSetting: Copies=54"
++*Copies 55/55: "%% FoomaticRIPOptionSetting: Copies=55"
++*Copies 56/56: "%% FoomaticRIPOptionSetting: Copies=56"
++*Copies 57/57: "%% FoomaticRIPOptionSetting: Copies=57"
++*Copies 58/58: "%% FoomaticRIPOptionSetting: Copies=58"
++*Copies 59/59: "%% FoomaticRIPOptionSetting: Copies=59"
++*Copies 60/60: "%% FoomaticRIPOptionSetting: Copies=60"
++*Copies 61/61: "%% FoomaticRIPOptionSetting: Copies=61"
++*Copies 62/62: "%% FoomaticRIPOptionSetting: Copies=62"
++*Copies 63/63: "%% FoomaticRIPOptionSetting: Copies=63"
++*Copies 64/64: "%% FoomaticRIPOptionSetting: Copies=64"
++*Copies 65/65: "%% FoomaticRIPOptionSetting: Copies=65"
++*Copies 66/66: "%% FoomaticRIPOptionSetting: Copies=66"
++*Copies 67/67: "%% FoomaticRIPOptionSetting: Copies=67"
++*Copies 68/68: "%% FoomaticRIPOptionSetting: Copies=68"
++*Copies 69/69: "%% FoomaticRIPOptionSetting: Copies=69"
++*Copies 70/70: "%% FoomaticRIPOptionSetting: Copies=70"
++*Copies 71/71: "%% FoomaticRIPOptionSetting: Copies=71"
++*Copies 72/72: "%% FoomaticRIPOptionSetting: Copies=72"
++*Copies 73/73: "%% FoomaticRIPOptionSetting: Copies=73"
++*Copies 74/74: "%% FoomaticRIPOptionSetting: Copies=74"
++*Copies 75/75: "%% FoomaticRIPOptionSetting: Copies=75"
++*Copies 76/76: "%% FoomaticRIPOptionSetting: Copies=76"
++*Copies 77/77: "%% FoomaticRIPOptionSetting: Copies=77"
++*Copies 78/78: "%% FoomaticRIPOptionSetting: Copies=78"
++*Copies 79/79: "%% FoomaticRIPOptionSetting: Copies=79"
++*Copies 80/80: "%% FoomaticRIPOptionSetting: Copies=80"
++*Copies 81/81: "%% FoomaticRIPOptionSetting: Copies=81"
++*Copies 82/82: "%% FoomaticRIPOptionSetting: Copies=82"
++*Copies 83/83: "%% FoomaticRIPOptionSetting: Copies=83"
++*Copies 84/84: "%% FoomaticRIPOptionSetting: Copies=84"
++*Copies 85/85: "%% FoomaticRIPOptionSetting: Copies=85"
++*Copies 86/86: "%% FoomaticRIPOptionSetting: Copies=86"
++*Copies 87/87: "%% FoomaticRIPOptionSetting: Copies=87"
++*Copies 88/88: "%% FoomaticRIPOptionSetting: Copies=88"
++*Copies 89/89: "%% FoomaticRIPOptionSetting: Copies=89"
++*Copies 90/90: "%% FoomaticRIPOptionSetting: Copies=90"
++*Copies 91/91: "%% FoomaticRIPOptionSetting: Copies=91"
++*Copies 92/92: "%% FoomaticRIPOptionSetting: Copies=92"
++*Copies 93/93: "%% FoomaticRIPOptionSetting: Copies=93"
++*Copies 94/94: "%% FoomaticRIPOptionSetting: Copies=94"
++*Copies 95/95: "%% FoomaticRIPOptionSetting: Copies=95"
++*Copies 96/96: "%% FoomaticRIPOptionSetting: Copies=96"
++*Copies 97/97: "%% FoomaticRIPOptionSetting: Copies=97"
++*Copies 98/98: "%% FoomaticRIPOptionSetting: Copies=98"
++*Copies 99/99: "%% FoomaticRIPOptionSetting: Copies=99"
++*Copies 100/100: "%% FoomaticRIPOptionSetting: Copies=100"
++*CloseUI: *Copies
++
++*CloseGroup: General
++
++*OpenGroup: Adjustment/Adjustment
++
++*OpenUI *halftone/Halftone Algorithm: PickOne
++*FoomaticRIPOption halftone: enum CmdLine A
++*OrderDependency: 110 AnySetup *halftone
++*Defaulthalftone: default
++*halftone default/Default: "%% FoomaticRIPOptionSetting: halftone=default"
++*FoomaticRIPOptionSetting halftone=default: "  "
++*halftone as/Accurate Screens (better): "%% FoomaticRIPOptionSetting: halftone=as"
++*FoomaticRIPOptionSetting halftone=as: " -qas  "
++*halftone standard/Standard: "%% FoomaticRIPOptionSetting: halftone=standard"
++*FoomaticRIPOptionSetting halftone=standard: " -q1  "
++*halftone wts/Well Tempered Screens (best): "%% FoomaticRIPOptionSetting: halftone=wts"
++*FoomaticRIPOptionSetting halftone=wts: " -qwts  "
++*CloseUI: *halftone
++
++*OpenUI *ICM/ICM Color Profile: PickOne
++*FoomaticRIPOption ICM: enum CmdLine A
++*OrderDependency: 300 AnySetup *ICM
++*DefaultICM: none
++*ICM none/No ICM color correction: "%% FoomaticRIPOptionSetting: ICM=none"
++*FoomaticRIPOptionSetting ICM=none: "-C10 -Gnone.icm "
++*ICM testing/File testing.icm: "%% FoomaticRIPOptionSetting: ICM=testing"
++*FoomaticRIPOptionSetting ICM=testing: "-C10 -Gtesting.icm "
++*ICM testing2/File testing2.icm: "%% FoomaticRIPOptionSetting: ICM=testing2"
++*FoomaticRIPOptionSetting ICM=testing2: "-C10 -Gtesting2.icm "
++*ICM testing3/File testing3.icm: "%% FoomaticRIPOptionSetting: ICM=testing3"
++*FoomaticRIPOptionSetting ICM=testing3: "-C10 -Gtesting3.icm "
++*CloseUI: *ICM
++
++*CloseGroup: Adjustment
++
++*OpenGroup: Miscellaneous/Miscellaneous
++
++*OpenUI *NupOrient/N-up Orientation: PickOne
++*FoomaticRIPOption NupOrient: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupOrient
++*DefaultNupOrient: port
++*NupOrient land/Landscape: "%% FoomaticRIPOptionSetting: NupOrient=land"
++*FoomaticRIPOptionSetting NupOrient=land: "-ol "
++*NupOrient port/Portrait: "%% FoomaticRIPOptionSetting: NupOrient=port"
++*FoomaticRIPOptionSetting NupOrient=port: " "
++*NupOrient sea/Seascape: "%% FoomaticRIPOptionSetting: NupOrient=sea"
++*FoomaticRIPOptionSetting NupOrient=sea: "-os "
++*CloseUI: *NupOrient
++
++*OpenUI *NupPages/N-up Printing: PickOne
++*FoomaticRIPOption NupPages: enum CmdLine A
++*OrderDependency: 200 AnySetup *NupPages
++*DefaultNupPages: 1up
++*NupPages 1up/1-up: "%% FoomaticRIPOptionSetting: NupPages=1up"
++*FoomaticRIPOptionSetting NupPages=1up: " "
++*NupPages 2up/2-up: "%% FoomaticRIPOptionSetting: NupPages=2up"
++*FoomaticRIPOptionSetting NupPages=2up: "-2 "
++*NupPages 3up/3-up: "%% FoomaticRIPOptionSetting: NupPages=3up"
++*FoomaticRIPOptionSetting NupPages=3up: "-3 "
++*NupPages 4up/4-up: "%% FoomaticRIPOptionSetting: NupPages=4up"
++*FoomaticRIPOptionSetting NupPages=4up: "-4 "
++*NupPages 6up/6-up: "%% FoomaticRIPOptionSetting: NupPages=6up"
++*FoomaticRIPOptionSetting NupPages=6up: "-6 "
++*NupPages 8up/8-up: "%% FoomaticRIPOptionSetting: NupPages=8up"
++*FoomaticRIPOptionSetting NupPages=8up: "-8 "
++*NupPages 10up/10-up: "%% FoomaticRIPOptionSetting: NupPages=10up"
++*FoomaticRIPOptionSetting NupPages=10up: "-10 "
++*NupPages 12up/12-up: "%% FoomaticRIPOptionSetting: NupPages=12up"
++*FoomaticRIPOptionSetting NupPages=12up: "-12 "
++*NupPages 14up/14-up: "%% FoomaticRIPOptionSetting: NupPages=14up"
++*FoomaticRIPOptionSetting NupPages=14up: "-14 "
++*NupPages 15up/15-up: "%% FoomaticRIPOptionSetting: NupPages=15up"
++*FoomaticRIPOptionSetting NupPages=15up: "-15 "
++*NupPages 16up/16-up: "%% FoomaticRIPOptionSetting: NupPages=16up"
++*FoomaticRIPOptionSetting NupPages=16up: "-16 "
++*NupPages 18up/18-up: "%% FoomaticRIPOptionSetting: NupPages=18up"
++*FoomaticRIPOptionSetting NupPages=18up: "-18 "
++*CloseUI: *NupPages
++
++*CloseGroup: Miscellaneous
++
++
++*% Generic boilerplate PPD stuff as standard PostScript fonts and so on
++
++*DefaultFont: Courier
++*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM
++*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM
++*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM
++*Font Bookman-Demi: Standard "(001.004S)" Standard ROM
++*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM
++*Font Bookman-Light: Standard "(001.004S)" Standard ROM
++*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM
++*Font Courier: Standard "(002.004S)" Standard ROM
++*Font Courier-Bold: Standard "(002.004S)" Standard ROM
++*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM
++*Font Courier-Oblique: Standard "(002.004S)" Standard ROM
++*Font Helvetica: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM
++*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM
++*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM
++*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM
++*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM
++*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM
++*Font Palatino-Bold: Standard "(001.005S)" Standard ROM
++*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Italic: Standard "(001.005S)" Standard ROM
++*Font Palatino-Roman: Standard "(001.005S)" Standard ROM
++*Font Symbol: Special "(001.007S)" Special ROM
++*Font Times-Bold: Standard "(001.007S)" Standard ROM
++*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM
++*Font Times-Italic: Standard "(001.007S)" Standard ROM
++*Font Times-Roman: Standard "(001.007S)" Standard ROM
++*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM
++*Font ZapfDingbats: Special "(001.004S)" Standard ROM
++
+--- foo2zjs/README	2014-04-03 19:49:11.000000000 +0000
++++ foo2zjs/README	2014-03-25 10:49:40.000000000 +0000
+@@ -128,6 +128,17 @@
+ 	- Oki C5100n/C5150n/C5200n
+ 	- Oki C5500n/C5600n/C5800n
+ 
++    FOO2HBPL1
++    ---------
++    foo2hbpl1 converts Ghostscript pbmraw, pgmraw, ppmraw, or pamcmyk32
++    output formats to monochrome or color HBPL version 1 streams.
++
++	- Dell 1250c
++	- Dell C1660
++	- Dell C1760
++	- Epson AcuLaser C1700
++	- Fuji-Xerox DocuPrint CP105
++
+     FOO2HBPL2
+     ---------
+     foo2hbpl2 converts Ghostscript pbmraw, bitcmyk, or pksmraw output  for‐
+--- foo2zjs/README.in	2014-04-03 19:43:10.000000000 +0000
++++ foo2zjs/README.in	2014-03-25 10:49:27.000000000 +0000
+@@ -128,6 +128,17 @@
+ 	- Oki C5100n/C5150n/C5200n
+ 	- Oki C5500n/C5600n/C5800n
+ 
++    FOO2HBPL1
++    ---------
++    foo2hbpl1 converts Ghostscript pbmraw, pgmraw, ppmraw, or pamcmyk32
++    output formats to monochrome or color HBPL version 1 streams.
++
++	- Dell 1250c
++	- Dell C1660
++	- Dell C1760
++	- Epson AcuLaser C1700
++	- Fuji-Xerox DocuPrint CP105
++
+     FOO2HBPL2
+     ---------
+     foo2hbpl2 converts Ghostscript pbmraw, bitcmyk, or pksmraw output  for‐
+--- foo2zjs/foo2hbpl1-wrapper.1in	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foo2hbpl1-wrapper.1in	2014-03-24 12:30:14.000000000 +0000
+@@ -0,0 +1,240 @@
++'\" t
++.TH foo2hbpl1-wrapper 1 "${MODpage}" "foo2hbpl1-wrapper ${MODver}"
++#ifndef OLDGROFF
++#include "macros.man"
++#endif
++'\"==========================================================================
++'\"	MANUAL PAGE SOURCE
++'\"==========================================================================
++.SH NAME
++foo2hbpl1-wrapper \- Convert Postscript into a ZJS printer stream
++.SH SYNOPSIS
++.B foo2hbpl1-wrapper
++.RI [ options "] [" ps-file ]
++.SH DESCRIPTION
++.B foo2hbpl1-wrapper
++is a Foomatic compatible printer wrapper for the \fBfoo2hbpl1\fP printer driver.
++This script reads a Postscript \fIps-file\fP or standard input
++and converts it to Zenographics ZjStream printer format
++for driving the
++Dell 1250c, Dell C1660w, Dell C1760w,
++Epson AcuLaser C1700,
++and Fuji-Xerox CP105b printers.
++.P
++This script can be used in a standalone fashion, but is intended to
++be called from a printer spooler system which uses the Foomatic
++printer database.
++
++.SH COMMAND LINE OPTIONS
++.SS Normal Options
++These are the options used to select the parameters of a
++print job that are usually controlled on a per job basis.
++.TP
++.BI \-c
++Print in color (else monochrome).
++.TP
++.BI \-C\0 colormode
++Color correction mode [0].
++.TS
++n l .
++10	ICM color profile (using -G *.icm file)
++.TE
++.TP
++.BI \-d\0 duplex
++Duplex code to send to printer [1].
++.TS
++| n l | n l | n l .
++1	off	2	long edge	3	short edge
++.TE
++.TP
++.BI \-m\0 media
++Media code to send to printer [1].
++.TS
++l r.
++_
++Media	HBPL
++_
++plain	1
++bond	2
++lwcard	3
++lwgcard	4
++labels	5
++envelope	6
++recycled	7
++plain2	8
++bond2	9
++lwcard2	10
++lwgcard2	11
++recycled2	12
++.TE
++.TP
++.BI \-p\0 paper
++Paper size code to send to printer [1].
++.TS
++l r.
++_
++Paper	HBPL
++_
++A4	1
++B5jis	2
++letter	4
++executive	5
++fanfold german legal	6
++folio	6
++legal	7
++env#10	9
++envMonarch	10
++envC5	11
++envDL	12
++.TE
++.TP
++.BI \-n\0 copies
++Number of copies [1].
++.TP
++.BI \-r\0 xres x yres
++Set device resolution in pixels/inch [1200x600].
++.TP
++.BI \-s\0 source
++Source (Input Slot) code to send to printer [7].
++.TS
++| n l | n l.
++1	upper	4	manual
++2	lower	7	auto
++.TE
++.TP
++.BI \-t
++Draft mode.  Every other pixel is white.
++.TP
++.BI \-T\0 density
++Print density (1-5).  The default is 3 (medium).
++.TP
++.BI "\-2 \-3 \-4 \-5 \-6 \-8 \-9 \-10 \-12 \-14 \-15 \-16 \-18"
++Print in N-up.  Requires the \fBpsutils\fP package.
++.TP
++.BI \-o\0 orient
++Orientation used for N-up.
++.TS
++l l l.
++Portrait	-op	(normal)
++Landscape	-ol	(rotated 90 degrees anticlockwise)
++Seascape	-os	(rotated 90 degrees clockwise)
++.TE
++.SS Printer Tweaking Options
++These are the options used to customize the operation of \fBfoo2hbpl1\fP
++for a particular printer.
++.TP
++.BI \-u\0 xoff x yoff
++Set the offset of the start of the printable region from the
++upper left corner, in pixels [varies with paper size].
++The defaults should work on the 2200DL and 2300DL, and have not
++been tested on any other printers.
++.TP
++.BI \-l\0 xoff x yoff
++Set the offset of the end of the printable region from the
++lower right corner, in pixels [varies with paper size].
++The defaults should work on the 2200DL and 2300DL, and have not
++been tested on any other printers.
++.TP
++.BI \-L\0 mask
++Send the logical clipping values from -u/-l in the ZjStream.
++\fBfoo2hbpl1-wrapper\fP always runs Ghostscript with the ideal page dimensions,
++so that the scale of the image is correct,
++regardless whether or not the printer has unprintable regions.
++This option is used to move the position of the clipped image
++back to where it belongs on the page.  The default is to send
++the amount which was clipped by -u and -l, and should be
++good in most cases.
++.TS
++l l.
++0	don't send any logical clipping amounts
++1	only send Y clipping amount
++2	only send X clipping amount
++3	send both X and Y clipping amounts
++.TE
++.TP
++.BI \-P
++Do not send START_PLANE codes on monochrome output.  May be
++needed by some monochrome-only printers, such as the
++HP LaserJet 1000.
++.TP
++.BI \-X\0 padlen
++Add extra zero padding to the end of BID segments.  The default is
++16 bytes.  Padding 16 bytes of zeroes
++is needed for older ZjStream printers, such as the Minolta 2200DL
++and HP LaserJet 1000, and seems harmless to newer ones, such as
++the Minolta 2300DL.  So the default should be good for all cases.
++.SS Color Tweaking Options
++These are the options used to control the quality of color output.
++Color correction is currently a WORK IN PROGRESS.
++.TP
++.BI \-g\0 gsopts
++Additional options to pass to Ghostscript, such as -g\(lq-dDITHERPPI=nnn\(rq,
++etc.  This option may appear more than once.
++.TP
++.BI \-G\0 profile.icm
++Convert \fIprofile.icm\fP to a Postscript color rendering
++dictionary (CRD) using \fBfoo2zjs-icc2ps\fP and
++adjust the printer colors by using the Postscript \fBsetcolorrendering\fP
++operator.  (WORK IN PROGRESS).
++.TP
++.BI \-G\0 gamma-file.ps
++Prepend \fIgamma-file.ps\fP to the Postscript input to perform
++color correction using the \fBsetcolortransfer\fP Postscript operator.
++For example, the file might contain:
++.br
++{0.333 exp} {0.333 exp} {0.333 exp} {0.333 exp} setcolortransfer
++.TP
++.BI \-I\0 intent
++Select profile intent from the ICM file.
++0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute.
++Default is 0 (perceptual).
++.SS Debugging Options
++These options are used for debugging \fBfoo2hbpl1\fP and its wrapper.
++.TP
++.BI \-S\0 plane
++Output just a single color plane from a color print and print it
++on the black plane.  The default is to output all color planes.
++.TS
++l l.
++1	Cyan
++2	Magenta
++3	Yellow
++4	Black
++.TE
++.TP
++.BI \-D\0 level
++Set Debug level [0].
++
++.SH EXAMPLES
++Create a monochrome ZjStream from a Postscript document,
++examine it, and then print it using a RAW print queue:
++
++.RS
++.nf
++foo2hbpl1-wrapper testpage.ps > testpage.prn
++hbpl1decode < testpage.prn
++lpr -P raw testpage.prn
++.fi
++.RE
++.P
++Create a color ZjStream stream from a Postscript document:
++
++.RS
++.nf
++foo2hbpl1-wrapper -c testpage.ps > testpage.prn
++.fi
++.RE
++
++.SH FILES
++.BR /usr/bin/foo2hbpl1-wrapper
++.SH SEE ALSO
++.BR foo2hbpl1 (1),
++.BR hbpldecode (1)
++.SH "AUTHOR"
++Rick Richardson <rick.richardson@comcast.net>
++.br
++${URLHBPL}/
++'\"
++'\"
++'\"
++.em pdf_outline
+--- foo2zjs/foo2hbpl1-wrapper.in	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foo2hbpl1-wrapper.in	2014-04-04 19:06:24.048060000 +0000
+@@ -0,0 +1,577 @@
++#!/bin/sh
++
++#* Copyright (C) 2013 Rick Richardson
++#*
++#* This program is free software; you can redistribute it and/or modify
++#* it under the terms of the GNU General Public License as published by
++#* the Free Software Foundation; either version 2 of the License, or
++#* (at your option) any later version.
++#*
++#* This program is distributed in the hope that it will be useful,
++#* but WITHOUT ANY WARRANTY; without even the implied warranty of
++#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++#* GNU General Public License for more details.
++#*
++#* You should have received a copy of the GNU General Public License
++#* along with this program; if not, write to the Free Software
++#* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++#*
++#* Authors: Rick Richardson <rick.richardson@comcast.net>
++
++VERSION='$Id: foo2hbpl1-wrapper.in,v 1.3 2014/03/24 23:14:24 rick Exp $'
++
++#
++# Printer Notes:
++#
++# Dell 1250c
++# Dell C1660w
++# Dell C1760w
++# Epson AcuLaser C1700
++# Fuji-Xerox DocuPrint CP105b
++#
++
++PROGNAME="$0"
++BASENAME=`basename $PROGNAME`
++PREFIX=/usr
++SHARE=$PREFIX/share/foo2hbpl
++PATH=$PATH:/sw/bin:/opt/local/bin
++
++#
++#	Log the command line, for debugging and problem reports
++#
++if [ -x /usr/bin/logger -o -x /bin/logger ]; then
++    logger -t "$BASENAME" -p lpr.info -- "$BASENAME $@" </dev/null
++fi
++
++usage() {
++	cat <<EOF
++Usage:
++	$BASENAME [options] [ps-file]
++
++	Foomatic printer wrapper for the foo2hbpl1 printer driver.
++	This script reads a Postscript ps-file or standard input
++	and converts it to a Xerox HBPL version 1 stream.
++
++Normal Options:
++-c		  Print in color (else monochrome)
++-C colormode	  Colormode [$COLORMODE]
++		    10=ICM RGB color profile (using -G *.icm file)
++-m media	  Media code to send to printer [$MEDIA]
++		    1=plain, 2=bond, 3=lwcard, 4=lwgcard, 5=labels,
++		    6=envelope, 7=recycled, 8=plain2, 9=bond2,
++		    10=lwcard2, 11=lwgcard2, 12=recycled2
++-p paper	  Paper code [$PAPER]
++		    letter, legal, a4, executive, env10, monarch,
++		    c5, envDL, isob5, jisb5, a5, folio, CustomWxH
++-n copies	  Number of copies [$COPIES]
++		  Resolution is always 600x600
++-t		  Draft mode.  Every other pixel is white.
++-2/-3/-4/-6/-8/-10/-12/-14/-15/-16/-18
++		  Print with N-up (requires psutils)
++-o orient	  For N-up: -op is portrait, -ol is landscape, -os is seascape.
++
++Printer Tweaking Options:
++-u left,top,right,bottom
++		  Clip (i.e. white-out) margins of specified width
++
++Color Tweaking Options:
++-g gsopts	  Additional options to pass to Ghostscript, such as
++		  -dDITHERPPI=nnn, etc.  May appear more than once. []
++-G profile.icm	  Convert profile.icm to a Postscript CRD using icc2ps and
++		  adjust colors using the setcolorrendering PS operator.
++		  $SHARE/icm/ will be searched for profile.icm.
++-I intent	  Select profile intent from ICM file [$INTENT]
++		  0=Perceptual, 1=Colorimetric, 2=Saturation, 3=Absolute
++-G gamma-file.ps  Prepend gamma-file to the Postscript input to perform
++		  color correction using the setcolortransfer PS operator.
++
++Debugging Options:
++-D lvl		  Set Debug level [$DEBUG]
++-V		  $VERSION
++EOF
++
++	exit 1
++}
++
++#
++#       Report an error and exit
++#
++error() {
++	echo "$BASENAME: $1" >&2
++	exit 1
++}
++
++dbgcmd() {
++	if [ $DEBUG -ge 1 ]; then
++	    echo "$@" >&2
++	fi
++	"$@"
++}
++
++#
++#	N-up-ify the job.  Requires psnup from psutils package
++#
++nup() {
++    case "$NUP" in
++    [2368]|1[0458])
++	tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.3in -p$paper -q
++	;;
++    [49]|1[26])
++	tr '\r' '\n' | psnup $NUP_ORIENT -d2 -$NUP -m.5in -p$paper -q
++	;;
++    *)
++	error "Illegal call to nup()."
++	;;
++    esac
++}
++
++#
++#       Process the options
++#
++
++# Try to use a local copy of GhostScript 8.54, if available.  Otherwise,
++# fallback to whatever the Linux distro has installed (usually 7.07)
++#
++# N.B. := operator used here, when :- would be better, because "ash"
++# doesn't have :-
++if eval gs.foo -v >/dev/null 2>&1; then
++        GSBIN=${GSBIN:-gs.foo}
++else
++        GSBIN=${GSBIN:-gs}
++fi
++
++CMDLINE="$*"
++DEBUG=0
++COLOR=
++COLORMODE=default
++MODEL=0
++MEDIA=1		# plain
++COPIES=1
++PAPER=letter
++RES=600x600	# do not change this
++SOURCE=1
++NUP=
++CLIP_ALL=
++BC=
++AIB=
++NOPLANES=
++COLOR2MONO=
++GAMMAFILE=default
++INTENT=0
++GSOPTS=
++EXTRAPAD=
++SAVETONER=
++NUP_ORIENT=
++GSDEV=-sDEVICE=pgmraw
++# What mode to use if the user wants us to pick the "best" mode
++case `$GSBIN --version` in
++7*)	DEFAULTCOLORMODE=10
++	DEFAULTCOLORMODE=1
++	;;
++8.1*)
++	DEFAULTCOLORMODE=1
++	QUALITY=1
++	;;
++*)	DEFAULTCOLORMODE=1
++	;;
++esac
++while getopts "1:23456789o:b:cC:d:g:l:u:L:m:n:p:q:s:tz:ABS:D:G:I:PX:Vh?" opt
++do
++	case $opt in
++	b)	GSBIN="$OPTARG";;
++	c)	COLOR=-c;;
++	d)	DUPLEX="$OPTARG";;
++	g)	GSOPTS="$GSOPTS $OPTARG";;
++	m)	MEDIA="$OPTARG";;
++	n)	COPIES="$OPTARG";;
++	p)	PAPER="$OPTARG";;
++	q)	QUALITY="$OPTARG";;
++	s)	SOURCE="$OPTARG";;
++	t)	SAVETONER="-t";;
++	z)	MODEL="$OPTARG";;
++	u)	CLIP_ALL="-u $OPTARG";;
++	A)	AIB=-A;;
++	B)	BC=-B;;
++	C)	COLORMODE="$OPTARG";;
++	S)	COLOR2MONO="-S$OPTARG";;
++	D)	DEBUG="$OPTARG";;
++	G)	GAMMAFILE="$OPTARG";;
++	I)	INTENT="$OPTARG";;
++	P)	NOPLANES=-P;;
++	X)	EXTRAPAD="-X $OPTARG";;
++	[234689])	NUP="$opt";;
++	[57])	error "Can't find acceptable layout for $opt-up";;
++	1)	case "$OPTARG" in
++		[024568])	NUP="1$OPTARG";;
++		*)	error "Can't find acceptable layout for 1$OPTARG-up";;
++		esac
++		;;
++	o)	case "$OPTARG" in
++		l*)	NUP_ORIENT=-l;;
++		s*)	NUP_ORIENT=-r;;
++		p*|*)	NUP_ORIENT=;;
++		esac;;
++	V)	echo "$VERSION"; foo2hbpl -V; foo2zjs-pstops -V; exit 0;;
++	h|\?)
++		if [ "$CMDLINE" != "-?" -a "$CMDLINE" != -h ]; then
++		    echo "Illegal command:"
++		    echo "	$0 $CMDLINE"
++		    echo
++		fi
++		usage;;
++	esac
++done
++shift `expr $OPTIND - 1`
++
++#
++# If there is an argument left, take it as the file to print.
++# Else, the input comes from stdin.
++#
++if [ $# -ge 1 ]; then
++    if [ "$LPJOB" = "" ]; then
++	: # LPJOB="$1"
++    fi
++    exec < $1
++fi
++
++#
++#	Validate media code
++#
++case "$MEDIA" in
++1|plain)	MEDIA=1;;
++2|bond)		MEDIA=2;;
++3|lwcard)	MEDIA=3;;
++4|lwgcard)	MEDIA=4;;
++5|labels)	MEDIA=5;;
++6|envelope)	MEDIA=6;;
++7|recycled)	MEDIA=7;;
++8|plain2)	MEDIA=8;;
++9|bond2)	MEDIA=9;;
++10|lwcard2)	MEDIA=10;;
++11|lwgcard2)	MEDIA=11;;
++12|recycled2)	MEDIA=12;;
++[0-9]*)		;;
++*)		error "Unknown media code $MEDIA";;
++esac
++
++#
++#	Validate source (InputSlot) code
++#
++case "$SOURCE" in
++1|auto)		SOURCE=1;;
++2|manual)	SOURCE=2;;
++3|multi)	SOURCE=3;;
++4|tray1)	SOURCE=4;;
++[0-9]*)		;;
++*)		error "Unknown source code $SOURCE";;
++esac
++
++#
++#	Figure out the paper dimensions in pixels/inch, and set the
++#	default clipping region.  Unfortunately, this is a trouble
++#	area for ZjStream printers.  Various versions of ZjS print
++#	engines react differently when asked to print into their
++#	unprintable regions.
++#
++set_clipping() {
++
++    # Set clipping region if it isn't already set
++    if [ "$CLIP_ALL" = "" ]; then
++	CLIP_ALL="-u $1,$2,$3,$4"
++    fi
++}
++
++case "$PAPER" in
++Custom*x*)
++		# Command line only
++		XDIM=`echo "$PAPER" | sed -e "s/Custom.//" -e "s/x.*//" `
++		YDIM=`echo "$PAPER" | sed -e "s/.*x//" `
++		if [ "$XDIM" = "" -o "$YDIM" = "" ]; then
++		    error "Custom page size '$PAPER' != 1-99999"
++		fi
++		if [ "$XDIM" -eq 0 -o "$YDIM" -eq 0 ]; then
++		    error "Custom page size '$PAPER' != 1-99999"
++		fi
++		XDIM=`dc -e "$XDIM 600* 72/p"`
++		YDIM=`dc -e "$YDIM 600* 72/p"`
++		PAPER=21;        paper=letter;
++		DIM="${XDIM}x${YDIM}"
++		;;
++Custom*)
++		#%%BeginFeature: *CustomPageSize True
++		#216
++		#360
++		#0
++		#0
++		#0
++		#pop pop pop pop pop
++
++		#%%BeginFeature: *CustomPageSize True
++		#792.000000 612.000000 1 0.000000 0.000000
++		#pop pop pop pop pop
++
++		if [ $DEBUG = 0 ]; then
++		    TMPFILE=/tmp/cus$$
++		else
++		    TMPFILE=/tmp/custom.ps
++		fi
++		cat >$TMPFILE
++		exec <$TMPFILE
++
++		tmp=`head -n 10000 $TMPFILE \
++		    | sed -n '/CustomPageSize/{n;p;n;p;}' \
++		    | tr '\n' ' '`
++		case "$tmp" in
++		[0-9]*\ [0-9]*)
++		    XDIM=`echo "$tmp" | sed 's/ .*//'`
++		    YDIM=`echo "$tmp" | sed -e 's/^[^ ]* //' -e 's/ .*//'`
++		    ;;
++		*)
++		    if [ $DEBUG = 0 ]; then rm -f $TMPFILE; fi
++		    error "Custom page size [XY]DIM != 1-99999"
++		    ;;
++		esac
++		XDIM=`dc -e "$XDIM 600* 72/p"`
++		YDIM=`dc -e "$YDIM 600* 72/p"`
++		PAPER=21;        paper=letter;
++		DIM="${XDIM}x${YDIM}"
++		;;
++
++# Use names that Ghostscript recognizes, referring to
++# /usr/share/ghostscript/9.10/Resource/Init/gs_statd.ps
++# foo2hbpl1 will provide the appropriate numeric value
++
++letter)		DIM=5100x6600  ;;
++legal)		DIM=5100x8400  ;;
++a4)		DIM=4961x7016  ;;
++executive)	DIM=4350x6300  ;;
++env10)		DIM=2475x5700  ;;
++monarch)	DIM=2325x4500  ;;
++c5)		DIM=3827x5409  ;;
++envDL)		DIM=2599x5197  ;;
++isob5|b5)	DIM=4158x5906  ;;
++jisb5)		DIM=4299x6071  ;;
++a5)		DIM=3496x4961  ;;
++folio)		DIM=5100x7800  ;;
++pa4)		DIM=4961x6600  ;;
++archA)		DIM=5400x7200  ;;
++*)		error "Unimplemented paper code $PAPER";;
++esac
++
++#set_clipping 47 48 51 46	# exact values for Dell C1660w on letter paper
++ set_clipping 51 51 51 51	# default is 0.085 inches all around
++
++PAPERSIZE="-sPAPERSIZE=$PAPER";
++
++#
++# Filter thru psnup if N-up printing has been requested
++#
++case $NUP in
++[234689]|1[024568])	PREFILTER="nup";;
++*)			PREFILTER=cat;;
++esac
++if [ "$DEBUG" -ge 9 ]; then
++    PREFILTER="tee /tmp/$BASENAME.ps"
++fi
++
++#
++#	Overload -G.  If the file name ends with ".icm" or ".ICM"
++#	then convert the ICC color profile to a Postscript CRD,
++#	then prepend it to the users job.  Select the intent
++#	using the -I option.
++#
++
++create_crd() {
++    #
++    # Create a Postscript CRD
++    #
++    ICC2PS=$PREFIX/bin/foo2zjs-icc2ps
++    if [ -x $ICC2PS ]; then
++	case "$GAMMAFILE" in
++	none | none.icm | */none.icm)
++	    ;;
++	*)
++	    if [ -x /usr/bin/logger ]; then
++		logger -t "$BASENAME" -p lpr.info -- \
++		"`basename $ICC2PS` -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps"
++	    fi
++	    $ICC2PS -o $GAMMAFILE -t$INTENT > $ICCTMP.crd.ps 2>$ICCTMP.log \
++		|| error "Problem converting .ICM file to Postscript"
++	    ;;
++	esac
++
++	PSTOPS_OPTS="$PSTOPS_OPTS -c"
++	cat > $ICCTMP.usecie.ps <<-EOF
++		%!PS-Adobe-3.0
++		<</UseCIEColor true>>setpagedevice
++	EOF
++	if [ "$QUALITY" = wts -o "$QUALITY" = as ]; then
++	    if [ "$QUALITY" = wts ]; then
++		cat >> $ICCTMP.usecie.ps <<-EOF
++		    << /UseWTS true >> setuserparams
++		EOF
++	    else
++		cat >> $ICCTMP.usecie.ps <<-EOF
++		    << /UseWTS false >> setuserparams
++		EOF
++	    fi
++	    cat >> $ICCTMP.usecie.ps <<-EOF
++		<<
++		    /AccurateScreens true
++		    /HalftoneType 1
++		    /HalftoneName (Round Dot Screen) cvn
++		    /SpotFunction { 180 mul cos exch 180 mul cos add 2 div}
++		    /Frequency 137
++		    /Angle 37
++		>> sethalftone
++		EOF
++	fi
++	cat > $ICCTMP.selcrd.ps <<-EOF
++		/Current /ColorRendering findresource setcolorrendering
++	EOF
++	case "$GAMMAFILE" in
++	none | none.icm | */none.icm) GAMMAFILE="$ICCTMP.usecie.ps";;
++	*)	GAMMAFILE="$ICCTMP.usecie.ps $ICCTMP.crd.ps $ICCTMP.selcrd.ps";;
++	esac
++    else
++	GAMMAFILE=
++    fi
++}
++
++if [ $DEBUG -gt 0 ]; then
++    ICCTMP=/tmp/icc
++else
++    ICCTMP=/tmp/icc$$
++fi
++
++if [ "" = "$COLOR" ]; then
++    COLORMODE=
++    GAMMAFILE=
++else
++    case "$COLORMODE" in
++    default)	COLORMODE=$DEFAULTCOLORMODE;;
++    esac
++    case "$GAMMAFILE" in
++    default)	GAMMAFILE=samclp300-0.icm;;
++    esac
++fi
++
++CRDBASE="$PREFIX/share/foo2hbpl/crd"
++case "$MODEL" in
++    0)	model=CLP-300;;
++    1)	model=CLP-600;;
++    2)	model=CLP-600;;
++    3)	model=CLP-600;;
++esac
++
++PSTOPS_OPTS="-n"
++
++case "$COLORMODE" in
++0|"")
++    # Monochrome
++    ;;
++10|icm)
++    # Use old ICM method
++    AIB=-A
++    BC=-B
++    case "$GAMMAFILE" in
++    none | none.icm | */none.icm)
++	create_crd
++	;;
++    *.icm|*.ICM|*.icc|*.ICC)
++	#
++	# Its really an .ICM file, not a gamma file.
++	#
++	# The file can be a full path name, or the name of a file in $SHARE/icm/
++	#
++	if [ -r "$GAMMAFILE" ]; then
++	    create_crd
++	elif [ -r "$SHARE/icm/$GAMMAFILE" ]; then
++	    GAMMAFILE="$SHARE/icm/$GAMMAFILE"
++	    create_crd
++	else
++	    GAMMAFILE=
++	fi
++	;;
++    esac
++    ;;
++1|crd)
++    # CRD
++    GAMMAFILE=""
++    GAMMAFILE="$GAMMAFILE $CRDBASE/${model}cms"
++    GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
++    # Black text...
++    TMPFILE2=/tmp/black$$
++    cat $CRDBASE/black-text.ps - >$TMPFILE2
++    exec <$TMPFILE2
++    ;;
++*.crd)
++    GAMMAFILE="$CRDBASE/prolog.ps"
++    if [ -f $COLORMODE ]; then
++	GAMMAFILE="$GAMMAFILE $COLORMODE"
++    elif [ -f $CRDBASE/$COLORMODE ]; then
++	GAMMAFILE="$GAMMAFILE $CRDBASE/$COLORMODE"
++    else
++	error "Can't find CRD '$COLORMODE' in . or in $CRDBASE"
++    fi
++    GAMMAFILE="$GAMMAFILE $CRDBASE/$SCREEN"
++    ;;
++*)
++    error "Unknown color method '$COLORMODE'"
++    ;;
++esac
++
++if [ "" != "$COLOR" ]; then
++    GSDEV=-sDEVICE=pamcmyk32
++    $GSBIN --help | grep -q pamcmyk32 || GSDEV=-sDEVICE=ppmraw
++fi
++
++#
++#	Figure out USERNAME
++#
++if [ "$LPUSER" != "" ]; then
++    USER="$LPUSER@$LPHOST"
++else
++    USER=""
++fi
++
++#
++#	Main Program, just cobble together the pipeline and run it
++#
++#	The malarky with file descriptors 1 and 3 is to avoid a bug in
++#	(some versions?) of Ghostscript where Postscript's stdout gets
++#	intermingled with the printer drivers output, resulting in
++#	corrupted image data.
++#
++GS="$GSBIN -q -dBATCH -dSAFER -dQUIET -dNOPAUSE"
++
++foo2zjs-pstops $PSTOPS_OPTS | \
++$PREFILTER \
++| ($GS $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS \
++    -sOutputFile="|cat 1>&3" $GAMMAFILE -_ >/dev/null) 3>&1 \
++| foo2hbpl1 -m$MEDIA $CLIP_ALL -J "$LPJOB" -U "$USER"
++
++#
++#	Log the command line, for debugging and problem reports
++#
++if [ -x /usr/bin/logger ]; then
++    logger -t "$BASENAME" -p lpr.info -- \
++	"$GSBIN $PAPERSIZE -g$DIM -r$RES $GSDEV $GSOPTS $GAMMAFILE"
++    logger -t "$BASENAME" -p lpr.info -- \
++	"foo2hbpl1 -m$MEDIA $CLIP_ALL"
++fi
++
++#
++#	Remove cruft
++#
++if [ $DEBUG -eq 0 ]; then
++    for i in crd.ps log usecie.ps selcrd.ps
++    do
++	file="$ICCTMP.$i"
++	[ -f $file ] && rm -f $file
++    done
++    [ -f "$TMPFILE" ] && rm -f $TMPFILE
++    [ -f "$TMPFILE2" ] && rm -f $TMPFILE2
++fi
++
++exit 0
+--- foo2zjs/foo2hbpl1.1in	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foo2hbpl1.1in	2014-03-24 12:30:14.000000000 +0000
+@@ -0,0 +1,68 @@
++'\" t
++.TH foo2hbpl1 1 "${MODpage}" "foo2hbpl1 ${MODver}"
++#ifndef OLDGROFF
++#include "macros.man"
++#endif
++'\"==========================================================================
++'\"	MANUAL PAGE SOURCE
++'\"==========================================================================
++.SH NAME
++foo2hbpl1 \- Convert Ghostscript output to an HBPLv1 printer stream
++.SH SYNOPSIS
++.B foo2hbpl1
++.RI [ options "] <" pnm-or-pam-file " >" hbpl1-file
++.SH DESCRIPTION
++.B foo2hbpl1
++converts Ghostscript pbmraw, pgmraw, ppmraw, or pamcmyk32 output
++formats to monochrome or color HBPL version 1 streams, to drive the
++Dell 1250c, Dell C1660w, Dell C1760w,
++Epson AcuLaser C1700,
++and Fuji-Xerox CP105b printers.
++
++.SH COMMAND LINE OPTIONS
++.TP
++.BI \-J\0 filename
++Filename string to send to printer.
++.TP
++.BI \-U\0 username
++Username string to send to printer.
++.SH EXAMPLES
++Create a black and white ZJS stream:
++
++.RS
++.nf
++gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \ 
++    -sPAPERSIZE=letter -r600x600 -sDEVICE=pgmraw \ 
++    -sOutputFile=- - < testpage.ps \ 
++| foo2hbpl1 >testpage.zm
++.fi
++.RE
++.P
++Create a color ZJS stream:
++
++.RS
++.nf
++gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \ 
++    -sPAPERSIZE=letter -g5100x6600 -r600x600 -sDEVICE=pamcmyk32 \ 
++    -sOutputFile=- - < testpage.ps \ 
++| foo2hbpl1 >testpage.zc
++.fi
++.RE
++
++.SH FILES
++.BR /usr/bin/foo2hbpl1
++.SH SEE ALSO
++.BR foo2hbpl1-wrapper (1),
++.BR hbpldecode (1)
++.SH "AUTHOR"
++Rick Richardson <rick.richardson@comcast.net>
++.br
++Peter Korf <peter@niendo.de>
++.br
++Dave Coffin <dcoffin@cybercom.net>
++.br
++${URLHBPL}/
++'\"
++'\"
++'\"
++.em pdf_outline
+--- foo2zjs/foo2hbpl1.c	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foo2hbpl1.c	2014-04-04 18:18:29.692060000 +0000
+@@ -0,0 +1,692 @@
++/*
++
++GENERAL
++This program converts bilevel PBM, 8-bit PGM, 24-bit PPM, and 32-bit
++CMYK PAM files (output by Ghostscript as "pbmraw", "pgmraw", "ppmraw",
++and "pamcmyk32" respectively) to HBPL version 1 for the consumption
++of various Dell, Epson, and Fuji-Xerox printers.
++
++With this utility, you can print to some Dell and Fuji printers, such as these:
++    - Dell 1250c			B/W and Color
++    - Dell C1660			B/W and Color
++    - Dell C1760			B/W and Color
++    - Epson AcuLaser C1700		B/W and Color
++    - Fuji-Xerox DocuPrint CP105	B/W and Color
++
++AUTHORS
++This program was originally written by Dave Coffin in March 2014.
++
++LICENSE
++This program is free software; you can redistribute it and/or modify
++it under the terms of the GNU General Public License as published by
++the Free Software Foundation; either version 2 of the License, or (at
++your option) any later version.
++
++This program is distributed in the hope that it will be useful,
++but WITHOUT ANY WARRANTY; without even the implied warranty of
++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++GNU General Public License for more details.
++
++You should have received a copy of the GNU General Public License
++along with this program; if not, write to the Free Software
++Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++
++If you want to use this program under different license conditions,
++then contact the author for an arrangement.
++
++*/
++
++static char Version[] = "$Id: foo2hbpl1.c,v 1.3 2014/03/30 05:08:32 rick Exp $";
++
++#include <time.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <ctype.h>
++#include <string.h>
++#include <unistd.h>
++#include <stdarg.h>
++#ifdef linux
++    #include <sys/utsname.h>
++#endif
++
++/*
++ * Command line options
++ */
++int	MediaCode = 0;
++char	*Username = NULL;
++char	*Filename = NULL;
++int	Clip[] = { 8,8,8,8 };
++
++void
++usage(void)
++{
++    fprintf(stderr,
++"Usage:\n"
++"   foo2hbpl1 [options] <pamcmyk32-file >hbpl-file\n"
++"\n"
++"	Convert Ghostscript pbmraw, pgmraw, ppmraw, or pamcmyk32\n"
++"	format to HBPLv1, for the Dell C1660w and other printers.\n"
++"\n"
++"	gs -q -dBATCH -dSAFER -dQUIET -dNOPAUSE \\ \n"
++"		-sPAPERSIZE=letter -r600x600 -sDEVICE=pamcmyk32 \\ \n"
++"		-sOutputFile=- - < testpage.ps \\ \n"
++"	| foo2hbpl1 >testpage.zc\n"
++"\n"
++"Options:\n"
++"-m media	Media code to send to printer [1 or 6]\n"
++"		  1=plain, 2=bond, 3=lwcard, 4=lwgcard, 5=labels,\n"
++"		  6=envelope, 7=recycled, 8=plain2, 9=bond2,\n"
++"		  10=lwcard2, 11=lwgcard2, 12=recycled2\n"
++"-u left,top,right,bottom\n"
++"		Erase margins of specified width [%d,%d,%d,%d]\n"
++"-J filename	Filename string to send to printer\n"
++"-U username	Username string to send to printer\n"
++"-V		Version %s\n"
++	, Clip[0], Clip[1], Clip[2], Clip[3]
++	, Version);
++}
++
++void
++error(int fatal, char *fmt, ...)
++{
++    va_list ap;
++
++    va_start(ap, fmt);
++    vfprintf(stderr, fmt, ap);
++    va_end(ap);
++
++    if (fatal) exit(fatal);
++}
++
++struct stream
++{
++    unsigned char *buf;
++    int size, off, bits;
++};
++
++void
++putbits(struct stream *s, unsigned val, int nbits)
++{
++    if (s->off + 16 > s->size &&
++	!(s->buf = realloc(s->buf, s->size += 0x100000)))
++	    error (1, "Out of memory\n");
++    if (s->bits)
++    {
++	s->off--;
++	val |= s->buf[s->off] >> (8-s->bits) << nbits;
++	nbits += s->bits;
++    }
++    s->bits = nbits & 7;
++    while ((nbits -= 8) > 0)
++	s->buf[s->off++] = val >> nbits;
++    s->buf[s->off++] = val << -nbits;
++}
++
++/*
++   Runlengths are integers between 1 and 17057 encoded as follows:
++
++	1	00
++	2	01 0
++	3	01 1
++	4	100 0
++	5	100 1
++	6	101 00
++	7	101 01
++	8	101 10
++	9	101 11
++	10	110 0000
++	11	110 0001
++	12	110 0010
++	   ...
++	25	110 1111
++	26	111 000 000
++	27	111 000 001
++	28	111 000 010
++	29	111 000 011
++	   ...
++	33	111 000 111
++	34	111 001 000
++	   ...
++	41	111 001 111
++	42	111 010 000
++	50	111 011 0000
++	66	111 100 00000
++	98	111 101 000000
++	162	111 110 000000000
++	674	111 111 00000000000000
++	17057	111 111 11111111111111
++*/
++void
++put_len(struct stream *s, unsigned val)
++{
++    unsigned code[] =
++    {
++	  1, 0, 2,
++	  2, 2, 3,
++	  4, 8, 4,
++	  6, 0x14, 5,
++	 10, 0x60, 7,
++	 26, 0x1c0, 9,
++	 50, 0x3b0, 10,
++	 66, 0x780, 11,
++	 98, 0xf40, 12,
++	162, 0x7c00, 15,
++	674, 0xfc000, 20,
++	17058
++    };
++    int c = 0;
++
++    if (val < 1 || val > 17057) return;
++    while (val >= code[c+3]) c += 3;
++    putbits(s, val-code[c] + code[c+1], code[c+2]);
++}
++
++/*
++   CMYK byte differences are encoded as follows:
++
++	 0	000
++	+1	001
++	-1	010
++	 2	011s0	s = 0 for +, 1 for -
++	 3	011s1
++	 4	100s00
++	 5	100s01
++	 6	100s10
++	 7	100s11
++	 8	101s000
++	 9	101s001
++	    ...
++	 14	101s110
++	 15	101s111
++	 16	110s00000
++	 17	110s00001
++	 18	110s00010
++	    ...
++	 46	110s11110
++	 47	110s11111
++	 48	1110s00000
++	 49	1110s00001
++	    ...
++	 78	1110s11110
++	 79	1110s11111
++	 80	1111s000000
++	 81	1111s000001
++	    ...
++	 126	1111s101110
++	 127	1111s101111
++	 128	11111110000
++*/
++void
++put_diff(struct stream *s, signed char val)
++{
++    static unsigned short code[] =
++    {
++	 2,  3, 3, 1,
++	 4,  4, 3, 2,
++	 8,  5, 3, 3,
++	16,  6, 3, 5,
++	48, 14, 4, 5,
++	80, 15, 4, 6,
++	129
++    };
++    int sign, abs, c = 0;
++
++    switch (val)
++    {
++    case  0:  putbits(s, 0, 3);  return;
++    case  1:  putbits(s, 1, 3);  return;
++    case -1:  putbits(s, 2, 3);  return;
++    }
++    abs = ((sign = val < 0)) ? -val:val;
++    while (abs >= code[c+4]) c += 4;
++    putbits(s, code[c+1], code[c+2]);
++    putbits(s, sign, 1);
++    putbits(s, abs-code[c], code[c+3]);
++}
++
++void
++setle(unsigned char *c, int s, int i)
++{
++    while (s--)
++    {
++	*c++ = i;
++	i >>= 8;
++    }
++}
++
++void
++start_doc(int color)
++{
++    char reca[] = { 0x41,0x81,0xa1,0x00,0x82,0xa2,0x07,0x00,0x83,0xa2,0x01,0x00 };
++    time_t t;
++    struct tm *tmp;
++    char datestr[16], timestr[16];
++    char cname[128] = "My Computer";
++    char *mname[] =
++    {	"",
++	"NORMAL",
++	"THICK",
++	"HIGHQUALITY",
++	"COAT2",
++	"LABEL",
++	"ENVELOPE",
++	"RECYCLED",
++	"NORMALREV",
++	"THICKSIDE2",
++	"HIGHQUALITYREV",
++	"COATEDPAPER2REV",
++	"RECYCLEREV",
++    };
++
++    t = time(NULL);
++    tmp = localtime(&t);
++    strftime(datestr, sizeof datestr, "%m/%d/%Y", tmp);
++    strftime(timestr, sizeof timestr, "%H:%M:%S", tmp);
++
++    #ifdef linux
++    {
++	struct utsname u;
++
++	uname(&u);
++	strncpy(cname, u.nodename, 128);
++	cname[127] = 0;
++    }
++    #endif
++
++/* Lines end with \n, not \r\n */
++
++    printf(
++	"\033%%-12345X@PJL SET STRINGCODESET=UTF8\n"
++	"@PJL COMMENT DATE=%s\n"
++	"@PJL COMMENT TIME=%s\n"
++	"@PJL COMMENT DNAME=%s\n"
++	"@PJL JOB MODE=PRINTER\n"
++	"@PJL SET JOBATTR=\"@LUNA=%s\"\n"
++	"@PJL SET JOBATTR=\"@TRCH=OFF\"\n"
++	"@PJL SET DUPLEX=OFF\n"
++	"@PJL SET BINDING=LONGEDGE\n"
++	"@PJL SET IWAMANUALDUP=OFF\n"
++	"@PJL SET JOBATTR=\"@MSIP=%s\"\n"
++	"@PJL SET RENDERMODE=%s\n"
++	"@PJL SET ECONOMODE=OFF\n"
++	"@PJL SET RET=ON\n"
++	"@PJL SET JOBATTR=\"@IREC=OFF\"\n"
++	"@PJL SET JOBATTR=\"@TRAP=ON\"\n"
++	"@PJL SET JOBATTR=\"@JOAU=%s\"\n"
++	"@PJL SET JOBATTR=\"@CNAM=%s\"\n"
++	"@PJL SET COPIES=1\n"
++	"@PJL SET QTY=1\n"
++	"@PJL SET PAPERDIRECTION=SEF\n"
++	"@PJL SET RESOLUTION=600\n"
++	"@PJL SET BITSPERPIXEL=8\n"
++	"@PJL SET JOBATTR=\"@DRDM=XRC\"\n"
++	"@PJL SET JOBATTR=\"@TSCR=11\"\n"
++	"@PJL SET JOBATTR=\"@GSCR=11\"\n"
++	"@PJL SET JOBATTR=\"@ISCR=12\"\n"
++	"@PJL SET JOBATTR=\"@TTRC=11\"\n"
++	"@PJL SET JOBATTR=\"@GTRC=11\"\n"
++	"@PJL SET JOBATTR=\"@ITRC=12\"\n"
++	"@PJL SET JOBATTR=\"@TCPR=11\"\n"
++	"@PJL SET JOBATTR=\"@GCPR=11\"\n"
++	"@PJL SET JOBATTR=\"@ICPR=12\"\n"
++	"@PJL SET JOBATTR=\"@TUCR=11\"\n"
++	"@PJL SET JOBATTR=\"@GUCR=11\"\n"
++	"@PJL SET JOBATTR=\"@IUCR=12\"\n"
++	"@PJL SET JOBATTR=\"@BSPM=OFF\"\n"
++	"@PJL SET JOBATTR=\"@TDFT=0\"\n"
++	"@PJL SET JOBATTR=\"@GDFT=0\"\n"
++	"@PJL SET JOBATTR=\"@IDFT=0\"\n"
++	"@PJL ENTER LANGUAGE=HBPL\n"
++	, datestr, timestr
++	, Filename ? Filename : ""
++	, Username ? Username : ""
++	, mname[MediaCode]
++	, color ? "COLOR" : "GRAYSCALE"
++	, Username ? Username : ""
++	, cname);
++    fwrite (reca, 1, sizeof reca, stdout);
++}
++
++#define IP (((int *)image) + off)
++#define CP (((char *)image) + off)
++#define DP (((char *)image) + off*deep)
++#define BP(x) ((blank[(off+x) >> 3] << ((off+x) & 7)) & 128)
++#define put_token(s,x) putbits(s, huff[hsel][x] >> 4, huff[hsel][x] & 15)
++
++void
++encode_page(int color, int width, int height, char *image)
++{
++    unsigned char head[90] =
++    {
++	0x43,0x91,0xa1,0x00,0x92,0xa1,0x01,0x93,0xa1,0x01,0x94,0xa1,
++	0x00,0x95,0xc2,0x00,0x00,0x00,0x00,0x96,0xa1,0x00,0x97,0xc3,
++	0x00,0x00,0x00,0x00,0x98,0xa1,0x00,0x99,0xa4,0x01,0x00,0x00,
++	0x00,0x9a,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9b,
++	0xa1,0x00,0x9c,0xa1,0x01,0x9d,0xa1,0x00,0x9e,0xa1,0x02,0x9f,
++	0xa1,0x05,0xa0,0xa1,0x08,0xa1,0xa1,0x00,0xa2,0xc4,0x00,0x00,
++	0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x52,0xa3,0xa1,0x00,0xa4,
++	0xb1,0xa4
++    };
++    unsigned char body[52] =
++    {
++	0x20,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x10,0x32,0x04,0x00,
++	0xa1,0x42,0x00,0x00,0x00,0x00,0xff
++    };
++    static short papers[] =
++    {	// Official sizes to nearest 1/600 inch
++	// will accept +-1.5mm (35/600 inch) tolerance
++	  0, 5100, 6600,	// Letter
++	  2, 5100, 8400,	// Legal
++	  4, 4961, 7016,	// A4
++	  6, 4350, 6300,	// Executive
++	 13, 2475, 5700,	// #10 envelope
++	 15, 2325, 4500,	// Monarch envelope
++	 17, 3827, 5409,	// C5 envelope
++	 19, 2599, 5197,	// DL envelope
++//	 ??, 4158, 5906,	// B5 ISO
++	 22, 4299, 6071,	// B5 JIS
++	 30, 3496, 4961,	// A5
++	410, 5100, 7800,	// Folio
++    };
++    static const unsigned short huff[2][8] =
++    {
++	{ 0x01,0x63,0x1c5,0x1d5,0x1e5,0x22,0x3e6 }, // for text & graphics
++	{ 0x22,0x63,0x1c5,0x1d5,0x1e5,0x01,0x3e6 }, // for images
++    };
++    unsigned char *blank;
++    static int pagenum = 0;
++    struct stream stream[5] = { { 0 } };
++    int dirs[] = { -1,0,-1,1,2 }, rotor[] = { 0,1,2,3,4 };
++    int i, j, row, col, deep, dir, run, try, bdir, brun, total;
++    int paper = 510, hsel = 0, off = 0, bit = 0, stat = 0;
++    int margin = width-96;
++
++    for (i = 0; i < sizeof papers / sizeof *papers; i++)
++	if (abs(width-papers[i+1]) < 36 && abs(height-papers[i+2]) < 36)
++	    paper = papers[i];
++    if (!MediaCode)
++	MediaCode = paper & 1 ? 6 : 1;
++    if (!pagenum)
++	start_doc(color);
++    head[12] = paper >> 1;
++    if (paper == 510)
++    {
++	setle (head+15, 2,  (width*254+300)/600);  // units of 0.1mm
++	setle (head+17, 2, (height*254+300)/600);
++	head[21] = 2;
++    }
++    width = -(-width & -8);
++    setle (head+33, 4, ++pagenum);
++    setle (head+39, 4, width);
++    setle (head+43, 4, height);
++    setle (head+70, 4, width);
++    setle (head+74, 4, height);
++    head[55] = 9 + color*130;
++    if (color)	body[6] = 1;
++    else	body[4] = 8;
++
++    deep = 1 + color*3;
++    for (i=1; i < 5; i++)
++	dirs[i] -= width;
++    if (!color) dirs[4] = -8;
++
++    blank = calloc(height+2, width/8);
++    memset (blank++, -color, width/8+1);
++    for (row = 1; row <= height; row++)
++    {
++	for (col = deep; col < deep*2; col++)
++	    image[row*width*deep + col] = -1;
++	for (col = 8; col < width*deep; col += 4)
++	    if (*(int *)(image + row*width*deep + col))
++	    {
++		for (col = 12; col < margin/8; col++)
++		    blank[row*(width/8)+col] = -1;
++		blank[row*(width/8)+col] = -2 << (~margin & 7);
++		break;
++	    }
++    }
++    memset (image, -color, (width+1)*deep);
++    image += (width+1)*deep;
++    blank += width/8;
++
++    while (off < width * height)
++    {
++	for (bdir = brun = dir = 0; dir < 5; dir++)
++	{
++	    try = dirs[rotor[dir]];
++	    for (run = 0; run < 17057; run++, try++)
++	    {
++		if (color)
++		{
++		    if (IP[run] != IP[try]) break;
++		}
++		else
++		    if (CP[run] != CP[try]) break;
++
++		if (BP(run) != BP(try)) break;
++	    }
++	    if (run > brun)
++	    {
++		bdir = dir;
++		brun = run;
++	    }
++	}
++	if (brun == 0)
++	{
++	    put_token(stream, 5);
++	    for (i = 0; i < deep; i++)
++		put_diff(stream+1+i, DP[i] - DP[i-deep]);
++	    bit = 0;
++	    off++;
++	    stat--;
++	    continue;
++	}
++	if (brun > width * height - off)
++	    brun = width * height - off;
++	if (bdir)
++	{
++	    j = rotor[bdir];
++	    for (i = bdir; i; i--)
++		rotor[i] = rotor[i-1];
++	    rotor[0] = j;
++	}
++	if ((off-1+brun)/width != (off-1)/width)
++	{
++	    if (abs(stat) > 8 && ((stat >> 31) & 1) != hsel)
++	    {
++		hsel ^= 1;
++		put_token(stream, 6);
++	    }
++	    stat = 0;
++	}
++	stat += bdir == bit;
++	put_token(stream, bdir - bit);
++	put_len(stream, brun);
++	bit = brun < 17057;
++	off += brun;
++    }
++
++    putbits(stream, 0xff, 8);
++    for (total = 48, i = 0; i <= deep; i++)
++    {
++	putbits(stream+i, 0xff, 8);
++	stream[i].off--;
++	setle (body+32 + i*4, 4, stream[i].off);
++	total += stream[i].off;
++    }
++    head[85] = 0xa2 + (total > 0xffff)*2;
++    setle (head+86, 4, total);
++    fwrite(head, 1, 88+(total > 0xffff)*2, stdout);
++    fwrite(body, 1, 48, stdout);
++    for (i = 0; i <= deep; i++)
++    {
++	fwrite(stream[i].buf, 1, stream[i].off, stdout);
++	free(stream[i].buf);
++    }
++    free(blank-width/8-1);
++    printf("SD");
++}
++#undef IP
++#undef CP
++#undef DP
++#undef BP
++#undef put_token
++
++int
++getint(FILE *fp)
++{
++    int c, ret;
++
++    for (;;)
++    {
++	while (isspace(c = fgetc(fp)));
++	if (c == '#')
++	    while (fgetc(fp) != '\n');
++	else break;
++    }
++    if (!isdigit(c)) return -1;
++    for (ret = c-'0'; isdigit(c = fgetc(fp)); )
++	ret = ret*10 + c-'0';
++    return ret;
++}
++
++void
++do_file(FILE *fp)
++{
++    int type, iwide, ihigh, ideep, imax, ibyte;
++    int wide, deep, byte, row, col, i, k;
++    char tupl[128], line[128];
++    unsigned char *image, *sp, *dp;
++
++    while ((type = fgetc(fp)) != EOF)
++    {
++	type = ((type - 'P') << 8) | fgetc(fp);
++	tupl[0] = iwide = ihigh = ideep = deep = imax = ibyte = -1;
++	switch (type)
++	{
++	case '4':
++	    deep = 1 + (ideep = 0);
++	    goto six;
++	case '5':
++	    deep = ideep = 1;
++	    goto six;
++	case '6':
++	    deep = 1 + (ideep = 3);
++six:	    iwide = getint(fp);
++	    ihigh = getint(fp);
++	    imax = type == '4' ? 255 : getint(fp);
++	    break;
++	case '7':
++	    do
++	    {
++		if (!fgets(line, 128, fp)) goto fail;
++		if (!strncmp(line, "WIDTH ",6))
++		    iwide = atoi(line + 6);
++		if (!strncmp(line, "HEIGHT ",7))
++		    ihigh = atoi(line + 7);
++		if (!strncmp(line, "DEPTH ",6))
++		    deep = ideep = atoi(line + 6);
++		if (!strncmp(line, "MAXVAL ",7))
++		    imax = atoi(line + 7);
++		if (!strncmp(line, "TUPLTYPE ",9))
++		    strcpy (tupl, line + 9);
++	    } while (strcmp(line, "ENDHDR\n"));
++	    if (ideep != 4 || strcmp(tupl, "CMYK\n")) goto fail;
++	    break;
++	default:
++	    goto fail;
++	}
++	if (iwide <= 0 || ihigh <= 0 || imax != 255) goto fail;
++	wide = -(-iwide & -8);
++        if (ideep)
++	    ibyte = iwide * ideep;
++	else
++	    ibyte = wide >> 3;
++	byte = wide * deep;
++	image = calloc (ihigh+2, byte);
++	for (row = 1; row <= ihigh; row++)
++	{
++	    i = fread (image, ibyte, 1, fp);
++	    sp = image;
++	    dp = image + row*byte;
++	    for (col = 0; col < iwide; col++)
++	    {
++		dp += deep;
++		switch (ideep)
++		{
++		case 0:
++		    *dp = ((image[col >> 3] >> (~col & 7)) & 1) * 255;
++		    break;
++		case 1:
++		    *dp = ~*sp;
++		    break;
++		case 3:
++		    for (k = sp[2], i = 0; i < 2; i++)
++			if (k < sp[i]) k = sp[i];
++		    *dp = ~k;
++		    for (i = 0; i < 3; i++)
++			dp[i+1] = k ? (k - sp[i]) * 255 / k : 255;
++		    break;
++		case 4:
++		    for (i=0; i < 4; i++)
++			dp[i] = sp[((i-1) & 3)];
++		    break;
++		}
++		sp += ideep;
++	    }
++	    for (i = 0; i < deep*Clip[0]; i++)
++		image[row*byte + deep+i] = 0;
++	    for (i = deep*(iwide-Clip[2]); i < byte; i++)
++		image[row*byte + deep+i] = 0;
++	}
++	memset(image+deep, 0, byte*(Clip[1]+1));
++	memset(image+deep + byte*(ihigh-Clip[3]+1), 0, byte*Clip[3]);
++	encode_page(deep > 1, iwide, ihigh, (char *) image);
++	free(image);
++    }
++    return;
++fail:
++    fprintf (stderr, "Not an acceptable PBM, PPM or PAM file!!!\n");
++}
++
++int
++main(int argc, char *argv[])
++{
++    int	c, i;
++
++    while ( (c = getopt(argc, argv, "m:u:J:U:V")) != EOF)
++	switch (c)
++	{
++	case 'm':  MediaCode = atoi(optarg); break;
++	case 'u':  if (sscanf(optarg, "%d,%d,%d,%d",
++			Clip, Clip+1, Clip+2, Clip+3) != 4)
++		      error(1, "Must specify four clipping margins!\n");
++		   break;
++	case 'J':  if (optarg[0]) Filename = optarg; break;
++	case 'U':  if (optarg[0]) Username = optarg; break;
++	case 'V':  printf("%s\n", Version); return 0;
++	default:   usage(); return 1;
++	}
++
++    argc -= optind;
++    argv += optind;
++
++    if (argc == 0)
++    {
++	do_file(stdin);
++    }
++    else
++    {
++	for (i = 0; i < argc; ++i)
++	{
++	    FILE *ifp;
++
++	    if (!(ifp = fopen(argv[i], "r")))
++		error(1, "Can't open '%s' for reading\n", argv[i]);
++	    do_file(ifp);
++	    fclose(ifp);
++	}
++    }
++    puts("B\033%-12345X@PJL EOJ");
++    return 0;
++}
+--- foo2zjs/foomatic-db/driver/foo2hbpl1.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/driver/foo2hbpl1.xml	2014-03-24 16:18:13.000000000 +0000
+@@ -0,0 +1,21 @@
++<driver id="driver/foo2hbpl1">
++    <name>foo2hbpl1</name>
++    <url>http://foo2hbpl.rkkda.com/</url>
++    <execution>
++	<filter />
++	<prototype>foo2hbpl1-wrapper %A</prototype>
++    </execution>
++    <comments> <en>
++
++	This is a driver developed for the Dell 1250c, Dell C1660, Dell C1760,
++	Epson AcuLaser C1700, and the Fuji-Xerox DocuPrint cp105.
++
++    </en> </comments>
++    <printers>
++	<printer><id>printer/Dell-1250c</id></printer>
++	<printer><id>printer/Dell-C1660</id></printer>
++	<printer><id>printer/Dell-C1760</id></printer>
++	<printer><id>printer/Epson-AcuLaser_C1700</id></printer>
++	<printer><id>printer/Fuji_Xerox-DocuPrint_CP105</id></printer>
++    </printers>
++</driver>
+--- foo2zjs/foomatic-db/opt/foo2hbpl1-ColorMode.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2hbpl1-ColorMode.xml	2014-03-24 15:31:46.000000000 +0000
+@@ -0,0 +1,38 @@
++<option type="enum" id="opt/foo2hbpl1-ColorMode">
++    <!-- A multilingual <comments> block can appear here, too;
++       it should be treated as documentation for the user. -->
++    <arg_longname> <en>Color Mode</en> </arg_longname>
++    <arg_shortname> <en>ColorMode</en> </arg_shortname>
++    <arg_execution>
++	<arg_group>General</arg_group>
++	<arg_order>120</arg_order>
++	<arg_spot>A</arg_spot>
++	<arg_required />
++	<arg_substitution />
++	<arg_proto>%s </arg_proto>
++    </arg_execution>
++    <constraints>
++	<constraint sense="true">
++	<driver>foo2hbpl1</driver>
++	<arg_defval>ev/foo2hbpl1-ColorMode-mono</arg_defval>
++	</constraint>
++    </constraints>
++    <enum_vals>
++	<enum_val id="ev/foo2hbpl1-ColorMode-mono">
++	    <ev_longname> <en>Monochrome</en> </ev_longname>
++	    <comments><en>
++		Prints in monochrome only
++	    </en></comments>
++	    <ev_shortname> <en>Monochrome</en> </ev_shortname>
++	    <ev_driverval></ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-ColorMode-color">
++	    <ev_longname> <en>Color</en> </ev_longname>
++	    <comments><en>
++		Prints in color using the best compromise setting.
++	    </en></comments>
++	    <ev_shortname> <en>Color</en> </ev_shortname>
++	    <ev_driverval>-c</ev_driverval>
++	</enum_val>
++    </enum_vals>
++</option>
+--- foo2zjs/foomatic-db/opt/foo2hbpl1-ICM.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2hbpl1-ICM.xml	2014-03-25 10:14:22.000000000 +0000
+@@ -0,0 +1,52 @@
++<option type="enum" id="opt/foo2hbpl1-ICM">
++    <comments>
++	<en>
++	This option controls which .ICM file to use for color correction.
++	ICM files are stored in directory /usr/share/foo2hbpl/icm/.
++	</en>
++    </comments>
++    <arg_longname> <en>ICM Color Profile</en> </arg_longname>
++    <arg_shortname> <en>ICM</en> </arg_shortname>
++    <arg_execution>
++	<arg_group>Adjustment</arg_group>
++	<arg_order>300</arg_order>
++	<arg_spot>A</arg_spot>
++	<arg_required />
++	<arg_substitution />
++	<arg_proto>%s </arg_proto>
++    </arg_execution>
++    <constraints>
++	<constraint sense="true">
++	    <driver>foo2hbpl1</driver>
++	    <arg_defval>ev/foo2hbpl1-ICM-none</arg_defval>
++	</constraint>
++    </constraints>
++    <enum_vals>
++	<enum_val id="ev/foo2hbpl1-ICM-none">
++	    <ev_longname> <en>No ICM color correction</en> </ev_longname>
++		<!-- A multilingual <comments> block can appear here, too;
++		 it should be treated as documentation for the user. -->
++	    <ev_shortname> <en>none</en> </ev_shortname>
++	    <ev_driverval>-C10 -Gnone.icm</ev_driverval>
++	</enum_val>
++
++        <enum_val id="ev/foo2hbpl1-ICM-testing">
++            <ev_longname> <en>File testing.icm</en> </ev_longname>
++            <ev_shortname> <en>testing</en> </ev_shortname>
++            <ev_driverval>-C10 -Gtesting.icm</ev_driverval>
++        </enum_val>
++
++        <enum_val id="ev/foo2hbpl1-ICM-testing2">
++            <ev_longname> <en>File testing2.icm</en> </ev_longname>
++            <ev_shortname> <en>testing2</en> </ev_shortname>
++            <ev_driverval>-C10 -Gtesting2.icm</ev_driverval>
++        </enum_val>
++
++        <enum_val id="ev/foo2hbpl1-ICM-testing3">
++            <ev_longname> <en>File testing3.icm</en> </ev_longname>
++            <ev_shortname> <en>testing3</en> </ev_shortname>
++            <ev_driverval>-C10 -Gtesting3.icm</ev_driverval>
++        </enum_val>
++
++    </enum_vals>
++</option>
+--- foo2zjs/foomatic-db/opt/foo2hbpl1-MediaType.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2hbpl1-MediaType.xml	2014-03-24 15:50:56.000000000 +0000
+@@ -0,0 +1,82 @@
++<option type="enum" id="opt/foo2hbpl1-MediaType">
++    <!-- A multilingual <comments> block can appear here, too;
++       it should be treated as documentation for the user. -->
++    <arg_longname> <en>Media Type</en> </arg_longname>
++    <arg_shortname> <en>MediaType</en> </arg_shortname>
++    <arg_execution>
++	<arg_group>General</arg_group>
++	<arg_order>150</arg_order>
++	<arg_spot>A</arg_spot>
++	<arg_required />
++	<arg_substitution />
++	<arg_proto>-m%s </arg_proto>
++    </arg_execution>
++    <constraints>
++	<constraint sense="true">
++	<driver>foo2hbpl1</driver>
++	<arg_defval>ev/foo2hbpl1-MediaType-1</arg_defval>
++	</constraint>
++    </constraints>
++    <enum_vals>
++	<enum_val id="ev/foo2hbpl1-MediaType-1">
++	    <ev_longname> <en>Plain Paper</en> </ev_longname>
++	    <ev_shortname> <en>plain</en> </ev_shortname>
++	    <ev_driverval>1</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-2">
++	    <ev_longname> <en>Bond</en> </ev_longname>
++	    <ev_shortname> <en>bond</en> </ev_shortname>
++	    <ev_driverval>2</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-3">
++	    <ev_longname> <en>Light Weight Card</en> </ev_longname>
++	    <ev_shortname> <en>lwcard</en> </ev_shortname>
++	    <ev_driverval>3</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-4">
++	    <ev_longname> <en>Light Weight Glossy Card</en> </ev_longname>
++	    <ev_shortname> <en>lwgcard</en> </ev_shortname>
++	    <ev_driverval>4</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-5">
++	    <ev_longname> <en>Labels</en> </ev_longname>
++	    <ev_shortname> <en>labels</en> </ev_shortname>
++	    <ev_driverval>5</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-6">
++	    <ev_longname> <en>Envelope</en> </ev_longname>
++	    <ev_shortname> <en>envelope</en> </ev_shortname>
++	    <ev_driverval>6</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-7">
++	    <ev_longname> <en>Recycled Paper</en> </ev_longname>
++	    <ev_shortname> <en>recycled</en> </ev_shortname>
++	    <ev_driverval>7</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-8">
++	    <ev_longname> <en>Plain Paper Side 2</en> </ev_longname>
++	    <ev_shortname> <en>plain2</en> </ev_shortname>
++	    <ev_driverval>8</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-9">
++	    <ev_longname> <en>Bond Side 2</en> </ev_longname>
++	    <ev_shortname> <en>bond2</en> </ev_shortname>
++	    <ev_driverval>9</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-10">
++	    <ev_longname> <en>Light Weight Card Side 2</en> </ev_longname>
++	    <ev_shortname> <en>lwcard2</en> </ev_shortname>
++	    <ev_driverval>10</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-11">
++	    <ev_longname> <en>Light Weight Glossy Card Side 2</en></ev_longname>
++	    <ev_shortname> <en>lwgcard2</en> </ev_shortname>
++	    <ev_driverval>11</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-MediaType-12">
++	    <ev_longname> <en>Recycled Paper Side 2</en> </ev_longname>
++	    <ev_shortname> <en>recycled2</en> </ev_shortname>
++	    <ev_driverval>12</ev_driverval>
++	</enum_val>
++    </enum_vals>
++</option>
+--- foo2zjs/foomatic-db/opt/foo2hbpl1-PageSize.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2hbpl1-PageSize.xml	2014-04-01 11:05:46.000000000 +0000
+@@ -0,0 +1,80 @@
++<option type="enum" id="opt/foo2hbpl1-PageSize">
++    <arg_longname> <en>Page Size</en> </arg_longname>
++    <arg_shortname> <en>PageSize</en> </arg_shortname>
++    <arg_execution>
++	<arg_group>General</arg_group>
++	<arg_order>135</arg_order>
++	<arg_spot>A</arg_spot>
++	<arg_required />
++	<arg_substitution />
++	<arg_proto>-p%s </arg_proto>
++    </arg_execution>
++    <constraints>
++	<constraint sense="true">
++	<driver>foo2hbpl1</driver>
++	<arg_defval>ev/foo2hbpl1-PageSize-4</arg_defval>
++	</constraint>
++    </constraints>
++    <enum_vals>
++	<enum_val id="ev/foo2hbpl1-PageSize-1">
++	    <ev_longname> <en>A4</en> </ev_longname>
++	    <ev_shortname> <en>A4</en> </ev_shortname>
++	    <ev_driverval>1</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-2">
++	    <ev_longname> <en>B5 (JIS)</en> </ev_longname>
++	    <ev_shortname> <en>B5jis</en> </ev_shortname>
++	    <ev_driverval>2</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-4">
++	    <ev_longname> <en>Letter</en> </ev_longname>
++	    <ev_shortname> <en>Letter</en> </ev_shortname>
++	    <ev_driverval>4</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-5">
++	    <ev_longname> <en>Executive</en> </ev_longname>
++	    <ev_shortname> <en>Executive</en> </ev_shortname>
++	    <ev_driverval>5</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-6">
++	    <ev_longname> <en>Fanfold German Legal</en> </ev_longname>
++	    <ev_shortname> <en>FanfoldGermanLegal</en> </ev_shortname>
++	    <ev_driverval>6</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-6-alt">
++	    <ev_longname> <en>Folio</en> </ev_longname>
++	    <ev_shortname> <en>Folio</en> </ev_shortname>
++	    <ev_driverval>6</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-7">
++	    <ev_longname> <en>Legal</en> </ev_longname>
++	    <ev_shortname> <en>Legal</en> </ev_shortname>
++	    <ev_driverval>7</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-9">
++	    <ev_longname> <en>Env #10</en> </ev_longname>
++	    <ev_shortname> <en>Env10</en> </ev_shortname>
++	    <ev_driverval>9</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-10">
++	    <ev_longname> <en>Env Monarch</en> </ev_longname>
++	    <ev_shortname> <en>EnvMonarch</en> </ev_shortname>
++	    <ev_driverval>10</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-11">
++	    <ev_longname> <en>Env C5</en> </ev_longname>
++	    <ev_shortname> <en>EnvC5</en> </ev_shortname>
++	    <ev_driverval>11</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-12">
++	    <ev_longname> <en>Env DL</en> </ev_longname>
++	    <ev_shortname> <en>EnvDL</en> </ev_shortname>
++	    <ev_driverval>12</ev_driverval>
++	</enum_val>
++	<enum_val id="ev/foo2hbpl1-PageSize-Custom">
++	    <ev_longname> <en>Custom</en> </ev_longname>
++	    <ev_shortname> <en>Custom</en> </ev_shortname>
++	    <ev_driverval>Custom.%0x%1</ev_driverval>
++	</enum_val>
++    </enum_vals>
++</option>
+--- foo2zjs/foomatic-db/opt/foo2xxx-Copies.xml	2014-04-03 22:23:27.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2xxx-Copies.xml	2014-03-24 15:32:48.000000000 +0000
+@@ -65,6 +65,10 @@
+ 	    <arg_defval>1</arg_defval>
+ 	</constraint>
+ 	<constraint sense="true">
++	    <driver>foo2hbpl1</driver>
++	    <arg_defval>1</arg_defval>
++	</constraint>
++	<constraint sense="true">
+ 	    <driver>foo2hbpl2</driver>
+ 	    <arg_defval>1</arg_defval>
+ 	</constraint>
+--- foo2zjs/foomatic-db/opt/foo2xxx-Halftone.xml	2014-04-03 22:23:40.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2xxx-Halftone.xml	2014-03-25 10:16:58.000000000 +0000
+@@ -68,6 +68,10 @@
+ 	    <arg_defval>ev/foo2xxx-Halftone-Default</arg_defval>
+ 	</constraint>
+ 	<constraint sense="true">
++	    <driver>foo2hbpl1</driver>
++	    <arg_defval>ev/foo2xxx-Halftone-Default</arg_defval>
++	</constraint>
++	<constraint sense="true">
+ 	    <driver>foo2hbpl2</driver>
+ 	    <arg_defval>ev/foo2xxx-Halftone-Default</arg_defval>
+ 	</constraint>
+--- foo2zjs/foomatic-db/opt/foo2xxx-Nup.xml	2014-04-03 22:24:01.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2xxx-Nup.xml	2014-03-24 15:34:43.000000000 +0000
+@@ -65,6 +65,10 @@
+ 	    <arg_defval>ev/foo2xxx-Nup-1</arg_defval>
+ 	</constraint>
+ 	<constraint sense="true">
++	    <driver>foo2hbpl1</driver>
++	    <arg_defval>ev/foo2xxx-Nup-1</arg_defval>
++	</constraint>
++	<constraint sense="true">
+ 	    <driver>foo2hbpl2</driver>
+ 	    <arg_defval>ev/foo2xxx-Nup-1</arg_defval>
+ 	</constraint>
+--- foo2zjs/foomatic-db/opt/foo2xxx-NupOrient.xml	2014-04-03 22:23:50.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2xxx-NupOrient.xml	2014-03-24 15:35:10.000000000 +0000
+@@ -65,6 +65,10 @@
+ 	    <arg_defval>ev/foo2xxx-NupOrient-port</arg_defval>
+ 	</constraint>
+ 	<constraint sense="true">
++	    <driver>foo2hbpl1</driver>
++	    <arg_defval>ev/foo2xxx-NupOrient-port</arg_defval>
++	</constraint>
++	<constraint sense="true">
+ 	    <driver>foo2hbpl2</driver>
+ 	    <arg_defval>ev/foo2xxx-NupOrient-port</arg_defval>
+ 	</constraint>
+--- foo2zjs/foomatic-db/opt/foo2xxx-Quality.xml	2014-04-03 22:24:12.000000000 +0000
++++ foo2zjs/foomatic-db/opt/foo2xxx-Quality.xml	2014-03-24 15:35:36.000000000 +0000
+@@ -68,6 +68,10 @@
+ 	    <arg_defval>ev/foo2xxx-Quality-Normal</arg_defval>
+ 	</constraint>
+ 	<constraint sense="true">
++	    <driver>foo2hbpl1</driver>
++	    <arg_defval>ev/foo2xxx-Quality-Normal</arg_defval>
++	</constraint>
++	<constraint sense="true">
+ 	    <driver>foo2hbpl2</driver>
+ 	    <arg_defval>ev/foo2xxx-Quality-Normal</arg_defval>
+ 	</constraint>
+--- foo2zjs/foomatic-db/printer/Dell-1250c.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/printer/Dell-1250c.xml	2014-03-24 15:58:32.000000000 +0000
+@@ -0,0 +1,70 @@
++<printer id="printer/Dell-1250c">
++    <make>Dell</make>
++    <model>1250c</model>
++    <mechanism>
++	<laser/>
++	<color/>
++	<resolution>
++	    <dpi>
++		<x>600</x>
++		<y>600</y>
++	    </dpi>
++	</resolution>
++	<margins>
++	    <general>
++		<unit>inch</unit>
++		<top>0.085</top>
++		<bottom>0.085</bottom>
++		<left>0.085</left>
++		<right>0.085</right>
++	    </general>
++	</margins>
++<!--
++	<consumables>
++	    <comments> <en>
++		Toner Cyan (1000 prints) - $45
++		Toner Magenta (1000 prints) - $45
++		Toner Yellow (1000 prints) - $45
++		Toner Black (2000 prints) - $54
++		Waste Toner (5000 prints) - $10
++		Drum Kit (20000 prints) - $159
++	    </en> </comments>
++	    <partno>106R01271</partno>
++	    <partno>106R01272</partno>
++	    <partno>106R01273</partno>
++	    <partno>106R01274</partno>
++	    <partno>108R00722</partno>
++	    <partno>108R00744</partno>
++	</consumables>
++-->
++    </mechanism>
++    <url>http://www.pcmag.com/article2/0,2817,2380920,00.asp</url>
++    <lang>
++	<proprietary/>
++	<!--no pjl--><!--No "text"?-->
++    </lang>
++    <autodetect>
++<!--
++        <parallel>
++            <ieee1284>MFG:Xerox;CMD:SPLC;MDL:Phaser 6110;CLS:PRINTER;STATUS:BUSY;</ieee1284>
++            <manufacturer>Xerox</manufacturer>
++            <model>Phaser 6110</model>
++            <commandset>SPLC</commandset>
++        </parallel>
++-->
++	<snmp>
++	    <description>Dell 1250c</description>
++	</snmp>
++    </autodetect>
++    <functionality>C</functionality>
++    <driver>foo2hbpl1</driver>
++    <!--not "unverified"--><!--no "contrib_url"-->
++    <comments> <en>
++
++	The Dell 1250c is color printer with a 2014 street price of $200.
++
++	These printers are supported by the foo2hbpl1 open software printer
++	driver.
++
++    </en> </comments>
++</printer>
+--- foo2zjs/foomatic-db/printer/Dell-C1660.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/printer/Dell-C1660.xml	2014-03-24 15:27:13.000000000 +0000
+@@ -0,0 +1,70 @@
++<printer id="printer/Dell-C1660">
++    <make>Dell</make>
++    <model>C1660</model>
++    <mechanism>
++	<laser/>
++	<color/>
++	<resolution>
++	    <dpi>
++		<x>600</x>
++		<y>600</y>
++	    </dpi>
++	</resolution>
++	<margins>
++	    <general>
++		<unit>inch</unit>
++		<top>0.085</top>
++		<bottom>0.085</bottom>
++		<left>0.085</left>
++		<right>0.085</right>
++	    </general>
++	</margins>
++<!--
++	<consumables>
++	    <comments> <en>
++		Toner Cyan (1000 prints) - $45
++		Toner Magenta (1000 prints) - $45
++		Toner Yellow (1000 prints) - $45
++		Toner Black (2000 prints) - $54
++		Waste Toner (5000 prints) - $10
++		Drum Kit (20000 prints) - $159
++	    </en> </comments>
++	    <partno>106R01271</partno>
++	    <partno>106R01272</partno>
++	    <partno>106R01273</partno>
++	    <partno>106R01274</partno>
++	    <partno>108R00722</partno>
++	    <partno>108R00744</partno>
++	</consumables>
++-->
++    </mechanism>
++    <url>http://accessories.us.dell.com/sna/productdetail.aspx?c=us&amp;cs=04&amp;l=en&amp;s=bsd&amp;sku=225-411</url>
++    <lang>
++	<proprietary/>
++	<!--no pjl--><!--No "text"?-->
++    </lang>
++    <autodetect>
++<!--
++        <parallel>
++            <ieee1284>MFG:Xerox;CMD:SPLC;MDL:Phaser 6110;CLS:PRINTER;STATUS:BUSY;</ieee1284>
++            <manufacturer>Xerox</manufacturer>
++            <model>Phaser 6110</model>
++            <commandset>SPLC</commandset>
++        </parallel>
++-->
++	<snmp>
++	    <description>Dell C1660</description>
++	</snmp>
++    </autodetect>
++    <functionality>C</functionality>
++    <driver>foo2hbpl1</driver>
++    <!--not "unverified"--><!--no "contrib_url"-->
++    <comments> <en>
++
++	The Dell C1660 is color printer with a 2014 street price of $200.
++
++	These printers are supported by the foo2hbpl1 open software printer
++	driver.
++
++    </en> </comments>
++</printer>
+--- foo2zjs/foomatic-db/printer/Dell-C1760.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/printer/Dell-C1760.xml	2014-03-24 16:04:23.000000000 +0000
+@@ -0,0 +1,70 @@
++<printer id="printer/Dell-C1760">
++    <make>Dell</make>
++    <model>C1760</model>
++    <mechanism>
++	<laser/>
++	<color/>
++	<resolution>
++	    <dpi>
++		<x>600</x>
++		<y>600</y>
++	    </dpi>
++	</resolution>
++	<margins>
++	    <general>
++		<unit>inch</unit>
++		<top>0.085</top>
++		<bottom>0.085</bottom>
++		<left>0.085</left>
++		<right>0.085</right>
++	    </general>
++	</margins>
++<!--
++	<consumables>
++	    <comments> <en>
++		Toner Cyan (1000 prints) - $45
++		Toner Magenta (1000 prints) - $45
++		Toner Yellow (1000 prints) - $45
++		Toner Black (2000 prints) - $54
++		Waste Toner (5000 prints) - $10
++		Drum Kit (20000 prints) - $159
++	    </en> </comments>
++	    <partno>106R01271</partno>
++	    <partno>106R01272</partno>
++	    <partno>106R01273</partno>
++	    <partno>106R01274</partno>
++	    <partno>108R00722</partno>
++	    <partno>108R00744</partno>
++	</consumables>
++-->
++    </mechanism>
++    <url>http://accessories.us.dell.com/sna/productdetail.aspx?c=us&amp;cs=04&amp;l=en&amp;s=bsd&amp;sku=225-4111</url>
++    <lang>
++	<proprietary/>
++	<!--no pjl--><!--No "text"?-->
++    </lang>
++    <autodetect>
++<!--
++        <parallel>
++            <ieee1284>MFG:Xerox;CMD:SPLC;MDL:Phaser 6110;CLS:PRINTER;STATUS:BUSY;</ieee1284>
++            <manufacturer>Xerox</manufacturer>
++            <model>Phaser 6110</model>
++            <commandset>SPLC</commandset>
++        </parallel>
++-->
++	<snmp>
++	    <description>Dell C1760</description>
++	</snmp>
++    </autodetect>
++    <functionality>C</functionality>
++    <driver>foo2hbpl1</driver>
++    <!--not "unverified"--><!--no "contrib_url"-->
++    <comments> <en>
++
++	The Dell C1760 is color printer with a 2014 street price of $300.
++
++	These printers are supported by the foo2hbpl1 open software printer
++	driver.
++
++    </en> </comments>
++</printer>
+--- foo2zjs/foomatic-db/printer/Epson-AcuLaser_C1700.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/printer/Epson-AcuLaser_C1700.xml	2014-03-24 16:13:45.000000000 +0000
+@@ -0,0 +1,71 @@
++<printer id="printer/Epson-AcuLaser_C1700">
++    <make>Epson</make>
++    <model>AcuLaser C1700</model>
++    <mechanism>
++	<laser/>
++	<color/>
++	<resolution>
++	    <dpi>
++		<x>600</x>
++		<y>600</y>
++	    </dpi>
++	</resolution>
++	<margins>
++	    <general>
++		<unit>inch</unit>
++		<top>0.085</top>
++		<bottom>0.085</bottom>
++		<left>0.085</left>
++		<right>0.085</right>
++	    </general>
++	</margins>
++<!--
++	<consumables>
++	    <comments> <en>
++		Toner Cyan (1000 prints) - $45
++		Toner Magenta (1000 prints) - $45
++		Toner Yellow (1000 prints) - $45
++		Toner Black (2000 prints) - $54
++		Waste Toner (5000 prints) - $10
++		Drum Kit (20000 prints) - $159
++	    </en> </comments>
++	    <partno>106R01271</partno>
++	    <partno>106R01272</partno>
++	    <partno>106R01273</partno>
++	    <partno>106R01274</partno>
++	    <partno>108R00722</partno>
++	    <partno>108R00744</partno>
++	</consumables>
++-->
++    </mechanism>
++    <url>http://www.epson.co.uk/gb/en/viewcon/corporatesite/products/mainunits/overview/10816</url>
++    <lang>
++	<proprietary/>
++	<!--no pjl--><!--No "text"?-->
++    </lang>
++    <autodetect>
++<!--
++        <parallel>
++            <ieee1284>MFG:Xerox;CMD:SPLC;MDL:Phaser 6110;CLS:PRINTER;STATUS:BUSY;</ieee1284>
++            <manufacturer>Xerox</manufacturer>
++            <model>Phaser 6110</model>
++            <commandset>SPLC</commandset>
++        </parallel>
++-->
++	<snmp>
++	    <description>Epson AcuLaser C1700</description>
++	</snmp>
++    </autodetect>
++    <functionality>C</functionality>
++    <driver>foo2hbpl1</driver>
++    <!--not "unverified"--><!--no "contrib_url"-->
++    <comments> <en>
++
++	The Epson AcuLaser C1700 is color printer with a 2014 street price
++	of $200.
++
++	These printers are supported by the foo2hbpl1 open software printer
++	driver.
++
++    </en> </comments>
++</printer>
+--- foo2zjs/foomatic-db/printer/Fuji_Xerox-DocuPrint_CP105.xml	1970-01-01 00:00:00.000000000 +0000
++++ foo2zjs/foomatic-db/printer/Fuji_Xerox-DocuPrint_CP105.xml	2014-03-24 16:17:06.000000000 +0000
+@@ -0,0 +1,71 @@
++<printer id="printer/Fuji_Xerox-DocuPrint_CP105">
++    <make>Fuji Xerox</make>
++    <model>DocuPrint CP105</model>
++    <mechanism>
++	<laser/>
++	<color/>
++	<resolution>
++	    <dpi>
++		<x>600</x>
++		<y>600</y>
++	    </dpi>
++	</resolution>
++	<margins>
++	    <general>
++		<unit>inch</unit>
++		<top>0.085</top>
++		<bottom>0.085</bottom>
++		<left>0.085</left>
++		<right>0.085</right>
++	    </general>
++	</margins>
++<!--
++	<consumables>
++	    <comments> <en>
++		Toner Cyan (1000 prints) - $45
++		Toner Magenta (1000 prints) - $45
++		Toner Yellow (1000 prints) - $45
++		Toner Black (2000 prints) - $54
++		Waste Toner (5000 prints) - $10
++		Drum Kit (20000 prints) - $159
++	    </en> </comments>
++	    <partno>106R01271</partno>
++	    <partno>106R01272</partno>
++	    <partno>106R01273</partno>
++	    <partno>106R01274</partno>
++	    <partno>108R00722</partno>
++	    <partno>108R00744</partno>
++	</consumables>
++-->
++    </mechanism>
++    <url>http://accessories.us.dell.com/sna/productdetail.aspx?c=us&amp;cs=04&amp;l=en&amp;s=bsd&amp;sku=225-411</url>
++    <lang>
++	<proprietary/>
++	<!--no pjl--><!--No "text"?-->
++    </lang>
++    <autodetect>
++<!--
++        <parallel>
++            <ieee1284>MFG:Xerox;CMD:SPLC;MDL:Phaser 6110;CLS:PRINTER;STATUS:BUSY;</ieee1284>
++            <manufacturer>Xerox</manufacturer>
++            <model>Phaser 6110</model>
++            <commandset>SPLC</commandset>
++        </parallel>
++-->
++	<snmp>
++	    <description>Fuji Xerox DocuPrint CP105</description>
++	</snmp>
++    </autodetect>
++    <functionality>C</functionality>
++    <driver>foo2hbpl1</driver>
++    <!--not "unverified"--><!--no "contrib_url"-->
++    <comments> <en>
++
++	The Fuji-Xerox DocuPrint CP105 is color printer with a 2014 street
++	price of $200.
++
++	These printers are supported by the foo2hbpl1 open software printer
++	driver.
++
++    </en> </comments>
++</printer>
diff --git a/nixpkgs/pkgs/misc/drivers/foo2zjs/no-hardcode-fw.diff b/nixpkgs/pkgs/misc/drivers/foo2zjs/no-hardcode-fw.diff
new file mode 100644
index 000000000000..003272858a42
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/foo2zjs/no-hardcode-fw.diff
@@ -0,0 +1,98 @@
+#
+#
+# patch "hplj1000"
+#  from [d5336e74866d31735d97874191351a0dcc092b44]
+#    to [55102b37684ee5181674d19d866caec2cf603412]
+#
+============================================================
+--- a/hplj1000	d5336e74866d31735d97874191351a0dcc092b44
++++ b/hplj1000	55102b37684ee5181674d19d866caec2cf603412
+@@ -39,11 +39,6 @@ DEV=""
+ DEV=""
+ 
+ #
+-# Directory to find downloadable HP firmware files sihpMMMM.dl
+-#
+-FWDIR=/usr/share/foo2zjs/firmware
+-
+-#
+ # Program used to determine USB printer id information
+ #
+ # NOTE: /usr/bin is NOT mounted at this point
+@@ -83,57 +78,61 @@ case "$0" in
+     MODEL=P1005; FWMODEL=$MODEL
+     USB1=0x03f0	#Vendor
+     USB2=0x3d17	#Model
+-    FWDIR=/usr/share/foo2xqx/firmware
++    DRIVER=foo2xqx
+     ;;
+ *P1006)
+     MODEL=P1006; FWMODEL=$MODEL
+     USB1=0x03f0	#Vendor
+     USB2=0x3e17	#Model
+-    FWDIR=/usr/share/foo2xqx/firmware
++    DRIVER=foo2xqx
+     ;;
+ *P1007)
+     MODEL=P1007; FWMODEL=P1005		# Alias
+     USB1=0x03f0	#Vendor
+     USB2=0x4817	#Model
+-    FWDIR=/usr/share/foo2xqx/firmware
++    DRIVER=foo2xqx
+     ;;
+ *P1008)
+     MODEL=P1008; FWMODEL=P1006		# Alias
+     USB1=0x03f0	#Vendor
+     USB2=0x4917	#Model
+-    FWDIR=/usr/share/foo2xqx/firmware
++    DRIVER=foo2xqx
+     ;;
+ *P1505)
+     MODEL=P1505; FWMODEL=$MODEL
+     USB1=0x03f0	#Vendor
+     USB2=0x3f17	#Model
+-    FWDIR=/usr/share/foo2xqx/firmware
++    DRIVER=foo2xqx
+     ;;
+ *P1505n)
+     MODEL=P1505n; FWMODEL=$MODEL
+     USB1=0x03f0	#Vendor
+     USB2=0x4017	#Model
+-    FWDIR=/usr/share/foo2xqx/firmware
++    DRIVER=foo2xqx
+     ;;
+ *1000)
+     MODEL=1000; FWMODEL=$MODEL
+     USB1=0x03f0	#Vendor
+     USB2=0x0517	#Model
++    DRIVER=foo2zjs
+     ;;
+ *1005)
+     MODEL=1005; FWMODEL=$MODEL
+     USB1=0x03f0	#Vendor
+     USB2=0x1317	#Model
++    DRIVER=foo2zjs
+     ;;
+ *1018)
+     MODEL=1018; FWMODEL=$MODEL
+     USB1=0x03f0 #Vendor
+     USB2=0x4117 #Model
++    DRIVER=foo2zjs
+     ;;
+ *1020)
+     MODEL=1020; FWMODEL=$MODEL
+     USB1=0x03f0 #Vendor
+     USB2=0x2b17 #Model
++    DRIVER=foo2zjs
+     ;;
+ *)
+     log "Only HP LaserJet 100[05],1018,1020,P100[5678],P1505 are supported"
+@@ -203,7 +202,7 @@ load1() {
+ #
+ load1() {
+     _dev="$1"
+-    fw="$FWDIR/sihp$FWMODEL.dl"
++    fw="${FOO2ZJS_DATADIR:-/usr/share}/$DRIVER/firmware/sihp$FWMODEL.dl"
+     if [ ! -f "$fw" ]; then
+ 	log "Missing HP LaserJet $MODEL firmware file $fw"
+ 	log "...read foo2zjs installation instructions and run ./getweb $MODEL"
diff --git a/nixpkgs/pkgs/misc/drivers/foo2zjs/papercode-format-fix.patch b/nixpkgs/pkgs/misc/drivers/foo2zjs/papercode-format-fix.patch
new file mode 100644
index 000000000000..fb38fc206c98
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/foo2zjs/papercode-format-fix.patch
@@ -0,0 +1,101 @@
+From 29ac95ac76a9d9977561cef352f8b803579fea2a Mon Sep 17 00:00:00 2001
+From: Shinbar <richard.shine@gmail.com>
+Date: Thu, 26 Mar 2020 19:33:39 +0000
+Subject: [PATCH 1/3] PPDs (e.g. Del-1660.ppd) are specifying paper sizes as
+ parameters e.g. -p1 which are then being picked up as an invalid paper size
+ In cups error_log manifesting as: foo2hbpl1-wrapper: Unimplemented paper code
+ 1
+
+Have amended foo2hbpl1-wrapper.in to intepret paper sizes
+paper parameters are also now being interpreted.
+This has fixed for a Dell 1660w printer, running on Ubuntu 18.04
+---
+ foo2hbpl1-wrapper.in | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+diff --git a/foo2hbpl1-wrapper.in b/foo2hbpl1-wrapper.in
+index 567e891..bb20ed5 100644
+--- a/foo2hbpl1-wrapper.in
++++ b/foo2hbpl1-wrapper.in
+@@ -341,20 +341,20 @@ Custom*)
+ # /usr/share/ghostscript/9.10/Resource/Init/gs_statd.ps
+ # foo2hbpl1 will provide the appropriate numeric value
+ 
+-letter)		DIM=5100x6600  ;;
+-legal)		DIM=5100x8400  ;;
+-a4)		DIM=4961x7016  ;;
+-executive)	DIM=4350x6300  ;;
+-env10)		DIM=2475x5700  ;;
+-monarch)	DIM=2325x4500  ;;
+-c5)		DIM=3827x5409  ;;
+-envDL)		DIM=2599x5197  ;;
+-isob5|b5)	DIM=4158x5906  ;;
+-jisb5)		DIM=4299x6071  ;;
+-a5)		DIM=3496x4961  ;;
+-folio)		DIM=5100x7800  ;;
+-pa4)		DIM=4961x6600  ;;
+-archA)		DIM=5400x7200  ;;
++4|letter|Letter)	DIM=5100x6600  ;;
++7|legal|Legal)		DIM=5100x8400  ;;
++1|a4|A4)		DIM=4961x7016  ;;
++5|executive|Executive)	DIM=4350x6300  ;;
++9|env10|Env10)		DIM=2475x5700  ;;
++10|monarch|EnvMonarch)	DIM=2325x4500  ;;
++11|c5|EnvC5)		DIM=3827x5409  ;;
++12|envDL|EnvDL)		DIM=2599x5197  ;;
++isob5|b5)		DIM=4158x5906  ;;
++2|jisb5|B5jis)		DIM=4299x6071  ;;
++a5)			DIM=3496x4961  ;;
++6|folio|Folio)		DIM=5100x7800  ;;
++pa4)			DIM=4961x6600  ;;
++archA)			DIM=5400x7200  ;;
+ *)		error "Unimplemented paper code $PAPER";;
+ esac
+ 
+
+From 289d55ded5af7d84a91b0ecf26bbea18f3cb2d9e Mon Sep 17 00:00:00 2001
+From: Shinbar <richard.shine@gmail.com>
+Date: Fri, 27 Mar 2020 09:19:40 +0000
+Subject: [PATCH 2/3] Added A5 paper size parameter
+
+---
+ foo2hbpl1-wrapper.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/foo2hbpl1-wrapper.in b/foo2hbpl1-wrapper.in
+index bb20ed5..474972d 100644
+--- a/foo2hbpl1-wrapper.in
++++ b/foo2hbpl1-wrapper.in
+@@ -351,7 +351,7 @@ Custom*)
+ 12|envDL|EnvDL)		DIM=2599x5197  ;;
+ isob5|b5)		DIM=4158x5906  ;;
+ 2|jisb5|B5jis)		DIM=4299x6071  ;;
+-a5)			DIM=3496x4961  ;;
++3|a5|A5)		DIM=3496x4961  ;;
+ 6|folio|Folio)		DIM=5100x7800  ;;
+ pa4)			DIM=4961x6600  ;;
+ archA)			DIM=5400x7200  ;;
+
+From 393f7a7c70bbf9fa0c39ac1504b220793670d201 Mon Sep 17 00:00:00 2001
+From: Shinbar <richard.shine@gmail.com>
+Date: Sun, 29 Mar 2020 10:01:31 +0100
+Subject: [PATCH 3/3] Makefile now works in FreeBSD
+
+---
+ osx-hotplug/Makefile | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/osx-hotplug/Makefile b/osx-hotplug/Makefile
+index 4165085..a9aa06a 100644
+--- a/osx-hotplug/Makefile
++++ b/osx-hotplug/Makefile
+@@ -64,8 +64,5 @@ clean:
+ 	rm -f *.o *.1
+ 
+ uninstall:
+-	( \
+-		echo "g/osx-hplj-hotplug/d"; \
+-		echo "w"; \
+-	) | ex $(RC)
++	-(echo "g/osx-hplj-hotplug/d"; echo "w") | ex $(RC)
+ 	-rm -f $(BIN)/osx-hplj-hotplug
diff --git a/nixpkgs/pkgs/misc/drivers/foomatic-filters/default.nix b/nixpkgs/pkgs/misc/drivers/foomatic-filters/default.nix
new file mode 100644
index 000000000000..c9a7d10bd8b0
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/foomatic-filters/default.nix
@@ -0,0 +1,47 @@
+{ lib, stdenv, fetchpatch, fetchurl, pkg-config, perl, cups, dbus, enscript }:
+
+stdenv.mkDerivation rec {
+  pname = "foomatic-filters";
+  version = "4.0.17";
+
+  src = fetchurl {
+    url = "https://www.openprinting.org/download/foomatic/foomatic-filters-${version}.tar.gz";
+    sha256 = "1qrkgbm5jay2r7sh9qbyf0aiyrsl1mdc844hxf7fhw95a0zfbqm2";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ perl cups dbus enscript ];
+
+  patches = [
+    (fetchpatch {
+      name = "CVE-2015-8327+CVE-2015-8560.patch";
+      url = "https://salsa.debian.org/debian/foomatic-filters/raw/a3abbef2d2f8c7e62d2fe64f64afe294563fdf8f/debian/patches/0500-r7406_also_consider_the_back_tick_as_an_illegal_shell_escape_character.patch";
+      sha256 = "055nwi3sjf578nk40bqsch3wx8m2h65hdih0wmxflb6l0hwkq4p4";
+    })
+  ];
+
+  preConfigure =
+    ''
+      substituteInPlace foomaticrip.c --replace /bin/bash ${stdenv.shell}
+    '';
+
+  # Workaround build failure on -fno-common toolchains like upstream
+  # gcc-10. Otherwise build fails as:
+  #   ld: foomatic_rip-options.o:/build/foomatic-filters-4.0.17/options.c:49: multiple definition of
+  #     `cupsfilter'; foomatic_rip-foomaticrip.o:/build/foomatic-filters-4.0.17/foomaticrip.c:158: first defined here
+  env.NIX_CFLAGS_COMPILE = "-fcommon";
+
+  installTargets = [ "install-cups" ];
+
+  installFlags = [
+    "CUPS_FILTERS=$(out)/lib/cups/filter"
+    "CUPS_BACKENDS=$(out)/lib/cups/backend"
+  ];
+
+  meta = {
+    description = "Foomatic printing filters";
+    maintainers = [ lib.maintainers.raskin ];
+    platforms = lib.platforms.linux;
+    license = lib.licenses.gpl2Plus;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/gutenprint/bin.nix b/nixpkgs/pkgs/misc/drivers/gutenprint/bin.nix
new file mode 100644
index 000000000000..4b74b191e7f0
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/gutenprint/bin.nix
@@ -0,0 +1,70 @@
+{ lib, stdenv, fetchurl, rpm, cpio, zlib }:
+
+/* usage: (sorry, its still impure but works!)
+
+impure directory:
+mkdir /opt/gutenprint; sudo cp -r $(nix-build -A gutenprintBin -f $NIXPGS_ALL) /opt/gutenprint
+
+add the following lines to bindirCmds property of  printing/cupsd.nix:
+
+  ln -s ${pkgs.gutenprintBin}/lib/cups/backend/* $out/lib/cups/backend/
+  ln -s ${pkgs.gutenprintBin}/lib/cups/filter/* $out/lib/cups/filter/
+  mkdir -p $out/lib/cups/model
+  cat ${pkgs.gutenprintBin}/ppds/Canon/Canon-PIXMA_iP4000-gutenprint.5.0.sim-en.ppd.gz |gunzip > $out/lib/cups/model/Canon-PIXMA_iP4000-gutenprint.5.0.sim-en.ppd
+  sed -i 's@/opt/gutenprint/cups@${pkgs.gutenprintBin}/cups@' $out/lib/cups/model/Canon-PIXMA_iP4000-gutenprint.5.0.sim-en.ppd
+
+Then rebuild your system and add your printer using the the localhost:603 cups web interface
+select the extracted .ppd file which can be found in the model directory of
+sed -n 's/^ServerBin //p' $(sed -n 's/respawn.*-c \(.*''\) -F.*''/\1/p' /etc/event.d/cupsd)
+(sorry, cups still doesn't see it. You could copy it into /nix/store/
+*-cups/lib/cups/model/ and you would be able to select canon -> PIXMA 4000
+then. I've tried that.
+
+TODO tidy this all up. Find source instead of binary. Fix paths ... Find out how to check ink levels etc
+
+*/
+
+stdenv.mkDerivation {
+  pname = "cups-gutenprint-binary";
+  version = "5.0.1";
+
+  src = if stdenv.hostPlatform.system == "x86_64-linux" then fetchurl {
+    url = "https://www.openprinting.org/download/printdriver/debian/dists/lsb3.1/main/binary-amd64/gutenprint_5.0.1-1lsb3.1_amd64.deb";
+    sha256 = "0an5gba6r6v54r53s2gj2fjk8fzpl4lrksjas2333528b0k8gbbc";
+  } else throw "TODO"; # get from openprint.com -> drivers -> gutenprint
+
+  buildInputs = [ rpm cpio ];
+
+  dontUnpack = true;
+  dontInstall = true;
+  dontFixup = true;
+
+  libPath = lib.makeLibraryPath [ stdenv.cc.cc zlib ];
+
+  buildPhase = ''
+    ar -x $src data.tar.gz
+    tar xfz data.tar.gz
+    cp -r opt/gutenprint $out
+
+    for p in \
+        $out/cups/lib/driver/gutenprint.5.0 \
+        $out/bin/{escputil,cups-calibrate} \
+        $out/cups/lib/driver/gutenprint.5.0 \
+        $out/cups/lib/filter/{rastertogutenprint.5.0,commandtocanon,commandtoepson} \
+        $out/cups/lib/backend/{canon,epson} \
+        $out/sbin/cups-genppd.5.0 \
+      ; do
+      patchelf --interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \
+          --set-rpath $libPath $p
+    done
+
+    mkdir $out/lib
+    ln -s $out/cups/lib $out/lib/cups
+  '';
+
+  meta = {
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    description = "Some additional CUPS drivers including Canon drivers";
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/gutenprint/default.nix b/nixpkgs/pkgs/misc/drivers/gutenprint/default.nix
new file mode 100644
index 000000000000..8004af7686e1
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/gutenprint/default.nix
@@ -0,0 +1,55 @@
+# this package was called gimp-print in the past
+{ stdenv, lib, fetchurl, makeWrapper, pkg-config
+, ijs, zlib
+, gimp2Support ? false, gimp
+, cupsSupport ? true, cups, libusb1, perl
+}:
+
+stdenv.mkDerivation rec {
+  pname = "gutenprint";
+  version = "5.3.4";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/gimp-print/gutenprint-${version}.tar.bz2";
+    sha256 = "0s0b14hjwvbxksq7af5v8z9g2rfqv9jdmxd9d81m57f5mh6rad0p";
+  };
+
+  strictDeps = true;
+  nativeBuildInputs = [ makeWrapper pkg-config ]
+    ++ lib.optionals cupsSupport [ cups perl ]; # for cups-config
+  buildInputs =
+    [ ijs zlib ]
+    ++ lib.optionals gimp2Support [ gimp.gtk gimp ]
+    ++ lib.optionals cupsSupport [ cups libusb1 perl ];
+
+  configureFlags = lib.optionals cupsSupport [
+    "--disable-static-genppd" # should be harmless on NixOS
+  ];
+
+  # FIXME: hacky because we modify generated configure, but I haven't found a better way.
+  # makeFlags doesn't change this everywhere (e.g. in cups-genppdupdate).
+  preConfigure = lib.optionalString cupsSupport ''
+    sed -i \
+      -e "s,cups_conf_datadir=.*,cups_conf_datadir=\"$out/share/cups\",g" \
+      -e "s,cups_conf_serverbin=.*,cups_conf_serverbin=\"$out/lib/cups\",g" \
+      -e "s,cups_conf_serverroot=.*,cups_conf_serverroot=\"$out/etc/cups\",g" \
+      configure
+  '' + lib.optionalString gimp2Support ''
+    sed -i \
+      -e "s,gimp2_plug_indir=.*,gimp2_plug_indir=\"$out/lib/gimp/${gimp.majorVersion}\",g" \
+      configure
+  '';
+
+  enableParallelBuilding = true;
+
+  # Testing is very, very long.
+  # doCheck = true;
+
+  meta = with lib; {
+    description = "Ghostscript and cups printer drivers";
+    homepage = "https://sourceforge.net/projects/gimp-print/";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    isGutenprint = true;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/hplip/default.nix b/nixpkgs/pkgs/misc/drivers/hplip/default.nix
new file mode 100644
index 000000000000..66b26753095e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/hplip/default.nix
@@ -0,0 +1,288 @@
+{ lib, stdenv, fetchurl, substituteAll
+, pkg-config, autoreconfHook
+, cups, zlib, libjpeg, libusb1, python3Packages, sane-backends
+, dbus, file, ghostscript, usbutils
+, net-snmp, openssl, perl, nettools, avahi
+, bash, util-linux
+# To remove references to gcc-unwrapped
+, removeReferencesTo, qt5
+, withQt5 ? true
+, withPlugin ? false
+, withStaticPPDInstall ? false
+}:
+
+let
+
+  pname = "hplip";
+  version = "3.23.3";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/hplip/${pname}-${version}.tar.gz";
+    sha256 = "sha256-5CYKmKKx2I0h6CVi3kGaohyVvJ4qzjWDNGqA/SF+B7Y=";
+  };
+
+  plugin = fetchurl {
+    url = "https://developers.hp.com/sites/default/files/${pname}-${version}-plugin.run";
+    sha256 = "sha256-AyZBiF1B42dGnJeoJLFSCGNK83c86ZAM2uFciuv2H4A=";
+  };
+
+  hplipState = substituteAll {
+    inherit version;
+    src = ./hplip.state;
+  };
+
+  hplipPlatforms = {
+    i686-linux   = "x86_32";
+    x86_64-linux = "x86_64";
+    armv6l-linux = "arm32";
+    armv7l-linux = "arm32";
+    aarch64-linux = "arm64";
+  };
+
+  hplipArch = hplipPlatforms.${stdenv.hostPlatform.system}
+    or (throw "HPLIP not supported on ${stdenv.hostPlatform.system}");
+
+  pluginArches = [ "x86_32" "x86_64" "arm32" "arm64" ];
+
+in
+
+assert withPlugin -> builtins.elem hplipArch pluginArches
+  || throw "HPLIP plugin not supported on ${stdenv.hostPlatform.system}";
+
+python3Packages.buildPythonApplication {
+  inherit pname version src;
+  format = "other";
+
+  buildInputs = [
+    libjpeg
+    cups
+    libusb1
+    sane-backends
+    dbus
+    file
+    ghostscript
+    net-snmp
+    openssl
+    perl
+    zlib
+    avahi
+  ];
+
+  nativeBuildInputs = [
+    pkg-config
+    removeReferencesTo
+    autoreconfHook
+  ] ++ lib.optional withQt5 qt5.wrapQtAppsHook;
+
+  pythonPath = with python3Packages; [
+    dbus
+    pillow
+    pygobject3
+    reportlab
+    usbutils
+    sip_4
+    dbus-python
+    distro
+  ] ++ lib.optionals withQt5 [
+    pyqt5
+    pyqt5_sip
+    enum-compat
+  ];
+
+  makeWrapperArgs = [ "--prefix" "PATH" ":" "${nettools}/bin" ];
+
+  patches = [
+    # HPLIP's getSystemPPDs() function relies on searching for PPDs below common FHS
+    # paths, and hp-setup crashes if none of these paths actually exist (which they
+    # don't on NixOS).  Add the equivalent NixOS path, /var/lib/cups/path/share.
+    # See: https://github.com/NixOS/nixpkgs/issues/21796
+    ./hplip-3.20.11-nixos-cups-ppd-search-path.patch
+
+    # Remove all ImageProcessor functionality since that is closed source
+    (fetchurl {
+      url = "https://web.archive.org/web/20230226174550/https://sources.debian.org/data/main/h/hplip/3.22.10+dfsg0-1/debian/patches/0028-Remove-ImageProcessor-binary-installs.patch";
+      sha256 = "sha256:18njrq5wrf3fi4lnpd1jqmaqr7ph5d7jxm7f15b1wwrbxir1rmml";
+    })
+
+    # Revert changes that break compilation under -Werror=format-security
+    ./revert-snprintf-change.patch
+  ];
+
+  postPatch = ''
+    # https://github.com/NixOS/nixpkgs/issues/44230
+    substituteInPlace createPPD.sh \
+      --replace ppdc "${cups}/bin/ppdc" \
+      --replace "gzip -c" "gzip -cn"
+
+    # HPLIP hardcodes absolute paths everywhere. Nuke from orbit.
+    find . -type f -exec sed -i \
+      -e s,/etc/hp,$out/etc/hp,g \
+      -e s,/etc/sane.d,$out/etc/sane.d,g \
+      -e s,/usr/include/libusb-1.0,${libusb1.dev}/include/libusb-1.0,g \
+      -e s,/usr/share/hal/fdi/preprobe/10osvendor,$out/share/hal/fdi/preprobe/10osvendor,g \
+      -e s,/usr/lib/systemd/system,$out/lib/systemd/system,g \
+      -e s,/var/lib/hp,$out/var/lib/hp,g \
+      -e s,/usr/bin/perl,${perl}/bin/perl,g \
+      -e s,/usr/bin/file,${file}/bin/file,g \
+      -e s,/usr/bin/gs,${ghostscript}/bin/gs,g \
+      -e s,/usr/share/cups/fonts,${ghostscript}/share/ghostscript/fonts,g \
+      -e "s,ExecStart=/usr/bin/python /usr/bin/hp-config_usb_printer,ExecStart=$out/bin/hp-config_usb_printer,g" \
+      -e s,Exec=/usr/bin/hp-uiscan,Exec=hp-uiscan,g \
+      -e s,Icon=/usr/share/icons/Humanity/devices/48/printer.svg,Icon=printer,g \
+      -e s,Icon=@abs_datadir@/hplip/data/images/128x128/hp_logo.png,Icon=hp_logo,g \
+      {} +
+
+    echo 'AUTOMAKE_OPTIONS = foreign' >> Makefile.am
+  '';
+
+  configureFlags = let out = placeholder "out"; in
+    [
+      "--with-hpppddir=${out}/share/cups/model/HP"
+      "--with-cupsfilterdir=${out}/lib/cups/filter"
+      "--with-cupsbackenddir=${out}/lib/cups/backend"
+      "--with-icondir=${out}/share/applications"
+      "--with-systraydir=${out}/xdg/autostart"
+      "--with-mimedir=${out}/etc/cups"
+      "--enable-policykit"
+      "--disable-qt4"
+
+      # remove ImageProcessor usage, it causes segfaults, see
+      # https://bugs.launchpad.net/hplip/+bug/1788706
+      # https://bugs.launchpad.net/hplip/+bug/1787289
+      "--disable-imageProcessor-build"
+    ]
+    ++ lib.optional withStaticPPDInstall "--enable-cups-ppd-install"
+    ++ lib.optional withQt5 "--enable-qt5"
+  ;
+
+  # Prevent 'ppdc: Unable to find include file "<font.defs>"' which prevent
+  # generation of '*.ppd' files.
+  # This seems to be a 'ppdc' issue when the tool is run in a hermetic sandbox.
+  # Could not find how to fix the problem in 'ppdc' so this is a workaround.
+  CUPS_DATADIR = "${cups}/share/cups";
+
+  makeFlags = let out = placeholder "out"; in [
+    "halpredir=${out}/share/hal/fdi/preprobe/10osvendor"
+    "rulesdir=${out}/etc/udev/rules.d"
+    "policykit_dir=${out}/share/polkit-1/actions"
+    "policykit_dbus_etcdir=${out}/etc/dbus-1/system.d"
+    "policykit_dbus_sharedir=${out}/share/dbus-1/system-services"
+    "hplip_confdir=${out}/etc/hp"
+    "hplip_statedir=${out}/var/lib/hp"
+  ];
+
+  postConfigure = ''
+    # don't save timestamp, in order to improve reproducibility
+    substituteInPlace Makefile \
+      --replace "GZIP_ENV = --best" "GZIP_ENV = --best -n"
+  '';
+
+  enableParallelBuilding = true;
+  enableParallelInstalling = false;
+
+  #
+  # Running `hp-diagnose_plugin -g` can be used to diagnose
+  # issues with plugins.
+  #
+  postInstall = ''
+    for resolution in 16x16 32x32 64x64 128x128 256x256; do
+      mkdir -p $out/share/icons/hicolor/$resolution/apps
+      ln -s $out/share/hplip/data/images/$resolution/hp_logo.png \
+        $out/share/icons/hicolor/$resolution/apps/hp_logo.png
+    done
+  '' + lib.optionalString withPlugin ''
+    sh ${plugin} --noexec --keep
+    cd plugin_tmp
+
+    cp plugin.spec $out/share/hplip/
+
+    mkdir -p $out/share/hplip/data/firmware
+    cp *.fw.gz $out/share/hplip/data/firmware
+
+    mkdir -p $out/share/hplip/data/plugins
+    cp license.txt $out/share/hplip/data/plugins
+
+    mkdir -p $out/share/hplip/prnt/plugins
+    for plugin in lj hbpl1; do
+      cp $plugin-${hplipArch}.so $out/share/hplip/prnt/plugins
+      chmod 0755 $out/share/hplip/prnt/plugins/$plugin-${hplipArch}.so
+      ln -s $out/share/hplip/prnt/plugins/$plugin-${hplipArch}.so \
+        $out/share/hplip/prnt/plugins/$plugin.so
+    done
+
+    mkdir -p $out/share/hplip/scan/plugins
+    for plugin in bb_soap bb_marvell bb_soapht bb_escl; do
+      cp $plugin-${hplipArch}.so $out/share/hplip/scan/plugins
+      chmod 0755 $out/share/hplip/scan/plugins/$plugin-${hplipArch}.so
+      ln -s $out/share/hplip/scan/plugins/$plugin-${hplipArch}.so \
+        $out/share/hplip/scan/plugins/$plugin.so
+    done
+
+    mkdir -p $out/share/hplip/fax/plugins
+    for plugin in fax_marvell; do
+      cp $plugin-${hplipArch}.so $out/share/hplip/fax/plugins
+      chmod 0755 $out/share/hplip/fax/plugins/$plugin-${hplipArch}.so
+      ln -s $out/share/hplip/fax/plugins/$plugin-${hplipArch}.so \
+        $out/share/hplip/fax/plugins/$plugin.so
+    done
+
+    mkdir -p $out/var/lib/hp
+    cp ${hplipState} $out/var/lib/hp/hplip.state
+  '';
+
+  # The installed executables are just symlinks into $out/share/hplip,
+  # but wrapPythonPrograms ignores symlinks. We cannot replace the Python
+  # modules in $out/share/hplip with wrapper scripts because they import
+  # each other as libraries. Instead, we emulate wrapPythonPrograms by
+  # 1. Calling patchPythonProgram on the original script in $out/share/hplip
+  # 2. Making our own wrapper pointing directly to the original script.
+  dontWrapPythonPrograms = true;
+  preFixup = ''
+    buildPythonPath "$out $pythonPath"
+
+    for bin in $out/bin/*; do
+      py=$(readlink -m $bin)
+      rm $bin
+      echo "patching \`$py'..."
+      patchPythonScript "$py"
+      echo "wrapping \`$bin'..."
+      makeWrapper "$py" "$bin" \
+          --prefix PATH ':' "$program_PATH" \
+          --set PYTHONNOUSERSITE "true" \
+          $makeWrapperArgs
+    done
+  '';
+
+  postFixup = ''
+    substituteInPlace $out/etc/hp/hplip.conf --replace /usr $out
+    # Patch udev rules:
+    # with plugin, they upload firmware to printers,
+    # without plugin, they complain about the missing plugin.
+    substituteInPlace $out/etc/udev/rules.d/56-hpmud.rules \
+      --replace {,${bash}}/bin/sh \
+      --replace /usr/bin/nohup "" \
+      --replace {,${util-linux}/bin/}logger \
+      --replace {/usr,$out}/bin
+    remove-references-to -t ${stdenv.cc.cc} $(readlink -f $out/lib/*.so)
+  '' + lib.optionalString withQt5 ''
+    for f in $out/bin/hp-*;do
+      wrapQtApp $f
+    done
+  '';
+
+  # There are some binaries there, which reference gcc-unwrapped otherwise.
+  stripDebugList = [
+    "share/hplip" "lib/cups/backend" "lib/cups/filter" python3Packages.python.sitePackages "lib/sane"
+  ];
+
+  meta = with lib; {
+    description = "Print, scan and fax HP drivers for Linux";
+    homepage = "https://developers.hp.com/hp-linux-imaging-and-printing";
+    downloadPage = "https://sourceforge.net/projects/hplip/files/hplip/";
+    license = if withPlugin
+      then licenses.unfree
+      else with licenses; [ mit bsd2 gpl2Plus ];
+    platforms = [ "i686-linux" "x86_64-linux" "armv6l-linux" "armv7l-linux" "aarch64-linux" ];
+    maintainers = with maintainers; [ ttuegel ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/hplip/hplip-3.20.11-nixos-cups-ppd-search-path.patch b/nixpkgs/pkgs/misc/drivers/hplip/hplip-3.20.11-nixos-cups-ppd-search-path.patch
new file mode 100644
index 000000000000..d26e13dd2d63
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/hplip/hplip-3.20.11-nixos-cups-ppd-search-path.patch
@@ -0,0 +1,24 @@
+From: Bryan Gardiner <bog@khumba.net>
+Date: Sat, 9 Jan 2021 16:51:20 -0800
+Subject: [PATCH] Add NixOS CUPS PPD search path.
+
+---
+ base/g.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/base/g.py b/base/g.py
+index f73e23f..758f339 100644
+--- a/base/g.py
++++ b/base/g.py
+@@ -283,7 +283,7 @@ prop.max_message_len = 8192
+ prop.max_message_read = 65536
+ prop.read_timeout = 90
+ 
+-prop.ppd_search_path = '/usr/share;/usr/local/share;/usr/lib;/usr/local/lib;/usr/libexec;/opt;/usr/lib64'
++prop.ppd_search_path = '/var/lib/cups/path/share;/usr/share;/usr/local/share;/usr/lib;/usr/local/lib;/usr/libexec;/opt;/usr/lib64'
+ prop.ppd_search_pattern = 'HP-*.ppd.*'
+ prop.ppd_download_url = 'http://www.linuxprinting.org/ppd-o-matic.cgi'
+ prop.ppd_file_suffix = '-hpijs.ppd'
+-- 
+2.29.2
+
diff --git a/nixpkgs/pkgs/misc/drivers/hplip/hplip.state b/nixpkgs/pkgs/misc/drivers/hplip/hplip.state
new file mode 100644
index 000000000000..9d19a93f3644
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/hplip/hplip.state
@@ -0,0 +1,4 @@
+[plugin]
+installed=1
+eula=1
+version=@version@
diff --git a/nixpkgs/pkgs/misc/drivers/hplip/revert-snprintf-change.patch b/nixpkgs/pkgs/misc/drivers/hplip/revert-snprintf-change.patch
new file mode 100644
index 000000000000..2caa98dc2cff
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/hplip/revert-snprintf-change.patch
@@ -0,0 +1,61 @@
+commit f103a260215016fc035bc1399c8accabf83b0264
+Author: Claudio Bley <claudio.bley@gmail.com>
+Date:   Fri Jul 1 22:29:05 2022 +0200
+
+    Revert change to hp_ipp.c from 3.22.{4 -> 6}
+    
+    This fails compilation:
+    ```
+    protocol/hp_ipp.c: In function ‘addCupsPrinter’:
+    protocol/hp_ipp.c:113:9: error: format not a string literal and no format arguments [-Werror=format-security]
+      113 |         snprintf( info,sizeof(info), name );
+          |         ^~~~~~~~
+    ```
+
+diff --git a/protocol/hp_ipp.c b/protocol/hp_ipp.c
+index 97d827d..af7013b 100644
+--- a/protocol/hp_ipp.c
++++ b/protocol/hp_ipp.c
+@@ -110,7 +110,7 @@ int addCupsPrinter(char *name, char *device_uri, char *location, char *ppd_file,
+      }
+ 
+      if ( info == NULL )
+-        snprintf( info,sizeof(info), name );
++        strcpy( info, name );
+ 
+      sprintf( printer_uri, "ipp://localhost/printers/%s", name );
+ 
+@@ -511,27 +511,27 @@ int __parsePrinterAttributes(ipp_t *response, printer_t **printer_list)
+ 
+              if ( strcmp(attr_name, "printer-name") == 0 &&
+                                         val_tag == IPP_TAG_NAME ) {
+-                  snprintf(t_printer->name, sizeof(t_printer->name),ippGetString(attr, 0, NULL) );
++                  strcpy(t_printer->name, ippGetString(attr, 0, NULL) );
+              }
+              else if ( strcmp(attr_name, "device-uri") == 0 &&
+                                          val_tag == IPP_TAG_URI ) {
+-                  snprintf(t_printer->device_uri,sizeof(t_printer->device_uri), ippGetString(attr, 0, NULL) );
++                  strcpy(t_printer->device_uri, ippGetString(attr, 0, NULL) );
+              }
+              else if ( strcmp(attr_name, "printer-uri-supported") == 0 &&
+                                                  val_tag == IPP_TAG_URI ) {
+-                  snprintf(t_printer->printer_uri,sizeof(t_printer->printer_uri), ippGetString(attr, 0, NULL) );
++                  strcpy(t_printer->printer_uri, ippGetString(attr, 0, NULL) );
+              }
+              else if ( strcmp(attr_name, "printer-info") == 0 &&
+                                         val_tag == IPP_TAG_TEXT ) {
+-                  snprintf(t_printer->info,sizeof(t_printer->info), ippGetString(attr, 0, NULL) );
++                  strcpy(t_printer->info, ippGetString(attr, 0, NULL) );
+              }
+              else if ( strcmp(attr_name, "printer-location") == 0 &&
+                                            val_tag == IPP_TAG_TEXT ) {
+-                  snprintf(t_printer->location,sizeof(t_printer->location),ippGetString(attr, 0, NULL) );
++                  strcpy(t_printer->location, ippGetString(attr, 0, NULL) );
+              }
+              else if ( strcmp(attr_name, "printer-make-and-model") == 0 &&
+                                                   val_tag == IPP_TAG_TEXT ) {
+-                  snprintf(t_printer->make_model,sizeof(t_printer->make_model),ippGetString(attr, 0, NULL) );
++                  strcpy(t_printer->make_model, ippGetString(attr, 0, NULL) );
+              } 
+              else if ( strcmp(attr_name, "printer-state") == 0 &&
+                                              val_tag == IPP_TAG_ENUM ) {
diff --git a/nixpkgs/pkgs/misc/drivers/infnoise/default.nix b/nixpkgs/pkgs/misc/drivers/infnoise/default.nix
new file mode 100644
index 000000000000..47ff00459923
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/infnoise/default.nix
@@ -0,0 +1,60 @@
+{ lib, stdenv, fetchFromGitHub, fetchpatch, libftdi
+, infnoise, testers }:
+
+stdenv.mkDerivation rec {
+  pname = "infnoise";
+  version = "0.3.2";
+
+  src = fetchFromGitHub {
+    owner = "leetronics";
+    repo = "infnoise";
+    rev = "e80ddd78085abf3d06df2e0d8c08fd33dade78eb";
+    sha256 = "sha256-9MKG1InkV+yrQPBTgi2gZJ3y9Fokb6WbxuAnM7n7FyA=";
+  };
+
+  patches = [
+    # Patch makefile so we can set defines from the command line instead of it depending on .git
+    ./makefile.patch
+
+    # Fix getc return type
+    (fetchpatch {
+      url = "https://github.com/leetronics/infnoise/commit/7ed7014e14253311c07e530c8f89f1c8f4705c2b.patch";
+      sha256 = "sha256-seB/fJaxQ/rXJp5iPtnobXXOccQ2KUAk6HFx31dhOhs=";
+    })
+  ];
+
+  GIT_COMMIT = src.rev;
+  GIT_VERSION = version;
+  GIT_DATE = "2019-08-12";
+
+  buildInputs = [ libftdi ];
+
+  makefile = "Makefile.linux";
+  makeFlags = [ "PREFIX=$(out)" ];
+  postPatch = ''
+    cd software
+    substituteInPlace init_scripts/infnoise.service --replace "/usr/local" "$out"
+  '';
+
+  postInstall = ''
+    make -C tools
+    find ./tools/ -executable -type f -exec \
+      sh -c "install -Dm755 {} $out/bin/infnoise-\$(basename {})" \;
+  '';
+
+  passthru = {
+    tests.version = testers.testVersion { package = infnoise; };
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/leetronics/infnoise";
+    description = "Driver for the Infinite Noise TRNG";
+    longDescription = ''
+      The Infinite Noise TRNG is a USB key hardware true random number generator.
+      It can either provide rng for userland applications, or provide rng for the OS entropy.
+    '';
+    license = licenses.cc0;
+    maintainers = with maintainers; [ StijnDW zhaofengli ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/infnoise/makefile.patch b/nixpkgs/pkgs/misc/drivers/infnoise/makefile.patch
new file mode 100644
index 000000000000..871a6c508ce6
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/infnoise/makefile.patch
@@ -0,0 +1,14 @@
+diff --git a/software/Makefile.linux b/software/Makefile.linux
+index db48aa5..df8b3d2 100644
+--- a/software/Makefile.linux
++++ b/software/Makefile.linux
+@@ -1,6 +1,6 @@
+-GIT_VERSION := $(shell git --no-pager describe --tags --always)
+-GIT_COMMIT  := $(shell git rev-parse --verify HEAD)
+-GIT_DATE    := $(firstword $(shell git --no-pager show --date=iso-strict --format="%ad" --name-only))
++GIT_VERSION ?= $(shell git --no-pager describe --tags --always)
++GIT_COMMIT  ?= $(shell git rev-parse --verify HEAD)
++GIT_DATE    ?= $(firstword $(shell git --no-pager show --date=iso-strict --format="%ad" --name-only))
+ 
+ PREFIX = $(DESTDIR)/usr/local
+ 
diff --git a/nixpkgs/pkgs/misc/drivers/logiops/default.nix b/nixpkgs/pkgs/misc/drivers/logiops/default.nix
new file mode 100644
index 000000000000..71283a406214
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/logiops/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, cmake, udev, libevdev, libconfig }:
+
+stdenv.mkDerivation rec {
+  pname = "logiops";
+  version = "0.2.3";
+
+  src = fetchFromGitHub {
+    owner = "pixlone";
+    repo = "logiops";
+    rev = "v${version}";
+    sha256 = "sha256-1v728hbIM2ODtB+r6SYzItczRJCsbuTvhYD2OUM1+/E=";
+  };
+
+  PKG_CONFIG_SYSTEMD_SYSTEMDSYSTEMUNITDIR = "${placeholder "out"}/lib/systemd/system";
+
+  nativeBuildInputs = [ cmake pkg-config ];
+  buildInputs = [ udev libevdev libconfig ];
+
+  meta = with lib; {
+    description = "Unofficial userspace driver for HID++ Logitech devices";
+    homepage = "https://github.com/PixlOne/logiops";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ ckie ];
+    platforms = with platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/m33-linux/default.nix b/nixpkgs/pkgs/misc/drivers/m33-linux/default.nix
new file mode 100644
index 000000000000..84272898f52c
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/m33-linux/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "M33-Linux";
+  version = "unstable-2016-06-23";
+
+  src = fetchFromGitHub {
+    owner = "donovan6000";
+    repo = "M3D-Linux";
+    rev = "5c1b90c13d260771dac970b49fdc9f840fee5f4a";
+    sha256 = "1bvbclkyfcv23vxb4s1zssvygklks1nhp4iwi4v90c1fvyz0356f";
+  };
+
+  installPhase = ''
+    install -Dm755 m33-linux $out/bin/m33-linux
+    install -Dm755 90-micro-3d-local.rules $out/lib/udev/rules.d/90-micro-3d-local.rules
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/donovan6000/M3D-Linux";
+    description = "A Linux program that can communicate with the Micro 3D printer";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ abbradar ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/moltengamepad/default.nix b/nixpkgs/pkgs/misc/drivers/moltengamepad/default.nix
new file mode 100644
index 000000000000..747866b9cfc9
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/moltengamepad/default.nix
@@ -0,0 +1,39 @@
+{ lib, stdenv, fetchFromGitHub, udev }:
+
+stdenv.mkDerivation {
+  pname = "moltengamepad";
+  version = "unstable-2016-05-04";
+
+  src = fetchFromGitHub {
+    owner = "jgeumlek";
+    repo = "MoltenGamepad";
+    rev = "6656357964c22be97227fc5353b53c6ab1e69929";
+    sha256 = "05cpxfzxgm86kxx0a9f76bshjwpz9w1g8bn30ib1i5a3fv7bmirl";
+  };
+
+  hardeningDisable = [ "format" ];
+
+  buildInputs = [ udev ];
+
+  buildPhase = ''
+    make
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp moltengamepad $out/bin
+  '';
+
+  patchPhase = ''
+    sed -i -e '159d;161d;472d;473d;474d;475d' source/eventlists/key_list.cpp
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/jgeumlek/MoltenGamepad";
+    description = "Flexible Linux input device translator, geared for gamepads";
+    license = licenses.mit;
+    maintainers = [ maintainers.ebzzry ];
+    platforms = platforms.linux;
+  };
+
+}
diff --git a/nixpkgs/pkgs/misc/drivers/pantum-driver/default.nix b/nixpkgs/pkgs/misc/drivers/pantum-driver/default.nix
new file mode 100644
index 000000000000..fdb54c53fdf6
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/pantum-driver/default.nix
@@ -0,0 +1,53 @@
+{ lib
+, stdenv
+, fetchzip
+, libusb1
+, cups
+, dpkg
+, libjpeg8
+, makeWrapper
+, autoPatchelfHook
+, enablePtqpdf ? false # Pantum's version of qpdf
+}:
+
+let
+  architecture = {
+    i686-linux = "i386";
+    x86_64-linux = "amd64";
+  }.${stdenv.hostPlatform.system} or (throw "unsupported system ${stdenv.hostPlatform.system}");
+in
+stdenv.mkDerivation rec {
+  pname = "pantum-driver";
+  version = "1.1.84";
+
+  src = fetchzip {
+    url = "https://drivers.pantum.com/Pantum_Ubuntu_Driver_V${version}_1.zip";
+    sha256 = "sha256-UJzYBsGj/TMhQoMourx7UPGBpN0MPi4pEN8m1sXLw/g=";
+  };
+
+  buildInputs = [ libusb1 libjpeg8 cups ];
+  nativeBuildInputs = [ dpkg autoPatchelfHook ];
+
+  installPhase = ''
+    dpkg-deb -x ./Resources/pantum_${version}-1_${architecture}.deb .
+
+    mkdir -p $out $out/lib
+    cp -r etc $out/
+    cp -r usr/lib/cups $out/lib/
+    cp -r usr/local/lib/* $out/lib/
+    cp -r usr/share $out/
+    cp Resources/locale/en_US.UTF-8/* $out/share/doc/pantum/
+  '' + lib.optionalString enablePtqpdf ''
+    cp -r opt/pantum/* $out/
+    ln -s $out/lib/libqpdf.so* $out/lib/libqpdf.so
+    ln -s $out/lib/libqpdf.so $out/lib/libqpdf.so.21
+  '';
+
+  meta = {
+    description = "Pantum universal driver";
+    homepage = "https://global.pantum.com/";
+    sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+    license = lib.licenses.unfree;
+    platforms = [ "i686-linux" "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/postscript-lexmark/default.nix b/nixpkgs/pkgs/misc/drivers/postscript-lexmark/default.nix
new file mode 100644
index 000000000000..d9544e4b330d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/postscript-lexmark/default.nix
@@ -0,0 +1,36 @@
+{ lib, stdenv, fetchurl, rpmextract }:
+let
+  version = "20160218";
+in
+stdenv.mkDerivation {
+  pname = "postscript-lexmark";
+  inherit version;
+
+  src = fetchurl {
+    url = "https://www.openprinting.org/download/printdriver/components/lsb3.2/main/RPMS/noarch/openprinting-ppds-postscript-lexmark-${version}-1lsb3.2.noarch.rpm";
+    sha256 = "0wbhvypdr96a5ddg6kj41dn9sbl49n7pfi2vs762ij82hm2gvwcm";
+  };
+
+  nativeBuildInputs = [ rpmextract ];
+
+  sourceRoot = ".";
+
+  unpackPhase = ''
+    rpmextract $src
+    for ppd in opt/OpenPrinting-Lexmark/ppds/Lexmark/*; do
+      gzip -d $ppd
+    done
+  '';
+
+  installPhase = ''
+    mkdir -p $out/share/cups/model/postscript-lexmark
+    cp opt/OpenPrinting-Lexmark/ppds/Lexmark/*.ppd $out/share/cups/model/postscript-lexmark/
+    cp -r opt/OpenPrinting-Lexmark/doc $out/doc
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.openprinting.org/driver/Postscript-Lexmark/";
+    description = "Lexmark Postscript Drivers";
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/sc-controller/default.nix b/nixpkgs/pkgs/misc/drivers/sc-controller/default.nix
new file mode 100644
index 000000000000..009e08967453
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/sc-controller/default.nix
@@ -0,0 +1,57 @@
+{ lib, buildPythonApplication, fetchFromGitHub, wrapGAppsHook
+, pytestCheckHook
+, gtk3, gobject-introspection, libappindicator-gtk3, librsvg
+, evdev, pygobject3, pylibacl, bluez, vdf
+, linuxHeaders
+, libX11, libXext, libXfixes, libusb1, udev
+}:
+
+buildPythonApplication rec {
+  pname = "sc-controller";
+  version = "0.4.8.11";
+
+  src = fetchFromGitHub {
+    owner  = "Ryochan7";
+    repo   = pname;
+    rev    = "v${version}";
+    sha256 = "xu9QqddJf0cXkhNPrOnE+L8CV5AfgcCyk9DSh+G94c0=";
+  };
+
+  nativeBuildInputs = [ wrapGAppsHook gobject-introspection ];
+
+  buildInputs = [ gtk3 libappindicator-gtk3 librsvg ];
+
+  propagatedBuildInputs = [ evdev pygobject3 pylibacl vdf ];
+
+  nativeCheckInputs = [ pytestCheckHook ];
+
+  postPatch = ''
+    substituteInPlace scc/paths.py --replace sys.prefix "'$out'"
+    substituteInPlace scc/uinput.py --replace /usr/include ${linuxHeaders}/include
+    substituteInPlace scc/device_monitor.py --replace "find_library('bluetooth')" "'libbluetooth.so.3'"
+  '';
+
+  LD_LIBRARY_PATH = lib.makeLibraryPath [ libX11 libXext libXfixes libusb1 udev bluez ];
+
+  preFixup = ''
+    gappsWrapperArgs+=(--prefix LD_LIBRARY_PATH : "$LD_LIBRARY_PATH")
+  '';
+
+  postFixup = ''
+    (
+      # scc runs these scripts as programs. (See find_binary() in scc/tools.py.)
+      cd $out/lib/python*/site-packages/scc/x11
+      patchPythonScript scc-autoswitch-daemon.py
+      patchPythonScript scc-osd-daemon.py
+    )
+  '';
+
+  meta = with lib; {
+    homepage    = "https://github.com/Ryochan7/sc-controller";
+    # donations: https://www.patreon.com/kozec
+    description = "User-mode driver and GUI for Steam Controller and other controllers";
+    license     = licenses.gpl2;
+    platforms   = platforms.linux;
+    maintainers = with maintainers; [ orivej rnhmjoj ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/spacenavd/configure-cfgfile-path.patch b/nixpkgs/pkgs/misc/drivers/spacenavd/configure-cfgfile-path.patch
new file mode 100644
index 000000000000..268282e96eae
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/spacenavd/configure-cfgfile-path.patch
@@ -0,0 +1,63 @@
+diff --git a/src/spnavd.c b/src/spnavd.c
+index 2d4eca6..a5227ed 100644
+--- a/src/spnavd.c
++++ b/src/spnavd.c
+@@ -27,6 +27,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ #include <sys/select.h>
+ #include <sys/socket.h>
+ #include <sys/un.h>
++#include <sys/types.h>
++#include <pwd.h>
+ #include "spnavd.h"
+ #include "logger.h"
+ #include "dev.h"
+@@ -47,13 +49,39 @@ static void handle_events(fd_set *rset);
+ static void sig_handler(int s);
+ static char *fix_path(char *str);
+ 
+-static char *cfgfile = DEF_CFGFILE;
++static char* config_path;
++char* cfg_path()
++{
++	char* buf;
++	if((buf = getenv("XDG_CONFIG_HOME"))) {
++		if(config_path == NULL) {
++			config_path = malloc(strlen(buf) + strlen("/spnavrc") + 1);
++			if ( config_path != NULL) {
++				sprintf(config_path, "%s/spnavrc", buf);
++			}
++		};
++		return config_path;
++	} else {
++		if (!(buf = getenv("HOME"))) {
++			struct passwd *pw = getpwuid(getuid());
++			buf = pw->pw_dir;
++		}
++		config_path = malloc(strlen(buf) + strlen("/.config/spnavrc") + 1);
++		if ( config_path != NULL) {
++			sprintf(config_path, "%s/.config/spnavrc", buf);
++		}
++		return config_path;
++	}
++}
++
++static char *cfgfile = NULL;
+ static char *logfile = DEF_LOGFILE;
+ static char *pidpath = NULL;
+ 
+ int main(int argc, char **argv)
+ {
+ 	int i, pid, ret, become_daemon = 1;
++	cfgfile = cfg_path();
+ 
+ 	for(i=1; i<argc; i++) {
+ 		if(argv[i][0] == '-') {
+@@ -247,7 +275,7 @@ static void print_usage(const char *argv0)
+ 	printf("usage: %s [options]\n", argv0);
+ 	printf("options:\n");
+ 	printf(" -d: do not daemonize\n");
+-	printf(" -c <file>: config file path (default: " DEF_CFGFILE ")\n");
++	printf(" -c <file>: config file path (default: %s)\n", cfg_path());
+ 	printf(" -l <file>|syslog: log file path or log to syslog (default: " DEF_LOGFILE ")\n");
+ 	printf(" -v: verbose output\n");
+ 	printf(" -V,-version: print version number and exit\n");
diff --git a/nixpkgs/pkgs/misc/drivers/spacenavd/configure-pidfile-path.patch b/nixpkgs/pkgs/misc/drivers/spacenavd/configure-pidfile-path.patch
new file mode 100644
index 000000000000..bc2cad9784cb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/spacenavd/configure-pidfile-path.patch
@@ -0,0 +1,82 @@
+diff --git a/src/spnavd.c b/src/spnavd.c
+index 03080da..2d4eca6 100644
+--- a/src/spnavd.c
++++ b/src/spnavd.c
+@@ -42,12 +42,14 @@ static void cleanup(void);
+ static void daemonize(void);
+ static int write_pid_file(void);
+ static int find_running_daemon(void);
++static char *pidfile_path(void);
+ static void handle_events(fd_set *rset);
+ static void sig_handler(int s);
+ static char *fix_path(char *str);
+ 
+ static char *cfgfile = DEF_CFGFILE;
+ static char *logfile = DEF_LOGFILE;
++static char *pidpath = NULL;
+ 
+ int main(int argc, char **argv)
+ {
+@@ -270,7 +272,7 @@ static void cleanup(void)
+ 		remove_device(tmp);
+ 	}
+ 
+-	remove(PIDFILE);
++	remove(pidfile_path());
+ }
+ 
+ static void daemonize(void)
+@@ -314,7 +316,7 @@ static int write_pid_file(void)
+ 	FILE *fp;
+ 	int pid = getpid();
+ 
+-	if(!(fp = fopen(PIDFILE, "w"))) {
++	if(!(fp = fopen(pidfile_path(), "w"))) {
+ 		return -1;
+ 	}
+ 	fprintf(fp, "%d\n", pid);
+@@ -329,7 +331,7 @@ static int find_running_daemon(void)
+ 	struct sockaddr_un addr;
+ 
+ 	/* try to open the pid-file */
+-	if(!(fp = fopen(PIDFILE, "r"))) {
++	if(!(fp = fopen(pidfile_path(), "r"))) {
+ 		return -1;
+ 	}
+ 	if(fscanf(fp, "%d\n", &pid) != 1) {
+@@ -356,6 +358,22 @@ static int find_running_daemon(void)
+ 	return pid;
+ }
+ 
++char *pidfile_path(void)
++{
++	char *xdg_runtime_dir;
++	if((xdg_runtime_dir = getenv("XDG_RUNTIME_DIR"))) {
++		if ( pidpath == NULL ) {
++			pidpath = malloc(strlen(xdg_runtime_dir) + strlen("/spnavd.pid") + 1);
++			if ( pidpath != NULL ) {
++				sprintf(pidpath, "%s/spnavd.pid", xdg_runtime_dir);
++			}
++		};
++		return pidpath;
++	} else {
++		return DEFAULT_PIDFILE;
++	}
++}
++
+ static void handle_events(fd_set *rset)
+ {
+ 	int dev_fd, hotplug_fd;
+diff --git a/src/spnavd.h b/src/spnavd.h
+index 2d1c48b..17d22d3 100644
+--- a/src/spnavd.h
++++ b/src/spnavd.h
+@@ -26,7 +26,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ #define DEF_CFGFILE		"/etc/spnavrc"
+ #define DEF_LOGFILE		"/var/log/spnavd.log"
+ 
+-#define PIDFILE		"/var/run/spnavd.pid"
++#define DEFAULT_PIDFILE		"/run/spnavd.pid"
+ #define DEFAULT_SOCK_NAME	"/run/spnav.sock"
+ #define SYSLOG_ID	"spnavd"
+ 
diff --git a/nixpkgs/pkgs/misc/drivers/spacenavd/configure-socket-path.patch b/nixpkgs/pkgs/misc/drivers/spacenavd/configure-socket-path.patch
new file mode 100644
index 000000000000..c59987dcc051
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/spacenavd/configure-socket-path.patch
@@ -0,0 +1,118 @@
+diff --git a/src/proto_unix.c b/src/proto_unix.c
+index 998f234..d38452c 100644
+--- a/src/proto_unix.c
++++ b/src/proto_unix.c
+@@ -36,11 +36,14 @@ enum {
+ 
+ static int lsock = -1;
+ 
++static char *spath = NULL;
++
+ int init_unix(void)
+ {
+ 	int s;
+ 	mode_t prev_umask;
+ 	struct sockaddr_un addr;
++	char *sock_path;
+ 
+ 	if(lsock >= 0) return 0;
+ 
+@@ -49,16 +52,18 @@ int init_unix(void)
+ 		return -1;
+ 	}
+ 
+-	unlink(SOCK_NAME);	/* in case it already exists */
++	sock_path = socket_path();
++
++	unlink(sock_path);	/* in case it already exists */
+ 
+ 	memset(&addr, 0, sizeof addr);
+ 	addr.sun_family = AF_UNIX;
+-	strcpy(addr.sun_path, SOCK_NAME);
++	strcpy(addr.sun_path, sock_path);
+ 
+ 	prev_umask = umask(0);
+ 
+ 	if(bind(s, (struct sockaddr*)&addr, sizeof addr) == -1) {
+-		logmsg(LOG_ERR, "failed to bind unix socket: %s: %s\n", SOCK_NAME, strerror(errno));
++		logmsg(LOG_ERR, "failed to bind unix socket: %s: %s\n", sock_path, strerror(errno));
+ 		close(s);
+ 		return -1;
+ 	}
+@@ -68,7 +73,7 @@ int init_unix(void)
+ 	if(listen(s, 8) == -1) {
+ 		logmsg(LOG_ERR, "listen failed: %s\n", strerror(errno));
+ 		close(s);
+-		unlink(SOCK_NAME);
++		unlink(sock_path);
+ 		return -1;
+ 	}
+ 
+@@ -82,7 +87,7 @@ void close_unix(void)
+ 		close(lsock);
+ 		lsock = -1;
+ 
+-		unlink(SOCK_NAME);
++		unlink(socket_path());
+ 	}
+ }
+ 
+@@ -173,3 +178,19 @@ int handle_uevents(fd_set *rset)
+ 
+ 	return 0;
+ }
++
++char *socket_path(void)
++{
++	char *xdg_runtime_dir;
++	if((xdg_runtime_dir = getenv("XDG_RUNTIME_DIR"))) {
++		if ( spath == NULL ) {
++			spath = malloc(strlen(xdg_runtime_dir) + strlen("/spnav.sock") + 1);
++			if ( spath != NULL ) {
++				sprintf(spath, "%s/spnav.sock", xdg_runtime_dir);
++			}
++		};
++		return spath;
++	} else {
++		return DEFAULT_SOCK_NAME;
++	}
++}
+diff --git a/src/proto_unix.h b/src/proto_unix.h
+index 045b379..ec4509c 100644
+--- a/src/proto_unix.h
++++ b/src/proto_unix.h
+@@ -23,6 +23,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ #include "event.h"
+ #include "client.h"
+ 
++char *socket_path(void);
+ int init_unix(void);
+ void close_unix(void);
+ int get_unix_socket(void);
+diff --git a/src/spnavd.c b/src/spnavd.c
+index cbea191..03080da 100644
+--- a/src/spnavd.c
++++ b/src/spnavd.c
+@@ -344,7 +344,7 @@ static int find_running_daemon(void)
+ 	}
+ 	memset(&addr, 0, sizeof addr);
+ 	addr.sun_family = AF_UNIX;
+-	strncpy(addr.sun_path, SOCK_NAME, sizeof addr.sun_path);
++	strncpy(addr.sun_path, socket_path(), sizeof addr.sun_path);
+ 
+ 	if(connect(s, (struct sockaddr*)&addr, sizeof addr) == -1) {
+ 		close(s);
+diff --git a/src/spnavd.h b/src/spnavd.h
+index fa0a916..2d1c48b 100644
+--- a/src/spnavd.h
++++ b/src/spnavd.h
+@@ -26,8 +26,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ #define DEF_CFGFILE		"/etc/spnavrc"
+ #define DEF_LOGFILE		"/var/log/spnavd.log"
+ 
+-#define SOCK_NAME	"/var/run/spnav.sock"
+ #define PIDFILE		"/var/run/spnavd.pid"
++#define DEFAULT_SOCK_NAME	"/run/spnav.sock"
+ #define SYSLOG_ID	"spnavd"
+ 
+ /* Multiple devices support */
diff --git a/nixpkgs/pkgs/misc/drivers/spacenavd/default.nix b/nixpkgs/pkgs/misc/drivers/spacenavd/default.nix
new file mode 100644
index 000000000000..eb2fc165cccb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/spacenavd/default.nix
@@ -0,0 +1,46 @@
+{ stdenv, lib, fetchFromGitHub, fetchpatch, libX11, IOKit }:
+
+stdenv.mkDerivation rec {
+  version = "0.8";
+  pname = "spacenavd";
+
+  src = fetchFromGitHub {
+    owner = "FreeSpacenav";
+    repo = "spacenavd";
+    rev = "v${version}";
+    sha256 = "1zz0cm5cgvp9s5n4nzksl8rb11c7sw214bdafzra74smvqfjcjcf";
+  };
+
+  patches = [
+    # Fixes Darwin: https://github.com/FreeSpacenav/spacenavd/pull/38
+    (fetchpatch {
+      url = "https://github.com/FreeSpacenav/spacenavd/commit/d6a25d5c3f49b9676d039775efc8bf854737c43c.patch";
+      sha256 = "02pdgcvaqc20qf9hi3r73nb9ds7yk2ps9nnxaj0x9p50xjnhfg5c";
+    })
+    # Changes the socket path from /run/spnav.sock to $XDG_RUNTIME_DIR/spnav.sock
+    # to allow for a user service
+    ./configure-socket-path.patch
+    # Changes the pidfile path from /run/spnavd.pid to $XDG_RUNTIME_DIR/spnavd.pid
+    # to allow for a user service
+    ./configure-pidfile-path.patch
+    # Changes the config file path from /etc/spnavrc to $XDG_CONFIG_HOME/spnavrc or $HOME/.config/spnavrc
+    # to allow for a user service
+    ./configure-cfgfile-path.patch
+  ];
+
+  buildInputs = [ libX11 ]
+    ++ lib.optional stdenv.isDarwin IOKit;
+
+  configureFlags = [ "--disable-debug" ];
+
+  makeFlags = [ "CC=${stdenv.cc.targetPrefix}cc" ];
+
+  meta = with lib; {
+    homepage = "https://spacenav.sourceforge.net/";
+    description = "Device driver and SDK for 3Dconnexion 3D input devices";
+    longDescription = "A free, compatible alternative, to the proprietary 3Dconnexion device driver and SDK, for their 3D input devices (called 'space navigator', 'space pilot', 'space traveller', etc)";
+    license = licenses.gpl3Plus;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ sohalt ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/steamcontroller/default.nix b/nixpkgs/pkgs/misc/drivers/steamcontroller/default.nix
new file mode 100644
index 000000000000..50d1133c3820
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/steamcontroller/default.nix
@@ -0,0 +1,34 @@
+{ lib, fetchFromGitHub, python3Packages, libusb1, linuxHeaders
+}:
+
+with python3Packages;
+
+buildPythonApplication {
+  pname = "steamcontroller";
+  version = "2017-08-11";
+
+  src = fetchFromGitHub {
+    owner  = "ynsta";
+    repo   = "steamcontroller";
+    rev    = "80928ce237925e0d0d7a65a45b481435ba6b931e";
+    sha256 = "0lv9j2zv8fmkmc0x9r7fa8zac2xrwfczms35qz1nfa1hr84wniid";
+  };
+
+  postPatch = ''
+    substituteInPlace src/uinput.py --replace \
+      "/usr/include" "${linuxHeaders}/include"
+  '';
+
+  buildInputs = [ libusb1 ];
+  propagatedBuildInputs = [ psutil python3Packages.libusb1 ];
+  doCheck = false;
+  pythonImportsCheck = [ "steamcontroller" ];
+
+  meta = with lib; {
+    description = "A standalone Steam controller driver";
+    homepage    = "https://github.com/ynsta/steamcontroller";
+    license     = licenses.mit;
+    maintainers = with maintainers; [ rnhmjoj ];
+    platforms   = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/sundtek/default.nix b/nixpkgs/pkgs/misc/drivers/sundtek/default.nix
new file mode 100644
index 000000000000..da2852e70d56
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/sundtek/default.nix
@@ -0,0 +1,53 @@
+{ fetchurl, lib, stdenv }:
+
+with lib;
+
+let
+  version = "2016-01-26";
+  rpath = makeLibraryPath [ "$out/lib" "$out/bin" ];
+  platform = with stdenv;
+    if isx86_64 then "64bit"
+    else
+    if isi686 then "32bit"
+    else throw "${system} not considered in build derivation. Might still be supported.";
+  sha256 = with stdenv;
+    if isx86_64 then "1jfsng5n3phw5rqpkid9m5j7m7zgj5bifh7swvba7f97y6imdaax"
+    else "15y6r5w306pcq4g1rn9f7vf70f3a7qhq237ngaf0wxh2nr0aamxp";
+
+in
+  stdenv.mkDerivation {
+    src = fetchurl {
+      url = "http://www.sundtek.de/media/netinst/${platform}/installer.tar.gz";
+      sha256 = sha256;
+    };
+    pname = "sundtek";
+    inherit version;
+
+    sourceRoot = ".";
+
+    installPhase = ''
+      cp -r opt $out
+
+      # add and fix pkg-config file
+      mkdir -p $out/lib/pkgconfig
+      substitute $out/doc/libmedia.pc $out/lib/pkgconfig/libmedia.pc \
+        --replace /opt $out
+    '';
+
+    postFixup = ''
+      find $out -type f -exec \
+        patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" {} \
+        patchelf --set-rpath ${rpath} {} \;
+    '';
+
+    preferLocalBuild = true;
+
+    meta = {
+      description = "Sundtek MediaTV driver";
+      maintainers = [ maintainers.simonvandel ];
+      sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
+      platforms = platforms.unix;
+      license = licenses.unfree;
+      homepage = "https://support.sundtek.com/index.php/topic,1573.0.html";
+    };
+  }
diff --git a/nixpkgs/pkgs/misc/drivers/utsushi/default.nix b/nixpkgs/pkgs/misc/drivers/utsushi/default.nix
new file mode 100644
index 000000000000..e270a21f5d5f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/utsushi/default.nix
@@ -0,0 +1,179 @@
+{ lib, stdenv, writeScriptBin, fetchpatch, fetchFromGitLab, autoreconfHook, pkg-config
+, autoconf-archive, libxslt, boost, gtkmm2, imagemagick, sane-backends
+, tesseract4, udev, libusb1
+, withNetworkScan ? false, utsushi-networkscan
+}:
+
+
+let
+  fakegit = writeScriptBin "git" ''
+    #! ${stdenv.shell} -e
+    if [ "$1" = "describe" ]; then
+      [ -r .rev ] && cat .rev || true
+    fi
+  '';
+
+in stdenv.mkDerivation rec {
+  pname = "imagescan";
+  version = "3.65.0";
+
+  src = fetchFromGitLab {
+    owner = "utsushi";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-CrN9F/WJKmlDN7eozEHtKgGUQBWVwTqwjnrfiATk7lI=";
+  };
+
+  patches = [
+    (fetchpatch {
+      url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/media-gfx/iscan/files/iscan-3.63.0-autoconf-2.70.patch?id=4fe8a9e6c60f9163cadad830ba4935c069c67b10";
+      sha256 = "sha256-2V4cextjcEQrywe4tvvD5KaVYdXnwdNhTiY/aSNx3mM=";
+    })
+    (fetchpatch {
+      url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/media-gfx/iscan/files/iscan-3.61.0-imagemagick-7.patch?id=985c92af4730d864e86fa87746185b0246e9db93";
+      sha256 = "sha256-dfdVMp3ZfclYeRxYjMIvl+ZdlLn9S+IwQ+OmlHW8318=";
+    })
+    (fetchpatch {
+      url = "https://raw.githubusercontent.com/archlinux/svntogit-community/b3046e0e78b95440f135fcadb19a9eb531729a58/trunk/boost-1.74.patch";
+      sha256 = "sha256-W8R1l7ZPcsfiIy1QBJvh0M8du0w1cnTg3PyAz65v4rE=";
+    })
+    (fetchpatch {
+      url = "https://gitweb.gentoo.org/repo/gentoo.git/plain/media-gfx/iscan/files/iscan-3.65.0-sane-backends-1.1.patch";
+      sha256 = "sha256-AmMZ+/lrUMR7IU+S8MEn0Ji5pqOiD6izFJBsJ0tCCCw=";
+    })
+  ];
+
+  nativeBuildInputs = [
+    autoreconfHook
+    pkg-config
+    autoconf-archive
+    fakegit
+    libxslt
+  ];
+
+  buildInputs = [
+    boost.dev
+    gtkmm2.dev
+    imagemagick
+    sane-backends
+    udev.dev
+    libusb1.dev
+  ];
+
+  env.NIX_CFLAGS_COMPILE = toString [
+    "-Wno-error=deprecated-declarations"
+    "-Wno-error=parentheses"
+    "-Wno-error=unused-variable"
+  ];
+
+
+  postPatch = ''
+    # create fake udev and sane config
+    mkdir -p $out/etc/{sane.d,udev/rules.d}
+    touch $out/etc/sane.d/dll.conf
+
+    # absolute paths to convert & tesseract
+    sed -i '/\[AC_DEFINE(\[HAVE_IMAGE_MAGICK\], \[1\])/a \ MAGICK_CONVERT="${imagemagick}/bin/convert"' configure.ac
+    substituteInPlace filters/magick.cpp \
+      --replace 'convert ' '${imagemagick}/bin/convert '
+    substituteInPlace filters/reorient.cpp \
+      --replace '"tesseract' '"${tesseract4}/bin/tesseract'
+    substituteInPlace filters/get-text-orientation \
+      --replace '=tesseract' '=${tesseract4}/bin/tesseract'
+  '';
+
+  configureFlags = [
+    "--with-boost-libdir=${boost}/lib"
+    "--with-sane-confdir=${placeholder "out"}/etc/sane.d"
+    "--with-udev-confdir=${placeholder "out"}/etc/udev"
+    "--with-gtkmm"
+    "--with-jpeg"
+    "--with-magick"
+    "--with-magick-pp"
+    "--with-sane"
+    "--with-tiff"
+  ];
+
+  installFlags = [ "SANE_BACKENDDIR=${placeholder "out"}/lib/sane" ];
+
+  enableParallelBuilding = true;
+
+  doInstallCheck = false;
+
+  postInstall = lib.optionalString withNetworkScan ''
+    ln -s ${utsushi-networkscan}/libexec/utsushi/networkscan $out/libexec/utsushi
+  '';
+
+  meta = with lib; {
+    description = "SANE utsushi backend for some Epson scanners";
+    longDescription = ''
+      ImageScanV3 (aka utsushi) scanner driver. Non-free plugins are not
+      included, so no network support. To use the SANE backend, in
+      <literal>/etc/nixos/configuration.nix</literal>:
+
+      <literal>
+      hardware.sane = {
+        enable = true;
+        extraBackends = [ pkgs.utsushi ];
+      };
+      services.udev.packages = [ pkgs.utsushi ];
+      </literal>
+
+      Supported hardware:
+      DS-1610, DS-1630, DS-1660W, DS-310, DS-320, DS-360W, DS-40, DS-410,
+      DS-50000, DS-510, DS-520, DS-530, DS-535, DS-535H, DS-5500, DS-560,
+      DS-570W, DS-575W, DS-60000, DS-6500, DS-70, DS-70000, DS-7500, DS-760,
+      DS-770, DS-775, DS-780N, DS-80W, DS-860, EC-4020 Series, EC-4030 Series,
+      EC-4040 Series, EP-10VA Series, EP-30VA Series, EP-708A Series, EP-709A
+      Series, EP-710A Series, EP-711A Series, EP-712A Series, EP-808A Series,
+      EP-810A Series, EP-811A Series, EP-812A Series, EP-879A Series, EP-880A
+      Series, EP-881A Series, EP-882A Series, EP-978A3 Series, EP-979A3 Series,
+      EP-982A3 Series, EP-M570T Series, ES-200, ES-300W, ES-300WR, ES-400,
+      ES-50, ES-50, ES-500W, ES-500WR, ES-55R, ES-60W, ES-60WB, ES-60WW,
+      ES-65WR, ET-16500 Series, ET-2500 Series, ET-2550 Series, ET-2600 Series,
+      ET-2610 Series, ET-2650 Series, ET-2700 Series, ET-2710 Series, ET-2720
+      Series, ET-2750 Series, ET-2760 Series, ET-3600 Series, ET-3700 Series,
+      ET-3710 Series, ET-3750 Series, ET-3760 Series, ET-4500 Series, ET-4550
+      Series, ET-4700 Series, ET-4750 Series, ET-4760 Series, ET-7700 Series,
+      ET-7750 Series, ET-8700 Series, ET-M2140 Series, ET-M2170 Series,
+      ET-M3140 Series, ET-M3170 Series, ET-M3180 Series, EW-052A Series,
+      EW-452A Series, EW-M5071FT Series, EW-M571T Series, EW-M630T Series,
+      EW-M660FT Series, EW-M670FT Series, EW-M770T Series, EW-M970A3T Series,
+      FF-640, FF-680W, GT-S650, L1455 Series, L220 Series, L222 Series, L3050
+      Series, L3060 Series, L3070 Series, L3100 Series, L3110 Series, L3150
+      Series, L3160 Series, L360 Series, L362 Series, L364 Series, L365 Series,
+      L366 Series, L375 Series, L380 Series, L382 Series, L385 Series, L386
+      Series, L395 Series, L396 Series, L405 Series, L4150 Series, L4160
+      Series, L455 Series, L475 Series, L485 Series, L486 Series, L495 Series,
+      L5190 Series, L565 Series, L566 Series, L575 Series, L605 Series, L6160
+      Series, L6170 Series, L6190 Series, L655 Series, L7160 Series, L7180
+      Series, LX-10000F, LX-10000FK, LX-10010MF, LX-7000F, M2140 Series, M2170
+      Series, M3140 Series, M3170 Series, M3180 Series, PX-048A Series, PX-049A
+      Series, PX-M160T Series, PX-M270FT Series, PX-M270T Series, PX-M380F,
+      PX-M381FL, PX-M5080F Series, PX-M5081F Series, PX-M680F Series, PX-M7050
+      Series, PX-M7050FP, PX-M7050FX, PX-M7070FX, PX-M7110F, PX-M7110FP,
+      PX-M780F Series, PX-M781F Series, PX-M840FX, PX-M860F, PX-M880FX,
+      PX-M884F, PX-M885F, PX-M886FL, Perfection V19, Perfection V39, ST-2000
+      Series, ST-3000 Series, ST-4000 Series, ST-M3000 Series, WF-2750 Series,
+      WF-2760 Series, WF-2810 Series, WF-2830 Series, WF-2850 Series, WF-2860
+      Series, WF-3720 Series, WF-3730 Series, WF-4720 Series, WF-4730 Series,
+      WF-4740 Series, WF-6530 Series, WF-6590 Series, WF-7710 Series, WF-7720
+      Series, WF-8510 Series, WF-8590 Series, WF-C17590 Series, WF-C20590
+      Series, WF-C5710 Series, WF-C5790 Series, WF-C5790BA, WF-C579R Series,
+      WF-C579RB, WF-C8610 Series, WF-C8690 Series, WF-C8690B, WF-C869R Series,
+      WF-M20590 Series, WF-M5799 Series, WF-R8590 Series, XP-2100 Series,
+      XP-220 Series, XP-230 Series, XP-235 Series, XP-240 Series, XP-243 245
+      247 Series, XP-255 257 Series, XP-3100 Series, XP-332 335 Series, XP-340
+      Series, XP-342 343 345 Series, XP-352 355 Series, XP-4100 Series, XP-430
+      Series, XP-432 435 Series, XP-440 Series, XP-442 445 Series, XP-452 455
+      Series, XP-5100 Series, XP-530 Series, XP-540 Series, XP-6000 Series,
+      XP-6100 Series, XP-630 Series, XP-640 Series, XP-7100 Series, XP-830
+      Series, XP-8500 Series, XP-8600 Series, XP-900 Series, XP-960 Series,
+      XP-970 Series
+    '';
+    homepage = "https://gitlab.com/utsushi/imagescan";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ wucke13 maxwilson ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/utsushi/networkscan.nix b/nixpkgs/pkgs/misc/drivers/utsushi/networkscan.nix
new file mode 100644
index 000000000000..b9aa1cbe904f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/utsushi/networkscan.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchurl, rpmextract }:
+
+stdenv.mkDerivation rec {
+  pname = "imagescan-plugin-networkscan";
+  imagescanVersion = "3.65.0";
+  version = "1.1.4";
+
+  src = fetchurl {
+    urls = [
+      "https://buzo.eu/mirror/epson/imagescan-bundle-fedora-32-${imagescanVersion}.x64.rpm.tar.gz"
+      "https://web.archive.org/web/20221027001620if_/https://download2.ebz.epson.net/imagescanv3/fedora/latest1/rpm/x64/imagescan-bundle-fedora-32-${imagescanVersion}.x64.rpm.tar.gz"
+    ];
+    sha256 = "sha256-fxi63sV+YJOlv1aVTfCPIXOPfNAo+R7zNPvA11sFmMk=";
+  };
+
+  nativeBuildInputs = [ rpmextract ];
+
+  installPhase = ''
+    rpmextract plugins/imagescan-plugin-networkscan-${version}-*.x86_64.rpm
+    install -Dm755 usr/libexec/utsushi/networkscan $out/libexec/utsushi/networkscan
+    patchelf \
+      --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
+      --set-rpath ${lib.makeLibraryPath [ stdenv.cc.cc ]} \
+      $out/libexec/utsushi/networkscan
+  '';
+
+  meta = with lib; {
+    homepage = "https://support.epson.net/linux/en/imagescanv3.php";
+    description = "Network scan plugin for ImageScan v3";
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+    license = licenses.unfree;
+    maintainers = with maintainers; [ abbradar ];
+    platforms = [ "x86_64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/xboxdrv/default.nix b/nixpkgs/pkgs/misc/drivers/xboxdrv/default.nix
new file mode 100644
index 000000000000..f81e81ecbea0
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/xboxdrv/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, scons
+, libX11
+, pkg-config
+, libusb1
+, boost
+, glib
+, dbus-glib
+}:
+
+stdenv.mkDerivation rec {
+  pname = "xboxdrv";
+  version = "0.8.8";
+
+  src = fetchFromGitHub {
+    owner = "xboxdrv";
+    repo = "xboxdrv";
+    rev = "v${version}";
+    hash = "sha256-R0Bt4xfzQA1EmZbf7lcWLwSSUayf5Y711QhlAVhiLrY=";
+  };
+
+  makeFlags = [ "PREFIX=$(out)" ];
+  nativeBuildInputs = [ pkg-config scons ];
+  buildInputs = [ libX11 libusb1 boost glib dbus-glib ];
+  enableParallelBuilding = true;
+  dontUseSconsInstall = true;
+
+  patches = [
+    ./fix-60-sec-delay.patch
+    ./scons-py3.patch
+    ./scons-v4.2.0.patch
+    ./xboxdrvctl-py3.patch
+  ];
+
+  meta = with lib; {
+    homepage = "https://xboxdrv.gitlab.io/";
+    description = "Xbox/Xbox360 (and more) gamepad driver for Linux that works in userspace";
+    license = licenses.gpl3Plus;
+    maintainers = [ ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/drivers/xboxdrv/fix-60-sec-delay.patch b/nixpkgs/pkgs/misc/drivers/xboxdrv/fix-60-sec-delay.patch
new file mode 100644
index 000000000000..da543d2cfa01
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/xboxdrv/fix-60-sec-delay.patch
@@ -0,0 +1,27 @@
+From 7326421eeaadbc2aeb3828628c2e65bb7be323a9 Mon Sep 17 00:00:00 2001
+From: buxit <buti@bux.at>
+Date: Wed, 2 Nov 2016 16:25:14 +0100
+Subject: [PATCH] fix 60 seconds delay
+
+use `libusb_handle_events_timeout_completed()` instead of `libusb_handle_events()`
+should fix #144
+---
+ src/usb_gsource.cpp | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/src/usb_gsource.cpp b/src/usb_gsource.cpp
+index 00bf1315..afb38f65 100644
+--- a/src/usb_gsource.cpp
++++ b/src/usb_gsource.cpp
+@@ -174,7 +174,10 @@ USBGSource::on_source_dispatch(GSource* source, GSourceFunc callback, gpointer u
+ gboolean
+ USBGSource::on_source()
+ {
+-  libusb_handle_events(NULL);
++  struct timeval to;
++  to.tv_sec = 0;
++  to.tv_usec = 0;
++  libusb_handle_events_timeout_completed(NULL, &to, NULL);
+   return TRUE;
+ }
+ 
diff --git a/nixpkgs/pkgs/misc/drivers/xboxdrv/scons-py3.patch b/nixpkgs/pkgs/misc/drivers/xboxdrv/scons-py3.patch
new file mode 100644
index 000000000000..4aa6fa619317
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/xboxdrv/scons-py3.patch
@@ -0,0 +1,63 @@
+From 17bd43a7d3ef86216abc36b42b4e6a1f70aa9979 Mon Sep 17 00:00:00 2001
+From: xnick <xnick@users.noreply.github.com>
+Date: Thu, 12 Oct 2017 20:34:35 +0300
+Subject: [PATCH] Update SConstruct
+
+python3 compatible
+---
+ SConstruct | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/SConstruct b/SConstruct
+index 4cd79704..c0007054 100644
+--- a/SConstruct
++++ b/SConstruct
+@@ -19,7 +19,7 @@ def build_dbus_glue(target, source, env):
+     xml = re.sub(r"callback = \(([A-Za-z_]+)\) \(marshal_data \? marshal_data : cc->callback\);",
+                  r"union { \1 fn; void* obj; } conv;\n  "
+                  "conv.obj = (marshal_data ? marshal_data : cc->callback);\n  "
+-                 "callback = conv.fn;", xml)
++                 "callback = conv.fn;", xml.decode('utf-8'))
+ 
+     with open(target[0].get_path(), "w") as f:
+         f.write(xml)
+@@ -29,10 +29,10 @@ def build_bin2h(target, source, env):
+     Takes a list of files and converts them into a C source that can be included
+     """
+     def c_escape(str): 
+-        return str.translate(string.maketrans("/.-", "___"))
++        return str.translate(bytes.maketrans(b"/.-", b"___"))
+     
+-    print target
+-    print source
++    print(target)
++    print(source)
+     with open(target[0].get_path(), "w") as fout:
+         fout.write("// autogenerated by scons Bin2H builder, do not edit by hand!\n\n")
+ 
+@@ -45,8 +45,8 @@ def build_bin2h(target, source, env):
+                 data = fin.read()
+                 fout.write("// \"%s\"\n" % src.get_path())
+                 fout.write("const char %s[] = {" % c_escape(src.get_path()))
+-                bytes_arr = ["0x%02x" % ord(c) for c in data]
+-                for i in xrange(len(bytes_arr)):
++                bytes_arr = ["0x%02x" % c for c in data]
++                for i in range(len(bytes_arr)):
+                     if i % 13 == 0:
+                         fout.write("\n  ")
+                     fout.write(bytes_arr[i])
+@@ -131,12 +131,12 @@ env.Append(CPPDEFINES = { 'PACKAGE_VERSION': "'\"%s\"'" % package_version })
+ conf = Configure(env)
+ 
+ if not conf.env['CXX']:
+-    print "g++ must be installed!"
++    print('g++ must be installed!')
+     Exit(1)
+ 
+ # X11 checks
+ if not conf.CheckLibWithHeader('X11', 'X11/Xlib.h', 'C++'):
+-    print 'libx11-dev must be installed!'
++    print('libx11-dev must be installed!')
+     Exit(1)
+ 
+ env = conf.Finish()
diff --git a/nixpkgs/pkgs/misc/drivers/xboxdrv/scons-v4.2.0.patch b/nixpkgs/pkgs/misc/drivers/xboxdrv/scons-v4.2.0.patch
new file mode 100644
index 000000000000..04b05e8d6ffc
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/xboxdrv/scons-v4.2.0.patch
@@ -0,0 +1,20 @@
+--- a/SConstruct	2021-10-31 20:42:44.232084185 -0400
++++ b/SConstruct	2021-10-31 20:42:54.063024444 -0400
+@@ -36,7 +36,7 @@
+     with open(target[0].get_path(), "w") as fout:
+         fout.write("// autogenerated by scons Bin2H builder, do not edit by hand!\n\n")
+ 
+-        if env.has_key("BIN2H_NAMESPACE"):
++        if "BIN2H_NAMESPACE" in env:
+             fout.write("namespace %s {\n\n" % env["BIN2H_NAMESPACE"])
+             
+         # write down data
+@@ -62,7 +62,7 @@
+                                     for src in source], ",\n"))
+             fout.write("\n}\n\n")
+ 
+-        if env.has_key("BIN2H_NAMESPACE"):
++        if "BIN2H_NAMESPACE" in env:
+             fout.write("} // namespace %s\n\n" % env["BIN2H_NAMESPACE"])
+                 
+         fout.write("/* EOF */\n")
diff --git a/nixpkgs/pkgs/misc/drivers/xboxdrv/xboxdrvctl-py3.patch b/nixpkgs/pkgs/misc/drivers/xboxdrv/xboxdrvctl-py3.patch
new file mode 100644
index 000000000000..71d8762cb9ca
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/xboxdrv/xboxdrvctl-py3.patch
@@ -0,0 +1,73 @@
+--- a/xboxdrvctl	2021-06-21 19:39:51.000000000 -0400
++++ b/xboxdrvctl 19:43:27.467984928 -0400
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python2
++#!/usr/bin/env python3
+ 
+ ##  Xbox360 USB Gamepad Userspace Driver
+ ##  Copyright (C) 2011 Ingo Ruhnke <grumbel@gmail.com>
+@@ -37,23 +37,23 @@
+                   help="print controller status")
+ 
+ group.add_option("-s", "--slot", metavar="SLOT", type="int",
+-                  dest="slot", 
++                  dest="slot",
+                   help="use slot SLOT for actions")
+ 
+ group.add_option("-l", "--led", metavar="NUM", type="int",
+-                  dest="led", 
++                  dest="led",
+                   help="set LED")
+ 
+-group.add_option("-r", "--rumble", metavar="L:R", 
+-                  dest="rumble", 
++group.add_option("-r", "--rumble", metavar="L:R",
++                  dest="rumble",
+                   help="print controller status")
+ 
+ group.add_option("-c", "--config", metavar="NUM", type="int",
+-                  dest="config", 
++                  dest="config",
+                   help="switches to controller configuration NUM")
+ 
+ group.add_option("--shutdown", action="store_true",
+-                  dest="shutdown", 
++                  dest="shutdown",
+                   help="shuts down the daemon")
+ 
+ parser.add_option_group(group)
+@@ -69,9 +69,9 @@
+     try:
+         bus.get_object("org.seul.Xboxdrv", '/org/seul/Xboxdrv/Daemon')
+     except dbus.exceptions.DBusException:
+-				bus = dbus.SystemBus()
++        bus = dbus.SystemBus()
+ else:
+-    print "Error: invalid argument to --bus. Must be 'auto', 'session, or 'system'"
++    print("Error: invalid argument to --bus. Must be 'auto', 'session, or 'system'")
+     exit()
+ 
+ if options.status:
+@@ -82,19 +82,19 @@
+     daemon.Shutdown()
+ else:
+     if (options.led or options.rumble or options.config) and options.slot == None:
+-        print "Error: --slot argument required"
++        print("Error: --slot argument required")
+         exit()
+     else:
+         if options.slot != None:
+             slot = bus.get_object("org.seul.Xboxdrv", '/org/seul/Xboxdrv/ControllerSlots/%d' % options.slot)
+-    
++
+             if options.led != None:
+                 slot.SetLed(options.led)
+ 
+             if options.rumble:
+                 m = re.match('^(\d+):(\d+)$', options.rumble)
+                 if not m:
+-                    print "Error: invalid argument to --rumble"
++                    print("Error: invalid argument to --rumble")
+                     exit()
+                 else:
+                     left  = int(m.group(1))
diff --git a/nixpkgs/pkgs/misc/drivers/xwiimote/default.nix b/nixpkgs/pkgs/misc/drivers/xwiimote/default.nix
new file mode 100644
index 000000000000..69ffcdd78865
--- /dev/null
+++ b/nixpkgs/pkgs/misc/drivers/xwiimote/default.nix
@@ -0,0 +1,28 @@
+{ lib, stdenv, udev, ncurses, pkg-config, fetchurl, bluez }:
+
+stdenv.mkDerivation rec {
+  pname = "xwiimote";
+  version = "2";
+
+  src = fetchurl {
+    url = "https://github.com/dvdhrm/xwiimote/releases/download/xwiimote-${version}/xwiimote-${version}.tar.xz";
+    sha256 = "1g9cbhblll47l300zr999xr51x2g98y49l222f77fhswd12kjzhd";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ udev ncurses bluez ];
+
+  configureFlags = [ "--with-doxygen=no" ];
+
+  meta = {
+    homepage = "https://dvdhrm.github.io/xwiimote";
+    description = "Userspace utilities to control connected Nintendo Wii Remotes";
+    platforms = lib.platforms.linux;
+    license = lib.licenses.mit;
+  };
+
+  postInstallPhase = ''
+    mkdir -p "$out/etc/X11/xorg.conf.d/"
+    cp "res/50-xorg-fix-xwiimote.conf" "$out/etc/X11/xorg.conf.d/50-fix-xwiimote.conf"
+  '';
+}
diff --git a/nixpkgs/pkgs/misc/dumb/default.nix b/nixpkgs/pkgs/misc/dumb/default.nix
new file mode 100644
index 000000000000..2a554d99b287
--- /dev/null
+++ b/nixpkgs/pkgs/misc/dumb/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub, cmake, allegro, SDL2 }:
+
+stdenv.mkDerivation rec {
+  pname = "dumb";
+  version = "2.0.3";
+
+  nativeBuildInputs = [ cmake ];
+  buildInputs = [ allegro SDL2 ];
+
+  src = fetchFromGitHub {
+    owner = "kode54";
+    repo = "dumb";
+    rev = version;
+    sha256 = "1cnq6rb14d4yllr0yi32p9jmcig8avs3f43bvdjrx4r1mpawspi6";
+  };
+
+  cmakeFlags = [
+    "-DCMAKE_BUILD_TYPE='Release'"
+    "-DBUILD_EXAMPLES='OFF'"
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/kode54/dumb";
+    description = "Module/tracker based music format parser and player library";
+    license = licenses.free;  # Derivative of GPL
+    maintainers = with maintainers; [ Madouura ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/dxvk/darwin-dxvk-compat.patch b/nixpkgs/pkgs/misc/dxvk/darwin-dxvk-compat.patch
new file mode 100644
index 000000000000..99833a020cda
--- /dev/null
+++ b/nixpkgs/pkgs/misc/dxvk/darwin-dxvk-compat.patch
@@ -0,0 +1,48 @@
+diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp
+index 09f3559a..215787f9 100644
+--- a/src/d3d11/d3d11_device.cpp
++++ b/src/d3d11/d3d11_device.cpp
+@@ -801,8 +801,12 @@ namespace dxvk {
+     InitReturnPtr(ppGeometryShader);
+     D3D11CommonShader module;
+
+-    if (!m_dxvkDevice->features().extTransformFeedback.transformFeedback)
+-      return DXGI_ERROR_INVALID_CALL;
++    if (!m_dxvkDevice->features().extTransformFeedback.transformFeedback) {
++        Logger::err(
++                 "D3D11: CreateGeometryShaderWithStreamOutput:"
++                 "\n  Transform feedback not supported by device");
++        return S_OK;
++    }
+
+     // Zero-init some counterss so that we can increment
+     // them while walking over the stream output entries
+@@ -1920,7 +1924,7 @@ namespace dxvk {
+     DxvkDeviceFeatures supported = adapter->features();
+     DxvkDeviceFeatures enabled   = {};
+
+-    enabled.core.features.geometryShader                          = VK_TRUE;
++    enabled.core.features.geometryShader                          = supported.core.features.geometryShader;
+     enabled.core.features.robustBufferAccess                      = VK_TRUE;
+     enabled.core.features.shaderStorageImageWriteWithoutFormat    = VK_TRUE;
+     enabled.core.features.depthBounds                             = supported.core.features.depthBounds;
+@@ -1951,7 +1955,7 @@ namespace dxvk {
+       enabled.core.features.sampleRateShading                     = VK_TRUE;
+       enabled.core.features.samplerAnisotropy                     = supported.core.features.samplerAnisotropy;
+       enabled.core.features.shaderClipDistance                    = VK_TRUE;
+-      enabled.core.features.shaderCullDistance                    = VK_TRUE;
++      enabled.core.features.shaderCullDistance                    = supported.core.features.shaderCullDistance;
+       enabled.core.features.textureCompressionBC                  = VK_TRUE;
+       enabled.extDepthClipEnable.depthClipEnable                  = supported.extDepthClipEnable.depthClipEnable;
+       enabled.extHostQueryReset.hostQueryReset                    = VK_TRUE;
+@@ -1971,8 +1975,8 @@ namespace dxvk {
+       enabled.core.features.logicOp                               = supported.core.features.logicOp;
+       enabled.core.features.shaderImageGatherExtended             = VK_TRUE;
+       enabled.core.features.variableMultisampleRate               = supported.core.features.variableMultisampleRate;
+-      enabled.extTransformFeedback.transformFeedback              = VK_TRUE;
+-      enabled.extTransformFeedback.geometryStreams                = VK_TRUE;
++      enabled.extTransformFeedback.transformFeedback              = supported.extTransformFeedback.transformFeedback;
++      enabled.extTransformFeedback.geometryStreams                = supported.extTransformFeedback.geometryStreams;
+     }
+
+     if (featureLevel >= D3D_FEATURE_LEVEL_10_1) {
diff --git a/nixpkgs/pkgs/misc/dxvk/darwin-thread-primitives.patch b/nixpkgs/pkgs/misc/dxvk/darwin-thread-primitives.patch
new file mode 100644
index 000000000000..c008099407c5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/dxvk/darwin-thread-primitives.patch
@@ -0,0 +1,186 @@
+diff --git a/src/util/thread.h b/src/util/thread.h
+index 28aeca8a..db5c9913 100644
+--- a/src/util/thread.h
++++ b/src/util/thread.h
+@@ -149,178 +149,8 @@ namespace dxvk {
+     }
+   }
+ 
+-
+-  /**
+-   * \brief SRW-based mutex implementation
+-   *
+-   * Drop-in replacement for \c std::mutex that uses Win32
+-   * SRW locks, which are implemented with \c futex in wine.
+-   */
+-  class mutex {
+-
+-  public:
+-
+-    using native_handle_type = PSRWLOCK;
+-
+-    mutex() { }
+-
+-    mutex(const mutex&) = delete;
+-    mutex& operator = (const mutex&) = delete;
+-
+-    void lock() {
+-      AcquireSRWLockExclusive(&m_lock);
+-    }
+-
+-    void unlock() {
+-      ReleaseSRWLockExclusive(&m_lock);
+-    }
+-
+-    bool try_lock() {
+-      return TryAcquireSRWLockExclusive(&m_lock);
+-    }
+-
+-    native_handle_type native_handle() {
+-      return &m_lock;
+-    }
+-
+-  private:
+-
+-    SRWLOCK m_lock = SRWLOCK_INIT;
+-
+-  };
+-
+-
+-  /**
+-   * \brief Recursive mutex implementation
+-   *
+-   * Drop-in replacement for \c std::recursive_mutex that
+-   * uses Win32 critical sections.
+-   */
+-  class recursive_mutex {
+-
+-  public:
+-
+-    using native_handle_type = PCRITICAL_SECTION;
+-
+-    recursive_mutex() {
+-      InitializeCriticalSection(&m_lock);
+-    }
+-
+-    ~recursive_mutex() {
+-      DeleteCriticalSection(&m_lock);
+-    }
+-
+-    recursive_mutex(const recursive_mutex&) = delete;
+-    recursive_mutex& operator = (const recursive_mutex&) = delete;
+-
+-    void lock() {
+-      EnterCriticalSection(&m_lock);
+-    }
+-
+-    void unlock() {
+-      LeaveCriticalSection(&m_lock);
+-    }
+-
+-    bool try_lock() {
+-      return TryEnterCriticalSection(&m_lock);
+-    }
+-
+-    native_handle_type native_handle() {
+-      return &m_lock;
+-    }
+-
+-  private:
+-
+-    CRITICAL_SECTION m_lock;
+-
+-  };
+-
+-
+-  /**
+-   * \brief SRW-based condition variable implementation
+-   *
+-   * Drop-in replacement for \c std::condition_variable that
+-   * uses Win32 condition variables on SRW locks.
+-   */
+-  class condition_variable {
+-
+-  public:
+-
+-    using native_handle_type = PCONDITION_VARIABLE;
+-
+-    condition_variable() {
+-      InitializeConditionVariable(&m_cond);
+-    }
+-
+-    condition_variable(condition_variable&) = delete;
+-
+-    condition_variable& operator = (condition_variable&) = delete;
+-
+-    void notify_one() {
+-      WakeConditionVariable(&m_cond);
+-    }
+-
+-    void notify_all() {
+-      WakeAllConditionVariable(&m_cond);
+-    }
+-
+-    void wait(std::unique_lock<dxvk::mutex>& lock) {
+-      auto srw = lock.mutex()->native_handle();
+-      SleepConditionVariableSRW(&m_cond, srw, INFINITE, 0);
+-    }
+-
+-    template<typename Predicate>
+-    void wait(std::unique_lock<dxvk::mutex>& lock, Predicate pred) {
+-      while (!pred())
+-        wait(lock);
+-    }
+-
+-    template<typename Clock, typename Duration>
+-    std::cv_status wait_until(std::unique_lock<dxvk::mutex>& lock, const std::chrono::time_point<Clock, Duration>& time) {
+-      auto now = Clock::now();
+-
+-      return (now < time)
+-        ? wait_for(lock, now - time)
+-        : std::cv_status::timeout;
+-    }
+-
+-    template<typename Clock, typename Duration, typename Predicate>
+-    bool wait_until(std::unique_lock<dxvk::mutex>& lock, const std::chrono::time_point<Clock, Duration>& time, Predicate pred) {
+-      if (pred())
+-        return true;
+-
+-      auto now = Clock::now();
+-      return now < time && wait_for(lock, now - time, pred);
+-    }
+-
+-    template<typename Rep, typename Period>
+-    std::cv_status wait_for(std::unique_lock<dxvk::mutex>& lock, const std::chrono::duration<Rep, Period>& timeout) {
+-      auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(timeout);
+-      auto srw = lock.mutex()->native_handle();
+-
+-      return SleepConditionVariableSRW(&m_cond, srw, ms.count(), 0)
+-        ? std::cv_status::no_timeout
+-        : std::cv_status::timeout;
+-    }
+-
+-    template<typename Rep, typename Period, typename Predicate>
+-    bool wait_for(std::unique_lock<dxvk::mutex>& lock, const std::chrono::duration<Rep, Period>& timeout, Predicate pred) {
+-      bool result = pred();
+-
+-      if (!result && wait_for(lock, timeout) == std::cv_status::no_timeout)
+-        result = pred();
+-
+-      return result;
+-    }
+-
+-    native_handle_type native_handle() {
+-      return &m_cond;
+-    }
+-
+-  private:
+-
+-    CONDITION_VARIABLE m_cond;
+-
+-  };
++  using mutex = std::mutex;
++  using recursive_mutex = std::recursive_mutex;
++  using condition_variable = std::condition_variable;
+ 
+ }
diff --git a/nixpkgs/pkgs/misc/dxvk/default.nix b/nixpkgs/pkgs/misc/dxvk/default.nix
new file mode 100644
index 000000000000..88b7e5b104fb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/dxvk/default.nix
@@ -0,0 +1,52 @@
+{ lib
+, stdenvNoCC
+, fetchFromGitHub
+, pkgsCross
+, stdenv
+, bash
+}:
+
+stdenvNoCC.mkDerivation (finalAttrs:
+  let
+    dxvk32 = if stdenv.isDarwin
+      then pkgsCross.mingw32.dxvk_1.override { enableMoltenVKCompat = true; }
+      else pkgsCross.mingw32.dxvk_2;
+    dxvk64 = if stdenv.isDarwin
+      then pkgsCross.mingwW64.dxvk_1.override { enableMoltenVKCompat = true; }
+      else pkgsCross.mingwW64.dxvk_2;
+  in
+  {
+    pname = "dxvk";
+    inherit (dxvk64) version;
+
+    outputs = [ "out" "bin" "lib" ];
+
+    dontUnpack = true;
+    dontConfigure = true;
+    dontBuild = true;
+
+    installPhase = ''
+      mkdir -p $out/bin $bin $lib
+      substitute ${./setup_dxvk.sh} $out/bin/setup_dxvk.sh \
+        --subst-var-by bash ${bash} \
+        --subst-var-by dxvk32 ${dxvk32} \
+        --subst-var-by dxvk64 ${dxvk64} \
+        --subst-var-by mcfgthreads32 "${pkgsCross.mingw32.windows.mcfgthreads_pre_gcc_13}" \
+        --subst-var-by mcfgthreads64 "${pkgsCross.mingwW64.windows.mcfgthreads_pre_gcc_13}"
+      chmod a+x $out/bin/setup_dxvk.sh
+      declare -A dxvks=( [x32]=${dxvk32} [x64]=${dxvk64} )
+      for arch in "''${!dxvks[@]}"; do
+        ln -s "''${dxvks[$arch]}/bin" $bin/$arch
+        ln -s "''${dxvks[$arch]}/lib" $lib/$arch
+      done
+    '';
+
+    meta = {
+      description = "Setup script for DXVK";
+      homepage = "https://github.com/doitsujin/dxvk";
+      changelog = "https://github.com/doitsujin/dxvk/releases";
+      maintainers = [ lib.maintainers.reckenrode ];
+      license = lib.licenses.zlib;
+      platforms = [ "x86_64-darwin" "i686-linux" "x86_64-linux" ];
+    };
+  })
diff --git a/nixpkgs/pkgs/misc/dxvk/dxvk.nix b/nixpkgs/pkgs/misc/dxvk/dxvk.nix
new file mode 100644
index 000000000000..b7bc4f2fc127
--- /dev/null
+++ b/nixpkgs/pkgs/misc/dxvk/dxvk.nix
@@ -0,0 +1,114 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, glslang
+, meson
+, ninja
+, windows
+, dxvkVersion ? "default"
+, spirv-headers
+, vulkan-headers
+, SDL2
+, glfw
+, pkgsBuildHost
+, gitUpdater
+, sdl2Support ? true
+, glfwSupport ? false
+, enableMoltenVKCompat ? false
+}:
+
+# SDL2 and GLFW support are mutually exclusive.
+assert !sdl2Support || !glfwSupport;
+
+let
+  # DXVK 2.0+ no longer vendors certain dependencies. This derivation also needs to build on Darwin,
+  # which does not currently support DXVK 2.0, so adapt conditionally for this situation.
+  isDxvk2 = lib.versionAtLeast (srcs.${dxvkVersion}.version) "2.0";
+
+  # DXVK has effectively the same build script regardless of platform.
+  srcs = {
+    "1.10" = rec {
+      version = "1.10.3";
+      src = fetchFromGitHub {
+        owner = "doitsujin";
+        repo = "dxvk";
+        rev = "v${version}";
+        hash = "sha256-T93ZylxzJGprrP+j6axZwl2d3hJowMCUOKNjIyNzkmE=";
+      };
+      # These patches are required when using DXVK with Wine on Darwin.
+      patches = lib.optionals enableMoltenVKCompat [
+        # Patch DXVK to work with MoltenVK even though it doesn’t support some required features.
+        # Some games work poorly (particularly Unreal Engine 4 games), but others work pretty well.
+        ./darwin-dxvk-compat.patch
+        # Use synchronization primitives from the C++ standard library to avoid deadlocks on Darwin.
+        # See: https://www.reddit.com/r/macgaming/comments/t8liua/comment/hzsuce9/
+        ./darwin-thread-primitives.patch
+      ];
+    };
+    "default" = rec {
+      version = "2.2";
+      src = fetchFromGitHub {
+        owner = "doitsujin";
+        repo = "dxvk";
+        rev = "v${version}";
+        hash = "sha256-GKRd66DvcA+7p3/wDqAUi02ZLRSVZ/fvJM0PQDEKVMA=";
+        fetchSubmodules = true; # Needed for the DirectX headers and libdisplay-info
+      };
+      patches = [ ];
+    };
+  };
+
+  isWindows = stdenv.targetPlatform.uname.system == "Windows";
+  isCross = stdenv.hostPlatform != stdenv.targetPlatform;
+in
+stdenv.mkDerivation (finalAttrs:  {
+  pname = "dxvk";
+  inherit (srcs.${dxvkVersion}) version src patches;
+
+  nativeBuildInputs = [ glslang meson ninja ];
+  buildInputs = lib.optionals isWindows [ windows.pthreads ]
+    ++ lib.optionals isDxvk2 (
+      [ spirv-headers vulkan-headers ]
+      ++ lib.optional (!isWindows && sdl2Support) SDL2
+      ++ lib.optional (!isWindows && glfwSupport) glfw
+    );
+
+  postPatch = lib.optionalString isDxvk2 ''
+    substituteInPlace "subprojects/libdisplay-info/tool/gen-search-table.py" \
+      --replace "/usr/bin/env python3" "${lib.getBin pkgsBuildHost.python3}/bin/python3"
+  '';
+
+  # Build with the Vulkan SDK in nixpkgs.
+  preConfigure = ''
+    rm -rf include/spirv/include include/vulkan/include
+    mkdir -p include/spirv/include include/vulkan/include
+  '';
+
+  mesonFlags =
+    let
+      arch = if stdenv.is32bit then "32" else "64";
+    in
+    [
+      "--buildtype" "release"
+      "--prefix" "${placeholder "out"}"
+    ]
+    ++ lib.optionals isCross [ "--cross-file" "build-win${arch}.txt" ]
+    ++ lib.optional glfwSupport "-Ddxvk_native_wsi=glfw";
+
+  doCheck = isDxvk2 && !isCross;
+
+  passthru = lib.optionalAttrs (lib.versionAtLeast finalAttrs.version "2.0") {
+    updateScript = gitUpdater {
+      rev-prefix = "v";
+    };
+  };
+
+  meta = {
+    description = "A Vulkan-based translation layer for Direct3D 9/10/11";
+    homepage = "https://github.com/doitsujin/dxvk";
+    changelog = "https://github.com/doitsujin/dxvk/releases";
+    maintainers = [ lib.maintainers.reckenrode ];
+    license = lib.licenses.zlib;
+    platforms = lib.platforms.windows ++ lib.optionals isDxvk2 lib.platforms.linux;
+  };
+})
diff --git a/nixpkgs/pkgs/misc/dxvk/setup_dxvk.sh b/nixpkgs/pkgs/misc/dxvk/setup_dxvk.sh
new file mode 100644
index 000000000000..4926acd3ba89
--- /dev/null
+++ b/nixpkgs/pkgs/misc/dxvk/setup_dxvk.sh
@@ -0,0 +1,266 @@
+#!@bash@/bin/bash -e
+
+set -eu -o pipefail
+
+# shellcheck disable=SC2034
+{
+    dxvk32_dir=@dxvk32@/bin
+    dxvk64_dir=@dxvk64@/bin
+
+    mcfgthreads32_dir=@mcfgthreads32@/bin
+    mcfgthreads64_dir=@mcfgthreads64@/bin
+}
+
+## Defaults
+
+declare -A dlls=(
+    [d3d9]="dxvk/d3d9.dll"
+    [d3d10]="dxvk/d3d10.dll dxvk/d3d10_1.dll dxvk/d3d10core.dll"
+    [d3d11]="dxvk/d3d11.dll"
+    [dxgi]="dxvk/dxgi.dll"
+    [mcfgthreads]="mcfgthreads/mcfgthread-12.dll"
+)
+
+declare -A targets=([d3d9]=1 [d3d11]=1 [dxgi]=1 [mcfgthreads]=1)
+
+## Command-line Parsing
+
+usage() {
+    echo "DXVK @version@"
+    echo "Set up Wine prefix with DXVK DLLs"
+    echo
+    echo "USAGE"
+    echo "    $0 [install|uninstall] [OPTIONS]"
+    echo
+    echo "COMMANDS"
+    echo "    install                  Copy the DXVK DLLs into the prefix"
+    echo "    uninstall                Restore the backed up Wine DLLs in the prefix"
+    echo
+    echo "OPTIONS"
+    echo "    --with(out)-dxgi         Copy DXVK DXGI DLL into prefix (default: with DXGI)"
+    echo "    --with(out)-d3d10        Copy D3D10 DLLs into prefix (default: without D3D10)"
+    echo "    -s, --symlink            Symlink instead of copy"
+    echo "    -f, --force              Create a Wine prefix even if it does not exist"
+    echo "    -p, --prefix <PREFIX>    Wine prefix to manage (default: \$WINEPREFIX)"
+    exit 1
+}
+
+case "${1:-}" in
+    uninstall|install)
+        action=$1
+        shift
+        ;;
+    -h|--help)
+        usage
+        ;;
+    *)
+        if [ -n "${1:-}" ]; then
+            echo "Unrecognized command: $1"
+        fi
+        usage
+        ;;
+esac
+
+
+do_symlink=false
+do_makeprefix=false
+
+while [ -n "${1:-}" ]; do
+    case "$1" in
+        --with-dxgi)
+            targets[dxgi]=1
+            ;;
+        --without-dxgi)
+            unset "targets[dxgi]"
+            ;;
+        --with-d3d10)
+            targets[d3d10]=1
+            ;;
+        --without-d3d10)
+            unset "targets[d3d10]"
+            ;;
+        -s|--symlink)
+            do_symlink=true
+            ;;
+        --no-symlink)
+            do_symlink=false
+            ;;
+        -f|--force)
+            do_makeprefix=true
+            ;;
+        --no-force)
+            do_makeprefix=false
+            ;;
+        -p|--prefix)
+            shift
+            if [ -n "${1:-}" ]; then
+                WINEPREFIX=$1
+            else
+                echo "Required PREFIX missing"
+                usage
+            fi
+            ;;
+        -h|--help)
+            usage
+            ;;
+        *)
+            echo "Unrecognized option: $1"
+            usage
+            ;;
+    esac
+    shift
+done
+
+## Get information on the Wine environment
+
+export WINEPREFIX=${WINEPREFIX:-"$HOME/.wine"}
+
+# check wine prefix before invoking wine, so that we
+# don't accidentally create one if the user screws up
+if ! $do_makeprefix && [ -n "$WINEPREFIX" ] && ! [ -f "$WINEPREFIX/system.reg" ]; then
+    echo "$WINEPREFIX: Not a valid wine prefix." >&2
+    exit 1
+fi
+
+export WINEDEBUG=-all
+# disable mscoree and mshtml to avoid downloading
+# wine gecko and mono
+export WINEDLLOVERRIDES="mscoree,mshtml="
+
+wine="wine"
+wine64="wine64"
+wineboot="wineboot"
+
+# $PATH is the way for user to control where wine is located (including custom Wine versions).
+# Pure 64-bit Wine (non Wow64) requries skipping 32-bit steps.
+# In such case, wine64 and winebooot will be present, but wine binary will be missing,
+# however it can be present in other PATHs, so it shouldn't be used, to avoid versions mixing.
+wine_path=$(dirname "$(command -v $wineboot)")
+wow64=true
+if ! [ -f "$wine_path/$wine" ]; then
+   wine=$wine64
+   wow64=false
+fi
+
+# resolve 32-bit and 64-bit system32 path
+winever=$($wine --version | grep wine)
+if [ -z "$winever" ]; then
+    echo "$wine: Not a wine executable. Check your $wine." >&2
+    exit 1
+fi
+
+# ensure wine placeholder dlls are recreated
+# if they are missing
+$wineboot -u
+
+win64_sys_path=$($wine64 winepath -u 'C:\windows\system32' 2> /dev/null)
+win64_sys_path="${win64_sys_path/$'\r'/}"
+if $wow64; then
+  win32_sys_path=$($wine winepath -u 'C:\windows\system32' 2> /dev/null)
+  win32_sys_path="${win32_sys_path/$'\r'/}"
+fi
+
+if [ -z "${win32_sys_path:-}" ] && [ -z "${win64_sys_path:-}" ]; then
+  echo 'Failed to resolve C:\windows\system32.' >&2
+  exit 1
+fi
+
+## Utility functions
+
+install_file() {
+    $do_symlink && file_cmd="ln -sv" || file_cmd="install -m 755 -v"
+
+    srcfile=$1
+    dstfile=$2
+
+    if [ -f "${srcfile}.so" ]; then
+        srcfile="${srcfile}.so"
+    fi
+
+    if ! [ -f "${srcfile}" ]; then
+        echo "${srcfile}: File not found. Skipping." >&2
+        return 1
+    fi
+
+    if [ -n "$1" ]; then
+        if [ -f "${dstfile}" ] || [ -h "${dstfile}" ]; then
+            if ! [ -f "${dstfile}.old" ]; then
+                mv -v "${dstfile}" "${dstfile}.old"
+            else
+                rm -v "${dstfile}"
+            fi
+        fi
+        $file_cmd "${srcfile}" "${dstfile}"
+    else
+        echo "${dstfile}: File not found in wine prefix" >&2
+        return 1
+    fi
+}
+
+uninstall_file() {
+    srcfile=$1
+    dstfile=$2
+
+    if [ -f "${srcfile}.so" ]; then
+        srcfile="${srcfile}.so"
+    fi
+
+    if ! [ -f "${srcfile}" ]; then
+        echo "${srcfile}: File not found. Skipping." >&2
+        return 1
+    fi
+
+    if ! [ -f "${dstfile}" ] && ! [ -h "${dstfile}" ]; then
+        echo "${dstfile}: File not found. Skipping." >&2
+        return 1
+    fi
+
+    if [ -f "${dstfile}.old" ]; then
+        rm -v "${dstfile}"
+        mv -v "${dstfile}.old" "${dstfile}"
+        return 0
+    else
+        return 1
+    fi
+}
+
+install_override() {
+    dll=$(basename "$1")
+    if ! $wine reg add 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v "$dll" /d native /f >/dev/null 2>&1; then
+        echo -e "Failed to add override for $dll"
+        exit 1
+    fi
+}
+
+uninstall_override() {
+    dll=$(basename "$1")
+    if ! $wine reg delete 'HKEY_CURRENT_USER\Software\Wine\DllOverrides' /v "$dll" /f > /dev/null 2>&1; then
+        echo "Failed to remove override for $dll"
+    fi
+}
+
+## Perform the requested command
+
+declare -A paths
+
+for target in "${!targets[@]}"; do
+    [ "${targets[$target]}" -eq 1 ] || continue
+    for dll in ${dlls[$target]}; do
+        dllname=$(basename "$dll")
+        basedir=$(dirname "$dll")
+
+        if [ -n "${win32_sys_path:-}" ]; then
+            basedir32=${basedir}32_dir
+            paths["${!basedir32}/$dllname"]="$win32_sys_path/$dllname"
+        fi
+        if [ -n "${win64_sys_path:-}" ]; then
+            basedir64=${basedir}64_dir
+            paths["${!basedir64}/$dllname"]="$win64_sys_path/$dllname"
+        fi
+    done
+done
+
+for srcpath in "${!paths[@]}"; do
+    "${action}_file" "$srcpath" "${paths["$srcpath"]}"
+    "${action}_override" "$(basename "$srcpath" .dll)"
+done
diff --git a/nixpkgs/pkgs/misc/fastly/default.nix b/nixpkgs/pkgs/misc/fastly/default.nix
new file mode 100644
index 000000000000..261c06dd2e24
--- /dev/null
+++ b/nixpkgs/pkgs/misc/fastly/default.nix
@@ -0,0 +1,82 @@
+{ lib
+, fetchurl
+, fetchFromGitHub
+, installShellFiles
+, buildGoModule
+, go
+, makeWrapper
+, viceroy
+}:
+
+buildGoModule rec {
+  pname = "fastly";
+  version = "10.2.4";
+
+  src = fetchFromGitHub {
+    owner = "fastly";
+    repo = "cli";
+    rev = "refs/tags/v${version}";
+    hash = "sha256-4N2Eo6InqdK5CFhHp8X3+1xKA99Wtnj2Q0/GDglWoBc=";
+    # The git commit is part of the `fastly version` original output;
+    # leave that output the same in nixpkgs. Use the `.git` directory
+    # to retrieve the commit SHA, and remove the directory afterwards,
+    # since it is not needed after that.
+    leaveDotGit = true;
+    postFetch = ''
+      cd "$out"
+      git rev-parse --short HEAD > $out/COMMIT
+      find "$out" -name .git -print0 | xargs -0 rm -rf
+    '';
+  };
+
+  subPackages = [
+    "cmd/fastly"
+  ];
+
+  vendorHash = "sha256-IimrJZLaSkwWsqoVmNRyLhcME4y1YKw5xLayKxRj5lw=";
+
+  nativeBuildInputs = [
+    installShellFiles
+    makeWrapper
+  ];
+
+  # Flags as provided by the build automation of the project:
+  #   https://github.com/fastly/cli/blob/7844f9f54d56f8326962112b5534e5c40e91bf09/.goreleaser.yml#L14-L18
+  ldflags = [
+    "-s"
+    "-w"
+    "-X github.com/fastly/cli/pkg/revision.AppVersion=v${version}"
+    "-X github.com/fastly/cli/pkg/revision.Environment=release"
+    "-X github.com/fastly/cli/pkg/revision.GoHostOS=${go.GOHOSTOS}"
+    "-X github.com/fastly/cli/pkg/revision.GoHostArch=${go.GOHOSTARCH}"
+  ];
+  preBuild = let
+    cliConfigToml = fetchurl {
+      url = "https://web.archive.org/web/20230523192914/https://developer.fastly.com/api/internal/cli-config";
+      hash = "sha256-zgZ3m69dRvuc1S7hHeLxzrM/Z/u0PKUn0XbyQOYO3es=";
+    };
+  in ''
+    cp ${cliConfigToml} ./pkg/config/config.toml
+    ldflags+=" -X github.com/fastly/cli/pkg/revision.GitCommit=$(cat COMMIT)"
+  '';
+
+  preFixup = ''
+    wrapProgram $out/bin/fastly --prefix PATH : ${lib.makeBinPath [ viceroy ]} \
+      --set FASTLY_VICEROY_USE_PATH 1
+  '';
+
+  postInstall = ''
+    export HOME="$(mktemp -d)"
+    installShellCompletion --cmd fastly \
+      --bash <($out/bin/fastly --completion-script-bash) \
+      --zsh <($out/bin/fastly --completion-script-zsh)
+  '';
+
+  meta = with lib; {
+    description = "Command line tool for interacting with the Fastly API";
+    homepage = "https://github.com/fastly/cli";
+    changelog = "https://github.com/fastly/cli/blob/v${version}/CHANGELOG.md";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ ereslibre shyim ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/flashfocus/default.nix b/nixpkgs/pkgs/misc/flashfocus/default.nix
new file mode 100644
index 000000000000..d300711deb2a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/flashfocus/default.nix
@@ -0,0 +1,50 @@
+{ lib, python3, fetchPypi, netcat-openbsd, nix-update-script }:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "flashfocus";
+  version = "2.3.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-XT3CKJWn1uKnPPsJC+MWlEAd8sWdVTEXz5b3n0UUedY=";
+  };
+
+  postPatch = ''
+    substituteInPlace bin/nc_flash_window \
+      --replace "nc" "${lib.getExe netcat-openbsd}"
+  '';
+
+  nativeBuildInputs = with python3.pkgs; [
+    pythonRelaxDepsHook
+  ];
+
+  pythonRelaxDeps = [
+    "pyyaml"
+    "xcffib"
+  ];
+
+  propagatedBuildInputs = with python3.pkgs; [
+    i3ipc
+    xcffib
+    click
+    cffi
+    xpybutil
+    marshmallow
+    pyyaml
+  ];
+
+  # Tests require access to a X session
+  doCheck = false;
+
+  pythonImportsCheck = [ "flashfocus" ];
+
+  passthru.updateScript = nix-update-script { };
+
+  meta = with lib; {
+    homepage = "https://github.com/fennerm/flashfocus";
+    description = "Simple focus animations for tiling window managers";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ artturin ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/frescobaldi/default.nix b/nixpkgs/pkgs/misc/frescobaldi/default.nix
new file mode 100644
index 000000000000..57baeb7fe828
--- /dev/null
+++ b/nixpkgs/pkgs/misc/frescobaldi/default.nix
@@ -0,0 +1,61 @@
+{ lib, stdenv, buildPythonApplication, fetchFromGitHub, python3Packages, pyqtwebengine, lilypond }:
+
+buildPythonApplication rec {
+  pname = "frescobaldi";
+  version = "3.2";
+
+  src = fetchFromGitHub {
+    owner = "wbsoft";
+    repo = "frescobaldi";
+    rev = "v${version}";
+    sha256 = "sha256-q340ChF7VZcbLMW/nd1so7WScsPfbdeJUjTzsY5dkec=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    qpageview
+    lilypond
+    pygame
+    python-ly
+    sip_4
+    pyqt5
+    poppler-qt5
+    pyqtwebengine
+  ];
+
+  nativeBuildInputs = [ pyqtwebengine.wrapQtAppsHook ];
+
+  # Needed because source is fetched from git
+  preBuild = ''
+    make -C i18n
+    make -C linux
+  '';
+
+  # no tests in shipped with upstream
+  doCheck = false;
+
+  dontWrapQtApps = true;
+  makeWrapperArgs = [
+    "\${qtWrapperArgs[@]}"
+  ];
+
+  meta = with lib; {
+    homepage = "https://frescobaldi.org/";
+    description = "A LilyPond sheet music text editor";
+    longDescription = ''
+      Powerful text editor with syntax highlighting and automatic completion,
+      Music view with advanced Point & Click, Midi player to proof-listen
+      LilyPond-generated MIDI files, Midi capturing to enter music,
+      Powerful Score Wizard to quickly setup a music score, Snippet Manager
+      to store and apply text snippets, templates or scripts, Use multiple
+      versions of LilyPond, automatically selects the correct version, Built-in
+      LilyPond documentation browser and built-in User Guide, Smart
+      layout-control functions like coloring specific objects in the PDF,
+      MusicXML import, Modern user iterface with configurable colors,
+      fonts and keyboard shortcuts
+    '';
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ sepi ];
+    platforms = platforms.all;
+    broken = stdenv.isDarwin; # never built on Hydra https://hydra.nixos.org/job/nixpkgs/trunk/frescobaldi.x86_64-darwin
+  };
+}
diff --git a/nixpkgs/pkgs/misc/g810-led/default.nix b/nixpkgs/pkgs/misc/g810-led/default.nix
new file mode 100644
index 000000000000..0f38188c407d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/g810-led/default.nix
@@ -0,0 +1,51 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, hidapi
+, profile ? "/etc/g810-led/profile"
+}:
+
+stdenv.mkDerivation rec {
+  pname = "g810-led";
+  version = "0.4.3";
+
+  src = fetchFromGitHub {
+    owner = "MatMoul";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-GKHtQ7DinqfhclDdPO94KtTLQhhonAoWS4VOvs6CMhY=";
+  };
+
+  postPatch = ''
+    substituteInPlace udev/g810-led.rules \
+      --replace "/usr" $out \
+      --replace "/etc/g810-led/profile" "${profile}"
+  '';
+
+  buildInputs = [
+    hidapi
+  ];
+
+  installPhase = ''
+    runHook preInstall
+
+    install -D bin/g810-led $out/bin/g810-led
+
+    # See https://github.com/MatMoul/g810-led#compatible-keyboards-
+    for keyboard in {g213,g410,g413,g512,g513,g610,g815,g910,gpro}; do
+      ln -s \./g810-led $out/bin/$keyboard-led
+    done
+
+    install -D udev/g810-led.rules $out/etc/udev/rules.d/90-g810-led.rules
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Linux LED controller for some Logitech G Keyboards";
+    homepage = "https://github.com/MatMoul/g810-led";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ fab ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/ghostscript/default.nix b/nixpkgs/pkgs/misc/ghostscript/default.nix
new file mode 100644
index 000000000000..e66b44bad0cb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ghostscript/default.nix
@@ -0,0 +1,193 @@
+{ config
+, stdenv
+, lib
+, fetchurl
+, pkg-config
+, zlib
+, expat
+, openssl
+, autoconf
+, libjpeg
+, libpng
+, libtiff
+, freetype
+, fontconfig
+, libpaper
+, jbig2dec
+, libiconv
+, ijs
+, lcms2
+, callPackage
+, bash
+, buildPackages
+, openjpeg
+, cupsSupport ? config.ghostscript.cups or (!stdenv.isDarwin)
+, cups
+, x11Support ? cupsSupport
+, xorg # with CUPS, X11 only adds very little
+, dynamicDrivers ? true
+
+# for passthru.tests
+, graphicsmagick
+, imagemagick
+, libspectre
+, lilypond
+, pstoedit
+, python3
+}:
+
+let
+  fonts = stdenv.mkDerivation {
+    name = "ghostscript-fonts";
+
+    srcs = [
+      (fetchurl {
+        url = "mirror://sourceforge/gs-fonts/ghostscript-fonts-std-8.11.tar.gz";
+        sha256 = "00f4l10xd826kak51wsmaz69szzm2wp8a41jasr4jblz25bg7dhf";
+      })
+      (fetchurl {
+        url = "mirror://gnu/ghostscript/gnu-gs-fonts-other-6.0.tar.gz";
+        sha256 = "1cxaah3r52qq152bbkiyj2f7dx1rf38vsihlhjmrvzlr8v6cqil1";
+      })
+      # ... add other fonts here
+    ];
+
+    installPhase = ''
+      mkdir "$out"
+      mv -v * "$out/"
+    '';
+  };
+
+in
+stdenv.mkDerivation rec {
+  pname = "ghostscript${lib.optionalString x11Support "-with-X"}";
+  version = "10.01.2";
+
+  src = fetchurl {
+    url = "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/download/gs${lib.replaceStrings ["."] [""] version}/ghostscript-${version}.tar.xz";
+    hash = "sha512-7iDw4S9VOj0EV45xoNRd7+vHERfOTcLBQEOYW/5zSK1/iy/pj8m09bk17LMuUNw0C+Z9bvWBkFQuxtD52h3jgA==";
+  };
+
+  patches = [
+    ./urw-font-files.patch
+    ./doc-no-ref.diff
+  ];
+
+  outputs = [ "out" "man" "doc" ];
+
+  enableParallelBuilding = true;
+
+  depsBuildBuild = [
+    buildPackages.stdenv.cc
+  ];
+
+  nativeBuildInputs = [ pkg-config autoconf zlib ]
+    ++ lib.optional cupsSupport cups;
+
+  buildInputs = [
+    zlib expat openssl
+    libjpeg libpng libtiff freetype fontconfig libpaper jbig2dec
+    libiconv ijs lcms2 bash openjpeg
+  ]
+  ++ lib.optionals x11Support [ xorg.libICE xorg.libX11 xorg.libXext xorg.libXt ]
+  ++ lib.optional cupsSupport cups
+  ;
+
+  preConfigure = ''
+    # https://ghostscript.com/doc/current/Make.htm
+    export CCAUX=$CC_FOR_BUILD
+    ${lib.optionalString cupsSupport ''export CUPSCONFIG="${cups.dev}/bin/cups-config"''}
+
+    rm -rf jpeg libpng zlib jasper expat tiff lcms2mt jbig2dec freetype cups/libs ijs openjpeg
+
+    sed "s@if ( test -f \$(INCLUDE)[^ ]* )@if ( true )@; s@INCLUDE=/usr/include@INCLUDE=/no-such-path@" -i base/unix-aux.mak
+    sed "s@^ZLIBDIR=.*@ZLIBDIR=${zlib.dev}/include@" -i configure.ac
+
+    autoconf
+  '';
+
+  configureFlags = [
+    "--with-system-libtiff"
+    "--without-tesseract"
+  ] ++ lib.optionals dynamicDrivers [
+    "--enable-dynamic"
+    "--disable-hidden-visibility"
+  ] ++ lib.optionals x11Support [
+    "--with-x"
+  ] ++ lib.optionals cupsSupport [
+    "--enable-cups"
+  ];
+
+  # make check does nothing useful
+  doCheck = false;
+
+  # don't build/install statically linked bin/gs
+  buildFlags = [ "so" ];
+  installTargets = [ "soinstall" ];
+
+  postInstall = ''
+    ln -s gsc "$out"/bin/gs
+
+    cp -r Resource "$out/share/ghostscript/${version}"
+
+    ln -s "${fonts}" "$out/share/ghostscript/fonts"
+  '' + lib.optionalString stdenv.isDarwin ''
+    for file in $out/lib/*.dylib* ; do
+      install_name_tool -id "$file" $file
+    done
+  '';
+
+  # dynamic library name only contains maj.min, eg. '9.53'
+  dylib_version = lib.versions.majorMinor version;
+  preFixup = lib.optionalString stdenv.isDarwin ''
+    install_name_tool -change libgs.dylib.$dylib_version $out/lib/libgs.dylib.$dylib_version $out/bin/gs
+    install_name_tool -change libgs.dylib.$dylib_version $out/lib/libgs.dylib.$dylib_version $out/bin/gsx
+  '';
+
+  # validate dynamic linkage
+  doInstallCheck = true;
+  installCheckPhase = ''
+    runHook preInstallCheck
+
+    $out/bin/gs --version
+    $out/bin/gsx --version
+    pushd examples
+    for f in *.{ps,eps,pdf}; do
+      echo "Rendering $f"
+      $out/bin/gs \
+        -dNOPAUSE \
+        -dBATCH \
+        -sDEVICE=bitcmyk \
+        -sOutputFile=/dev/null \
+        -r600 \
+        -dBufferSpace=100000 \
+        $f
+    done
+    popd # examples
+
+    runHook postInstallCheck
+  '';
+
+  passthru.tests = {
+    test-corpus-render = callPackage ./test-corpus-render.nix {};
+    inherit graphicsmagick imagemagick libspectre lilypond pstoedit;
+    inherit (python3.pkgs) matplotlib;
+  };
+
+  meta = {
+    homepage = "https://www.ghostscript.com/";
+    description = "PostScript interpreter (mainline version)";
+    longDescription = ''
+      Ghostscript is the name of a set of tools that provides (i) an
+      interpreter for the PostScript language and the PDF file format,
+      (ii) a set of C procedures (the Ghostscript library) that
+      implement the graphics capabilities that appear as primitive
+      operations in the PostScript language, and (iii) a wide variety
+      of output drivers for various file formats and printers.
+    '';
+    license = lib.licenses.agpl3;
+    platforms = lib.platforms.all;
+    maintainers = [ lib.maintainers.viric ];
+    mainProgram = "gs";
+  };
+}
diff --git a/nixpkgs/pkgs/misc/ghostscript/doc-no-ref.diff b/nixpkgs/pkgs/misc/ghostscript/doc-no-ref.diff
new file mode 100644
index 000000000000..7380ba2f9953
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ghostscript/doc-no-ref.diff
@@ -0,0 +1,7 @@
+Kill the reference from libgc.so to the documentation directory.
+It's bad for closure, and probably not really good for anything.
+--- a/base/gs.mak
++++ b/base/gs.mak
+@@ -538,1 +538,1 @@
+-	$(EXP)$(ECHOGS_XE) -a $(gconfigd_h) -x 23 define -s -u GS_DOCDIR -x 2022 $(GS_DOCDIR) -x 22
++	$(EXP)$(ECHOGS_XE) -a $(gconfigd_h) -x 23 define -s -u GS_DOCDIR -x 2022 /no-path-to-docs -x 22
diff --git a/nixpkgs/pkgs/misc/ghostscript/test-corpus-render.nix b/nixpkgs/pkgs/misc/ghostscript/test-corpus-render.nix
new file mode 100644
index 000000000000..26cad916e209
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ghostscript/test-corpus-render.nix
@@ -0,0 +1,37 @@
+{ stdenv
+, fetchgit
+, ghostscript
+}:
+
+stdenv.mkDerivation {
+  pname = "ghostscript-test-corpus-render";
+  version = "unstable-2022-12-01";
+
+  src = fetchgit {
+    url = "git://git.ghostscript.com/tests.git";
+    rev = "e81c3a1d7c679aab8230e9152165d8cffb687242";
+    hash = "sha256-h+UHpCHASYOhf4xG6gkVJK9TEG85kE3jNx5cD1I3LQg=";
+  };
+
+  dontConfigure = true;
+  dontBuild = true;
+
+  doCheck = true;
+  checkPhase = ''
+    find . -iregex '.*\.\(ps\|eps\|pdf\)' | while read f; do
+      echo "Rendering $f"
+      ${ghostscript}/bin/gs \
+        -dNOPAUSE \
+        -dBATCH \
+        -sDEVICE=bitcmyk \
+        -sOutputFile=/dev/null \
+        -r600 \
+        -dBufferSpace=100000 \
+        $f
+    done
+  '';
+
+  installPhase = ''
+    touch $out
+  '';
+}
diff --git a/nixpkgs/pkgs/misc/ghostscript/urw-font-files.patch b/nixpkgs/pkgs/misc/ghostscript/urw-font-files.patch
new file mode 100644
index 000000000000..9a4aab0bbbef
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ghostscript/urw-font-files.patch
@@ -0,0 +1,61 @@
+Sometime between 8.62 and 8.64, the fontmap file was changed such that the
+`.pfb' files of the URW++ fonts no longer appear in 8.64, making it impossible
+to display/render these fonts.
+
+--- gnu-ghostscript-8.64/Resource/Init/Fontmap.GS	2009-05-27 02:19:02.000000000 +0200
++++ gnu-ghostscript-8.62/Resource/Init/Fontmap.GS	2009-05-27 02:19:09.000000000 +0200
+@@ -81,6 +81,54 @@
+ %	Copyright URW Software, Copyright 1994 by URW.
+ %
+ 
++% Actual fonts
++
++/URWBookmanL-DemiBold	(b018015l.pfb)	;
++/URWBookmanL-DemiBoldItal	(b018035l.pfb)	;
++/URWBookmanL-Ligh	(b018012l.pfb)	;
++/URWBookmanL-LighItal	(b018032l.pfb)	;
++
++/NimbusMonL-Regu	(n022003l.pfb)	;
++/NimbusMonL-ReguObli	(n022023l.pfb)	;
++/NimbusMonL-Bold	(n022004l.pfb)	;
++/NimbusMonL-BoldObli	(n022024l.pfb)	;
++
++/URWGothicL-Book	(a010013l.pfb)	;
++/URWGothicL-BookObli	(a010033l.pfb)	;
++/URWGothicL-Demi	(a010015l.pfb)	;
++/URWGothicL-DemiObli	(a010035l.pfb)	;
++
++/NimbusSanL-Regu	(n019003l.pfb)	;
++/NimbusSanL-ReguItal	(n019023l.pfb)	;
++/NimbusSanL-Bold	(n019004l.pfb)	;
++/NimbusSanL-BoldItal	(n019024l.pfb)	;
++
++/NimbusSanL-ReguCond	(n019043l.pfb)	;
++/NimbusSanL-ReguCondItal	(n019063l.pfb)	;
++/NimbusSanL-BoldCond	(n019044l.pfb)	;
++/NimbusSanL-BoldCondItal	(n019064l.pfb)	;
++
++/URWPalladioL-Roma	(p052003l.pfb)	;
++/URWPalladioL-Ital	(p052023l.pfb)	;
++/URWPalladioL-Bold	(p052004l.pfb)	;
++/URWPalladioL-BoldItal	(p052024l.pfb)	;
++
++/CenturySchL-Roma	(c059013l.pfb)	;
++/CenturySchL-Ital	(c059033l.pfb)	;
++/CenturySchL-Bold	(c059016l.pfb)	;
++/CenturySchL-BoldItal	(c059036l.pfb)	;
++
++/NimbusRomNo9L-Regu	(n021003l.pfb)	;
++/NimbusRomNo9L-ReguItal	(n021023l.pfb)	;
++/NimbusRomNo9L-Medi	(n021004l.pfb)	;
++/NimbusRomNo9L-MediItal	(n021024l.pfb)	;
++
++/StandardSymL	(s050000l.pfb)	;
++
++/URWChanceryL-MediItal	(z003034l.pfb)	;
++
++/Dingbats	(d050000l.pfb)	;
++
+ % Aliases
+ 
+ /Bookman-Demi			/URWBookmanL-DemiBold	;
diff --git a/nixpkgs/pkgs/misc/gnu-shepherd/default.nix b/nixpkgs/pkgs/misc/gnu-shepherd/default.nix
new file mode 100644
index 000000000000..66f47a8f6ffb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/gnu-shepherd/default.nix
@@ -0,0 +1,24 @@
+{ stdenv, lib, fetchurl, guile, pkg-config, guile-fibers }:
+
+stdenv.mkDerivation rec {
+  pname = "gnu-shepherd";
+  version = "0.9.3";
+
+  src = fetchurl {
+    url = "mirror://gnu/shepherd/shepherd-${version}.tar.gz";
+    sha256 = "0qy2yq13xhf05an5ilz7grighdxicx56211yaarqq5qigiiybc32";
+  };
+
+  configureFlags = [ "--localstatedir=/" ];
+
+  buildInputs = [ guile guile-fibers ];
+  nativeBuildInputs = [ pkg-config ];
+
+  meta = with lib; {
+    homepage = "https://www.gnu.org/software/shepherd/";
+    description = "Service manager that looks after the herd of system services";
+    license = with licenses; [ gpl3Plus ];
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ kloenk ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/gnuk/default.nix b/nixpkgs/pkgs/misc/gnuk/default.nix
new file mode 100644
index 000000000000..afef861c0dc4
--- /dev/null
+++ b/nixpkgs/pkgs/misc/gnuk/default.nix
@@ -0,0 +1,11 @@
+{ callPackage, fetchgit, ... } @ args:
+
+callPackage ./generic.nix (args // {
+  version = "1.2.14";
+
+  src = fetchgit {
+    url = "git://git.gniibe.org/gnuk/gnuk.git";
+    rev = "177ef67edfa2306c2a369a037362385c354083e1";
+    sha256 = "16wa3xsaq4r8caw6c24hnv4j78bklacix4in2y66j35h68ggr3j1";
+  };
+})
diff --git a/nixpkgs/pkgs/misc/gnuk/generic.nix b/nixpkgs/pkgs/misc/gnuk/generic.nix
new file mode 100644
index 000000000000..2556ff42308f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/gnuk/generic.nix
@@ -0,0 +1,52 @@
+{ lib, stdenv, gcc-arm-embedded, binutils-arm-embedded, makeWrapper
+, python3Packages
+
+# Extra options
+, device ? "fsij", vid ? "234b", pid ? "0000"
+
+# Version specific options
+, version, src
+, ...
+}:
+
+stdenv.mkDerivation {
+  pname = "gnuk-${device}";
+
+  inherit version src;
+
+  nativeBuildInputs = [ gcc-arm-embedded binutils-arm-embedded makeWrapper ];
+  buildInputs = with python3Packages; [ python pyusb colorama ];
+
+  configurePhase = ''
+    cd src
+    patchShebangs configure
+    ./configure --vidpid=${vid}:${pid}
+  '';
+
+  installPhase = ''
+    mkdir -p $out/bin
+
+    find . -name gnuk.bin -exec cp {} $out \;
+
+    #sed -i 's,Exception as e,IOError as e,' ../tool/stlinkv2.py
+    sed -i ../tool/stlinkv2.py \
+      -e "1a import array" \
+      -e "s,\(data_received =\) (),\1 array.array('B'),g" \
+      -e "s,\(data_received\) = data_received + \(.*\),\1.extend(\2),g"
+    cp ../tool/stlinkv2.py $out/bin/stlinkv2
+    wrapProgram $out/bin/stlinkv2 --prefix PYTHONPATH : "$PYTHONPATH"
+
+    # Some useful helpers
+    echo "#! ${stdenv.shell} -e" | tee $out/bin/{unlock,flash}
+    echo "$out/bin/stlinkv2 -u \$@" >> $out/bin/unlock
+    echo "$out/bin/stlinkv2 -b \$@ $out/gnuk.bin" >> $out/bin/flash
+    chmod +x $out/bin/{unlock,flash}
+  '';
+
+  meta = with lib; {
+    homepage = "https://www.fsij.org/doc-gnuk/";
+    description = "An implementation of USB cryptographic token for gpg";
+    license = licenses.gpl3;
+    platforms = with platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/hdt/default.nix b/nixpkgs/pkgs/misc/hdt/default.nix
new file mode 100644
index 000000000000..9e1efd5f836d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/hdt/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, libtool, pkg-config, zlib, serd }:
+
+stdenv.mkDerivation rec {
+  pname = "hdt";
+  version = "1.3.3";
+
+  src = fetchFromGitHub {
+    owner = "rdfhdt";
+    repo = "hdt-cpp";
+    rev = "v${version}";
+    sha256 = "1vsq80jnix6cy78ayag7v8ajyw7h8dqyad1q6xkf2hzz3skvr34z";
+  };
+
+  buildInputs = [ zlib serd ];
+
+  nativeBuildInputs = [ autoreconfHook libtool pkg-config ];
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "http://www.rdfhdt.org/";
+    description = "Header Dictionary Triples (HDT) is a compression format for RDF data that can also be queried for Triple Patterns";
+    license = licenses.lgpl21;
+    platforms = platforms.linux;
+    maintainers = [ maintainers.koslambrou ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/i3a/default.nix b/nixpkgs/pkgs/misc/i3a/default.nix
new file mode 100644
index 000000000000..5bfc2c5c4a39
--- /dev/null
+++ b/nixpkgs/pkgs/misc/i3a/default.nix
@@ -0,0 +1,29 @@
+{ lib, python3Packages, fetchPypi }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "i3a";
+  version = "2.0.1";
+
+  src = fetchPypi {
+    inherit pname version;
+    hash = "sha256-2k1HYtgJ76qXLvX6RmOSKtMMg+K722n8U9YmBANvQvE=";
+  };
+
+  postPatch = ''
+    substituteInPlace setup.py \
+      --replace "python_requires='>=3.7,<3.10'," "python_requires='>=3.7',"
+  '';
+
+  nativeBuildInputs = [ python3Packages.setuptools-scm ];
+
+  propagatedBuildInputs = [ python3Packages.i3ipc ];
+
+  doCheck = false;
+
+  meta = with lib; {
+    homepage = "https://git.goral.net.pl/mgoral/i3a";
+    description = "A set of scripts used for automation of i3 and sway window manager layouts";
+    license = licenses.gpl3Plus;
+    maintainers = with maintainers; [ fortuneteller2k ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/ite-backlight/default.nix b/nixpkgs/pkgs/misc/ite-backlight/default.nix
new file mode 100644
index 000000000000..aa53ecabff34
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ite-backlight/default.nix
@@ -0,0 +1,47 @@
+{ lib
+, pkgs
+, stdenv
+, ninja
+, libusb1
+, meson
+, boost
+, fetchFromGitHub
+, pkg-config
+, microsoft-gsl
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ite-backlight";
+  version = "1.1";
+
+  src = fetchFromGitHub {
+    owner = "hexagonal-sun";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1hany4bn93mac9qyz97r1l858d48zdvvmn3mabzr3441ivqr9j0a";
+  };
+
+  nativeBuildInputs = [
+    ninja
+    pkg-config
+    meson
+    microsoft-gsl
+  ];
+
+  buildInputs = [
+    boost
+    libusb1
+  ];
+
+  meta = with lib; {
+    description = "Commands to control ite-backlight devices";
+    longDescription = ''
+      This project aims to provide a set of simple utilities for controlling ITE 8291
+      keyboard backlight controllers.
+    '';
+    license = with licenses; [ mit ];
+    homepage = "https://github.com/hexagonal-sun/ite-backlight";
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ hexagonal-sun ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/jackaudio/default.nix b/nixpkgs/pkgs/misc/jackaudio/default.nix
new file mode 100644
index 000000000000..7c85da21f7f3
--- /dev/null
+++ b/nixpkgs/pkgs/misc/jackaudio/default.nix
@@ -0,0 +1,84 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, python3Packages, makeWrapper
+, bash, libsamplerate, libsndfile, readline, eigen, celt
+, wafHook
+# Darwin Dependencies
+, aften, AudioUnit, CoreAudio, libobjc, Accelerate
+
+# Optional Dependencies
+, dbus ? null, libffado ? null, alsa-lib ? null
+, libopus ? null
+
+# Extra options
+, prefix ? ""
+
+, testers
+}:
+
+let
+  inherit (python3Packages) python dbus-python;
+  shouldUsePkg = pkg: if pkg != null && lib.meta.availableOn stdenv.hostPlatform pkg then pkg else null;
+
+  libOnly = prefix == "lib";
+
+  optDbus = if stdenv.isDarwin then null else shouldUsePkg dbus;
+  optPythonDBus = if libOnly then null else shouldUsePkg dbus-python;
+  optLibffado = if libOnly then null else shouldUsePkg libffado;
+  optAlsaLib = if libOnly then null else shouldUsePkg alsa-lib;
+  optLibopus = shouldUsePkg libopus;
+in
+stdenv.mkDerivation (finalAttrs: {
+  pname = "${prefix}jack2";
+  version = "1.9.19";
+
+  src = fetchFromGitHub {
+    owner = "jackaudio";
+    repo = "jack2";
+    rev = "v${finalAttrs.version}";
+    sha256 = "01s8i64qczxqawgrzrw19asaqmcspf5l2h3203xzg56wnnhhzcw7";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ pkg-config python makeWrapper wafHook ];
+  buildInputs = [ libsamplerate libsndfile readline eigen celt
+    optDbus optPythonDBus optLibffado optAlsaLib optLibopus
+  ] ++ lib.optionals stdenv.isDarwin [
+    aften AudioUnit CoreAudio Accelerate libobjc
+  ];
+
+  prePatch = ''
+    substituteInPlace svnversion_regenerate.sh \
+        --replace /bin/bash ${bash}/bin/bash
+  '';
+
+  dontAddWafCrossFlags = true;
+  wafConfigureFlags = [
+    "--classic"
+    "--autostart=${if (optDbus != null) then "dbus" else "classic"}"
+  ] ++ lib.optional (optDbus != null) "--dbus"
+    ++ lib.optional (optLibffado != null) "--firewire"
+    ++ lib.optional (optAlsaLib != null) "--alsa";
+
+  postInstall = (if libOnly then ''
+    rm -rf $out/{bin,share}
+    rm -rf $out/lib/{jack,libjacknet*,libjackserver*}
+  '' else ''
+    wrapProgram $out/bin/jack_control --set PYTHONPATH $PYTHONPATH
+  '');
+
+  postFixup = ''
+    substituteInPlace "$dev/lib/pkgconfig/jack.pc" \
+      --replace "$out/include" "$dev/include"
+  '';
+
+  passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage;
+
+  meta = with lib; {
+    description = "JACK audio connection kit, version 2 with jackdbus";
+    homepage = "https://jackaudio.org";
+    license = licenses.gpl2Plus;
+    pkgConfigModules = [ "jack" ];
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ goibhniu ];
+  };
+})
diff --git a/nixpkgs/pkgs/misc/jackaudio/jack1.nix b/nixpkgs/pkgs/misc/jackaudio/jack1.nix
new file mode 100644
index 000000000000..4e7375a26916
--- /dev/null
+++ b/nixpkgs/pkgs/misc/jackaudio/jack1.nix
@@ -0,0 +1,45 @@
+{ lib, stdenv, fetchurl, pkg-config
+
+# Optional Dependencies
+, alsa-lib ? null, db ? null, libuuid ? null, libffado ? null, celt ? null
+
+, testers
+}:
+
+let
+  shouldUsePkg = pkg: if pkg != null && lib.meta.availableOn stdenv.hostPlatform pkg then pkg else null;
+
+  optAlsaLib = shouldUsePkg alsa-lib;
+  optDb = shouldUsePkg db;
+  optLibuuid = shouldUsePkg libuuid;
+  optLibffado = shouldUsePkg libffado;
+  optCelt = shouldUsePkg celt;
+in
+stdenv.mkDerivation (finalAttrs: {
+  pname = "jack1";
+  version = "0.125.0";
+
+  src = fetchurl {
+    url = "https://jackaudio.org/downloads/jack-audio-connection-kit-${finalAttrs.version}.tar.gz";
+    sha256 = "0i6l25dmfk2ji2lrakqq9icnwjxklgcjzzk65dmsff91z2zva5rm";
+  };
+
+  configureFlags = [
+    (lib.enableFeature (optLibffado != null) "firewire")
+  ];
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ optAlsaLib optDb optLibffado optCelt ];
+  propagatedBuildInputs = [ optLibuuid ];
+
+  passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage;
+
+  meta = with lib; {
+    broken = stdenv.isDarwin;
+    description = "JACK audio connection kit";
+    homepage = "https://jackaudio.org";
+    license = with licenses; [ gpl2 lgpl21 ];
+    pkgConfigModules = [ "jack" ];
+    platforms = platforms.unix;
+  };
+})
diff --git a/nixpkgs/pkgs/misc/jitsi-meet-prosody/default.nix b/nixpkgs/pkgs/misc/jitsi-meet-prosody/default.nix
new file mode 100644
index 000000000000..7d00c7586e09
--- /dev/null
+++ b/nixpkgs/pkgs/misc/jitsi-meet-prosody/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchurl, dpkg, nixosTests }:
+
+stdenv.mkDerivation rec {
+  pname = "jitsi-meet-prosody";
+  version = "1.0.6943";
+  src = fetchurl {
+    url = "https://download.jitsi.org/stable/${pname}_${version}-1_all.deb";
+    sha256 = "MrLRA0XdaDWD7frh4XDXLTcjsAYWal5qwT5C6cq4MKc=";
+  };
+
+  dontBuild = true;
+
+  unpackCmd = "${dpkg}/bin/dpkg-deb -x $src debcontents";
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/share
+    mv usr/share/jitsi-meet/prosody-plugins $out/share/
+    runHook postInstall
+  '';
+
+  passthru.tests = {
+    single-node-smoke-test = nixosTests.jitsi-meet;
+  };
+
+  passthru.updateScript = ./update.sh;
+
+  meta = with lib; {
+    description = "Prosody configuration for Jitsi Meet";
+    longDescription = ''
+        This package contains configuration for Prosody to be used with Jitsi Meet.
+    '';
+    homepage = "https://github.com/jitsi/jitsi-meet/";
+    license = licenses.asl20;
+    maintainers = teams.jitsi.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/jitsi-meet-prosody/update.sh b/nixpkgs/pkgs/misc/jitsi-meet-prosody/update.sh
new file mode 100755
index 000000000000..3c3695b1f6ad
--- /dev/null
+++ b/nixpkgs/pkgs/misc/jitsi-meet-prosody/update.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p curl pup common-updater-scripts
+
+set -eu -o pipefail
+
+version="$(curl https://download.jitsi.org/stable/ | \
+    pup 'a[href] text{}' | \
+    awk -F'[_-]' '/jitsi-meet-prosody/ {printf $4"\n"}' | \
+    sort -Vu | \
+    tail -n 1)"
+
+update-source-version jitsi-meet-prosody "$version"
diff --git a/nixpkgs/pkgs/misc/lguf-brightness/default.nix b/nixpkgs/pkgs/misc/lguf-brightness/default.nix
new file mode 100644
index 000000000000..0bb288c21763
--- /dev/null
+++ b/nixpkgs/pkgs/misc/lguf-brightness/default.nix
@@ -0,0 +1,31 @@
+{ lib, stdenv, fetchFromGitHub, cmake, libusb1, ncurses5 }:
+
+stdenv.mkDerivation rec {
+  pname = "lguf-brightness";
+
+  version = "unstable-2018-02-11";
+
+  src = fetchFromGitHub  {
+    owner = "periklis";
+    repo = pname;
+    rev = "fcb2bc1738d55c83b6395c24edc27267a520a725";
+    sha256 = "0cf7cn2kpmlvz00qxqj1m5zxmh7i2x75djbj4wqk7if7a0nlrd5m";
+  };
+
+  nativeBuildInputs = [ cmake ];
+
+  buildInputs = [ libusb1 ncurses5 ];
+
+  installPhase = ''
+    install -D lguf_brightness $out/bin/lguf_brightness
+  '';
+
+  meta = with lib; {
+    description = "Adjust brightness for LG UltraFine 4K display (cross platform)";
+    homepage = "https://github.com/periklis/lguf-brightness";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ periklis ];
+    mainProgram = "lguf_brightness";
+    platforms = with platforms; linux ++ darwin;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/libcardiacarrest/default.nix b/nixpkgs/pkgs/misc/libcardiacarrest/default.nix
new file mode 100644
index 000000000000..4139c5b0f13e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/libcardiacarrest/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, glib, libpulseaudio }:
+
+with lib;
+
+stdenv.mkDerivation rec {
+  pname = "libcardiacarrest";
+  version = "12.2.8"; # <PA API version>.<version>
+
+  src = fetchFromGitHub {
+    owner = "oxij";
+    repo = "libcardiacarrest";
+    rev = "d89639f5b2d298cf74af26880f5ebf50e645166d";
+    sha256 = "0vrigwcw3g8zknqyznv6y3437ahn1w00gv3d303smmygr0p8bd94";
+  };
+
+  outputs = [ "out" "dev" ];
+
+  nativeBuildInputs = [ pkg-config ];
+
+  buildInputs = [ glib ];
+
+  makeFlags = [ "PREFIX=$(out)" ];
+
+  postInstall = ''
+    moveToOutput $out/include $dev
+    moveToOutput $out/lib/pkgconfig $dev
+    moveToOutput $out/lib/cmake $dev
+  '';
+
+  meta = src.meta // {
+    description = "A trivial implementation of libpulse PulseAudio library API";
+    longDescription = ''
+      libcardiacarrest is a trivial implementation of libpulse
+      PulseAudio library API that unconditionally (but gracefully)
+      fails to connect to the PulseAudio daemon and does nothing else.
+
+      apulse and pressureaudio (which uses apulse internally) are an
+      inspiration for this but unlike those two projects
+      libcardiacarrest is not an emulation layer, all it does is it
+      gracefully fails to provide the requested PulseAudio service
+      hoping the application would try something else (e.g. ALSA or
+      JACK).
+    '';
+    license = libpulseaudio.meta.license; # "same as PA headers"
+    maintainers = [ maintainers.oxij ]; # also the author
+  };
+
+}
diff --git a/nixpkgs/pkgs/misc/lightspark/default.nix b/nixpkgs/pkgs/misc/lightspark/default.nix
new file mode 100644
index 000000000000..29baa653d3f1
--- /dev/null
+++ b/nixpkgs/pkgs/misc/lightspark/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, cmake, curl, zlib, ffmpeg, glew, pcre
+, rtmpdump, cairo, boost, SDL2, libjpeg, pango, xz, nasm, llvm, glibmm
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lightspark";
+  version = "0.8.7";
+
+  src = fetchFromGitHub {
+    owner = "lightspark";
+    repo = "lightspark";
+    rev = version;
+    hash = "sha256-qX/ft9slWTbvuSyi2jB6YC7D7QTtCybL/dTo1dJp3pQ=";
+  };
+
+  postPatch = ''
+    sed -i 's/SET(ETCDIR "\/etc")/SET(ETCDIR "etc")/g' CMakeLists.txt
+  '';
+
+  nativeBuildInputs = [ pkg-config cmake ];
+
+  buildInputs = [
+    curl zlib ffmpeg glew pcre rtmpdump cairo boost SDL2 libjpeg pango xz nasm
+    llvm glibmm
+  ];
+
+  meta = with lib; {
+    description = "Open source Flash Player implementation";
+    homepage = "https://lightspark.github.io/";
+    license = licenses.lgpl3Plus;
+    maintainers = with maintainers; [ jchw ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/lilypond/default.nix b/nixpkgs/pkgs/misc/lilypond/default.nix
new file mode 100644
index 000000000000..b9f59934efea
--- /dev/null
+++ b/nixpkgs/pkgs/misc/lilypond/default.nix
@@ -0,0 +1,70 @@
+{ stdenv, lib, fetchurl, ghostscript, gyre-fonts, texinfo, imagemagick, texi2html, guile_2_2
+, python3, gettext, flex, perl, bison, pkg-config, autoreconfHook, dblatex
+, fontconfig, freetype, pango, fontforge, help2man, zip, netpbm, groff
+, freefont_ttf, makeFontsConf
+, makeWrapper, t1utils, boehmgc, rsync
+, texlive, tex ? texlive.combine {
+    inherit (texlive) scheme-small lh metafont epsf fontinst;
+  }
+}:
+
+stdenv.mkDerivation rec {
+  pname = "lilypond";
+  version = "2.24.1";
+
+  src = fetchurl {
+    url = "http://lilypond.org/download/sources/v${lib.versions.majorMinor version}/lilypond-${version}.tar.gz";
+    sha256 = "sha256-1cWQh1ZKXNbwilK6gOfWUJuRxYXkQ4XcwPo5Jl0YFQk=";
+  };
+
+  postInstall = ''
+    for f in "$out/bin/"*; do
+        # Override default argv[0] setting so LilyPond can find
+        # its Scheme libraries.
+        wrapProgram "$f" --set GUILE_AUTO_COMPILE 0 \
+                         --set PATH "${ghostscript}/bin" \
+                         --argv0 "$f"
+    done
+  '';
+
+  configureFlags = [
+    "--disable-documentation"
+     # FIXME: these URW fonts are not OTF, configure reports "URW++ OTF files... no".
+    "--with-urwotf-dir=${ghostscript}/share/ghostscript/fonts"
+    "--with-texgyre-dir=${gyre-fonts}/share/fonts/truetype/"
+  ];
+
+  preConfigure = ''
+    sed -e "s@mem=mf2pt1@mem=$PWD/mf/mf2pt1@" -i scripts/build/mf2pt1.pl
+    export HOME=$TMPDIR/home
+  '';
+
+  nativeBuildInputs = [ autoreconfHook bison flex makeWrapper pkg-config ];
+
+  buildInputs =
+    [ ghostscript texinfo imagemagick texi2html guile_2_2 dblatex tex zip netpbm
+      python3 gettext perl fontconfig freetype pango
+      fontforge help2man groff t1utils boehmgc rsync
+    ];
+
+  autoreconfPhase = "NOCONFIGURE=1 sh autogen.sh";
+
+  enableParallelBuilding = true;
+
+  passthru.updateScript = {
+    command = [ ./update.sh ];
+    supportedFeatures = [ "commit" ];
+  };
+
+  meta = with lib; {
+    description = "Music typesetting system";
+    homepage = "http://lilypond.org/";
+    license = licenses.gpl3;
+    maintainers = with maintainers; [ marcweber yurrriq ];
+    platforms = platforms.all;
+  };
+
+  FONTCONFIG_FILE = lib.optional stdenv.isDarwin (makeFontsConf {
+    fontDirectories = [ freefont_ttf ];
+  });
+}
diff --git a/nixpkgs/pkgs/misc/lilypond/fonts.nix b/nixpkgs/pkgs/misc/lilypond/fonts.nix
new file mode 100644
index 000000000000..f1c80ad761b2
--- /dev/null
+++ b/nixpkgs/pkgs/misc/lilypond/fonts.nix
@@ -0,0 +1,134 @@
+{ lib, stdenv, fetchFromGitHub, lilypond }:
+
+let
+
+  olpFont = { fontName, rev, sha256, version ? rev, ... }:
+    stdenv.mkDerivation {
+      inherit version;
+      pname = "openlilypond-font-${fontName}";
+
+      src = fetchFromGitHub {
+        inherit rev sha256;
+        owner = "OpenLilyPondFonts";
+        repo = fontName;
+      };
+
+      installPhase = ''
+        local fontsdir="$out/share/lilypond/${lilypond.version}/fonts"
+
+        install -m755 -d "$fontsdir/otf"
+        for font in {otf,supplementary-fonts}/**.{o,t}tf; do
+          install -Dt "$fontsdir/otf" -m755 "$font"
+        done
+
+        install -m755 -d "$fontsdir/svg"
+        for font in svg/**.{svg,woff}; do
+          install -Dt "$fontsdir/svg" -m755 "$font"
+        done
+      '';
+
+      meta = with lib; {
+        inherit (lilypond.meta) homepage platforms;
+        description = "${fontName} font for LilyPond";
+        license = licenses.ofl;
+        maintainers = with maintainers; [ yurrriq ];
+      };
+    };
+
+in
+
+rec {
+  beethoven = olpFont {
+    fontName = "beethoven";
+    rev = "669f400";
+    sha256 = "17wdklg5shmqwnb7b81qavfg52v32wx5yf15c6al0hbvv1nqqj2i";
+  };
+  bravura = olpFont {
+    fontName = "bravura";
+    rev = "53c7744";
+    sha256 = "1p27w1c3bzxlnm6rzq8n7dbfjwbxqjy4r0fhkmk9jbm8awmzw214";
+  };
+  cadence = olpFont {
+    fontName = "cadence";
+    rev = "1cc0fb7";
+    sha256 = "1zxb3m8glh8iwj8mzcgyaxhlq0bji0rwniw702m70h9kpifiim1j";
+  };
+  gonville = olpFont {
+    fontName = "gonville";
+    rev = "a638bc9";
+    sha256 = "15khy9677crgd6bpajn7l1drysgxy49wiym3b248khgpavidwyy9";
+  };
+  gutenberg1939 = olpFont {
+    fontName = "gutenberg1939";
+    rev = "2316a35";
+    sha256 = "1lkhivmrx92z37zfrb5mkhzhwggyaga9cm0wl89r0n2f2kayyc7q";
+  };
+  haydn = olpFont {
+    fontName = "haydn";
+    rev = "9e7de8b";
+    sha256 = "1jmbhb2jm887sdc498l2jilpivq1d8lmmgdb8lp59lv8d9fx105z";
+  };
+  improviso = olpFont {
+    fontName = "improviso";
+    rev = "0753f5a";
+    sha256 = "1clin9c74gjhhira12mwxynxn4b1ixij5bg04mvk828lbr740mfm";
+  };
+  lilyboulez = olpFont {
+    fontName = "lilyboulez";
+    rev = "e8455fc";
+    sha256 = "0mq92x0rbgfb6s7ipgg2zcxika2si30w3ay89rp7m6vwca01649y";
+  };
+  lilyjazz = olpFont {
+    fontName = "lilyjazz";
+    rev = "8fa7d554";
+    sha256 = "1z7px7k2sn7snnj7yfjv0p9axwbn452vn9ww9icmb1249b0d1qry";
+  };
+  lv-goldenage = olpFont {
+    fontName = "lv-goldenage";
+    rev = "8a92fd3";
+    sha256 = "03nbd1vmlaj7wkhsnl2lq09nafv7zj1k518zs966vclzah94qghp";
+  };
+  paganini = olpFont {
+    fontName = "paganini";
+    rev = "8e4e55a";
+    sha256 = "0gw9wr4hfn205j40rpgnfddhzhn9x4pwfinamj5b7607880nvx29";
+  };
+  profondo = olpFont {
+    fontName = "profondo";
+    rev = "8cfb668";
+    sha256 = "0armwbg9y0l935949b7klngws6fq42fi944lws61qvjl61780br8";
+  };
+  ross = olpFont {
+    fontName = "ross";
+    rev = "aa8127f";
+    sha256 = "1w2x3pd1d1z4x0107dpq95v7m547cj4nkkzxgqpmzfqa0074idqd";
+  };
+  scorlatti = olpFont {
+    fontName = "scorlatti";
+    rev = "1db87da";
+    sha256 = "07jam5hwdy6bydrm98cdla6p6rl8lmy8zzsfq46i55l64l3w956h";
+  };
+  sebastiano = olpFont {
+    fontName = "sebastiano";
+    rev = "44bf262";
+    sha256 = "09i8p3p4z6vz69j187cpxvikkgc4pk6gxippahy0k7i7bh0d4qaj";
+  };
+
+  all = [
+    beethoven
+    bravura
+    cadence
+    gonville
+    gutenberg1939
+    haydn
+    improviso
+    lilyboulez
+    lilyjazz
+    lv-goldenage
+    paganini
+    profondo
+    ross
+    scorlatti
+    sebastiano
+  ];
+}
diff --git a/nixpkgs/pkgs/misc/lilypond/unstable.nix b/nixpkgs/pkgs/misc/lilypond/unstable.nix
new file mode 100644
index 000000000000..ff016344c7a4
--- /dev/null
+++ b/nixpkgs/pkgs/misc/lilypond/unstable.nix
@@ -0,0 +1,14 @@
+{ lib, fetchurl, lilypond }:
+
+lilypond.overrideAttrs (oldAttrs: rec {
+  version = "2.25.6";
+  src = fetchurl {
+    url = "https://lilypond.org/download/sources/v${lib.versions.majorMinor version}/lilypond-${version}.tar.gz";
+    sha256 = "sha256-auDkASJQgq4+Yc6jFvJ8rUvVRMn6ndr2Cd6yzK75irk=";
+  };
+
+  passthru.updateScript = {
+    command = [ ./update.sh "unstable" ];
+    supportedFeatures = [ "commit" ];
+  };
+})
diff --git a/nixpkgs/pkgs/misc/lilypond/update.sh b/nixpkgs/pkgs/misc/lilypond/update.sh
new file mode 100755
index 000000000000..e9c3f48805af
--- /dev/null
+++ b/nixpkgs/pkgs/misc/lilypond/update.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -I nixpkgs=./. -i bash -p curl gnused nix
+
+set -euo pipefail
+
+if [ $# -gt 0 ] && [ "$1" = "unstable" ]; then
+    ATTR="lilypond-unstable"
+    FILE="$(dirname "${BASH_SOURCE[@]}")/unstable.nix"
+    QUERY="VERSION_DEVEL="
+else
+    ATTR="lilypond"
+    FILE="$(dirname "${BASH_SOURCE[@]}")/default.nix"
+    QUERY="VERSION_STABLE="
+fi
+
+# update version
+PREV=$(nix eval --raw -f default.nix $ATTR.version)
+NEXT=$(curl -s 'https://gitlab.com/lilypond/lilypond/-/raw/master/VERSION' | grep "$QUERY" | cut -d= -f2)
+sed -i "s|$PREV|$NEXT|" "$FILE"
+echo "[{\"commitMessage\":\"$ATTR: $PREV -> $NEXT\"}]"
+
+# update hash
+PREV=$(nix eval --raw -f default.nix $ATTR.src.outputHash)
+NEXT=$(nix hash to-sri --type sha256 $(nix-prefetch-url --type sha256 $(nix eval --raw -f default.nix $ATTR.src.url)))
+sed -i "s|$PREV|$NEXT|" "$FILE"
diff --git a/nixpkgs/pkgs/misc/lilypond/with-fonts.nix b/nixpkgs/pkgs/misc/lilypond/with-fonts.nix
new file mode 100644
index 000000000000..2cfd1519795d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/lilypond/with-fonts.nix
@@ -0,0 +1,17 @@
+{ lib, symlinkJoin, makeWrapper
+, lilypond, openlilylib-fonts
+}:
+
+lib.appendToName "with-fonts" (symlinkJoin {
+  inherit (lilypond) meta name version ;
+
+  paths = [ lilypond ] ++ openlilylib-fonts.all;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  postBuild = ''
+    for p in $out/bin/*; do
+        wrapProgram "$p" --set LILYPOND_DATADIR "$out/share/lilypond/${lilypond.version}"
+    done
+  '';
+})
diff --git a/nixpkgs/pkgs/misc/logging/beats/7.x.nix b/nixpkgs/pkgs/misc/logging/beats/7.x.nix
new file mode 100644
index 000000000000..77ac0bd3b59d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/logging/beats/7.x.nix
@@ -0,0 +1,59 @@
+{ lib, fetchFromGitHub, elk7Version, buildGoModule, libpcap, nixosTests, systemd, config }:
+
+let beat = package: extraArgs: buildGoModule (rec {
+  pname = package;
+  version = elk7Version;
+
+  src = fetchFromGitHub {
+    owner = "elastic";
+    repo = "beats";
+    rev = "v${version}";
+    hash = "sha256-Quq32/3NeGhrsy17GrIeBiB3LGQuMFTFl3lAyyU6GZM=";
+  };
+
+  vendorHash = "sha256-UJjwCRxY1rrymroBqC/SfCVM9vmnQOtLlS3OONih3kM=";
+
+  subPackages = [ package ];
+
+  meta = with lib; {
+    homepage = "https://www.elastic.co/products/beats";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ fadenb basvandijk dfithian ];
+    platforms = platforms.linux;
+  };
+} // extraArgs);
+in
+rec {
+  filebeat7 = beat "filebeat" {
+    meta.description = "Lightweight shipper for logfiles";
+    buildInputs = [ systemd ];
+    tags = [ "withjournald" ];
+    postFixup = ''
+      patchelf --set-rpath ${lib.makeLibraryPath [ (lib.getLib systemd) ]} "$out/bin/filebeat"
+    '';
+  };
+  heartbeat7 = beat "heartbeat" { meta.description = "Lightweight shipper for uptime monitoring"; };
+  metricbeat7 = beat "metricbeat" {
+    meta.description = "Lightweight shipper for metrics";
+    passthru.tests =
+      lib.optionalAttrs config.allowUnfree (
+        assert metricbeat7.drvPath == nixosTests.elk.unfree.ELK-7.elkPackages.metricbeat.drvPath;
+        {
+          elk = nixosTests.elk.unfree.ELK-7;
+        }
+      );
+  };
+  packetbeat7 = beat "packetbeat" {
+    buildInputs = [ libpcap ];
+    meta.description = "Network packet analyzer that ships data to Elasticsearch";
+    meta.longDescription = ''
+      Packetbeat is an open source network packet analyzer that ships the
+      data to Elasticsearch.
+
+      Think of it like a distributed real-time Wireshark with a lot more
+      analytics features. The Packetbeat shippers sniff the traffic between
+      your application processes, parse on the fly protocols like HTTP, MySQL,
+      PostgreSQL, Redis or Thrift and correlate the messages into transactions.
+    '';
+  };
+}
diff --git a/nixpkgs/pkgs/misc/logging/pacemaker/default.nix b/nixpkgs/pkgs/misc/logging/pacemaker/default.nix
new file mode 100644
index 000000000000..3ce74457acd2
--- /dev/null
+++ b/nixpkgs/pkgs/misc/logging/pacemaker/default.nix
@@ -0,0 +1,102 @@
+{ lib
+, stdenv
+, autoconf
+, automake
+, bash
+, bzip2
+, corosync
+, dbus
+, fetchFromGitHub
+, glib
+, gnutls
+, libqb
+, libtool
+, libuuid
+, libxml2
+, libxslt
+, pam
+, pkg-config
+, python3
+, nixosTests
+
+# Pacemaker is compiled twice, once with forOCF = true to extract its
+# OCF definitions for use in the ocf-resource-agents derivation, then
+# again with forOCF = false, where the ocf-resource-agents is provided
+# as the OCF_ROOT.
+, forOCF ? false
+, ocf-resource-agents
+} :
+
+stdenv.mkDerivation rec {
+  pname = "pacemaker";
+  version = "2.1.6";
+
+  src = fetchFromGitHub {
+    owner = "ClusterLabs";
+    repo = pname;
+    rev = "Pacemaker-${version}";
+    sha256 = "sha256-3+eRQ3NqPusdFhKc0wE7UMMNKsDLRVvh+EhD6zYGoP0=";
+  };
+
+  nativeBuildInputs = [
+    autoconf
+    automake
+    libtool
+    pkg-config
+  ];
+
+  buildInputs = [
+    bash
+    bzip2
+    corosync
+    dbus.dev
+    glib
+    gnutls
+    libqb
+    libuuid
+    libxml2.dev
+    libxslt.dev
+    pam
+    python3
+  ];
+
+  preConfigure = ''
+    ./autogen.sh --prefix="$out"
+  '';
+  configureFlags = [
+    "--exec-prefix=${placeholder "out"}"
+    "--sysconfdir=/etc"
+    "--localstatedir=/var"
+    "--with-initdir=/etc/systemd/system"
+    "--with-systemdsystemunitdir=/etc/systemd/system"
+    "--with-corosync"
+    # allows Type=notify in the systemd service
+    "--enable-systemd"
+  ] ++ lib.optional (!forOCF) "--with-ocfdir=${ocf-resource-agents}/usr/lib/ocf";
+
+  installFlags = [ "DESTDIR=${placeholder "out"}" ];
+
+  env.NIX_CFLAGS_COMPILE = toString (lib.optionals stdenv.cc.isGNU [
+    "-Wno-error=strict-prototypes"
+  ]);
+
+  enableParallelBuilding = true;
+
+  postInstall = ''
+    # pacemaker's install linking requires a weirdly nested hierarchy
+    mv $out$out/* $out
+    rm -r $out/nix
+  '';
+
+  passthru.tests = {
+    inherit (nixosTests) pacemaker;
+  };
+
+  meta = with lib; {
+    homepage = "https://clusterlabs.org/pacemaker/";
+    description = "Pacemaker is an open source, high availability resource manager suitable for both small and large clusters.";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ryantm astro ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/long-shebang/default.nix b/nixpkgs/pkgs/misc/long-shebang/default.nix
new file mode 100644
index 000000000000..6ad7c8496ed5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/long-shebang/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchurl }: let
+  version = "1.2.0";
+in stdenv.mkDerivation {
+  pname = "long-shebang";
+  inherit version;
+
+  src = fetchurl {
+    url = "https://github.com/shlevy/long-shebang/releases/download/v${version}/long-shebang-${version}.tar.xz";
+    sha256 = "10h29w1c5bm0rlscyjiz1kzb134rn92as6v4y7i8mhhmdh6mmf79";
+  };
+
+  meta = {
+    description = "A tool for #! scripts with more than one argument";
+
+    homepage = "https://github.com/shlevy/long-shebang";
+
+    license = lib.licenses.mit;
+
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/lssecret/default.nix b/nixpkgs/pkgs/misc/lssecret/default.nix
new file mode 100644
index 000000000000..f27bb538d19a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/lssecret/default.nix
@@ -0,0 +1,31 @@
+{ lib
+, stdenv
+, fetchFromGitLab
+, pkg-config
+, libsecret
+}:
+
+stdenv.mkDerivation rec {
+  name = "lssecret";
+  version = "unstable-2022-12-02";
+
+  src = fetchFromGitLab {
+    owner = "GrantMoyer";
+    repo = name;
+    rev = "20fd771a";
+    hash = "sha256-yU70WZj4EC/sFJxyq2SQ0YQ6RCQHYiW/aQiYWo7+ujk=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ libsecret ];
+
+  makeFlags = ["DESTDIR=$(out)"];
+
+  meta = {
+    description = "A tool to list passwords and other secrets stored using the org.freedesktop.secrets dbus api";
+    homepage = "https://gitlab.com/GrantMoyer/lssecret";
+    license = lib.licenses.unlicense;
+    maintainers = with lib.maintainers; [ genericnerdyusername ];
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/meson-tools/default.nix b/nixpkgs/pkgs/misc/meson-tools/default.nix
new file mode 100644
index 000000000000..02b162c88098
--- /dev/null
+++ b/nixpkgs/pkgs/misc/meson-tools/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, openssl }:
+
+stdenv.mkDerivation rec {
+  pname = "meson-tools";
+  version = "0.1";
+
+  src = fetchFromGitHub {
+    owner = "afaerber";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1bvshfa9pa012yzdwapi3nalpgcwmfq7d3n3w3mlr357a6kq64qk";
+  };
+
+  buildInputs = [ openssl ];
+
+  installPhase = ''
+    mkdir -p "$out/bin"
+    mv amlbootsig unamlbootsig amlinfo "$out/bin"
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/afaerber/meson-tools";
+    description = "Tools for Amlogic Meson ARM platforms";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ lopsided98 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/mlxbf-bootimages/default.nix b/nixpkgs/pkgs/misc/mlxbf-bootimages/default.nix
new file mode 100644
index 000000000000..a7552c0bb5cb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/mlxbf-bootimages/default.nix
@@ -0,0 +1,41 @@
+{ stdenv
+, lib
+, fetchurl
+, dpkg
+}:
+
+stdenv.mkDerivation rec {
+  pname = "mlxbf-bootimages";
+  version = "4.0.3-12704";
+
+  src = fetchurl {
+    url = let mainVersion = builtins.elemAt (lib.splitString "-" version) 0; in
+      "https://linux.mellanox.com/public/repo/bluefield/${mainVersion}/bootimages/prod/${pname}-signed_${version}_arm64.deb";
+    hash = "sha256-e13XZhxf41240Qu+hh2a9+KIvZCL+8k5JyZrpJCHmI8=";
+  };
+
+  nativeBuildInputs = [
+    dpkg
+  ];
+
+  unpackCmd = "dpkg -x $curSrc src";
+
+  # Only install /lib. /usr only contains the licenses which are also available
+  # in /lib.
+  installPhase = ''
+    find lib -type f -exec install -D {} $out/{} \;
+  '';
+
+  meta = with lib; {
+    description = "BlueField boot images";
+    homepage = "https://github.com/Mellanox/bootimages";
+    # It is unclear if the bootimages themselves are Open Source software. They
+    # never explicitly say they are. They contain Open Source software licensed
+    # under bsd2, bsd2Patent, bsd3. However, it is probably safer to assume
+    # they are unfree. See https://github.com/Mellanox/bootimages/issues/3
+    license = licenses.unfree;
+    platforms = [ "aarch64-linux" ];
+    maintainers = with maintainers; [ nikstur ];
+  };
+}
+
diff --git a/nixpkgs/pkgs/misc/mnemonicode/default.nix b/nixpkgs/pkgs/misc/mnemonicode/default.nix
new file mode 100644
index 000000000000..352dd038fb5a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/mnemonicode/default.nix
@@ -0,0 +1,27 @@
+{ stdenv, lib, fetchFromGitHub }:
+
+stdenv.mkDerivation {
+  pname = "mnemonicode";
+  version = "2015-11-30";
+  src = fetchFromGitHub {
+    owner = "singpolyma";
+    repo = "mnemonicode";
+    rev = "1687fabdf48acf68d4186f219bc20bffe02e8ee0";
+    sha256 = "0kp1jhhqfwfiqg9kx0mbyr4qh4yc4zg4szqk5fbf809nx2pvprm5";
+  };
+  installPhase = ''
+    mkdir -p $out/bin
+    cp mnencode $out/bin
+    cp mndecode $out/bin
+  '';
+  meta = with lib; {
+    description = ''
+      Routines which implement a method for encoding binary data into a sequence
+      of words which can be spoken over the phone, for example, and converted
+      back to data on the other side.
+    '';
+    license = licenses.mit;
+    platforms = platforms.all;
+    maintainers = [ maintainers.cstrahan ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/moonfire-nvr/Cargo.lock b/nixpkgs/pkgs/misc/moonfire-nvr/Cargo.lock
new file mode 100644
index 000000000000..b7ff7fc7d46f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/moonfire-nvr/Cargo.lock
@@ -0,0 +1,2651 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "ahash"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf6ccdb167abbf410dcb915cabd428929d7f6a04980b54a11f26a39f1c7f7107"
+dependencies = [
+ "cfg-if",
+ "getrandom",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
+
+[[package]]
+name = "arrayref"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
+
+[[package]]
+name = "arrayvec"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "base64ct"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42"
+
+[[package]]
+name = "bitstream-io"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d28070975aaf4ef1fd0bd1f29b739c06c2cdd9972e090617fb6dca3b2cb564e"
+
+[[package]]
+name = "blake3"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef"
+dependencies = [
+ "arrayref",
+ "arrayvec",
+ "cc",
+ "cfg-if",
+ "constant_time_eq",
+ "digest",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bpaf"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72974597bfc83173d714c0fc785a8ab64ca0f0896cb72b05f2f4c5e682543871"
+dependencies = [
+ "bpaf_derive",
+ "owo-colors",
+ "supports-color",
+]
+
+[[package]]
+name = "bpaf_derive"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6b7be5dcfd7bb931b9932e689c69a9b9f50a46cf0b588c90ed73ec28e8e0bf4"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.23",
+]
+
+[[package]]
+name = "bstr"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b45ea9b00a7b3f2988e9a65ad3917e62123c38dba709b666506207be96d1790b"
+dependencies = [
+ "memchr",
+ "once_cell",
+ "regex-automata",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c"
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "time 0.1.45",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "cipher"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e"
+dependencies = [
+ "crypto-common",
+ "inout",
+]
+
+[[package]]
+name = "coded"
+version = "0.2.0-pre"
+source = "git+https://github.com/scottlamb/coded?rev=2c97994974a73243d5dd12134831814f42cdb0e8#2c97994974a73243d5dd12134831814f42cdb0e8"
+
+[[package]]
+name = "constant_time_eq"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279"
+
+[[package]]
+name = "cookie-factory"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b"
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "cstr"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8aa998c33a6d3271e3678950a22134cd7dd27cef86dee1b611b5b14207d1d90b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "cursive"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5438eb16bdd8af51b31e74764fef5d0a9260227a5ec82ba75c9d11ce46595839"
+dependencies = [
+ "ahash",
+ "cfg-if",
+ "crossbeam-channel",
+ "cursive_core",
+ "lazy_static",
+ "libc",
+ "log",
+ "maplit",
+ "ncurses",
+ "signal-hook",
+ "term_size",
+ "unicode-segmentation",
+ "unicode-width",
+]
+
+[[package]]
+name = "cursive_core"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2de434b364bcca5039553b7ae1b5994b59b679e18bcb03adbc9c8e538446b9b4"
+dependencies = [
+ "ahash",
+ "crossbeam-channel",
+ "enum-map",
+ "enumset",
+ "lazy_static",
+ "log",
+ "num",
+ "owning_ref",
+ "time 0.3.17",
+ "unicode-segmentation",
+ "unicode-width",
+ "xi-unicode",
+]
+
+[[package]]
+name = "darling"
+version = "0.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0dd3cd20dc6b5a876612a6e5accfe7f3dd883db6d07acfbf14c128f61550dfa"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a784d2ccaf7c98501746bf0be29b2022ba41fd62a2e622af997a03e9f972859f"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7618812407e9402654622dd402b0a89dff9ba93badd6540781526117b92aab7e"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "diff"
+version = "0.1.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
+
+[[package]]
+name = "digest"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "either"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "enum-map"
+version = "2.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50c25992259941eb7e57b936157961b217a4fc8597829ddef0596d6c3cd86e1a"
+dependencies = [
+ "enum-map-derive",
+]
+
+[[package]]
+name = "enum-map-derive"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a4da76b3b6116d758c7ba93f7ec6a35d2e2cf24feda76c6e38a375f4d5c59f2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "enumset"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19be8061a06ab6f3a6cf21106c873578bf01bd42ad15e0311a9c76161cb1c753"
+dependencies = [
+ "enumset_derive",
+]
+
+[[package]]
+name = "enumset_derive"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03e7b551eba279bf0fa88b83a46330168c1560a52a94f5126f892f0b364ab3e0"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "fallible-iterator"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
+[[package]]
+name = "fastrand"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "flate2"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "four-cc"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3958af68a31b1d1384d3f39b6aa33eb14b6009065b5ca305ddd9712a4237124f"
+
+[[package]]
+name = "futures"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9"
+
+[[package]]
+name = "futures-task"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea"
+
+[[package]]
+name = "futures-util"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "h264-reader"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3c095862f1b74a6021f766321767e64fbec34fa76503debbe1da2c04ce23c2c"
+dependencies = [
+ "bitstream-io",
+ "hex-slice",
+ "log",
+ "memchr",
+ "rfc6381-codec",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ff8ae62cd3a9102e5637afc8452c55acf3844001bd5374e0b0bd7b6616c038"
+dependencies = [
+ "ahash",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.8.1"
+source = "git+https://github.com/scottlamb/hashlink?rev=26715ca0efe3f1773a0a22bbde8e36cafcaaed52#26715ca0efe3f1773a0a22bbde8e36cafcaaed52"
+dependencies = [
+ "hashbrown 0.13.1",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hex-slice"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5491a308e0214554f07a81d8944abe45f552871c12e3c3c6e7e5d354039a6c4c"
+
+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "http"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-auth"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0b40b39d66c28829a0cf4d09f7e139ff8201f7500a5083732848ed3b4b4d850"
+dependencies = [
+ "base64",
+ "digest",
+ "hex",
+ "md-5",
+ "memchr",
+ "rand",
+ "sha2",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-serve"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "496ab5f39096e4c915f167c276aea19521ed862beb50f7d2bc530578535689d7"
+dependencies = [
+ "bytes",
+ "flate2",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "httpdate",
+ "libc",
+ "memchr",
+ "mime",
+ "pin-project",
+ "smallvec",
+ "tokio",
+ "winapi",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
+[[package]]
+name = "hyper"
+version = "0.14.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+]
+
+[[package]]
+name = "inout"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e"
+
+[[package]]
+name = "is-terminal"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24fddda5af7e54bf7da53067d6e802dbcc381d0a8eef629df528e3ebf68755cb"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "is_ci"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb"
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
+
+[[package]]
+name = "js-sys"
+version = "0.3.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.147"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+
+[[package]]
+name = "libsqlite3-sys"
+version = "0.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29f835d03d717946d28b1d1ed632eb6f0e24a299388ee623d0c23118d3e8a7fa"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0"
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "maplit"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "md-5"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "moonfire-base"
+version = "0.0.1"
+dependencies = [
+ "chrono",
+ "coded",
+ "futures",
+ "libc",
+ "nix",
+ "nom",
+ "rusqlite",
+ "serde",
+ "serde_json",
+ "slab",
+ "time 0.1.45",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "moonfire-db"
+version = "0.7.7"
+dependencies = [
+ "base64",
+ "blake3",
+ "byteorder",
+ "cstr",
+ "diff",
+ "fnv",
+ "futures",
+ "h264-reader",
+ "hashlink",
+ "itertools",
+ "libc",
+ "moonfire-base",
+ "nix",
+ "num-rational",
+ "odds",
+ "pretty-hex",
+ "protobuf",
+ "protobuf-codegen",
+ "ring",
+ "rusqlite",
+ "scrypt",
+ "serde",
+ "serde_json",
+ "smallvec",
+ "tempfile",
+ "time 0.1.45",
+ "tokio",
+ "tracing",
+ "ulid",
+ "url",
+ "uuid",
+]
+
+[[package]]
+name = "moonfire-nvr"
+version = "0.7.7"
+dependencies = [
+ "base64",
+ "blake3",
+ "bpaf",
+ "byteorder",
+ "bytes",
+ "chrono",
+ "cursive",
+ "fnv",
+ "futures",
+ "h264-reader",
+ "http",
+ "http-serve",
+ "hyper",
+ "itertools",
+ "libc",
+ "log",
+ "memchr",
+ "moonfire-base",
+ "moonfire-db",
+ "mp4",
+ "nix",
+ "nom",
+ "num-rational",
+ "password-hash",
+ "protobuf",
+ "reffers",
+ "reqwest",
+ "retina",
+ "ring",
+ "rusqlite",
+ "serde",
+ "serde_json",
+ "smallvec",
+ "sync_wrapper",
+ "tempfile",
+ "time 0.1.45",
+ "tokio",
+ "tokio-stream",
+ "tokio-tungstenite",
+ "toml",
+ "tracing",
+ "tracing-core",
+ "tracing-futures",
+ "tracing-log",
+ "tracing-subscriber",
+ "tracing-test",
+ "ulid",
+ "url",
+ "uuid",
+]
+
+[[package]]
+name = "mp4"
+version = "0.9.2"
+source = "git+https://github.com/scottlamb/mp4-rust?branch=moonfire#388fb47653305fb153de4e11d8cbc6f307e02ee5"
+dependencies = [
+ "byteorder",
+ "bytes",
+ "num-rational",
+ "serde",
+ "serde_json",
+ "thiserror",
+]
+
+[[package]]
+name = "mp4ra-rust"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be9daf03b43bf3842962947c62ba40f411e46a58774c60838038f04a67d17626"
+dependencies = [
+ "four-cc",
+]
+
+[[package]]
+name = "mpeg4-audio-const"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96a1fe2275b68991faded2c80aa4a33dba398b77d276038b8f50701a22e55918"
+
+[[package]]
+name = "ncurses"
+version = "5.101.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e2c5d34d72657dc4b638a1c25d40aae81e4f1c699062f72f467237920752032"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "nix"
+version = "0.26.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46a58d1d356c6597d08cde02c2f09d785b09e28711837b1ed667dc652c08a694"
+dependencies = [
+ "bitflags 1.3.2",
+ "cfg-if",
+ "libc",
+ "memoffset",
+ "pin-utils",
+ "static_assertions",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5507769c4919c998e69e49c839d9dc6e693ede4cc4290d6ad8b41d4f09c548c"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606"
+dependencies = [
+ "num-complex",
+ "num-integer",
+ "num-iter",
+ "num-rational",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-complex"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+dependencies = [
+ "autocfg",
+ "num-bigint",
+ "num-integer",
+ "num-traits",
+ "serde",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "num_threads"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "odds"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfe9f693ec5bf79b8867b34aeaa5a2500e3a90461b486b573bcad3cca42b4d9e"
+dependencies = [
+ "rawpointer",
+ "rawslice",
+ "unchecked-index",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "owning_ref"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce"
+dependencies = [
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "owo-colors"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
+
+[[package]]
+name = "password-hash"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700"
+dependencies = [
+ "base64ct",
+ "rand_core",
+ "subtle",
+]
+
+[[package]]
+name = "pbkdf2"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "pin-project"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "pretty-hex"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "protobuf"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b55bad9126f378a853655831eb7363b7b01b81d19f8cb1218861086ca4a1a61e"
+dependencies = [
+ "once_cell",
+ "protobuf-support",
+ "thiserror",
+]
+
+[[package]]
+name = "protobuf-codegen"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dd418ac3c91caa4032d37cb80ff0d44e2ebe637b2fb243b6234bf89cdac4901"
+dependencies = [
+ "anyhow",
+ "once_cell",
+ "protobuf",
+ "protobuf-parse",
+ "regex",
+ "tempfile",
+ "thiserror",
+]
+
+[[package]]
+name = "protobuf-parse"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d39b14605eaa1f6a340aec7f320b34064feb26c93aec35d6a9a2272a8ddfa49"
+dependencies = [
+ "anyhow",
+ "indexmap",
+ "log",
+ "protobuf",
+ "protobuf-support",
+ "tempfile",
+ "thiserror",
+ "which",
+]
+
+[[package]]
+name = "protobuf-support"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5d4d7b8601c814cfb36bcebb79f0e61e45e1e93640cf778837833bbed05c372"
+dependencies = [
+ "thiserror",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rawpointer"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
+
+[[package]]
+name = "rawslice"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e23c908b26a742e5e3768ea42f19225ef809d3c9e3071bfe3e01c7e9b6fd1cd"
+dependencies = [
+ "rawpointer",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "reffers"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "162d659c5126f0981e174637accc2e8dfb5bec1908c3fd688d8cce663afed248"
+dependencies = [
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "regex"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+
+[[package]]
+name = "remove_dir_all"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "reqwest"
+version = "0.11.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c"
+dependencies = [
+ "base64",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "retina"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b8c5ef4eec9b0c6178ac107e1a533bbc5d2ff6a90f8aabd000d71e119c42d96"
+dependencies = [
+ "base64",
+ "bitstream-io",
+ "bytes",
+ "futures",
+ "h264-reader",
+ "hex",
+ "http-auth",
+ "log",
+ "once_cell",
+ "pin-project",
+ "pretty-hex",
+ "rand",
+ "rtsp-types",
+ "sdp-types",
+ "smallvec",
+ "thiserror",
+ "time 0.1.45",
+ "tokio",
+ "tokio-util",
+ "url",
+]
+
+[[package]]
+name = "rfc6381-codec"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4395f46a67f0d57c57f6a5361f3a9a0c0183a19cab3998892ecdc003de6d8037"
+dependencies = [
+ "four-cc",
+ "mp4ra-rust",
+ "mpeg4-audio-const",
+]
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rtsp-types"
+version = "0.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a1aec90dc5d8dec85c14032885770801439acb1651b2f166745ce482a2ddeaf"
+dependencies = [
+ "cookie-factory",
+ "nom",
+ "tinyvec",
+ "url",
+]
+
+[[package]]
+name = "rusqlite"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01e213bc3ecb39ac32e81e51ebe31fd888a940515173e3a18a35f8c6e896422a"
+dependencies = [
+ "bitflags 1.3.2",
+ "fallible-iterator",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "smallvec",
+]
+
+[[package]]
+name = "rustix"
+version = "0.38.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aabcb0461ebd01d6b79945797c27f8529082226cb630a9865a71870ff63532a4"
+dependencies = [
+ "bitflags 2.3.3",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
+
+[[package]]
+name = "salsa20"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "scrypt"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d"
+dependencies = [
+ "hmac",
+ "password-hash",
+ "pbkdf2",
+ "salsa20",
+ "sha2",
+]
+
+[[package]]
+name = "sdp-types"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8db497829e222d081f7b50ac81aec4f69750071a0f76b97b950b0b62204da6e"
+dependencies = [
+ "bstr",
+ "fallible-iterator",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.152"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.91"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "signal-hook"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "socket2"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "subtle"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
+
+[[package]]
+name = "supports-color"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4950e7174bffabe99455511c39707310e7e9b440364a2fcb1cc21521be57b354"
+dependencies = [
+ "is-terminal",
+ "is_ci",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8"
+
+[[package]]
+name = "tempfile"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "libc",
+ "redox_syscall",
+ "remove_dir_all",
+ "winapi",
+]
+
+[[package]]
+name = "term_size"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e4129646ca0ed8f45d09b929036bafad5377103edd06e50bf574b353d2b08d9"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
+[[package]]
+name = "time"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376"
+dependencies = [
+ "itoa",
+ "libc",
+ "num_threads",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
+
+[[package]]
+name = "time-macros"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2"
+dependencies = [
+ "time-core",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "tokio"
+version = "1.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "memchr",
+ "mio",
+ "num_cpus",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-tungstenite"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54319c93411147bced34cb5609a80e0a8e44c5999c93903a81cd866630ec0bfd"
+dependencies = [
+ "futures-util",
+ "log",
+ "tokio",
+ "tungstenite",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "log",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-futures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
+dependencies = [
+ "futures",
+ "futures-task",
+ "pin-project",
+ "tracing",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-serde"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1"
+dependencies = [
+ "serde",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "serde",
+ "serde_json",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+ "tracing-serde",
+]
+
+[[package]]
+name = "tracing-test"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a2c0ff408fe918a94c428a3f2ad04e4afd5c95bbc08fcf868eff750c15728a4"
+dependencies = [
+ "lazy_static",
+ "tracing-core",
+ "tracing-subscriber",
+ "tracing-test-macro",
+]
+
+[[package]]
+name = "tracing-test-macro"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258bc1c4f8e2e73a977812ab339d503e6feeb92700f6d07a6de4d321522d5c08"
+dependencies = [
+ "lazy_static",
+ "quote",
+ "syn 1.0.107",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642"
+
+[[package]]
+name = "tungstenite"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30ee6ab729cd4cf0fd55218530c4522ed30b7b6081752839b68fcec8d0960788"
+dependencies = [
+ "base64",
+ "byteorder",
+ "bytes",
+ "http",
+ "httparse",
+ "log",
+ "rand",
+ "sha1",
+ "thiserror",
+ "url",
+ "utf-8",
+]
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "ulid"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13a3aaa69b04e5b66cc27309710a569ea23593612387d67daaf102e73aa974fd"
+dependencies = [
+ "rand",
+]
+
+[[package]]
+name = "unchecked-index"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
+[[package]]
+name = "uuid"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c"
+dependencies = [
+ "getrandom",
+ "serde",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.107",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"
+
+[[package]]
+name = "web-sys"
+version = "0.3.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "which"
+version = "4.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b"
+dependencies = [
+ "either",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.0",
+ "windows_aarch64_msvc 0.42.0",
+ "windows_i686_gnu 0.42.0",
+ "windows_i686_msvc 0.42.0",
+ "windows_x86_64_gnu 0.42.0",
+ "windows_x86_64_gnullvm 0.42.0",
+ "windows_x86_64_msvc 0.42.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "xi-unicode"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a"
diff --git a/nixpkgs/pkgs/misc/moonfire-nvr/default.nix b/nixpkgs/pkgs/misc/moonfire-nvr/default.nix
new file mode 100644
index 000000000000..27b7ae7766db
--- /dev/null
+++ b/nixpkgs/pkgs/misc/moonfire-nvr/default.nix
@@ -0,0 +1,80 @@
+{ lib
+, rustPlatform
+, buildNpmPackage
+, fetchFromGitHub
+, pkg-config
+, ncurses
+, sqlite
+, testers
+, moonfire-nvr
+}:
+
+let
+  pname = "moonfire-nvr";
+  version = "0.7.7";
+  src = fetchFromGitHub {
+    owner = "scottlamb";
+    repo = "moonfire-nvr";
+    rev = "v${version}";
+    hash = "sha256-+7VahlS+NgaO2knP+xqdlZnNEfjz8yyF/VmjWf77KXI=";
+  };
+  ui = buildNpmPackage {
+    inherit version src;
+    pname = "${pname}-ui";
+    sourceRoot = "source/ui";
+    npmDepsHash = "sha256-IpZWgMo6Y3vRn9h495ifMB3tQxobLeTLC0xXS1vrKLA=";
+    installPhase = ''
+      runHook preInstall
+
+      cp -r build $out
+
+      runHook postInstall
+    '';
+  };
+in rustPlatform.buildRustPackage {
+  inherit pname version src;
+
+  sourceRoot = "source/server";
+
+  cargoLock = {
+    lockFile = ./Cargo.lock;
+    outputHashes = {
+      "coded-0.2.0-pre" = "sha256-ICDvLFCsiPCzAzf3nrRhH/McNPVQz1+uVOmj6Uc5teg=";
+      "hashlink-0.8.1" = "sha256-h7DEapTVy0SSTaOV9rCkdH3em4A9+PS0k1QQh1+0P4c=";
+      "mp4-0.9.2" = "sha256-mJZJDzD8Ep9c+4QusyBtRoqAArHK9SLdFxG1AR7JydE=";
+    };
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    ncurses
+    sqlite
+  ];
+
+  postInstall = ''
+    mkdir -p $out/lib/ui
+    ln -s ${ui} $out/lib/ui
+  '';
+
+  doCheck = false;
+
+  passthru = {
+    inherit ui;
+    tests.version = testers.testVersion {
+      inherit version;
+      package = moonfire-nvr;
+      command = "moonfire-nvr --version";
+    };
+  };
+
+  meta = with lib; {
+    description = "Moonfire NVR, a security camera network video recorder";
+    homepage = "https://github.com/scottlamb/moonfire-nvr";
+    changelog = "https://github.com/scottlamb/moonfire-nvr/releases/tag/v${version}";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ gaelreyrol ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/mxt-app/default.nix b/nixpkgs/pkgs/misc/mxt-app/default.nix
new file mode 100644
index 000000000000..7695f3cebefd
--- /dev/null
+++ b/nixpkgs/pkgs/misc/mxt-app/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, libtool }:
+
+stdenv.mkDerivation rec {
+  version="1.36";
+  pname = "mxt-app";
+
+  src = fetchFromGitHub {
+    owner = "atmel-maxtouch";
+    repo = "mxt-app";
+    rev = "v${version}";
+    sha256 = "sha256-hS/4d7HUCoulY73Sn1+IAb/IWD4VDht78Tn2jdluzhU=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook ];
+  buildInputs = [ libtool ];
+
+  hardeningDisable = [ "fortify" ];
+
+  meta = with lib; {
+    description = "Command line utility for Atmel maXTouch devices";
+    homepage = "https://github.com/atmel-maxtouch/mxt-app";
+    license = licenses.bsd2;
+    maintainers = [ maintainers.colemickens ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/my-env/default.nix b/nixpkgs/pkgs/misc/my-env/default.nix
new file mode 100644
index 000000000000..df4c8fc6b63d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/my-env/default.nix
@@ -0,0 +1,152 @@
+# idea: provide a build environments for your developement of preference
+/*
+  #### examples of use: ####
+  # Add this to your ~/.config/nixpkgs/config.nix:
+  {
+    packageOverrides = pkgs : with pkgs; {
+      sdlEnv = pkgs.myEnvFun {
+          name = "sdl";
+          nativeBuildInputs = [ cmake pkg-config ];
+          buildInputs = [ stdenv SDL SDL_image SDL_ttf SDL_gfx SDL_net];
+      };
+    };
+  }
+
+  # Then you can install it by:
+  #  $ nix-env -i env-sdl
+  # And you can load it simply calling:
+  #  $ load-env-sdl
+  # and this will update your env vars to have 'make' and 'gcc' finding the SDL
+  # headers and libs.
+
+
+  ##### Another example, more complicated but achieving more: #######
+  # Make an environment to build nix from source and create ctags (tagfiles can
+  # be extracted from TAG_FILES) from every source package. Here would be a
+  # full ~/.config/nixpkgs/config.nix
+  {
+    packageOverrides = pkgs : with pkgs; with sourceAndTags;
+    let complicatedMyEnv = { name, buildInputs ? [], cTags ? [], extraCmds ? ""}:
+            pkgs.myEnvFun {
+              inherit name;
+            buildInputs = buildInputs
+                  ++ map (x : sourceWithTagsDerivation
+                    ( (addCTaggingInfo x ).passthru.sourceWithTags ) ) cTags;
+            extraCmds = ''
+              ${extraCmds}
+              HOME=${builtins.getEnv "HOME"}
+              . ~/.bashrc
+            '';
+          };
+    in rec {
+      # this is the example we will be using
+      nixEnv = complicatedMyEnv {
+        name = "nix";
+        buildInputs = [ libtool stdenv perl curl bzip2 openssl db5 autoconf automake zlib ];
+      };
+    };
+  }
+
+  # Now we should build our newly defined custom environment using this command on a shell, so type:
+  #  $ nix-env -i env-nix
+
+  # You can load the environment simply typing a "load-env-${name}" command.
+  #  $ load-env-nix
+  # The result using that command should be:
+  #  env-nix loaded
+  and show you a shell with a prefixed prompt.
+*/
+
+{ mkDerivation, substituteAll, pkgs }:
+    { stdenv ? pkgs.stdenv, name, buildInputs ? []
+    , propagatedBuildInputs ? [], gcc ? stdenv.cc, extraCmds ? ""
+    , cleanupCmds ? "", shell ? "${pkgs.bashInteractive}/bin/bash --norc"}:
+
+mkDerivation {
+  inherit buildInputs propagatedBuildInputs;
+
+  name = "env-${name}";
+  phases = [ "buildPhase" "fixupPhase" ];
+  setupNew = substituteAll {
+    src = ../../stdenv/generic/setup.sh;
+    inherit gcc;
+  };
+
+  buildPhase = let
+    initialPath = import ../../stdenv/generic/common-path.nix { inherit pkgs; };
+  in ''
+    set -x
+    mkdir -p "$out/dev-envs" "$out/nix-support" "$out/bin"
+    s="$out/nix-support/setup-new-modified"
+    # shut some warning up.., do not use set -e
+    sed -e 's@set -eu@@' \
+        -e 's@assertEnvExists\s\+NIX_STORE@:@' \
+        -e 's@trap.*@@' \
+        -e '1i initialPath="${toString initialPath}"' \
+        "$setupNew" > "$s"
+    cat >> "$out/dev-envs/''${name/env-/}" << EOF
+      defaultNativeBuildInputs="$defaultNativeBuildInputs"
+      buildInputs="$buildInputs"
+      propagatedBuildInputs="$propagatedBuildInputs"
+      # the setup-new script wants to write some data to a temp file.. so just let it do that and tidy up afterwards
+      tmp="\$("${pkgs.coreutils}/bin/mktemp" -d)"
+      NIX_BUILD_TOP="\$tmp"
+      phases=
+      # only do all the setup stuff in nix-support/*
+      set +e
+      # This prevents having -rpath /lib in NIX_LDFLAGS
+      export NIX_NO_SELF_RPATH=1
+      if [[ -z "\$ZSH_VERSION" ]]; then
+        source "$s"
+      else
+        setopt interactivecomments
+        # fix bash indirection
+        # let's hope the bash arrays aren't used
+        # substitute is using bash array, so skip it
+        echo '
+            setopt NO_BAD_PATTERN
+            setopt NO_BANG_HIST
+            setopt NO_BG_NICE
+            setopt NO_EQUALS
+            setopt NO_FUNCTION_ARGZERO
+            setopt GLOB_SUBST
+            setopt NO_HUP
+            setopt INTERACTIVE_COMMENTS
+            setopt KSH_ARRAYS
+            setopt NO_MULTIOS
+            setopt NO_NOMATCH
+            setopt RM_STAR_SILENT
+            setopt POSIX_BUILTINS
+            setopt SH_FILE_EXPANSION
+            setopt SH_GLOB
+            setopt SH_OPTION_LETTERS
+            setopt SH_WORD_SPLIT
+          ' >> "\$tmp/script"
+        sed -e 's/\''${!\([^}]*\)}/\''${(P)\1}/g' \
+            -e 's/[[]\*\]//' \
+            -e 's/substitute() {/ substitute() { return; /' \
+            -e 's@PATH=\$@PATH=${pkgs.coreutils}/bin@' \
+            "$s" >> "\$tmp/script"
+        echo "\$tmp/script";
+        source "\$tmp/script";
+      fi
+      ${pkgs.coreutils}/bin/rm -fr "\$tmp"
+      ${extraCmds}
+
+      nix_cleanup() {
+        :
+        ${cleanupCmds}
+      }
+
+      export PATH
+      echo $name loaded >&2
+
+      trap nix_cleanup EXIT
+    EOF
+
+    mkdir -p $out/bin
+    sed -e 's,@shell@,${shell},' -e s,@myenvpath@,$out/dev-envs/${name}, \
+      -e 's,@name@,${name},' ${./loadenv.sh} > $out/bin/load-env-${name}
+    chmod +x $out/bin/load-env-${name}
+  '';
+}
diff --git a/nixpkgs/pkgs/misc/my-env/loadenv.sh b/nixpkgs/pkgs/misc/my-env/loadenv.sh
new file mode 100644
index 000000000000..1688d2f158fb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/my-env/loadenv.sh
@@ -0,0 +1,22 @@
+#!@shell@
+
+OLDPATH="$PATH"
+OLDTZ="$TZ"
+OLD_http_proxy="$http_proxy"
+OLD_ftp_proxy="$http_proxy"
+source @myenvpath@
+
+PATH="$PATH:$OLDPATH"
+export PS1="\n@name@:[\u@\h:\w]\$ "
+export NIX_MYENV_NAME="@name@"
+export buildInputs
+export TZ="$OLDTZ"
+export http_proxy="$OLD_http_proxy"
+export ftp_proxy="$OLD_ftp_proxy"
+
+if test $# -gt 0; then
+    exec "$@"
+else
+    exec @shell@
+fi
+
diff --git a/nixpkgs/pkgs/misc/nflz/default.nix b/nixpkgs/pkgs/misc/nflz/default.nix
new file mode 100644
index 000000000000..10a87f85b117
--- /dev/null
+++ b/nixpkgs/pkgs/misc/nflz/default.nix
@@ -0,0 +1,34 @@
+{ fetchCrate
+, lib
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "nflz";
+  version = "1.0.2";
+
+  src = fetchCrate {
+    inherit pname version;
+    hash = "sha256-c9+79zrIU/M1Rh+DiaLJzbrNSa4IKrYk1gP0dsabUiw=";
+  };
+
+  cargoHash = "sha256-+SOoZFVJ6mASRKufQE4JmHGKR5rbBgg1PmCrI6dvvko=";
+
+  # Tests do not work in the package published on crates.io, since the folder
+  # with test resources is not packaged.
+  doCheck = false;
+
+  meta = {
+    description = "Numbered Files Leading Zeros helps you to manage ascending numbered file names";
+    longDescription = ''
+      CLI to add leading zeros to ascending numbered file names.
+      NFLZ stands for Numbered Files Leading Zeros.
+
+      This library helps you to manage files inside your file system that
+      belong to a set of ordered files. An example are photos from a camera.
+    '';
+    homepage = "https://github.com/phip1611/nflz";
+    license = with lib.licenses; [ mit ];
+    maintainers = with lib.maintainers; [ phip1611 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/opcua-client-gui/default.nix b/nixpkgs/pkgs/misc/opcua-client-gui/default.nix
new file mode 100644
index 000000000000..361b2627c973
--- /dev/null
+++ b/nixpkgs/pkgs/misc/opcua-client-gui/default.nix
@@ -0,0 +1,60 @@
+{ lib
+, stdenv
+, python3Packages
+, fetchFromGitHub
+, makeDesktopItem
+, copyDesktopItems
+, desktopToDarwinBundle
+, wrapQtAppsHook
+}:
+
+python3Packages.buildPythonApplication rec {
+  pname = "opcua-client-gui";
+  version = "0.8.4";
+
+  src = fetchFromGitHub {
+    owner = "FreeOpcUa";
+    repo = "opcua-client-gui";
+    rev = version;
+    hash = "sha256-0BH1Txr3z4a7iFcsfnovmBUreXMvIX2zpZa8QivQVx8=";
+  };
+
+  nativeBuildInputs = [ copyDesktopItems wrapQtAppsHook ]
+    ++ lib.optionals stdenv.isDarwin [ desktopToDarwinBundle ];
+
+  makeWrapperArgs = [
+    "\${qtWrapperArgs[@]}"
+  ];
+
+  propagatedBuildInputs = with python3Packages; [
+    pyqt5
+    asyncua
+    opcua-widgets
+    numpy
+    pyqtgraph
+  ];
+
+  #This test uses a deprecated libarby, when updating the package check if the test was updated as well
+  doCheck = false;
+
+  desktopItems = [
+    (makeDesktopItem {
+      name = "opcua-client";
+      exec = "opcua-client";
+      comment = "OPC UA Client";
+      type = "Application";
+      #no icon because the app dosn't have one
+      desktopName = "opcua-client";
+      terminal = false;
+      categories = [ "Utility" ];
+    })
+  ];
+
+  meta = with lib; {
+    description = "OPC UA GUI Client";
+    homepage = "https://github.com/FreeOpcUa/opcua-client-gui";
+    platforms = platforms.unix;
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ janik ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/openrussian-cli/default.nix b/nixpkgs/pkgs/misc/openrussian-cli/default.nix
new file mode 100644
index 000000000000..038bdd5a73f1
--- /dev/null
+++ b/nixpkgs/pkgs/misc/openrussian-cli/default.nix
@@ -0,0 +1,59 @@
+{ stdenv, lib, fetchFromGitHub, pkg-config, wget, unzip
+, sqlite, which, lua, installShellFiles, makeWrapper
+}:
+let
+  luaEnv = lua.withPackages(p: with p; [ luasql-sqlite3 luautf8 ]);
+in
+stdenv.mkDerivation rec {
+  pname   = "openrussian-cli";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner   = "rhaberkorn";
+    repo    = "openrussian-cli";
+    rev     = version;
+    sha256  = "1ria7s7dpqip2wdwn35wmkry84g8ghdqnxc9cbxzzq63vl6pgvcn";
+  };
+
+  nativeBuildInputs = [
+    pkg-config wget unzip sqlite which installShellFiles makeWrapper
+  ];
+
+  buildInputs = [ luaEnv ];
+
+  makeFlags = [
+    "LUA=${luaEnv}/bin/lua"
+    "LUAC=${luaEnv}/bin/luac"
+  ];
+
+  dontConfigure = true;
+
+  # Can't use "make install" here
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin $out/share/openrussian
+    cp openrussian-sqlite3.db $out/share/openrussian
+    cp openrussian $out/bin
+
+    wrapProgram $out/bin/openrussian \
+      --prefix LUA_PATH ';' '${lua.pkgs.luaLib.genLuaPathAbsStr luaEnv}' \
+      --prefix LUA_CPATH ';' '${lua.pkgs.luaLib.genLuaCPathAbsStr luaEnv}'
+
+    runHook postInstall
+  '';
+
+  postInstall = ''
+    installShellCompletion --cmd openrussian --bash ./openrussian-completion.bash
+    installManPage ./openrussian.1
+  '';
+
+  meta = with lib; {
+    description = "Offline Console Russian Dictionary (based on openrussian.org)";
+    homepage    = "https://github.com/rhaberkorn/openrussian-cli";
+    license     = with licenses; [ gpl3Only mit cc-by-sa-40 ];
+    maintainers = with maintainers; [ zane ];
+    mainProgram = "openrussian";
+    platforms   = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/opensbi/default.nix b/nixpkgs/pkgs/misc/opensbi/default.nix
new file mode 100644
index 000000000000..9178676edc19
--- /dev/null
+++ b/nixpkgs/pkgs/misc/opensbi/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, python3
+, withPlatform ? "generic"
+, withPayload ? null
+, withFDT ? null
+}:
+
+stdenv.mkDerivation rec {
+  pname = "opensbi";
+  version = "1.3.1";
+
+  src = fetchFromGitHub {
+    owner = "riscv-software-src";
+    repo = "opensbi";
+    rev = "v${version}";
+    hash = "sha256-JNkPvmKYd5xbGB2lsZKWrpI6rBIckWbkLYu98bw7+QY=";
+  };
+
+  postPatch = ''
+    patchShebangs ./scripts
+  '';
+
+  nativeBuildInputs = [ python3 ];
+
+  installFlags = [
+    "I=$(out)"
+  ];
+
+  makeFlags = [
+    "PLATFORM=${withPlatform}"
+  ] ++ lib.optionals (withPayload != null) [
+    "FW_PAYLOAD_PATH=${withPayload}"
+  ] ++ lib.optionals (withFDT != null) [
+    "FW_FDT_PATH=${withFDT}"
+  ];
+
+  dontStrip = true;
+  dontPatchELF = true;
+
+  meta = with lib; {
+    description = "RISC-V Open Source Supervisor Binary Interface";
+    homepage = "https://github.com/riscv-software-src/opensbi";
+    license = licenses.bsd2;
+    maintainers = with maintainers; [ ius nickcao zhaofengli ];
+    platforms = [ "riscv64-linux" ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/plasma-hud/default.nix b/nixpkgs/pkgs/misc/plasma-hud/default.nix
new file mode 100644
index 000000000000..4116751f4fec
--- /dev/null
+++ b/nixpkgs/pkgs/misc/plasma-hud/default.nix
@@ -0,0 +1,41 @@
+{ lib, python3, fetchFromGitHub, rofi, gobject-introspection }:
+
+python3.pkgs.buildPythonApplication rec{
+  pname = "plasma-hud";
+  version = "19.10.1";
+
+  src = fetchFromGitHub {
+    owner = "Zren";
+    repo = pname;
+    rev = version;
+    sha256 = "19vlc156jfdamw7q1pc78fmlf0h3sff5ar3di9j316vbb60js16l";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [
+    rofi
+    dbus-python
+    setproctitle
+    xlib
+    pygobject3
+    gobject-introspection
+  ];
+  format = "other";
+  postPatch = ''
+    sed -i "s:/usr/lib/plasma-hud:$out/bin:" etc/xdg/autostart/plasma-hud.desktop
+  '';
+
+  installPhase = ''
+    patchShebangs $out/bin/plasma-hud
+    mkdir -p $out/bin $out/etc/xdg/autostart
+    cp -r $src/usr/lib/plasma-hud/plasma-hud $out/bin/plasma-hud
+    cp -r $src/etc $out/etc
+  '';
+
+  meta = with lib;{
+    license = licenses.gpl2Only;
+    homepage = "https://github.com/Zren/plasma-hud";
+    platforms = platforms.unix;
+    description = "Run menubar commands, much like the Unity 7 Heads-Up Display (HUD)";
+    maintainers = with maintainers; [ pasqui23 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/platformsh/default.nix b/nixpkgs/pkgs/misc/platformsh/default.nix
new file mode 100644
index 000000000000..64b9168fee48
--- /dev/null
+++ b/nixpkgs/pkgs/misc/platformsh/default.nix
@@ -0,0 +1,51 @@
+{ stdenv, fetchurl, makeWrapper, writeShellScript, lib, php, curl, jq, common-updater-scripts }:
+
+let
+  pname = "platformsh";
+  version = "3.79.2";
+in
+stdenv.mkDerivation {
+  inherit pname version;
+
+  src = fetchurl {
+    url = "https://github.com/platformsh/platformsh-cli/releases/download/v${version}/platform.phar";
+    sha256 = "sha256-STGMKWgI4C6ccg8DGUhdnEENOB2//gtpU0ljM4cQCXI=";
+  };
+
+  dontUnpack = true;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+    mkdir -p $out/bin
+    install -D $src $out/libexec/platformsh/platform.phar
+    makeWrapper ${php}/bin/php $out/bin/platform \
+      --add-flags "$out/libexec/platformsh/platform.phar"
+    runHook postInstall
+  '';
+
+  passthru = {
+      updateScript = writeShellScript "update-${pname}" ''
+        set -o errexit
+        export PATH="${lib.makeBinPath [ curl jq common-updater-scripts ]}"
+        NEW_VERSION=$(curl -s https://api.github.com/repos/platformsh/platformsh-cli/releases/latest | jq .tag_name --raw-output)
+
+        if [[ "v${version}" = "$NEW_VERSION" ]]; then
+            echo "The new version same as the old version."
+            exit 0
+        fi
+
+        update-source-version "platformsh" "$NEW_VERSION"
+      '';
+    };
+
+  meta = with lib; {
+    description = "The unified tool for managing your Platform.sh services from the command line.";
+    homepage = "https://github.com/platformsh/platformsh-cli";
+    license = licenses.mit;
+    maintainers = with maintainers; [ shyim ];
+    mainProgram = "platform";
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/present/default.nix b/nixpkgs/pkgs/misc/present/default.nix
new file mode 100644
index 000000000000..7ecf61837c59
--- /dev/null
+++ b/nixpkgs/pkgs/misc/present/default.nix
@@ -0,0 +1,31 @@
+{ lib, python3Packages, fetchPypi }:
+
+python3Packages.buildPythonPackage rec {
+  pname = "present";
+  version = "0.6.0";
+
+  src = fetchPypi {
+    inherit pname version;
+    sha256 = "sha256-l9W5L4LD9qRo3rLBkgd2I/aDaj+ucib5UYg+X4RYg6c=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [
+    click
+    pyyaml
+    pyfiglet
+    asciimatics
+    mistune
+  ];
+
+  pythonImportsCheck = [ "present" ];
+
+  # TypeError: don't know how to make test from: 0.6.0
+  doCheck = false;
+
+  meta = with lib; {
+    description = "A terminal-based presentation tool with colors and effects.";
+    homepage = "https://github.com/vinayak-mehta/present";
+    license = licenses.asl20;
+    maintainers = with maintainers; [ lom ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/ptouch-print/default.nix b/nixpkgs/pkgs/misc/ptouch-print/default.nix
new file mode 100644
index 000000000000..f9889cfe4bef
--- /dev/null
+++ b/nixpkgs/pkgs/misc/ptouch-print/default.nix
@@ -0,0 +1,34 @@
+{ lib, stdenv
+, fetchgit
+, autoreconfHook
+, gd
+, libusb1
+}:
+
+stdenv.mkDerivation rec {
+  pname = "ptouch-print";
+  version = "1.4.3";
+
+  src = fetchgit {
+    url = "https://mockmoon-cybernetics.ch/cgi/cgit/linux/ptouch-print.git";
+    rev = "v${version}";
+    sha256 = "0i57asg2hj1nfwy5lcb0vhrpvb9dqfhf81vh4i929h1kiqhlw2hx";
+  };
+
+  nativeBuildInputs = [
+    autoreconfHook
+  ];
+
+  buildInputs = [
+    gd
+    libusb1
+  ];
+
+  meta = with lib; {
+    description = "Command line tool to print labels on Brother P-Touch printers on Linux";
+    license = licenses.gpl3Plus;
+    homepage = "https://mockmoon-cybernetics.ch/computer/p-touch2430pc/";
+    maintainers = with maintainers; [ shamilton ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/pylode/default.nix b/nixpkgs/pkgs/misc/pylode/default.nix
new file mode 100644
index 000000000000..581baf0e9c80
--- /dev/null
+++ b/nixpkgs/pkgs/misc/pylode/default.nix
@@ -0,0 +1,49 @@
+{ lib
+, python3
+, fetchFromGitHub
+}:
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "pylode";
+  version = "2.13.3";
+  format = "setuptools";
+
+  disabled = python3.pythonOlder "3.6";
+
+  src = fetchFromGitHub {
+    owner = "RDFLib";
+    repo = pname;
+    rev = "refs/tags/${version}";
+    sha256 = "sha256-AtqkxnpEL+580S/iKCaRcsQO6LLYhkJxyNx6fi3atbE=";
+  };
+
+  propagatedBuildInputs = with python3.pkgs; [
+    beautifulsoup4
+    falcon
+    jinja2
+    markdown
+    python-dateutil
+    rdflib
+    requests
+  ];
+
+  postPatch = ''
+    substituteInPlace requirements.txt \
+      --replace "rdflib==6.0.0" "rdflib"
+  '';
+
+  # Path issues with the tests
+  doCheck = false;
+
+  pythonImportsCheck = [
+    "pylode"
+  ];
+
+  meta = with lib; {
+    description = "OWL ontology documentation tool using Python and templating, based on LODE";
+    homepage = "https://github.com/RDFLib/pyLODE";
+    # Next release will move to BSD3
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ koslambrou ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/rich-cli/default.nix b/nixpkgs/pkgs/misc/rich-cli/default.nix
new file mode 100644
index 000000000000..a7fb03e11ad4
--- /dev/null
+++ b/nixpkgs/pkgs/misc/rich-cli/default.nix
@@ -0,0 +1,79 @@
+{ lib
+, fetchFromGitHub
+, python3
+}:
+
+let
+  py = python3.override {
+    packageOverrides = final: prev: {
+      rich = prev.rich.overridePythonAttrs (old: rec {
+        version = "12.4.0";
+        src = fetchFromGitHub {
+          owner = "Textualize";
+          repo = "rich";
+          rev = "refs/tags/v12.4.0";
+          hash = "sha256-ryJTusUNpvNF2031ICJWK8ScxHIh+LrXYg7nd0ph4aQ=";
+        };
+        propagatedBuildInputs = with py.pkgs; [
+          commonmark
+          pygments
+        ];
+        doCheck = false;
+      });
+
+      textual = prev.textual.overridePythonAttrs (old: rec {
+        version = "0.1.18";
+        src = fetchFromGitHub {
+          owner = "Textualize";
+          repo = "textual";
+          rev = "refs/tags/v0.1.18";
+          hash = "sha256-XVmbt8r5HL8r64ISdJozmM+9HuyvqbpdejWICzFnfiw=";
+        };
+        doCheck = false;
+      });
+    };
+  };
+in
+
+python3.pkgs.buildPythonApplication rec {
+  pname = "rich-cli";
+  version = "1.8.0";
+  format = "pyproject";
+
+  src = fetchFromGitHub {
+    owner = "Textualize";
+    repo = pname;
+    rev = "refs/tags/v${version}";
+    hash = "sha256-mV5b/J9wX9niiYtlmAUouaAm9mY2zTtDmex7FNWcezQ=";
+  };
+
+  postPatch = ''
+    substituteInPlace pyproject.toml \
+      --replace 'rich = "^12.4.0"' 'rich = "*"' \
+      --replace 'textual = "^0.1.18"' 'textual = "*"'
+  '';
+
+  nativeBuildInputs = with py.pkgs; [
+    poetry-core
+  ];
+
+  propagatedBuildInputs = with py.pkgs; [
+    rich
+    click
+    requests
+    textual
+    rich-rst
+  ];
+
+  pythonImportsCheck = [
+    "rich_cli"
+  ];
+
+  meta = with lib; {
+    description = "Command Line Interface to Rich";
+    homepage = "https://github.com/Textualize/rich-cli";
+    changelog = "https://github.com/Textualize/rich-cli/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ joelkoen ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/riscv-pk/default.nix b/nixpkgs/pkgs/misc/riscv-pk/default.nix
new file mode 100644
index 000000000000..66b7321c780d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/riscv-pk/default.nix
@@ -0,0 +1,41 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, payload ? null }:
+
+stdenv.mkDerivation rec {
+  pname = "riscv-pk";
+  version = "1.0.0";
+
+  src = fetchFromGitHub {
+    owner = "riscv";
+    repo = "riscv-pk";
+    rev = "v${version}";
+    sha256 = "1cc0rz4q3a1zw8756b8yysw8lb5g4xbjajh5lvqbjix41hbdx6xz";
+  };
+
+  nativeBuildInputs = [ autoreconfHook ];
+
+  preConfigure = ''
+    mkdir build
+    cd build
+  '';
+
+  configureScript = "../configure";
+
+  configureFlags = lib.optional (payload != null)
+    "--with-payload=${payload}";
+
+  hardeningDisable = [ "all" ];
+
+  postInstall = ''
+    mv $out/* $out/.cleanup
+    mv $out/.cleanup/* $out
+    rmdir $out/.cleanup
+  '';
+
+  meta = {
+    description = "RISC-V Proxy Kernel and Bootloader";
+    homepage = "https://github.com/riscv/riscv-pk";
+    license = lib.licenses.bsd3;
+    platforms = lib.platforms.riscv;
+    maintainers = [ lib.maintainers.shlevy ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/rivalcfg/default.nix b/nixpkgs/pkgs/misc/rivalcfg/default.nix
new file mode 100644
index 000000000000..737a3839d7a0
--- /dev/null
+++ b/nixpkgs/pkgs/misc/rivalcfg/default.nix
@@ -0,0 +1,40 @@
+{ lib, fetchFromGitHub, python3Packages }:
+
+python3Packages.buildPythonPackage rec {
+  pname = "rivalcfg";
+  version = "4.8.0";
+
+  src = fetchFromGitHub {
+    owner = "flozz";
+    repo = "rivalcfg";
+    rev = "v${version}";
+    sha256 = "sha256-fCl+XY+R+QF7jWLkqii4v0sbXr7xoX3A3upm+XoBAms=";
+  };
+
+  propagatedBuildInputs = with python3Packages; [ hidapi setuptools ];
+
+  checkInputs = [ python3Packages.pytest ];
+  checkPhase = "pytest";
+
+  # tests are broken
+  doCheck = false;
+
+  postInstall = ''
+    set -x
+    mkdir -p $out/lib/udev/rules.d
+    tmpl_udev="$out/lib/udev/rules.d/99-rivalcfg.rules"
+    tmpudev="''${tmpl_udev}.in"
+    finaludev="$tmpl_udev"
+    "$out/bin/rivalcfg" --print-udev > "$tmpudev"
+    substitute "$tmpudev" "$out/lib/udev/rules.d/99-rivalcfg.rules" \
+      --replace MODE=\"0666\" "MODE=\"0664\", GROUP=\"input\""
+    rm "$tmpudev"
+  '';
+
+  meta = with lib; {
+    description = "Utility program that allows you to configure SteelSeries Rival gaming mice";
+    homepage = "https://github.com/flozz/rivalcfg";
+    license = licenses.wtfpl;
+    maintainers = with maintainers; [ ornxka ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/rkdeveloptool-pine64/default.nix b/nixpkgs/pkgs/misc/rkdeveloptool-pine64/default.nix
new file mode 100644
index 000000000000..d9de20bcf447
--- /dev/null
+++ b/nixpkgs/pkgs/misc/rkdeveloptool-pine64/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, fetchurl
+, meson
+, pkg-config
+, libusb1
+, scdoc
+, ninja
+, cmake
+}:
+
+let
+  rev = "cce7d2a5c4efd4e7727c440868141229354b327b";
+in
+stdenv.mkDerivation {
+  pname = "rkdeveloptool";
+  version = "unstable-2021-09-04";
+
+  src = fetchurl {
+    url = "https://gitlab.com/pine64-org/quartz-bsp/rkdeveloptool/-/archive/${rev}/rkdeveloptool-${rev}.tar.gz";
+    sha256 = "sha256-u/x1Y1zZ19SYwNLVAvpqjH247RijyDJ1HTDWIsmqlFk=";
+  };
+
+  postPatch = ''
+    substituteInPlace meson.build --replace \
+      "udev_rules_dir = udev.get_pkgconfig_variable('udevdir') + '/rules.d'" \
+      "udev_rules_dir = '$out/lib/udev'"
+  '';
+
+  nativeBuildInputs = [ meson ninja cmake pkg-config scdoc ];
+
+  buildInputs = [ libusb1 ];
+
+  meta =
+    let
+      inherit (lib) maintainers;
+    in
+    {
+      homepage = "https://gitlab.com/pine64-org/quartz-bsp/rkdeveloptool/";
+      description = "A tool from Rockchip to communicate with Rockusb devices (pine64 fork)";
+      license = lib.licenses.gpl2;
+      maintainers = [ maintainers.adisbladis ];
+    };
+}
diff --git a/nixpkgs/pkgs/misc/rkdeveloptool/default.nix b/nixpkgs/pkgs/misc/rkdeveloptool/default.nix
new file mode 100644
index 000000000000..a07748fbe263
--- /dev/null
+++ b/nixpkgs/pkgs/misc/rkdeveloptool/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, libusb1 }:
+
+stdenv.mkDerivation {
+  pname = "rkdeveloptool";
+  version = "unstable-2021-04-08";
+
+  src = fetchFromGitHub {
+    owner = "rockchip-linux";
+    repo = "rkdeveloptool";
+    rev = "46bb4c073624226c3f05b37b9ecc50bbcf543f5a";
+    sha256 = "eIFzyoY6l3pdfCN0uS16hbVp0qzdG3MtcS1jnDX1Yk0=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+
+  buildInputs = [ libusb1 ];
+
+  # main.cpp:1568:36: error: '%s' directive output may be truncated writing up to 557 bytes into a region of size 5
+  CPPFLAGS = lib.optionals stdenv.cc.isGNU [ "-Wno-error=format-truncation" ];
+
+  meta = with lib; {
+    homepage = "https://github.com/rockchip-linux/rkdeveloptool";
+    description = "A tool from Rockchip to communicate with Rockusb devices";
+    license = licenses.gpl2;
+    maintainers = [ maintainers.lopsided98 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/sagetex/default.nix b/nixpkgs/pkgs/misc/sagetex/default.nix
new file mode 100644
index 000000000000..0f22158e3eb5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/sagetex/default.nix
@@ -0,0 +1,44 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, texlive
+}:
+
+stdenv.mkDerivation (finalAttrs: rec {
+  pname = "sagetex";
+  version = "3.6.1";
+
+  src = fetchFromGitHub {
+    owner = "sagemath";
+    repo = "sagetex";
+    rev = "v${version}";
+    sha256 = "sha256-OfhbXHbGI+DaDHqZCOGiSHJPHjGuT7ZqSEjKweloW38=";
+  };
+
+  buildInputs = [
+    texlive.combined.scheme-basic
+  ];
+
+  buildPhase = ''
+    make sagetex.sty
+  '';
+
+  installPhase = ''
+    path="$out/tex/latex/sagetex"
+    mkdir -p "$path"
+    cp -va *.sty *.cfg *.def "$path/"
+  '';
+
+  passthru = {
+    tlType = "run";
+    pkgs = [ finalAttrs.finalPackage ];
+  };
+
+  meta = with lib; {
+    description = "Embed code, results of computations, and plots from Sage into LaTeX documents";
+    homepage = "https://github.com/sagemath/sagetex";
+    license = licenses.gpl2Plus;
+    maintainers = with maintainers; [ alexnortung ];
+    platforms = platforms.all;
+  };
+})
diff --git a/nixpkgs/pkgs/misc/sailsd/default.nix b/nixpkgs/pkgs/misc/sailsd/default.nix
new file mode 100644
index 000000000000..d2f91c42638a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/sailsd/default.nix
@@ -0,0 +1,48 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, jansson }:
+
+let
+  libsailing = fetchFromGitHub {
+    owner = "sails-simulator";
+    repo = "libsailing";
+    rev = "9b2863ff0c539cd23d91b0254032a7af9c840574";
+    sha256 = "06rcxkwgms9sxqr1swnnc4jnvgs0iahm4cksd475yd1bp5p1gq6j";
+  };
+in
+stdenv.mkDerivation rec {
+  version = "0.3.0";
+  pname = "sailsd";
+  src = fetchFromGitHub {
+    owner = "sails-simulator";
+    repo = "sailsd";
+    rev = version;
+    sha256 = "1s4nlffp683binbdxwwzbsci61kbjylbcr1jf44sv1h1r5d5js05";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ jansson libsailing ];
+
+  INSTALL_PATH = "$(out)";
+
+  postUnpack = ''
+    rmdir $sourceRoot/libsailing
+    cp -r ${libsailing} $sourceRoot/libsailing
+    chmod 755 -R $sourceRoot/libsailing
+  '';
+
+  patchPhase = ''
+    substituteInPlace Makefile \
+      --replace gcc cc
+  '';
+
+  meta = with lib; {
+    description = "Simulator daemon for autonomous sailing boats";
+    homepage = "https://github.com/sails-simulator/sailsd";
+    license = licenses.gpl3;
+    longDescription = ''
+      Sails is a simulator designed to test the AI of autonomous sailing
+      robots. It emulates the basic physics of sailing a small single sail
+      boat'';
+    maintainers = with maintainers; [ kragniz ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/scimark/default.nix b/nixpkgs/pkgs/misc/scimark/default.nix
new file mode 100644
index 000000000000..5726556e687f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/scimark/default.nix
@@ -0,0 +1,36 @@
+{ lib
+, stdenv
+, fetchurl
+, unzip
+}:
+
+stdenv.mkDerivation rec {
+  pname = "scimark";
+  version = "4c";
+
+  src = fetchurl {
+    url = "https://math.nist.gov/scimark2/${pname}${version}.zip";
+    hash = "sha256-kcg5vKYp0B7+bC/CmFMO/tMwxf9q6nvuFv0vRSy3MbE=";
+  };
+
+  nativeBuildInputs = [
+    unzip
+  ];
+
+  dontConfigure = true;
+
+  installPhase = ''
+    install -d $out/bin/
+    install scimark4 $out/bin/
+  '';
+
+  meta = with lib; {
+    homepage = "https://math.nist.gov/scimark2/index.html";
+    description = "Scientific and numerical computing benchmark (ANSI C version)";
+    license = licenses.publicDomain;
+    maintainers = with maintainers; [ AndersonTorres ];
+    mainProgram = "scimark4";
+    platforms = platforms.all;
+  };
+}
+# TODO [ AndersonTorres ]: Java version
diff --git a/nixpkgs/pkgs/misc/scrcpy/default.nix b/nixpkgs/pkgs/misc/scrcpy/default.nix
new file mode 100644
index 000000000000..9602b6364974
--- /dev/null
+++ b/nixpkgs/pkgs/misc/scrcpy/default.nix
@@ -0,0 +1,77 @@
+{ lib
+, stdenv
+, fetchurl
+, fetchFromGitHub
+, makeWrapper
+, meson
+, ninja
+, pkg-config
+, runtimeShell
+, installShellFiles
+
+, android-tools
+, ffmpeg
+, libusb1
+, SDL2
+}:
+
+let
+  version = "2.1.1";
+  prebuilt_server = fetchurl {
+    name = "scrcpy-server";
+    inherit version;
+    url = "https://github.com/Genymobile/scrcpy/releases/download/v${version}/scrcpy-server-v${version}";
+    sha256 = "sha256-lVjbbFZ0Oh3AOzj1mAH7QOkcyJH4/AyJ5bCwZ3YfFI4=";
+  };
+in
+stdenv.mkDerivation rec {
+  pname = "scrcpy";
+  inherit version;
+
+  src = fetchFromGitHub {
+    owner = "Genymobile";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-SRIQqmvqB1kudUvt0HTFPMdk7MLWEcK2jOT0on1rh+E=";
+  };
+
+  #   display.c: When run without a hardware accelerator, this allows the command to continue working rather than failing unexpectedly.
+  #   This can happen when running on non-NixOS because then scrcpy seems to have a hard time using the host OpenGL-supporting hardware.
+  #   It would be better to fix the OpenGL problem, but that seems much more intrusive.
+  postPatch = ''
+    substituteInPlace app/src/display.c \
+      --replace "SDL_RENDERER_ACCELERATED" "SDL_RENDERER_ACCELERATED || SDL_RENDERER_SOFTWARE"
+  '';
+
+  nativeBuildInputs = [ makeWrapper meson ninja pkg-config installShellFiles ];
+
+  buildInputs = [ ffmpeg SDL2 libusb1 ];
+
+  # Manually install the server jar to prevent Meson from "fixing" it
+  preConfigure = ''
+    echo -n > server/meson.build
+  '';
+
+  postInstall = ''
+    mkdir -p "$out/share/scrcpy"
+    ln -s "${prebuilt_server}" "$out/share/scrcpy/scrcpy-server"
+
+    # runtime dep on `adb` to push the server
+    wrapProgram "$out/bin/scrcpy" --prefix PATH : "${android-tools}/bin"
+  '' + lib.optionalString stdenv.isLinux ''
+    substituteInPlace $out/share/applications/scrcpy-console.desktop \
+      --replace "/bin/bash" "${runtimeShell}"
+  '';
+
+  meta = with lib; {
+    description = "Display and control Android devices over USB or TCP/IP";
+    homepage = "https://github.com/Genymobile/scrcpy";
+    sourceProvenance = with sourceTypes; [
+      fromSource
+      binaryBytecode # server
+    ];
+    license = licenses.asl20;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ deltaevo lukeadams msfjarvis ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/alock/default.nix b/nixpkgs/pkgs/misc/screensavers/alock/default.nix
new file mode 100644
index 000000000000..46af4b303dd6
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/alock/default.nix
@@ -0,0 +1,46 @@
+{ lib, stdenv, fetchFromGitHub, pkg-config, autoreconfHook
+, libX11, pam, libgcrypt, libXrender, imlib2 }:
+
+stdenv.mkDerivation rec {
+  pname = "alock";
+  version = "unstable-2017-07-20";
+
+  src = fetchFromGitHub {
+    owner = "Arkq";
+    repo = "alock";
+    rev = "2035e1d4a2293432f5503e82d10f899232eb0f38";
+    sha256 = "sha256-Rm00ytSfEv5Wljz4f/4bbyrK3sCV/oRUwz4DKx0pya8=";
+  };
+
+  PAM_DEFAULT_SERVICE = "login";
+
+  configureFlags = [
+    "--enable-pam"
+    "--enable-hash"
+    "--enable-xrender"
+    "--enable-imlib2"
+  ];
+
+  nativeBuildInputs = [ pkg-config autoreconfHook ];
+  buildInputs = [
+    libX11
+    pam libgcrypt libXrender imlib2
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/Arkq/alock";
+    description = "Simple screen lock application for X server";
+    longDescription = ''
+      alock locks the X server until the user enters a password
+      via the keyboard. If the authentication was successful
+      the X server is unlocked and the user can continue to work.
+
+      alock does not provide any fancy animations like xlock or
+      xscreensaver and never will. It's just for locking the current
+      X session.
+    '';
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ftrvxmtrx chris-martin ];
+    license = licenses.mit;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/betterlockscreen/default.nix b/nixpkgs/pkgs/misc/screensavers/betterlockscreen/default.nix
new file mode 100644
index 000000000000..8c7740ae7bb5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/betterlockscreen/default.nix
@@ -0,0 +1,58 @@
+{ fetchFromGitHub
+, lib
+, makeWrapper
+, stdenv
+
+  # Dependencies (@see https://github.com/pavanjadhaw/betterlockscreen/blob/master/shell.nix)
+, bc
+, coreutils
+, dbus
+, withDunst ? true
+, dunst
+, i3lock-color
+, gawk
+, gnugrep
+, gnused
+, imagemagick
+, procps
+, xorg
+}:
+
+let
+  runtimeDeps =
+    [ bc coreutils dbus i3lock-color gawk gnugrep gnused imagemagick procps xorg.xdpyinfo xorg.xrandr xorg.xset ]
+    ++ lib.optionals withDunst [ dunst ];
+in
+
+stdenv.mkDerivation rec {
+  pname = "betterlockscreen";
+  version = "4.0.4";
+
+  src = fetchFromGitHub {
+    owner = "pavanjadhaw";
+    repo = "betterlockscreen";
+    rev = "v${version}";
+    sha256 = "sha256-ZZnwByxfESE8ZOOh1vnbphUHDolo9MIQh3erjtBLmWQ=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    runHook preInstall
+
+    mkdir -p $out/bin
+    cp betterlockscreen $out/bin/betterlockscreen
+    wrapProgram "$out/bin/betterlockscreen" \
+      --prefix PATH : "$out/bin:${lib.makeBinPath runtimeDeps}"
+
+    runHook postInstall
+  '';
+
+  meta = with lib; {
+    description = "Fast and sweet looking lockscreen for linux systems with effects!";
+    homepage = "https://github.com/pavanjadhaw/betterlockscreen";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ eyjhb sebtm ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/electricsheep/default.nix b/nixpkgs/pkgs/misc/screensavers/electricsheep/default.nix
new file mode 100644
index 000000000000..a231d22d90f5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/electricsheep/default.nix
@@ -0,0 +1,76 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, autoreconfHook
+, wxGTK32
+, ffmpeg_4
+, lua5_1
+, curl
+, libpng
+, xorg
+, pkg-config
+, flam3
+, libgtop
+, boost179
+, tinyxml
+, freeglut
+, libGLU
+, libGL
+, glee
+}:
+
+stdenv.mkDerivation rec {
+  pname = "electricsheep";
+  version = "3.0.2-2019-10-05";
+
+  src = fetchFromGitHub {
+    owner = "scottdraves";
+    repo = pname;
+    rev = "37ba0fd692d6581f8fe009ed11c9650cd8174123";
+    sha256 = "sha256-v/+2dxOY/p6wNAywcFHUAfsZEJw31Syu2MacN/KeyWg=";
+  };
+
+  nativeBuildInputs = [ autoreconfHook pkg-config ];
+
+  buildInputs = [
+    wxGTK32
+    ffmpeg_4
+    lua5_1
+    curl
+    libpng
+    xorg.libXrender
+    flam3
+    libgtop
+    boost179
+    tinyxml
+    freeglut
+    libGLU
+    libGL
+    glee
+  ];
+
+  preAutoreconf = ''
+    cd client_generic
+    sed -i '/ACX_PTHREAD/d' configure.ac
+  '';
+
+  configureFlags = [
+    "CPPFLAGS=-I${glee}/include/GL"
+  ];
+
+  makeFlags = [
+    ''CXXFLAGS+="-DGL_GLEXT_PROTOTYPES"''
+  ];
+
+  preBuild = ''
+    sed -i "s|/usr|$out|" Makefile
+  '';
+
+  meta = with lib; {
+    description = "Electric Sheep, a distributed screen saver for evolving artificial organisms";
+    homepage = "https://electricsheep.org/";
+    maintainers = with maintainers; [ ];
+    platforms = platforms.linux;
+    license = licenses.gpl2Only;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/i3lock-pixeled/default.nix b/nixpkgs/pkgs/misc/screensavers/i3lock-pixeled/default.nix
new file mode 100644
index 000000000000..cb7a2fd1e184
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/i3lock-pixeled/default.nix
@@ -0,0 +1,40 @@
+{ lib, stdenv, i3lock, imagemagick, scrot, playerctl, fetchFromGitLab }:
+
+stdenv.mkDerivation rec {
+  pname = "i3lock-pixeled";
+  version = "1.2.1";
+
+  src = fetchFromGitLab {
+    owner = "Ma27";
+    repo = "i3lock-pixeled";
+    rev = version;
+    sha256 = "1l9yjf9say0mcqnnjkyj4z3f6y83bnx4jsycd1h10p3m8afbh8my";
+  };
+
+  propagatedBuildInputs = [
+    i3lock
+    imagemagick
+    scrot
+    playerctl
+  ];
+
+  makeFlags = [
+    "PREFIX=$(out)/bin"
+  ];
+
+  patchPhase = ''
+    substituteInPlace i3lock-pixeled \
+       --replace i3lock    "${i3lock}/bin/i3lock" \
+       --replace convert   "${imagemagick}/bin/convert" \
+       --replace scrot     "${scrot}/bin/scrot" \
+       --replace playerctl "${playerctl}/bin/playerctl"
+  '';
+
+  meta = with lib; {
+    description = "Simple i3lock helper which pixels a screenshot by scaling it down and up to get a pixeled version of the screen when the lock is active";
+    homepage = "https://gitlab.com/Ma27/i3lock-pixeled";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ ma27 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/light-locker/default.nix b/nixpkgs/pkgs/misc/screensavers/light-locker/default.nix
new file mode 100644
index 000000000000..33db5825bc02
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/light-locker/default.nix
@@ -0,0 +1,88 @@
+{ lib, stdenv
+, fetchFromGitHub
+, nix-update-script
+, meson
+, ninja
+, pkg-config
+, gtk3
+, glib
+, intltool
+, dbus-glib
+, libX11
+, libXScrnSaver
+, libXxf86vm
+, libXext
+, systemd
+, pantheon
+, wrapGAppsHook
+}:
+
+stdenv.mkDerivation rec {
+  pname = "light-locker";
+  version = "1.9.0";
+
+  outputs = [ "out" "man" ];
+
+  src = fetchFromGitHub {
+    owner = "the-cavalry";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1z5lcd02gqax65qc14hj5khifg7gr53zy3s5i6apba50lbdlfk46";
+  };
+
+  nativeBuildInputs = [
+    intltool
+    meson
+    ninja
+    pkg-config
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    dbus-glib
+    glib
+    gtk3
+    libX11
+    libXScrnSaver
+    libXext
+    libXxf86vm
+    systemd
+  ];
+
+  mesonFlags = [
+    "-Dmit-ext=true"
+    "-Ddpms-ext=true"
+    "-Dxf86gamma-ext=true"
+    "-Dsystemd=true"
+    "-Dupower=true"
+    "-Dlate-locking=true"
+    "-Dlock-on-suspend=true"
+    "-Dlock-on-lid=true"
+    "-Dgsettings=true"
+  ];
+
+  postInstall = ''
+    ${glib.dev}/bin/glib-compile-schemas $out/share/glib-2.0/schemas
+  '';
+
+  passthru = {
+    updateScript = nix-update-script { };
+  };
+
+  meta = with lib; {
+    homepage = "https://github.com/the-cavalry/light-locker";
+    description = "A simple session-locker for LightDM";
+    longDescription = ''
+      A simple locker (forked from gnome-screensaver) that aims to
+      have simple, sane, secure defaults and be well integrated with
+      the desktop while not carrying any desktop-specific
+      dependencies.
+
+      It relies on LightDM for locking and unlocking your session via
+      ConsoleKit/UPower or logind/systemd.
+    '';
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ obadz ] ++ teams.pantheon.members;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/multilockscreen/default.nix b/nixpkgs/pkgs/misc/screensavers/multilockscreen/default.nix
new file mode 100644
index 000000000000..b0c157c778ad
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/multilockscreen/default.nix
@@ -0,0 +1,47 @@
+{
+  lib, stdenv, makeWrapper, fetchFromGitHub, writeShellScriptBin,
+  imagemagick, i3lock-color, xdpyinfo, xrandr, bc, feh, procps, xrdb, xset,
+  gnused, gnugrep, coreutils
+}:
+let
+  i3lock = writeShellScriptBin "i3lock" ''
+    ${i3lock-color}/bin/i3lock-color "$@"
+  '';
+  binPath = lib.makeBinPath [
+    imagemagick i3lock
+    xdpyinfo xrandr xset
+    bc feh procps xrdb
+    gnused gnugrep coreutils
+  ];
+in
+stdenv.mkDerivation rec {
+  pname = "multilockscreen";
+  version = "1.2.0";
+
+  src = fetchFromGitHub {
+    owner = "jeffmhubbard";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1bfpbazvhaz9x356nsghz0czysh9b75g79cd9s35v0x0rrzdr9qj";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    mkdir -p $out/bin
+    cp multilockscreen $out/bin/multilockscreen
+    wrapProgram "$out/bin/multilockscreen" --prefix PATH : "${binPath}"
+  '';
+
+  meta = with lib; {
+    description = "Wrapper script for i3lock-color";
+    longDescription = ''
+      multilockscreen is a wrapper script for i3lock-color.
+      It allows you to cache background images for i3lock-color with a variety of different effects and adds a stylish indicator.
+    '';
+    homepage = "https://github.com/jeffmhubbard/multilockscreen";
+    license = licenses.mit;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ kylesferrazza ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/physlock/default.nix b/nixpkgs/pkgs/misc/screensavers/physlock/default.nix
new file mode 100644
index 000000000000..b5e9ba8d2b6a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/physlock/default.nix
@@ -0,0 +1,27 @@
+{ lib, stdenv, fetchFromGitHub, pam, systemd }:
+
+stdenv.mkDerivation rec {
+  version = "13";
+  pname = "physlock";
+  src = fetchFromGitHub {
+    owner = "muennich";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "1mz4xxjip5ldiw9jgfq9zvqb6w10bcjfx6939w1appqg8f521a7s";
+  };
+
+  buildInputs = [ pam systemd ];
+
+  preConfigure = ''
+    substituteInPlace Makefile \
+      --replace "-m 4755 -o root -g root" ""
+  '';
+
+  makeFlags = [ "PREFIX=$(out)" "SESSION=systemd" ];
+
+  meta = with lib; {
+    description = "A secure suspend/hibernate-friendly alternative to `vlock -an`";
+    license = licenses.gpl2;
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/pipes-rs/default.nix b/nixpkgs/pkgs/misc/screensavers/pipes-rs/default.nix
new file mode 100644
index 000000000000..01346b9ccc6e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/pipes-rs/default.nix
@@ -0,0 +1,33 @@
+{ rustPlatform, fetchFromGitHub, lib }:
+
+rustPlatform.buildRustPackage rec {
+  pname = "pipes-rs";
+  version = "1.6.1";
+
+  src = fetchFromGitHub {
+    owner = "lhvy";
+    repo = pname;
+    rev = "v${version}";
+    sha256 = "sha256-0i5jAqOGq+N5bUM103Gk1Wzgwe7wUQRjJ+T4XqUkuZw=";
+  };
+
+  cargoHash = "sha256-LOU1BCFeX+F2dJdajgLDAtgyyrn6KkvLx3KtF9NkKcY=";
+
+  doInstallCheck = true;
+
+  installCheckPhase = ''
+    if [[ "$("$out/bin/${pname}" --version)" == "${pname} ${version}" ]]; then
+      echo '${pname} smoke check passed'
+    else
+      echo '${pname} smoke check failed'
+      return 1
+    fi
+  '';
+
+  meta = with lib; {
+    description = "An over-engineered rewrite of pipes.sh in Rust";
+    homepage = "https://github.com/lhvy/pipes-rs";
+    license = licenses.blueOak100;
+    maintainers = [ maintainers.vanilla ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/pipes/default.nix b/nixpkgs/pkgs/misc/screensavers/pipes/default.nix
new file mode 100644
index 000000000000..bbabd02f4751
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/pipes/default.nix
@@ -0,0 +1,32 @@
+{ lib, stdenv, fetchFromGitHub, makeWrapper, coreutils, ncurses }:
+
+stdenv.mkDerivation rec {
+  pname = "pipes";
+  version = "1.3.0";
+
+  src = fetchFromGitHub {
+    owner = "pipeseroni";
+    repo = "pipes.sh";
+    rev = "v${version}";
+    hash = "sha256-856OWlnNiGB20571TJg7Ayzcz4r6NqdW5DMDiim09mc=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  installPhase = ''
+    mkdir $out -p
+    make PREFIX=$out/ install
+
+    wrapProgram $out/bin/pipes.sh \
+      --set PATH "${lib.makeBinPath [ coreutils ncurses ]}"
+  '';
+
+  meta = with lib; {
+    description = "Animated pipes terminal screensaver";
+    homepage = "https://github.com/pipeseroni/pipes.sh";
+    license = licenses.mit;
+    maintainers = [ maintainers.matthiasbeyer ];
+    mainProgram = "pipes.sh";
+    platforms = platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/rss-glx/cstddef.patch b/nixpkgs/pkgs/misc/screensavers/rss-glx/cstddef.patch
new file mode 100644
index 000000000000..8bec510b0405
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/rss-glx/cstddef.patch
@@ -0,0 +1,12 @@
+diff --git i/src/Implicit/impSurface.h w/src/Implicit/impSurface.h
+index 41fab81..027587f 100644
+--- i/src/Implicit/impSurface.h
++++ w/src/Implicit/impSurface.h
+@@ -25,6 +25,7 @@
+ #ifdef WIN32
+ 	#include <windows.h>
+ #endif
++#include <cstddef>
+ #include <vector>
+ #include <GL/gl.h>
+ 
diff --git a/nixpkgs/pkgs/misc/screensavers/rss-glx/default.nix b/nixpkgs/pkgs/misc/screensavers/rss-glx/default.nix
new file mode 100644
index 000000000000..3ec89194df87
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/rss-glx/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, fetchurl
+, autoconf
+, pkg-config
+, libX11
+, libXext
+, libGLU
+, libGL
+, imagemagick6
+, libtiff
+, bzip2
+}:
+
+stdenv.mkDerivation rec {
+  version = "0.9.1";
+  pname = "rss-glx";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/rss-glx/rss-glx_${version}.tar.bz2";
+    sha256 = "1aikafjqrfmv23jnrrm5d56dg6injh4l67zjdxzdapv9chw7g3cg";
+  };
+
+  nativeBuildInputs = [ autoconf pkg-config ];
+  buildInputs = [ libGLU libGL libX11 libXext imagemagick6 libtiff bzip2 ];
+
+  patches = [
+    ./cstddef.patch
+  ];
+
+  env.NIX_CFLAGS_COMPILE = "-I${imagemagick6.dev}/include/ImageMagick";
+
+  meta = {
+    description = "Really Slick Screensavers Port to GLX";
+    longDescription = ''
+      This package currently contains all of the screensavers from the
+      original collection, plus a few others.
+    '';
+    license = lib.licenses.gpl2;
+    platforms = lib.platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/slock/default.nix b/nixpkgs/pkgs/misc/screensavers/slock/default.nix
new file mode 100644
index 000000000000..09fccd11d9e9
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/slock/default.nix
@@ -0,0 +1,38 @@
+{ lib, stdenv, fetchurl, writeText
+, xorgproto, libX11, libXext, libXrandr, libxcrypt
+# default header can be obtained from
+# https://git.suckless.org/slock/tree/config.def.h
+, conf ? null }:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "slock";
+  version = "1.5";
+
+  src = fetchurl {
+    url = "https://dl.suckless.org/tools/slock-${finalAttrs.version}.tar.gz";
+    hash = "sha256-ruHj+/aid/tiWjg4BzuXm2SD57rKTOgvVt4f8ZLbDk0=";
+  };
+
+  buildInputs = [ xorgproto libX11 libXext libXrandr libxcrypt ];
+
+  installFlags = [ "PREFIX=$(out)" ];
+
+  postPatch = "sed -i '/chmod u+s/d' Makefile";
+
+  preBuild = lib.optionalString (conf != null) ''
+    cp ${writeText "config.def.h" conf} config.def.h
+  '';
+
+  makeFlags = [ "CC:=$(CC)" ];
+
+  meta = with lib; {
+    homepage = "https://tools.suckless.org/slock";
+    description = "Simple X display locker";
+    longDescription = ''
+      Simple X display locker. This is the simplest X screen locker.
+    '';
+    license = licenses.mit;
+    maintainers = with maintainers; [ astsmtl ];
+    platforms = platforms.linux;
+  };
+})
diff --git a/nixpkgs/pkgs/misc/screensavers/vlock/default.nix b/nixpkgs/pkgs/misc/screensavers/vlock/default.nix
new file mode 100644
index 000000000000..1602c94c0992
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/vlock/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchurl, pam }:
+
+stdenv.mkDerivation rec {
+  pname = "vlock";
+  version = "2.2.2";
+
+  src = fetchurl {
+    url = "mirror://debian/pool/main/v/vlock/vlock_${version}.orig.tar.gz";
+    sha256 = "1b9gv7hmlb8swda5bn40lp1yki8b8wv29vdnhcjqfl6ir98551za";
+  };
+
+  prePatch = ''
+    sed -i -e '/INSTALL/ {
+      s/-[og] [^ ]*//g; s/4711/755/
+    }' Makefile modules/Makefile
+  '';
+
+  patches = [ ./eintr.patch ];
+
+  configureFlags = [ "VLOCK_GROUP=root" "ROOT_GROUP=root" ];
+
+  buildInputs = [ pam ];
+
+  meta = with lib; {
+    description = "Virtual console locking program";
+    license = licenses.gpl2;
+    maintainers = [ ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/vlock/eintr.patch b/nixpkgs/pkgs/misc/screensavers/vlock/eintr.patch
new file mode 100644
index 000000000000..64f432434324
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/vlock/eintr.patch
@@ -0,0 +1,34 @@
+In systemd I have seen this error, using it as a service:
+
+vlock-start[14567]: vlock-new: could not activate new terminal: Interrupted system call
+
+I think this should fix that.
+
+Also on github: https://github.com/viric/vlock/commit/781a26087f83c7247601b6f82f784cca9266694e
+
+diff --git a/modules/new.c b/modules/new.c
+index e9b15fb..7aed640 100644
+--- a/modules/new.c
++++ b/modules/new.c
+@@ -103,9 +103,19 @@ static char *get_console_name(int n)
+  * file descriptor. */
+ static int activate_console(int consfd, int vtno)
+ {
+-  int c = ioctl(consfd, VT_ACTIVATE, vtno);
++  int c;
++  do {
++    c = ioctl(consfd, VT_ACTIVATE, vtno);
++  } while(c != 0 && errno == EINTR);
+ 
+-  return c < 0 ? c : ioctl(consfd, VT_WAITACTIVE, vtno);
++  if (c < 0)
++      return c;
++
++  do {
++    c = ioctl(consfd, VT_WAITACTIVE, vtno);
++  } while(c != 0 && errno == EINTR);
++
++  return c;
+ }
+ 
+ struct new_console_context {
diff --git a/nixpkgs/pkgs/misc/screensavers/xautolock/default.nix b/nixpkgs/pkgs/misc/screensavers/xautolock/default.nix
new file mode 100644
index 000000000000..fc87290da69a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/xautolock/default.nix
@@ -0,0 +1,35 @@
+{ lib, stdenv, fetchFromGitHub
+, imake, gccmakedep, libX11, libXext, libXScrnSaver, xorgproto
+}:
+
+stdenv.mkDerivation rec {
+  pname = "xautolock";
+  version = "2.2-7-ga23dd5c";
+
+  # This repository contains xautolock-2.2 plus various useful patches that
+  # were collected from Debian, etc.
+  src = fetchFromGitHub {
+    owner = "peti";
+    repo = "xautolock";
+    rev = "v${version}";
+    sha256 = "10j61rl0sx9sh84rjyfyddl73xb5i2cpb17fyrli8kwj39nw0v2g";
+  };
+
+  nativeBuildInputs = [ imake gccmakedep ];
+  buildInputs = [ libX11 libXext libXScrnSaver xorgproto ];
+
+  makeFlags = [
+    "BINDIR=$(out)/bin"
+    "MANPATH=$(out)/share/man"
+  ];
+
+  installTargets = [ "install" "install.man" ];
+
+  meta = with lib; {
+    description = "Launch a given program when your X session has been idle for a given time";
+    homepage = "http://www.ibiblio.org/pub/linux/X11/screensavers";
+    maintainers = with maintainers; [ peti ];
+    platforms = platforms.linux;
+    license = licenses.gpl2;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/xlockmore/default.nix b/nixpkgs/pkgs/misc/screensavers/xlockmore/default.nix
new file mode 100644
index 000000000000..3b771ffedc26
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/xlockmore/default.nix
@@ -0,0 +1,42 @@
+{ stdenv, lib, fetchurl, pam ? null, libX11, libXext, libXinerama
+, libXdmcp, libXt, autoreconfHook }:
+
+stdenv.mkDerivation rec {
+  pname = "xlockmore";
+  version = "5.72";
+
+  src = fetchurl {
+    url = "http://sillycycle.com/xlock/xlockmore-${version}.tar.xz";
+    sha256 = "sha256-1RGXWWeuc1UHKs3M9rG/QU+KFr5QzMgHDxPmJGI+x3I=";
+    curlOpts = "--user-agent 'Mozilla/5.0'";
+  };
+
+  # Optionally, it can use GTK.
+  buildInputs = [ pam libX11 libXext.dev libXinerama libXdmcp libXt ];
+  nativeBuildInputs = [ autoreconfHook ];
+
+  # Don't try to install `xlock' setuid. Password authentication works
+  # fine via PAM without super user privileges.
+  configureFlags =
+    [ "--disable-setuid"
+    ] ++ (lib.optional (pam != null) "--enable-pam");
+
+  postPatch =
+    let makePath = p: lib.concatMapStringsSep " " (x: x + "/" + p) buildInputs;
+        inputs = "${makePath "lib"} ${makePath "include"}";
+    in ''
+      sed -i 's,\(for ac_dir in\),\1 ${inputs},' configure.ac
+      sed -i 's,/usr/,/no-such-dir/,g' configure.ac
+      configureFlags+=" --enable-appdefaultdir=$out/share/X11/app-defaults"
+    '';
+
+  hardeningDisable = [ "format" ]; # no build output otherwise
+
+  meta = with lib; {
+    description = "Screen locker for the X Window System";
+    homepage = "http://sillycycle.com/xlockmore.html";
+    license = licenses.gpl2;
+    maintainers = with maintainers; [ pSub ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/xscreensaver/default.nix b/nixpkgs/pkgs/misc/screensavers/xscreensaver/default.nix
new file mode 100644
index 000000000000..1ec3b6905a65
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/xscreensaver/default.nix
@@ -0,0 +1,108 @@
+{ lib
+, stdenv
+, fetchurl
+, coreutils
+, gdk-pixbuf
+, gdk-pixbuf-xlib
+, gettext
+, gle
+, gtk3
+, intltool
+, libGL
+, libGLU
+, libX11
+, libXext
+, libXft
+, libXi
+, libXinerama
+, libXrandr
+, libXt
+, libXxf86vm
+, libxml2
+, makeWrapper
+, pam
+, perlPackages
+, pkg-config
+, systemd
+, forceInstallAllHacks ? false
+, withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd
+}:
+
+stdenv.mkDerivation (finalAttrs: {
+  pname = "xscreensaver";
+  version = "6.06";
+
+  src = fetchurl {
+    url = "https://www.jwz.org/xscreensaver/xscreensaver-${finalAttrs.version}.tar.gz";
+    hash = "sha256-9TT6uFqDbeW4vo6R/CG4DKfWpO2ThuviB9S+ek50mac=";
+  };
+
+  nativeBuildInputs = [
+    intltool
+    makeWrapper
+    pkg-config
+  ];
+
+  buildInputs = [
+    gdk-pixbuf
+    gdk-pixbuf-xlib
+    gettext
+    gle
+    gtk3
+    libGL
+    libGLU
+    libX11
+    libXext
+    libXft
+    libXi
+    libXinerama
+    libXrandr
+    libXt
+    libXxf86vm
+    libxml2
+    pam
+    perlPackages.LWPProtocolHttps
+    perlPackages.MozillaCA
+    perlPackages.perl
+  ]
+  ++ lib.optional withSystemd systemd;
+
+  preConfigure = ''
+    # Fix installation paths for GTK resources.
+    sed -e 's%@GTK_DATADIR@%@datadir@% ; s%@PO_DATADIR@%@datadir@%' \
+      -i driver/Makefile.in po/Makefile.in.in
+  '';
+
+  configureFlags = [
+    "--with-app-defaults=${placeholder "out"}/share/xscreensaver/app-defaults"
+  ];
+
+  # "marbling" has NEON code that mixes signed and unsigned vector types
+  env.NIX_CFLAGS_COMPILE = lib.optionalString stdenv.hostPlatform.isAarch "-flax-vector-conversions";
+
+  postInstall = ''
+    for bin in $out/bin/*; do
+      wrapProgram "$bin" \
+        --prefix PATH : "$out/libexec/xscreensaver" \
+        --prefix PATH : "${lib.makeBinPath [ coreutils perlPackages.perl ]}" \
+        --prefix PERL5LIB ':' $PERL5LIB
+    done
+  ''
+  + lib.optionalString forceInstallAllHacks ''
+    make -j$NIX_BUILD_CORES -C hacks/glx dnalogo
+    cat hacks/Makefile.in \
+      | grep -E '([a-z0-9]+):[[:space:]]*\1[.]o' | cut -d : -f 1 | xargs make -j$NIX_BUILD_CORES -C hacks
+    cat hacks/glx/Makefile.in \
+      | grep -E '([a-z0-9]+):[[:space:]]*\1[.]o' | cut -d : -f 1 | xargs make -j$NIX_BUILD_CORES -C hacks/glx
+    cp -f $(find hacks -type f -perm -111 "!" -name "*.*" ) "$out/libexec/xscreensaver"
+  '';
+
+  meta = {
+    homepage = "https://www.jwz.org/xscreensaver/";
+    description = "A set of screensavers";
+    downloadPage = "https://www.jwz.org/xscreensaver/download.html";
+    license = lib.licenses.mit;
+    maintainers = with lib.maintainers; [ raskin AndersonTorres ];
+    platforms = lib.platforms.unix;
+  };
+})
diff --git a/nixpkgs/pkgs/misc/screensavers/xss-lock/default.nix b/nixpkgs/pkgs/misc/screensavers/xss-lock/default.nix
new file mode 100644
index 000000000000..ec7e8f4e7e5c
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/xss-lock/default.nix
@@ -0,0 +1,24 @@
+{ lib, stdenv, fetchFromGitHub, cmake, docutils, pkg-config, glib, libpthreadstubs
+, libXau, libXdmcp, xcbutil }:
+
+stdenv.mkDerivation {
+  pname = "xss-lock";
+  version = "unstable-2018-05-31";
+
+  src = fetchFromGitHub {
+    owner = "xdbob";
+    repo = "xss-lock";
+    rev = "cd0b89df9bac1880ea6ea830251c6b4492d505a5";
+    sha256 = "040nqgfh564frvqkrkmak3x3h0yadz6kzk81jkfvd9vd20a9drh7";
+  };
+
+  nativeBuildInputs = [ cmake pkg-config docutils ];
+  buildInputs = [ glib libpthreadstubs libXau libXdmcp xcbutil ];
+
+  meta = with lib; {
+    description = "Use external locker (such as i3lock) as X screen saver";
+    license = licenses.mit;
+    maintainers = with maintainers; [ malyn offline ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/xssproxy/default.nix b/nixpkgs/pkgs/misc/screensavers/xssproxy/default.nix
new file mode 100644
index 000000000000..6f28a9ce132e
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/xssproxy/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchFromGitHub, glib, pkg-config, xorg, dbus }:
+
+stdenv.mkDerivation rec {
+  pname = "xssproxy";
+  version = "1.1.0";
+
+  src = fetchFromGitHub {
+    owner = "vincentbernat";
+    repo = "xssproxy";
+    rev = "v${version}";
+    sha256 = "sha256-BE/v1CJAwKwxlK3Xg3ezD+IXyT7ZFGz3bQzGxFQfEnU=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ glib xorg.libX11 xorg.libXScrnSaver dbus ];
+
+  makeFlags = [
+    "bindir=$(out)/bin"
+    "man1dir=$(out)/share/man/man1"
+  ];
+
+  meta = {
+    description = "Forward freedesktop.org Idle Inhibition Service calls to Xss";
+    homepage = "https://github.com/vincentbernat/xssproxy";
+    license = lib.licenses.gpl3;
+    maintainers = with lib.maintainers; [ benley ];
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/screensavers/xtrlock-pam/default.nix b/nixpkgs/pkgs/misc/screensavers/xtrlock-pam/default.nix
new file mode 100644
index 000000000000..b87374df14df
--- /dev/null
+++ b/nixpkgs/pkgs/misc/screensavers/xtrlock-pam/default.nix
@@ -0,0 +1,30 @@
+{ lib, stdenv, fetchFromGitHub, python2, pkg-config, pam, xorg }:
+
+stdenv.mkDerivation {
+  pname = "xtrlock-pam";
+  version = "3.4-post-20150909";
+
+  src = fetchFromGitHub {
+    owner = "aanatoly";
+    repo = "xtrlock-pam";
+    rev = "6f4920fcfff54791c0779057e9efacbbbbc05df6";
+    sha256 = "sha256-TFfs418fpjBrAJNGW8U3jE0K7jQkfL4vCquAViKkXPw=";
+  };
+
+  nativeBuildInputs = [ pkg-config ];
+  buildInputs = [ python2 pam xorg.libX11 ];
+
+  configurePhase = ''
+    substituteInPlace .config/options.py --replace /usr/include/security/pam_appl.h ${pam}/include/security/pam_appl.h
+    substituteInPlace src/xtrlock.c --replace system-local-login xscreensaver
+    python configure --prefix=$out
+  '';
+
+  meta = {
+    homepage = "https://github.com/aanatoly/xtrlock-pam";
+    description = "PAM based X11 screen locker";
+    license = "unknown";
+    maintainers = with lib.maintainers; [ ];
+    platforms = with lib.platforms; linux;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/seafile-shared/default.nix b/nixpkgs/pkgs/misc/seafile-shared/default.nix
new file mode 100644
index 000000000000..dfbe3998c919
--- /dev/null
+++ b/nixpkgs/pkgs/misc/seafile-shared/default.nix
@@ -0,0 +1,64 @@
+{ lib, stdenv
+, fetchFromGitHub
+, autoreconfHook
+, curl
+, libevent
+, libsearpc
+, libuuid
+, pkg-config
+, python3
+, sqlite
+, vala
+, libwebsockets
+}:
+
+stdenv.mkDerivation rec {
+  pname = "seafile-shared";
+  version = "9.0.3";
+
+  src = fetchFromGitHub {
+    owner = "haiwen";
+    repo = "seafile";
+    rev = "v${version}";
+    sha256 = "sha256-g8MQFhDBBUuEDGsJ14rHGsaGEznOtCMVOv+5kljXByY=";
+  };
+
+  nativeBuildInputs = [
+    libwebsockets
+    autoreconfHook
+    vala
+    pkg-config
+    python3
+    python3.pkgs.wrapPython
+  ];
+
+  buildInputs = [
+    libuuid
+    sqlite
+    libsearpc
+    libevent
+    curl
+  ];
+
+  configureFlags = [
+    "--disable-server"
+    "--with-python3"
+  ];
+
+  pythonPath = with python3.pkgs; [
+    future
+    pysearpc
+  ];
+
+  postFixup = ''
+    wrapPythonPrograms
+  '';
+
+  meta = with lib; {
+    homepage = "https://github.com/haiwen/seafile";
+    description = "Shared components of Seafile: seafile-daemon, libseafile, libseafile python bindings, manuals, and icons";
+    license = licenses.gpl2Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ greizgh schmittlauch ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/sndio/default.nix b/nixpkgs/pkgs/misc/sndio/default.nix
new file mode 100644
index 000000000000..a65c0cd7b0f5
--- /dev/null
+++ b/nixpkgs/pkgs/misc/sndio/default.nix
@@ -0,0 +1,29 @@
+{ lib, stdenv, fetchurl, alsa-lib, fixDarwinDylibNames }:
+
+stdenv.mkDerivation rec {
+  pname = "sndio";
+  version = "1.9.0";
+
+  src = fetchurl {
+    url = "https://www.sndio.org/sndio-${version}.tar.gz";
+    sha256 = "sha256-8wgm/JwH42nTkk1fzt9qClPA30rh9atQ/pzygFQPaZo=";
+  };
+
+  nativeBuildInputs = lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames;
+  buildInputs = lib.optional stdenv.hostPlatform.isLinux alsa-lib;
+  configurePlatforms = [];
+
+  postInstall = ''
+    install -Dm644 contrib/sndiod.service $out/lib/systemd/system/sndiod.service
+  '';
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    homepage = "https://www.sndio.org";
+    description = "Small audio and MIDI framework part of the OpenBSD project";
+    license = licenses.isc;
+    maintainers = with maintainers; [ Madouura ];
+    platforms = platforms.all;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/solfege/css.patch b/nixpkgs/pkgs/misc/solfege/css.patch
new file mode 100644
index 000000000000..40273df0132b
--- /dev/null
+++ b/nixpkgs/pkgs/misc/solfege/css.patch
@@ -0,0 +1,33 @@
+Fix theme parsing errors: https://savannah.gnu.org/bugs/index.php?53107
+
+--- a/solfege.css
++++ b/solfege.css
+@@ -7,19 +7,19 @@
+-#ProgressionNameLabel, #Feedback { font: "Sans 18" }
+-#ProgressionLabelNumber { font: "Sans 12" }
+-#BoldText { font: Bold }
++#ProgressionNameLabel, #Feedback { font: 18px Sans }
++#ProgressionLabelNumber { font: 12px Sans }
++#BoldText { font: 12px Sans Bold }
+ 
+-#StatisticsH1, #Heading1 { font: Sans 18 }
+-#StatisticsH2, #Heading2 { font: Sans 14 }
++#StatisticsH1, #Heading1 { font: 18px Sans }
++#StatisticsH2, #Heading2 { font: 14px Sans }
+ 
+-#BpmInactiveLabel { font: Sans 12 }
+-#BpmActiveLabel { font: Sans Bold 12 }
++#BpmInactiveLabel { font: 12px Sans }
++#BpmActiveLabel { font: 12px Sans Bold }
+ 
+ #DIALOGWARNING2 { background: red; }
+ #DIALOGWARNING  { background: yellow; }
+ 
+ #DEBUGWARNING {
+   background: red;
+-  font: Sans Bold 24;
++  font: 24px Sans Bold;
+ }
+ 
+-#FlashBarLabel { font: Sans 16 }
++#FlashBarLabel { font: 16px Sans }
diff --git a/nixpkgs/pkgs/misc/solfege/default.nix b/nixpkgs/pkgs/misc/solfege/default.nix
new file mode 100644
index 000000000000..64ddfae7b326
--- /dev/null
+++ b/nixpkgs/pkgs/misc/solfege/default.nix
@@ -0,0 +1,73 @@
+{ lib, fetchurl, gettext, pkg-config, texinfo, wrapGAppsHook
+, buildPythonApplication, pycairo, pygobject3
+, gdk-pixbuf, gobject-introspection, gtk3, librsvg
+, alsa-utils, timidity, mpg123, vorbis-tools, csound, lilypond
+, automake, autoconf, txt2man
+}:
+
+buildPythonApplication rec {
+  pname = "solfege";
+  version = "3.23.4";
+
+  src = fetchurl {
+    url = "https://alpha.gnu.org/gnu/solfege/solfege-${version}.tar.gz";
+    sha256 = "0sc17vf4xz6gy0s0z9ghi68yskikdmyb4gdaxx6imrm40734k8mp";
+  };
+
+  patches = [
+    ./css.patch
+    ./menubar.patch
+    ./texinfo.patch
+    ./webbrowser.patch
+  ];
+
+  preConfigure = ''
+    aclocal
+    autoconf
+  '';
+
+  nativeBuildInputs = [
+    automake
+    autoconf
+    gdk-pixbuf
+    gettext
+    pkg-config
+    texinfo
+    txt2man
+
+    gobject-introspection
+    wrapGAppsHook
+  ];
+
+  buildInputs = [
+    gtk3
+    librsvg
+  ];
+
+  propagatedBuildInputs = [
+    pycairo
+    pygobject3
+  ];
+
+  preBuild = ''
+    sed -i -e 's|wav_player=.*|wav_player=${alsa-utils}/bin/aplay|' \
+           -e 's|midi_player=.*|midi_player=${timidity}/bin/timidity|' \
+           -e 's|mp3_player=.*|mp3_player=${mpg123}/bin/mpg123|' \
+           -e 's|ogg_player=.*|ogg_player=${vorbis-tools}/bin/ogg123|' \
+           -e 's|csound=.*|csound=${csound}/bin/csound|' \
+           -e 's|lilypond-book=.*|lilypond-book=${lilypond}/bin/lilypond-book|' \
+           default.config
+  '';
+
+  format = "other";
+
+  enableParallelBuilding = true;
+
+  meta = with lib; {
+    description = "Ear training program";
+    homepage = "https://www.gnu.org/software/solfege/";
+    license = licenses.gpl3Only;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ bjornfor orivej anthonyroussel ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/solfege/menubar.patch b/nixpkgs/pkgs/misc/solfege/menubar.patch
new file mode 100644
index 000000000000..36d3944af61d
--- /dev/null
+++ b/nixpkgs/pkgs/misc/solfege/menubar.patch
@@ -0,0 +1,7 @@
+Fix https://savannah.gnu.org/bugs/index.php?53109
+
+--- a/solfege/mainwin.py
++++ b/solfege/mainwin.py
+@@ -270,1 +270,1 @@
+-        hdlbox = Gtk.HandleBox()
++        hdlbox = Gtk.HBox()
diff --git a/nixpkgs/pkgs/misc/solfege/texinfo.patch b/nixpkgs/pkgs/misc/solfege/texinfo.patch
new file mode 100644
index 000000000000..d681b3e901bd
--- /dev/null
+++ b/nixpkgs/pkgs/misc/solfege/texinfo.patch
@@ -0,0 +1,20 @@
+Fix build with texinfo 6.7. Otherwise
+
+    makeinfo -I topdocs --no-split --no-headers --output AUTHORS topdocs/AUTHORS.texi
+
+fails with
+
+    utf8 "\xC1" does not map to Unicode at /nix/store/...-texinfo-6.7/share/texinfo/Texinfo/ParserNonXS.pm line 1796, <FH> line 38.
+
+--- a/topdocs/AUTHORS.texi
++++ b/topdocs/AUTHORS.texi
+@@ -1,2 +1,3 @@
+ \input texinfo
++@documentencoding ISO-8859-1
+ @setfilename AUTHORS.info
+--- a/topdocs/README.texi
++++ b/topdocs/README.texi
+@@ -1,2 +1,3 @@
+ \input texinfo
++@documentencoding ISO-8859-1
+ @setfilename README.info
diff --git a/nixpkgs/pkgs/misc/solfege/webbrowser.patch b/nixpkgs/pkgs/misc/solfege/webbrowser.patch
new file mode 100644
index 000000000000..2c9b77d0b8eb
--- /dev/null
+++ b/nixpkgs/pkgs/misc/solfege/webbrowser.patch
@@ -0,0 +1,8 @@
+Fix startup.
+
+--- a/solfege/mainwin.py
++++ b/solfege/mainwin.py
+@@ -27,2 +27,3 @@ import textwrap
+ try:
++    webbrowser.register_standard_browsers()
+     i = webbrowser._tryorder.index("x-www-browser")
diff --git a/nixpkgs/pkgs/misc/sound-of-sorting/default.nix b/nixpkgs/pkgs/misc/sound-of-sorting/default.nix
new file mode 100644
index 000000000000..23529f6b0a18
--- /dev/null
+++ b/nixpkgs/pkgs/misc/sound-of-sorting/default.nix
@@ -0,0 +1,38 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, pkg-config
+, SDL2
+, wxGTK32
+, darwin
+}:
+
+stdenv.mkDerivation {
+  pname = "sound-of-sorting";
+  version = "unstable-2022-10-12";
+
+  src = fetchFromGitHub {
+    owner = "bingmann";
+    repo = "sound-of-sorting";
+    rev = "5cfcaf752593c8cbcf52555dd22745599a7d8b1b";
+    hash = "sha256-cBrTvFoz6WZIsh5qPPiWxQ338Z0OfcIefiI8CZF6nn8=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    wxGTK32
+    SDL2
+  ]
+  ++ lib.optional stdenv.isDarwin darwin.apple_sdk.frameworks.Cocoa ;
+
+  meta = {
+    description = "Audibilization and Visualization of Sorting Algorithms";
+    homepage = "https://panthema.net/2013/sound-of-sorting/";
+    license = lib.licenses.gpl3Plus;
+    maintainers = with lib.maintainers; [ AndersonTorres ];
+    platforms = lib.platforms.unix;
+  };
+}
diff --git a/nixpkgs/pkgs/misc/source-and-tags/default.nix b/nixpkgs/pkgs/misc/source-and-tags/default.nix
new file mode 100644
index 000000000000..eb243aa4f9b8
--- /dev/null
+++ b/nixpkgs/pkgs/misc/source-and-tags/default.nix
@@ -0,0 +1,94 @@
+{ stdenv, lib, glibcLocales, unzip, hasktags, ctags } : {
+  # optional srcDir
+  annotatedWithSourceAndTagInfo = x : (x ? passthru && x.passthru ? sourceWithTags
+                                      || x ? meta && x.meta ? sourceWithTags );
+  # hack because passthru doesn't work the way I'd expect. Don't have time to spend on this right now
+  # that's why I'm abusing meta for the same purpose in ghcsAndLibs
+  sourceWithTagsFromDerivation = x : if x ? passthru && x.passthru ? sourceWithTags  then x.passthru.sourceWithTags
+                                     else if x ? meta && x.meta ? sourceWithTags  then x.meta.sourceWithTags
+                                       else null;
+
+  # createTagFiles =  [ { name  = "my_tag_name_without_suffix", tagCmd = "ctags -R . -o \$TAG_FILE"; } ]
+  # tag command must create file named $TAG_FILE
+  sourceWithTagsDerivation = {name, src, srcDir ? ".", tagSuffix ? "_tags", createTagFiles ? []} :
+    stdenv.mkDerivation {
+    inherit src srcDir tagSuffix;
+    name = "${name}-source-with-tags";
+    nativeBuildInputs = [ unzip ];
+    # using separate tag directory so that you don't have to glob that much files when starting your editor
+    # is this a good choice?
+    installPhase =
+      let createTags = lib.concatStringsSep "\n"
+          (map (a: ''
+            TAG_FILE="$SRC_DEST/${a.name}$tagSuffix"
+            echo running tag cmd "${a.tagCmd}" in `pwd`
+            ${a.tagCmd}
+            TAG_FILES="$TAG_FILES''${TAG_FILES:+:}$TAG_FILE"
+           '') createTagFiles );
+      in ''
+      SRC_DEST=$out/src/$name
+      mkdir -p $SRC_DEST
+      pwd; ls
+      cp -r $srcDir $SRC_DEST
+      cd $SRC_DEST
+      ${createTags}
+
+      mkdir -p $out/nix-support
+      echo "TAG_FILES=\"\$TAG_FILES\''${TAG_FILES:+:}$TAG_FILES\"" >> $out/nix-support/setup-hook
+    '';
+  };
+  # example usage
+  #testSourceWithTags = sourceWithTagsDerivation (ghc68extraLibs ghcsAndLibs.ghc68).happs_server_darcs.passthru.sourceWithTags;
+
+
+  # creates annotated derivation (comments see above)
+  addHasktagsTaggingInfo = deriv : deriv // {
+      passthru = {
+        sourceWithTags = {
+         inherit (deriv) src;
+         srcDir = if deriv ? srcDir then deriv.srcDir else ".";
+         name = deriv.name;
+         createTagFiles = [
+               { name = "${deriv.name}_haskell";
+                 # tagCmd = "${toString ghcsAndLibs.ghc68.ghc}/bin/hasktags --ignore-close-implementation --ctags `find . -type f -name \"*.*hs\"`; sort tags > \$TAG_FILE"; }
+                 # *.*hs.* to catch gtk2hs .hs.pp files
+                 tagCmd = "
+                   srcs=\"`find . -type f -name \"*.*hs\"; find . -type f -name \"*.*hs*\";`\"
+                   [ -z \"$srcs\" ] || {
+                    # without this creating tag files for lifted-base fails
+                    export LC_ALL=en_US.UTF-8
+                    export LANG=en_US.UTF-8
+                    ${lib.optionalString stdenv.isLinux "export LOCALE_ARCHIVE=${glibcLocales}/lib/locale/locale-archive;"}
+
+                    ${toString hasktags}/bin/hasktags --ignore-close-implementation --ctags .
+                    mv tags \$TAG_FILE
+                   }";
+              }
+          ];
+       };
+    };
+  };
+
+
+  addCTaggingInfo = deriv :
+    deriv // {
+      passthru = {
+        sourceWithTags = {
+         inherit (deriv) src;
+         name = "${deriv.name}-source-ctags";
+         createTagFiles = [
+               { inherit  (deriv) name;
+                 tagCmd = "${toString ctags}/bin/ctags --sort=yes -o \$TAG_FILE -R ."; }
+          ];
+        };
+  }; };
+}
+/*
+experimental
+idea:
+a) Attach some information to a nexpression telling how to create a tag file which can then be used within your favourite editor
+   Do this in a way not affecting the expression (using passthru or meta which is ignored when calculating the hash)
+   implementations: addCTaggingInfo (C / C++) and addHasktagsTaggingInfo (Haskell)
+b) use sourceWithTagsDerivation function to create a derivation installing the source along with the generated tag files
+   so that you can use them easily witihn your favourite text editor
+*/
diff --git a/nixpkgs/pkgs/misc/stabber/default.nix b/nixpkgs/pkgs/misc/stabber/default.nix
new file mode 100644
index 000000000000..ff89241a2469
--- /dev/null
+++ b/nixpkgs/pkgs/misc/stabber/default.nix
@@ -0,0 +1,33 @@
+{ lib, stdenv, fetchFromGitHub, autoreconfHook, pkg-config, glib, expat
+, libmicrohttpd, darwin
+}:
+
+with lib;
+
+stdenv.mkDerivation {
+  pname = "stabber-unstable";
+  version = "2020-06-08";
+
+  src = fetchFromGitHub {
+    owner = "boothj5";
+    repo = "stabber";
+    rev = "3e5c2200715666aad403d0076e8ab584b329965e";
+    sha256 = "0042nbgagl4gcxa5fj7bikjdi1gbk0jwyqnzc5lswpb0l5y0i1ql";
+  };
+
+  preAutoreconf = ''
+    mkdir m4
+  '';
+
+  nativeBuildInputs = [ pkg-config autoreconfHook ];
+  buildInputs = [ glib expat libmicrohttpd ] ++
+    lib.optionals stdenv.isDarwin [ darwin.apple_sdk.frameworks.Security ];
+
+  meta = {
+    description = "Stubbed XMPP Server";
+    homepage = "https://github.com/profanity-im/stabber";
+    license = licenses.gpl3;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ hschaeidt ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/superd/default.nix b/nixpkgs/pkgs/misc/superd/default.nix
new file mode 100644
index 000000000000..be018cb24126
--- /dev/null
+++ b/nixpkgs/pkgs/misc/superd/default.nix
@@ -0,0 +1,43 @@
+{ lib
+, buildGoModule
+, fetchFromSourcehut
+, installShellFiles
+, scdoc
+}:
+
+buildGoModule rec {
+  pname = "superd";
+  version = "0.7.1";
+
+  src = fetchFromSourcehut {
+    owner = "~craftyguy";
+    repo = pname;
+    rev = version;
+    hash = "sha256-5g9Y1Lpxp9cUe0sNvU5CdsTGcN+j00gIKPO9pD5j8uM=";
+  };
+
+  vendorHash = "sha256-Oa99U3THyWLjH+kWMQAHO5QAS2mmtY7M7leej+gnEqo=";
+
+  nativeBuildInputs = [
+    installShellFiles
+    scdoc
+  ];
+
+  postBuild = ''
+    make doc
+  '';
+
+  postInstall = ''
+    installManPage superd.1 superd.service.5 superctl.1
+    installShellCompletion --bash completions/bash/superctl
+    installShellCompletion --zsh completions/zsh/superctl
+  '';
+
+  meta = with lib; {
+    description = "Unprivileged user service supervisor";
+    homepage = "https://sr.ht/~craftyguy/superd/";
+    license = licenses.gpl3Plus;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ chuangzhu wentam ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/t-rec/default.nix b/nixpkgs/pkgs/misc/t-rec/default.nix
new file mode 100644
index 000000000000..2bbfeda4d321
--- /dev/null
+++ b/nixpkgs/pkgs/misc/t-rec/default.nix
@@ -0,0 +1,37 @@
+{ lib, stdenv, imagemagick, ffmpeg, rustPlatform, fetchFromGitHub, makeWrapper
+, libiconv, Foundation }:
+
+let
+  binPath = lib.makeBinPath [
+    imagemagick
+    ffmpeg
+  ];
+in
+rustPlatform.buildRustPackage rec {
+  pname = "t-rec";
+  version = "0.7.6";
+
+  src = fetchFromGitHub {
+    owner = "sassman";
+    repo = "t-rec-rs";
+    rev = "v${version}";
+    sha256 = "sha256-o1fO0N65L6Z6W6aBNhS5JqDHIc1MRQx0yECGzVSCsbo=";
+  };
+
+  nativeBuildInputs = [ makeWrapper ];
+  buildInputs = [ imagemagick ]
+    ++ lib.optionals stdenv.isDarwin [ libiconv Foundation ];
+
+  postInstall = ''
+    wrapProgram "$out/bin/t-rec" --prefix PATH : "${binPath}"
+  '';
+
+  cargoHash = "sha256-3NExPlHNcoYVkpOzWCyd66chJpeDzQLRJUruSLAwGNw=";
+
+  meta = with lib; {
+    description = "Blazingly fast terminal recorder that generates animated gif images for the web written in rust";
+    homepage = "https://github.com/sassman/t-rec-rs";
+    license = with licenses; [ gpl3Only ];
+    maintainers = [ maintainers.hoverbear ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/talkfilters/default.nix b/nixpkgs/pkgs/misc/talkfilters/default.nix
new file mode 100644
index 000000000000..3b785dfc5664
--- /dev/null
+++ b/nixpkgs/pkgs/misc/talkfilters/default.nix
@@ -0,0 +1,26 @@
+{ lib, stdenv, fetchurl }:
+
+let
+  pname = "talkfilters";
+  version = "2.3.8";
+in
+
+stdenv.mkDerivation {
+  name = "${pname}-${version}";
+
+  src = fetchurl {
+    url = "http://www.hyperrealm.com/${pname}/${pname}-${version}.tar.gz";
+    sha256 = "19nc5vq4bnkjvhk8srqddzhcs93jyvpm9r6lzjzwc1mgf08yg0a6";
+  };
+
+  hardeningDisable = [ "format" ];
+
+  meta = {
+    description = "Converts English text into text that mimics a stereotyped or humorous dialect";
+    homepage = "https://www.hyperrealm.com/talkfilters/talkfilters.html";
+    license = lib.licenses.gpl2;
+    maintainers = with lib.maintainers; [ ikervagyok ];
+    platforms = with lib.platforms; unix;
+  };
+}
+
diff --git a/nixpkgs/pkgs/misc/tmux-plugins/default.nix b/nixpkgs/pkgs/misc/tmux-plugins/default.nix
new file mode 100644
index 000000000000..f34fbb62cc98
--- /dev/null
+++ b/nixpkgs/pkgs/misc/tmux-plugins/default.nix
@@ -0,0 +1,725 @@
+{ lib
+, fetchFromGitHub
+, pkgs
+, stdenv
+}:
+
+let
+  rtpPath = "share/tmux-plugins";
+
+  addRtp = path: rtpFilePath: attrs: derivation:
+    derivation // { rtp = "${derivation}/${path}/${rtpFilePath}"; } // {
+      overrideAttrs = f: mkTmuxPlugin (attrs // f attrs);
+    };
+
+  mkTmuxPlugin = a@{
+    pluginName,
+    rtpFilePath ? (builtins.replaceStrings ["-"] ["_"] pluginName) + ".tmux",
+    namePrefix ? "tmuxplugin-",
+    src,
+    unpackPhase ? "",
+    configurePhase ? ":",
+    buildPhase ? ":",
+    addonInfo ? null,
+    preInstall ? "",
+    postInstall ? "",
+    path ? lib.getName pluginName,
+    ...
+  }:
+    if lib.hasAttr "dependencies" a then
+      throw "dependencies attribute is obselete. see NixOS/nixpkgs#118034" # added 2021-04-01
+    else addRtp "${rtpPath}/${path}" rtpFilePath a (stdenv.mkDerivation (a // {
+      pname = namePrefix + pluginName;
+
+      inherit pluginName unpackPhase configurePhase buildPhase addonInfo preInstall postInstall;
+
+      installPhase = ''
+        runHook preInstall
+
+        target=$out/${rtpPath}/${path}
+        mkdir -p $out/${rtpPath}
+        cp -r . $target
+        if [ -n "$addonInfo" ]; then
+          echo "$addonInfo" > $target/addon-info.json
+        fi
+
+        runHook postInstall
+      '';
+    }));
+
+in rec {
+  inherit mkTmuxPlugin;
+
+  mkDerivation = throw "tmuxPlugins.mkDerivation is deprecated, use tmuxPlugins.mkTmuxPlugin instead"; # added 2021-03-14
+
+  battery = mkTmuxPlugin {
+    pluginName = "battery";
+    version = "unstable-2019-07-04";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-battery";
+      rev = "f8b8e8451990365e0c98c38c184962e4f83b793b";
+      sha256 = "1bhdzsx3kdjqjmm1q4j8937lrpkzf71irr3fqhdbddsghwrrmwim";
+    };
+  };
+
+  better-mouse-mode = mkTmuxPlugin {
+    pluginName = "better-mouse-mode";
+    version = "unstable-2021-08-02";
+    src = fetchFromGitHub {
+      owner = "NHDaly";
+      repo = "tmux-better-mouse-mode";
+      rev = "aa59077c635ab21b251bd8cb4dc24c415e64a58e";
+      sha256 = "06346ih3hzwszhkj25g4xv5av7292s6sdbrdpx39p0n3kgf5mwww";
+    };
+    rtpFilePath = "scroll_copy_mode.tmux";
+    meta = {
+      homepage = "https://github.com/NHDaly/tmux-better-mouse-mode";
+      description = "better mouse support for tmux";
+      longDescription =
+      ''
+        Features:
+
+          * Emulate mouse-support for full-screen programs like less that don't provide built in mouse support.
+          * Exit copy-mode and return to your prompt by scrolling back all the way down to the bottom.
+          * Adjust your scrolling speed.
+      '';
+      license = lib.licenses.mit;
+      platforms = lib.platforms.unix;
+      maintainers = with lib.maintainers; [ chrispickard ];
+    };
+  };
+
+  catppuccin = mkTmuxPlugin {
+    pluginName = "catppuccin";
+    version = "unstable-2023-07-15";
+    src = fetchFromGitHub {
+      owner = "catppuccin";
+      repo = "tmux";
+      rev = "e7b50832f9bc59b0b5ef5316ba2cd6f61e4e22fc";
+      hash = "sha256-9ZfUqEKEexSh06QyR5C+tYd4tNfBi3PsA+STzUv4+/s=";
+    };
+    postInstall = ''
+      sed -i -e 's|''${PLUGIN_DIR}/catppuccin-selected-theme.tmuxtheme|''${TMUX_TMPDIR}/catppuccin-selected-theme.tmuxtheme|g' $target/catppuccin.tmux
+    '';
+    meta = with lib; {
+      homepage = "https://github.com/catppuccin/tmux";
+      description = "Soothing pastel theme for Tmux!";
+      license = licenses.mit;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ jnsgruk ];
+    };
+  };
+
+  continuum = mkTmuxPlugin {
+    pluginName = "continuum";
+    version = "unstable-2022-01-25";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-continuum";
+      rev = "fc2f31d79537a5b349f55b74c8ca69abaac1ddbb";
+      sha256 = "06i1jp83iybw76raaxciqz9a7ypgpkvbyjn6jjap8jpqfmj2wmjb";
+    };
+    meta = {
+      homepage = "https://github.com/tmux-plugins/tmux-continuum";
+      description = "continuous saving of tmux environment";
+      longDescription =
+      ''
+        Features:
+        * continuous saving of tmux environment
+        * automatic tmux start when computer/server is turned on
+        * automatic restore when tmux is started
+
+        Together, these features enable uninterrupted tmux usage. No matter the
+        computer or server restarts, if the machine is on, tmux will be there how
+        you left it off the last time it was used.
+      '';
+      license = lib.licenses.mit;
+      platforms = lib.platforms.unix;
+      maintainers = with lib.maintainers; [ ronanmacf ];
+    };
+  };
+
+  copy-toolkit = mkTmuxPlugin rec {
+    pluginName = "copy-toolkit";
+    rtpFilePath = "copytk.tmux";
+    version = "1.1";
+    src = fetchFromGitHub {
+      owner = "CrispyConductor";
+      repo = "tmux-copy-toolkit";
+      rev = "v${version}";
+      sha256 = "MEMC9klm+PH66UHwrB2SqdCaZX0LAujL+Woo/hV84m4=";
+    };
+    postInstall = ''
+      sed -i -e 's|python3 |${pkgs.python3}/bin/python3 |g' $target/copytk.tmux
+      sed -i -e 's|/bin/bash|${pkgs.bash}/bin/bash|g;s|/bin/cat|${pkgs.coreutils}/bin/cat|g' $target/copytk.py
+    '';
+    meta = {
+      homepage = "https://github.com/CrispyConductor/tmux-copy-toolkit";
+      description = "Various copy-mode tools";
+      license = lib.licenses.mit;
+      platforms = lib.platforms.unix;
+      maintainers = with lib.maintainers; [ deejayem ];
+    };
+  };
+
+  copycat = mkTmuxPlugin {
+    pluginName = "copycat";
+    version = "unstable-2020-01-09";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-copycat";
+      rev = "77ca3aab2aed8ede3e2b941079b1c92dd221cf5f";
+      sha256 = "1bchwzhai8k5rk32n4lrmh56rw944jqxr8imjk74hyaa7bbn81ds";
+    };
+  };
+
+  cpu = mkTmuxPlugin {
+    pluginName = "cpu";
+    version = "unstable-2023-01-06";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-cpu";
+      rev = "98d787191bc3e8f19c3de54b96ba1caf61385861";
+      sha256 = "sha256-ymmCI6VYvf94Ot7h2GAboTRBXPIREP+EB33+px5aaJk=";
+    };
+  };
+
+  ctrlw = mkTmuxPlugin rec {
+    pluginName = "ctrlw";
+    version = "0.1.1";
+    src = fetchFromGitHub {
+      owner = "eraserhd";
+      repo = "tmux-ctrlw";
+      rev = "v${version}";
+      sha256 = "1kv5pqfjczd6z7i9jf6j5xmcai50l9bn5p2p1w1l5fi6cj8cz1k1";
+    };
+  };
+
+  dracula = mkTmuxPlugin rec {
+    pluginName = "dracula";
+    version = "2.1.0";
+    src = fetchFromGitHub {
+      owner = "dracula";
+      repo = "tmux";
+      rev = "v${version}";
+      sha256 = "89S8LHTx2gYWj+Ejws5f6YRQgoj0rYE7ITtGtZibl30=";
+    };
+    meta = with lib; {
+      homepage = "https://draculatheme.com/tmux";
+      description = "A feature packed Dracula theme for tmux!";
+      license = licenses.mit;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ ethancedwards8 ];
+    };
+  };
+
+  extrakto = mkTmuxPlugin {
+    pluginName = "extrakto";
+    version = "unstable-2021-04-04";
+    src = fetchFromGitHub {
+      owner = "laktak";
+      repo = "extrakto";
+      rev = "de8ac3e8a9fa887382649784ed8cae81f5757f77";
+      sha256 = "0mkp9r6mipdm7408w7ls1vfn6i3hj19nmir2bvfcp12b69zlzc47";
+    };
+    nativeBuildInputs = [ pkgs.makeWrapper ];
+    postInstall = ''
+    for f in extrakto.sh open.sh tmux-extrakto.sh; do
+      wrapProgram $target/scripts/$f \
+        --prefix PATH : ${with pkgs; lib.makeBinPath (
+        [ pkgs.fzf pkgs.python3 pkgs.xclip ]
+        )}
+    done
+
+    '';
+    meta = {
+      homepage = "https://github.com/laktak/extrakto";
+      description = "Fuzzy find your text with fzf instead of selecting it by hand ";
+      license = lib.licenses.mit;
+      platforms = lib.platforms.unix;
+      maintainers = with lib.maintainers; [ kidd ];
+    };
+  };
+
+  fingers = mkTmuxPlugin rec {
+    pluginName = "fingers";
+    rtpFilePath = "tmux-fingers.tmux";
+    version = "1.0.1";
+    src = fetchFromGitHub {
+      owner = "Morantron";
+      repo = "tmux-fingers";
+      rev = version;
+      sha256 = "0gp37m3d0irrsih96qv2yalvr1wmf1n64589d4qzyzq16lzyjcr0";
+      fetchSubmodules = true;
+    };
+    nativeBuildInputs = [ pkgs.makeWrapper ];
+    postInstall = ''
+      for f in config.sh tmux-fingers.sh setup-fingers-mode-bindings.sh; do
+      wrapProgram $target/scripts/$f \
+        --prefix PATH : ${with pkgs; lib.makeBinPath (
+          [ gawk ] ++ lib.optionals stdenv.isDarwin [ reattach-to-user-namespace ]
+        )}
+      done
+    '';
+  };
+
+  fpp = mkTmuxPlugin {
+    pluginName = "fpp";
+    version = "unstable-2016-03-08";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-fpp";
+      rev = "ca125d5a9c80bb156ac114ac3f3d5951a795c80e";
+      sha256 = "1b89s6mfzifi7s5iwf22w7niddpq28w48nmqqy00dv38z4yga5ws";
+    };
+    postInstall = ''
+      sed -i -e 's|fpp |${pkgs.fpp}/bin/fpp |g' $target/fpp.tmux
+    '';
+  };
+
+  fuzzback = mkTmuxPlugin {
+    pluginName = "fuzzback";
+    version = "unstable-2022-11-21";
+    src = fetchFromGitHub {
+      owner = "roosta";
+      repo = "tmux-fuzzback";
+      rev = "bfd9cf0ef1c35488f0080f0c5ca4fddfdd7e18ec";
+      sha256 = "w788xDBkfiLdUVv1oJi0YikFPqVk6LiN6PDfHu8on5E=";
+    };
+    nativeBuildInputs = [ pkgs.makeWrapper ];
+    postInstall = ''
+      for f in fuzzback.sh preview.sh supported.sh; do
+        chmod +x $target/scripts/$f
+        wrapProgram $target/scripts/$f \
+          --prefix PATH : ${with pkgs; lib.makeBinPath [ coreutils fzf gawk gnused ]}
+      done
+    '';
+    meta = {
+      homepage = "https://github.com/roosta/tmux-fuzzback";
+      description = "Fuzzy search for terminal scrollback";
+      license = lib.licenses.mit;
+      platforms = lib.platforms.unix;
+      maintainers = with lib.maintainers; [ deejayem ];
+    };
+  };
+
+  fzf-tmux-url = mkTmuxPlugin {
+    pluginName = "fzf-tmux-url";
+    rtpFilePath = "fzf-url.tmux";
+    version = "unstable-2021-12-27";
+    src = fetchFromGitHub {
+      owner = "wfxr";
+      repo = "tmux-fzf-url";
+      rev = "1241fc5682850fe41812cad81c76541674ee305b";
+      sha256 = "1270c5nfvgsdajgfahlacqfb5xwg4hwfrciiy0v03d50vg4h0kdi";
+    };
+  };
+
+  gruvbox = mkTmuxPlugin {
+    pluginName = "gruvbox";
+    rtpFilePath = "gruvbox-tpm.tmux";
+    version = "unstable-2022-04-19";
+    src = fetchFromGitHub {
+      owner = "egel";
+      repo = "tmux-gruvbox";
+      rev = "3f9e38d7243179730b419b5bfafb4e22b0a969ad";
+      sha256 = "1l0kq77rk3cbv0rvh7bmfn90vvqqmywn9jk6gbl9mg3qbynq5wcf";
+    };
+  };
+
+  jump = mkTmuxPlugin {
+    pluginName = "jump";
+    version = "2020-06-26";
+    rtpFilePath = "tmux-jump.tmux";
+    src = fetchFromGitHub {
+      owner = "schasse";
+      repo = "tmux-jump";
+      rev = "416f613d3eaadbe1f6f9eda77c49430527ebaffb";
+      sha256 = "1xbzdyhsgaq2in0f8f491gwjmx6cxpkf2c35d2dk0kg4jfs505sz";
+    };
+    postInstall = ''
+      sed -i -e 's|ruby|${pkgs.ruby}/bin/ruby|g' $target/scripts/tmux-jump.sh
+    '';
+    meta = with lib; {
+      homepage = "https://github.com/schasse/tmux-jump";
+      description = "Vimium/Easymotion like navigation for tmux";
+      license = licenses.gpl3;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ arnarg ];
+    };
+  };
+
+  logging = mkTmuxPlugin {
+    pluginName = "logging";
+    version = "unstable-2019-04-19";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-logging";
+      rev = "b085ad423b5d59a2c8b8d71772352e7028b8e1d0";
+      sha256 = "0p0sawysalhi8k2a5hdxniqx6kb24kd8rnvfzkjqigzid5ik37js";
+    };
+  };
+
+  mode-indicator = mkTmuxPlugin rec {
+    pluginName = "mode-indicator";
+    version = "unstable-2021-10-01";
+    src = fetchFromGitHub {
+      owner = "MunifTanjim";
+      repo = "tmux-mode-indicator";
+      rev = "11520829210a34dc9c7e5be9dead152eaf3a4423";
+      sha256 = "sha256-hlhBKC6UzkpUrCanJehs2FxK5SoYBoiGiioXdx6trC4=";
+    };
+    meta = with lib; {
+      homepage = "https://github.com/MunifTanjim/tmux-mode-indicator";
+      description = "Plugin that displays prompt indicating currently active Tmux mode";
+      license = licenses.mit;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ aacebedo ];
+    };
+  };
+
+  net-speed = mkTmuxPlugin {
+    pluginName = "net-speed";
+    version = "unstable-2018-12-02";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-net-speed";
+      rev = "58abb615971cb617821e2e7e41c660334f55a92d";
+      sha256 = "1aj06gdhzcxsydjzf21n9kyxigwf38kh2rg8hh7gnjk260ydqlrc";
+    };
+  };
+
+  nord = mkTmuxPlugin rec {
+    pluginName = "nord";
+    version = "0.3.0";
+    src = pkgs.fetchFromGitHub {
+      owner = "arcticicestudio";
+      repo = "nord-tmux";
+      rev = "v${version}";
+      sha256 = "14xhh49izvjw4ycwq5gx4if7a0bcnvgsf3irywc3qps6jjcf5ymk";
+    };
+  };
+
+  maildir-counter = mkTmuxPlugin {
+    pluginName = "maildir-counter";
+    version = "unstable-2016-11-25";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-maildir-counter";
+      rev = "9415f0207e71e37cbd870c9443426dbea6da78b9";
+      sha256 = "0dwvqhiv9bjwr01hsi5c57n55jyv5ha5m5q1aqgglf4wyhbnfms4";
+    };
+  };
+
+  online-status = mkTmuxPlugin {
+    pluginName = "online-status";
+    version = "unstable-2018-11-30";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-online-status";
+      rev = "ea86704ced8a20f4a431116aa43f57edcf5a6312";
+      sha256 = "1hy3vg8v2sir865ylpm2r4ip1zgd4wlrf24jbwh16m23qdcvc19r";
+    };
+  };
+
+  open = mkTmuxPlugin {
+    pluginName = "open";
+    version = "unstable-2019-12-02";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-open";
+      rev = "cedb4584908bd8458fadc8d3e64101d3cbb48d46";
+      sha256 = "10s0xdhmg0dhpj13ybcq72pw3xgb2dq5v5h2mwidzqyh9g17wndh";
+    };
+  };
+
+  onedark-theme = mkTmuxPlugin {
+    pluginName = "onedark-theme";
+    rtpFilePath = "tmux-onedark-theme.tmux";
+    version = "unstable-2020-06-07";
+    src = fetchFromGitHub {
+      owner = "odedlaz";
+      repo = "tmux-onedark-theme";
+      rev = "3607ef889a47dd3b4b31f66cda7f36da6f81b85c";
+      sha256 = "19jljshwp2p83b634cd1mw69091x42jj0dg40ipw61qy6642h2m5";
+    };
+  };
+
+  pain-control = mkTmuxPlugin {
+    pluginName = "pain-control";
+    version = "unstable-2020-02-18";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-pain-control";
+      rev = "2db63de3b08fc64831d833240749133cecb67d92";
+      sha256 = "0w7a6n4n86ysiqcqj12j2hg9r5fznvbp3dz8pzas9q1k3avlk0zk";
+    };
+  };
+
+  plumb = mkTmuxPlugin rec {
+    pluginName = "plumb";
+    version = "0.1.1";
+    src = fetchFromGitHub {
+      owner = "eraserhd";
+      repo = "tmux-plumb";
+      rev = "v${version}";
+      sha256 = "1c6k4fdl0az9811r6k164mgd4w5la75xr6x7nabmy046xc0z5i2r";
+    };
+    postInstall = ''
+      sed -i -e 's,9 plumb,${pkgs.plan9port}/bin/9 plumb,' $target/scripts/plumb
+    '';
+  };
+
+  power-theme = mkTmuxPlugin {
+    pluginName = "power";
+    rtpFilePath = "tmux-power.tmux";
+    version = "unstable-2020-11-18";
+    src = pkgs.fetchFromGitHub {
+      owner = "wfxr";
+      repo = "tmux-power";
+      rev = "aec44aa5e00cc39eb71c668b1d73823270058e7d";
+      sha256 = "11nm8cylx10d565g17acy0bj12n6dcbxp71zca2bmg0j1dq859cm";
+    };
+  };
+
+  prefix-highlight = mkTmuxPlugin {
+    pluginName = "prefix-highlight";
+    version = "unstable-2021-03-30";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-prefix-highlight";
+      rev = "15acc6172300bc2eb13c81718dc53da6ae69de4f";
+      sha256 = "08rkflfnynxgv2s26b33l199h6xcqdfmlqbyqa1wkw7h85br3dgl";
+    };
+  };
+
+  resurrect = mkTmuxPlugin {
+    pluginName = "resurrect";
+    version = "unstable-2022-05-01";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-resurrect";
+      rev = "ca6468e2deef11efadfe3a62832ae67742505432";
+      sha256 = "0d7jg5dy4jq64679rf2zqmqbvgiqvpcj5jxfljk7d7y86dnqhj3n";
+    };
+    meta = {
+      homepage = "https://github.com/tmux-plugins/tmux-resurrect";
+      description = "Restore tmux environment after system restart";
+      longDescription =
+        ''
+          This plugin goes to great lengths to save and restore all the details
+          from your tmux environment. Here's what's been taken care of:
+
+          * all sessions, windows, panes and their order
+          * current working directory for each pane
+          * exact pane layouts within windows (even when zoomed)
+          * active and alternative session
+          * active and alternative window for each session
+          * windows with focus
+          * active pane for each window
+          * "grouped sessions" (useful feature when using tmux with multiple monitors)
+          * programs running within a pane! More details in the restoring programs doc.
+
+          Optional:
+          * restoring vim and neovim sessions
+          * restoring pane contents
+      '';
+      license = lib.licenses.mit;
+      platforms = lib.platforms.unix;
+      maintainers = with lib.maintainers; [ ronanmacf ];
+    };
+  };
+
+  sensible = mkTmuxPlugin {
+    pluginName = "sensible";
+    version = "unstable-2017-09-05";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-sensible";
+      rev = "e91b178ff832b7bcbbf4d99d9f467f63fd1b76b5";
+      sha256 = "1z8dfbwblrbmb8sgb0k8h1q0dvfdz7gw57las8nwd5gj6ss1jyvx";
+    };
+    postInstall = lib.optionalString stdenv.isDarwin ''
+      sed -e 's:reattach-to-user-namespace:${pkgs.reattach-to-user-namespace}/bin/reattach-to-user-namespace:g' -i $target/sensible.tmux
+    '';
+  };
+
+  sessionist = mkTmuxPlugin {
+    pluginName = "sessionist";
+    version = "unstable-2017-12-03";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-sessionist";
+      rev = "09ec86be38eae98ffc27bd0dde605ed10ae0dc89";
+      sha256 = "030q2mmj8akbc26jnqn8n7fckg1025p0ildx4wr401b6p1snnlw4";
+    };
+  };
+
+  sidebar = mkTmuxPlugin {
+    pluginName = "sidebar";
+    version = "unstable-2018-11-30";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-sidebar";
+      rev = "aacbdb45bc5ab69db448a72de4155d0b8dbac677";
+      sha256 = "1bp90zbv19kbbiik0bgb893ybss1jqsnk3353a631993xjwsih7c";
+    };
+  };
+
+  sysstat = mkTmuxPlugin {
+    pluginName = "sysstat";
+    version = "unstable-2017-12-12";
+    src = fetchFromGitHub {
+      owner = "samoshkin";
+      repo = "tmux-plugin-sysstat";
+      rev = "29e150f403151f2341f3abcb2b2487a5f011dd23";
+      sha256 = "013mv9p6r2r0ls3p60l8hdad4hm8niv3wr27vgm925gxmibi4hyq";
+    };
+  };
+
+  tilish = mkTmuxPlugin {
+    pluginName = "tilish";
+    version = "2020-08-12";
+    src = fetchFromGitHub {
+      owner = "jabirali";
+      repo = "tmux-tilish";
+      rev = "73d2404cdc0ef6bd7fbc8982edae0b0e2a4dd860";
+      sha256 = "1x58h3bg9d69j40fh8rcjpxvg0i6j04pj8p3jk57l3cghxis5j05";
+    };
+
+    meta = with lib; {
+      homepage = "https://github.com/jabirali/tmux-tilish";
+      description = "Plugin which makes tmux work and feel like i3wm";
+      license = licenses.mit;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ arnarg ];
+    };
+  };
+
+  tmux-colors-solarized = mkTmuxPlugin {
+    pluginName = "tmuxcolors";
+    version = "unstable-2019-07-14";
+    src = fetchFromGitHub {
+      owner = "seebi";
+      repo = "tmux-colors-solarized";
+      rev = "e5e7b4f1af37f8f3fc81ca17eadee5ae5d82cd09";
+      sha256 = "1l3i82abzi4b395cgdsjg7lcfaq15kyyhijwvrgchzxi95z3hl4x";
+    };
+  };
+
+  tmux-fzf = mkTmuxPlugin {
+    pluginName = "tmux-fzf";
+    rtpFilePath = "main.tmux";
+    version = "unstable-2023-07-06";
+    src = fetchFromGitHub {
+      owner = "sainnhe";
+      repo = "tmux-fzf";
+      rev = "51081a2688579228d860b3cb410f4437e857fc6e";
+      sha256 = "sha256-qElRHAbnZ+qRasvkfo+lKNahRHklvLOH0BmbQ1oyN6A=";
+    };
+    postInstall = ''
+      find $target -type f -print0 | xargs -0 sed -i -e 's|fzf |${pkgs.fzf}/bin/fzf |g'
+      find $target -type f -print0 | xargs -0 sed -i -e 's|sed |${pkgs.gnused}/bin/sed |g'
+      find $target -type f -print0 | xargs -0 sed -i -e 's|tput |${pkgs.ncurses}/bin/tput |g'
+    '';
+    meta = {
+      homepage = "https://github.com/sainnhe/tmux-fzf";
+      description = "Use fzf to manage your tmux work environment! ";
+      longDescription =
+        ''
+        Features:
+        * Manage sessions (attach, detach*, rename, kill*).
+        * Manage windows (switch, link, move, swap, rename, kill*).
+        * Manage panes (switch, break, join*, swap, layout, kill*, resize).
+        * Multiple selection (support for actions marked by *).
+        * Search commands and append to command prompt.
+        * Search key bindings and execute.
+        * User menu.
+        * Popup window support.
+      '';
+      license = lib.licenses.mit;
+      platforms = lib.platforms.unix;
+      maintainers = with lib.maintainers; [ kyleondy ];
+    };
+  };
+
+  tmux-thumbs = pkgs.callPackage ./tmux-thumbs {
+    inherit mkTmuxPlugin;
+  };
+
+  urlview = mkTmuxPlugin {
+    pluginName = "urlview";
+    version = "unstable-2016-01-06";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-urlview";
+      rev = "b84c876cffdd22990b4ab51247e795cbd7813d53";
+      sha256 = "1jp4jq57cn116b3i34v6yy69izd8s6mp2ijr260cw86g0470k0fn";
+    };
+    postInstall = ''
+      sed -i -e '14,20{s|urlview|${pkgs.urlview}/bin/urlview|g}' $target/urlview.tmux
+    '';
+  };
+
+  vim-tmux-focus-events = mkTmuxPlugin {
+    pluginName = "vim-tmux-focus-events";
+    version = "unstable-2020-10-05";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "vim-tmux-focus-events";
+      rev = "a568192ca0de4ca0bd7b3cd0249aad491625c941";
+      sha256 = "130l73v18md95djkc4s9d0fr018f8f183sjcgy7dgldwdaxlqdi1";
+    };
+
+    meta = with lib; {
+      homepage = "https://github.com/tmux-plugins/vim-tmux-focus-events";
+      description = "Makes FocusGained and FocusLost autocommand events work in vim when using tmux";
+      license = licenses.mit;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ ronanmacf ];
+    };
+  };
+
+  vim-tmux-navigator = mkTmuxPlugin {
+    pluginName = "vim-tmux-navigator";
+    rtpFilePath = "vim-tmux-navigator.tmux";
+    version = "unstable-2022-08-21";
+    src = fetchFromGitHub {
+      owner = "christoomey";
+      repo = "vim-tmux-navigator";
+      rev = "afb45a55b452b9238159047ce7c6e161bd4a9907";
+      hash = "sha256-8A+Yt9uhhAP76EiqUopE8vl7/UXkgU2x000EOcF7pl0=";
+    };
+  };
+
+  weather = mkTmuxPlugin {
+    pluginName = "weather";
+    version = "unstable-2020-02-08";
+    src = fetchFromGitHub {
+      owner = "xamut";
+      repo = "tmux-weather";
+      rev = "28a5fbe75bb25a408193d454304e28ddd75e9338";
+      hash = "sha256-of9E/npEsF1JVc9ttwrbC5WkIAwCNBJAgTfExfj79i4=";
+    };
+
+    meta = with lib; {
+      homepage = "https://github.com/xamut/tmux-weather";
+      description = "Shows weather in the status line";
+      license = licenses.mit;
+      platforms = platforms.unix;
+      maintainers = with maintainers; [ jfvillablanca ];
+    };
+  };
+
+  yank = mkTmuxPlugin {
+    pluginName = "yank";
+    version = "unstable-2021-06-20";
+    src = fetchFromGitHub {
+      owner = "tmux-plugins";
+      repo = "tmux-yank";
+      rev = "1b1a436e19f095ae8f825243dbe29800a8acd25c";
+      sha256 = "hRvkBf+YrWycecnDixAsD4CAHg3KsioomfJ/nLl5Zgs=";
+    };
+  };
+}
diff --git a/nixpkgs/pkgs/misc/tmux-plugins/tmux-thumbs/default.nix b/nixpkgs/pkgs/misc/tmux-plugins/tmux-thumbs/default.nix
new file mode 100644
index 000000000000..f55a2dbe7b60
--- /dev/null
+++ b/nixpkgs/pkgs/misc/tmux-plugins/tmux-thumbs/default.nix
@@ -0,0 +1,29 @@
+{ lib, mkTmuxPlugin, fetchFromGitHub, thumbs, substituteAll }:
+
+mkTmuxPlugin rec {
+  pluginName = "tmux-thumbs";
+  version = "0.7.1";
+  rtpFilePath = "tmux-thumbs.tmux";
+
+  src = fetchFromGitHub {
+    owner = "fcsonline";
+    repo = pluginName;
+    rev = version;
+    sha256 = "sha256-PH1nscmVhxJFupS7dlbOb+qEwG/Pa/2P6XFIbR/cfaQ=";
+  };
+
+  patches = [
+    (substituteAll {
+      src = ./fix.patch;
+      tmuxThumbsDir = "${thumbs}/bin";
+    })
+  ];
+
+  meta = with lib; {
+    homepage = "https://github.com/fcsonline/tmux-thumbs";
+    description = "A lightning fast version of tmux-fingers written in Rust for copy pasting with vimium/vimperator like hints.";
+    license = licenses.mit;
+    platforms = platforms.unix;
+    maintainers = with maintainers; [ ghostbuster91 ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/tmux-plugins/tmux-thumbs/fix.patch b/nixpkgs/pkgs/misc/tmux-plugins/tmux-thumbs/fix.patch
new file mode 100644
index 000000000000..326696ebc40a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/tmux-plugins/tmux-thumbs/fix.patch
@@ -0,0 +1,45 @@
+diff --git a/tmux-thumbs.sh b/tmux-thumbs.sh
+index 34dd528..8c05d54 100755
+--- a/tmux-thumbs.sh
++++ b/tmux-thumbs.sh
+@@ -1,22 +1,8 @@
+ #!/usr/bin/env bash
+ set -Eeu -o pipefail
+ 
+-VERSION=$(grep 'version =' Cargo.toml | grep -oe "[0-9]\+.[0-9]\+.[0-9]\+")
+-
+ # Setup env variables to be compatible with compiled and bundled installations
+ CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+-RELEASE_DIR="${CURRENT_DIR}/target/release"
+-
+-THUMBS_BINARY="${RELEASE_DIR}/thumbs"
+-TMUX_THUMBS_BINARY="${RELEASE_DIR}/tmux-thumbs"
+-
+-if [ ! -f "$THUMBS_BINARY" ]; then
+-  tmux split-window "cd ${CURRENT_DIR} && bash ./tmux-thumbs-install.sh"
+-  exit
+-elif [[ $(${THUMBS_BINARY} --version) != "thumbs ${VERSION}"  ]]; then
+-  tmux split-window "cd ${CURRENT_DIR} && bash ./tmux-thumbs-install.sh update"
+-  exit
+-fi
+ 
+ function get-opt-value() {
+   tmux show -vg "@thumbs-${1}" 2> /dev/null
+@@ -36,7 +22,7 @@ function get-opt-arg() {
+   fi
+ }
+ 
+-PARAMS=(--dir "${CURRENT_DIR}")
++PARAMS=(--dir @tmuxThumbsDir@)
+ 
+ function add-param() {
+   local type opt arg
+@@ -51,4 +37,4 @@ add-param upcase-command string
+ add-param multi-command  string
+ add-param osc52          boolean
+ 
+-"${TMUX_THUMBS_BINARY}" "${PARAMS[@]}" || true
++@tmuxThumbsDir@/tmux-thumbs "${PARAMS[@]}" || true
+
+
+
diff --git a/nixpkgs/pkgs/misc/tpm2-pkcs11/0001-configure-ac-version.patch b/nixpkgs/pkgs/misc/tpm2-pkcs11/0001-configure-ac-version.patch
new file mode 100644
index 000000000000..fa2575cb938a
--- /dev/null
+++ b/nixpkgs/pkgs/misc/tpm2-pkcs11/0001-configure-ac-version.patch
@@ -0,0 +1,13 @@
+diff --git a/configure.ac b/configure.ac
+index e861e42..018c19c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -26,7 +26,7 @@
+ #;**********************************************************************;
+ 
+ AC_INIT([tpm2-pkcs11],
+-  [m4_esyscmd_s([git describe --tags --always --dirty])],
++  [git-@VERSION@],
+   [https://github.com/tpm2-software/tpm2-pkcs11/issues],
+   [],
+   [https://github.com/tpm2-software/tpm2-pkcs11])
diff --git a/nixpkgs/pkgs/misc/tpm2-pkcs11/default.nix b/nixpkgs/pkgs/misc/tpm2-pkcs11/default.nix
new file mode 100644
index 000000000000..dd0cf011b158
--- /dev/null
+++ b/nixpkgs/pkgs/misc/tpm2-pkcs11/default.nix
@@ -0,0 +1,79 @@
+{ stdenv, lib, fetchFromGitHub, substituteAll
+, pkg-config, autoreconfHook, autoconf-archive, makeWrapper, patchelf
+, tpm2-tss, tpm2-tools, opensc, openssl, sqlite, python3, glibc, libyaml
+, abrmdSupport ? true, tpm2-abrmd ? null
+}:
+
+stdenv.mkDerivation rec {
+  pname = "tpm2-pkcs11";
+  version = "1.8.0";
+
+  src = fetchFromGitHub {
+    owner = "tpm2-software";
+    repo = pname;
+    rev = version;
+    sha256 = "sha256-f5wi0nIM071yaQCwPkY1agKc7OEQa/IxHJc4V2i0Q9I=";
+  };
+
+  patches = lib.singleton (
+    substituteAll {
+      src = ./0001-configure-ac-version.patch;
+      VERSION = version;
+    });
+
+  # The preConfigure phase doesn't seem to be working here
+  # ./bootstrap MUST be executed as the first step, before all
+  # of the autoreconfHook stuff
+  postPatch = ''
+    ./bootstrap
+  '';
+
+  nativeBuildInputs = [
+    pkg-config autoreconfHook autoconf-archive makeWrapper patchelf
+  ];
+  buildInputs = [
+    tpm2-tss tpm2-tools opensc openssl sqlite libyaml
+    (python3.withPackages (ps: with ps; [ packaging pyyaml cryptography pyasn1-modules tpm2-pytss ]))
+  ];
+
+  outputs = [ "out" "bin" "dev" ];
+
+  dontStrip = true;
+  dontPatchELF = true;
+
+  # To be able to use the userspace resource manager, the RUNPATH must
+  # explicitly include the tpm2-abrmd shared libraries.
+  preFixup = let
+    rpath = lib.makeLibraryPath (
+      (lib.optional abrmdSupport tpm2-abrmd)
+      ++ [
+        tpm2-tss
+        sqlite
+        openssl
+        glibc
+        libyaml
+      ]
+    );
+  in ''
+    patchelf \
+      --set-rpath ${rpath} \
+      ${lib.optionalString abrmdSupport "--add-needed ${lib.makeLibraryPath [tpm2-abrmd]}/libtss2-tcti-tabrmd.so"} \
+      --add-needed ${lib.makeLibraryPath [tpm2-tss]}/libtss2-tcti-device.so \
+      $out/lib/libtpm2_pkcs11.so.0.0.0
+  '';
+
+  postInstall = ''
+    mkdir -p $bin/bin/ $bin/share/tpm2_pkcs11/
+    mv ./tools/* $bin/share/tpm2_pkcs11/
+    makeWrapper $bin/share/tpm2_pkcs11/tpm2_ptool.py $bin/bin/tpm2_ptool \
+      --prefix PATH : ${lib.makeBinPath [ tpm2-tools ]}
+  '';
+
+  meta = with lib; {
+    description = "A PKCS#11 interface for TPM2 hardware";
+    homepage = "https://github.com/tpm2-software/tpm2-pkcs11";
+    license = licenses.bsd2;
+    platforms = platforms.linux;
+    maintainers = with maintainers; [ matthiasbeyer ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/uboot/0001-configs-rpi-allow-for-bigger-kernels.patch b/nixpkgs/pkgs/misc/uboot/0001-configs-rpi-allow-for-bigger-kernels.patch
new file mode 100644
index 000000000000..3a6fbeaef411
--- /dev/null
+++ b/nixpkgs/pkgs/misc/uboot/0001-configs-rpi-allow-for-bigger-kernels.patch
@@ -0,0 +1,45 @@
+From 3d0ce353cf62efea11aa88f814aa23bf8c04acc9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Milan=20P=C3=A4ssler?= <milan@petabyte.dev>
+Date: Mon, 11 Jan 2021 15:13:10 +0100
+Subject: [PATCH] configs/rpi: allow for bigger kernels
+
+---
+ include/configs/rpi.h | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/include/configs/rpi.h b/include/configs/rpi.h
+index 834f1cd..10ab1e7 100644
+--- a/include/configs/rpi.h
++++ b/include/configs/rpi.h
+@@ -153,20 +153,20 @@
+  * more than ~700M away from the start of the kernel image but this number can
+  * be larger OR smaller depending on e.g. the 'vmalloc=xxxM' command line
+  * parameter given to the kernel. So reserving memory from low to high
+- * satisfies this constraint again. Reserving 1M at 0x02600000-0x02700000 for
+- * the DTB leaves rest of the free RAM to the initrd starting at 0x02700000.
++ * satisfies this constraint again. Reserving 1M at 0x04700000-0x04800000 for
++ * the DTB leaves rest of the free RAM to the initrd starting at 0x04800000.
+  * Even with the smallest possible CPU-GPU memory split of the CPU getting
+- * only 64M, the remaining 25M starting at 0x02700000 should allow quite
+- * large initrds before they start colliding with U-Boot.
++ * only 64M, the remaining 8M starting at 0x04800000 should allow reasonably
++ * sized initrds before they start colliding with U-Boot.
+  */
+ #define ENV_MEM_LAYOUT_SETTINGS \
+ 	"fdt_high=" FDT_HIGH "\0" \
+ 	"initrd_high=" INITRD_HIGH "\0" \
+ 	"kernel_addr_r=0x00080000\0" \
+-	"scriptaddr=0x02400000\0" \
+-	"pxefile_addr_r=0x02500000\0" \
+-	"fdt_addr_r=0x02600000\0" \
+-	"ramdisk_addr_r=0x02700000\0"
++	"scriptaddr=0x04500000\0" \
++	"pxefile_addr_r=0x04600000\0" \
++	"fdt_addr_r=0x04700000\0" \
++	"ramdisk_addr_r=0x04800000\0"
+ 
+ #if CONFIG_IS_ENABLED(CMD_MMC)
+ 	#define BOOT_TARGET_MMC(func) \
+-- 
+2.29.2
+
diff --git a/nixpkgs/pkgs/misc/uboot/default.nix b/nixpkgs/pkgs/misc/uboot/default.nix
new file mode 100644
index 000000000000..ce4e18b656ad
--- /dev/null
+++ b/nixpkgs/pkgs/misc/uboot/default.nix
@@ -0,0 +1,564 @@
+{ stdenv
+, lib
+, bc
+, bison
+, dtc
+, fetchFromGitHub
+, fetchpatch
+, fetchurl
+, flex
+, gnutls
+, libuuid
+, meson-tools
+, ncurses
+, openssl
+, swig
+, which
+, armTrustedFirmwareAllwinner
+, armTrustedFirmwareAllwinnerH6
+, armTrustedFirmwareAllwinnerH616
+, armTrustedFirmwareRK3328
+, armTrustedFirmwareRK3399
+, armTrustedFirmwareS905
+, buildPackages
+}:
+
+let
+  defaultVersion = "2023.07.02";
+  defaultSrc = fetchurl {
+    url = "https://ftp.denx.de/pub/u-boot/u-boot-${defaultVersion}.tar.bz2";
+    hash = "sha256-a2pIWBwUq7D5W9h8GvTXQJIkBte4AQAqn5Ryf93gIdU=";
+  };
+  buildUBoot = lib.makeOverridable ({
+    version ? null
+  , src ? null
+  , filesToInstall
+  , installDir ? "$out"
+  , defconfig
+  , extraConfig ? ""
+  , extraPatches ? []
+  , extraMakeFlags ? []
+  , extraMeta ? {}
+  , ... } @ args: stdenv.mkDerivation ({
+    pname = "uboot-${defconfig}";
+
+    version = if src == null then defaultVersion else version;
+
+    src = if src == null then defaultSrc else src;
+
+    patches = [
+      ./0001-configs-rpi-allow-for-bigger-kernels.patch
+    ] ++ extraPatches;
+
+    postPatch = ''
+      patchShebangs tools
+      patchShebangs arch/arm/mach-rockchip
+    '';
+
+    nativeBuildInputs = [
+      ncurses # tools/kwboot
+      bc
+      bison
+      dtc
+      flex
+      openssl
+      (buildPackages.python3.withPackages (p: [
+        p.libfdt
+        p.setuptools # for pkg_resources
+        p.pyelftools
+      ]))
+      swig
+      which # for scripts/dtc-version.sh
+    ];
+    depsBuildBuild = [ buildPackages.stdenv.cc ];
+
+    buildInputs = [
+      ncurses # tools/kwboot
+      libuuid # tools/mkeficapsule
+      gnutls # tools/mkeficapsule
+    ];
+
+    hardeningDisable = [ "all" ];
+
+    enableParallelBuilding = true;
+
+    makeFlags = [
+      "DTC=dtc"
+      "CROSS_COMPILE=${stdenv.cc.targetPrefix}"
+    ] ++ extraMakeFlags;
+
+    passAsFile = [ "extraConfig" ];
+
+    configurePhase = ''
+      runHook preConfigure
+
+      make ${defconfig}
+
+      cat $extraConfigPath >> .config
+
+      runHook postConfigure
+    '';
+
+    installPhase = ''
+      runHook preInstall
+
+      mkdir -p ${installDir}
+      cp ${lib.concatStringsSep " " filesToInstall} ${installDir}
+
+      mkdir -p "$out/nix-support"
+      ${lib.concatMapStrings (file: ''
+        echo "file binary-dist ${installDir}/${builtins.baseNameOf file}" >> "$out/nix-support/hydra-build-products"
+      '') filesToInstall}
+
+      runHook postInstall
+    '';
+
+    dontStrip = true;
+
+    meta = with lib; {
+      homepage = "https://www.denx.de/wiki/U-Boot/";
+      description = "Boot loader for embedded systems";
+      license = licenses.gpl2;
+      maintainers = with maintainers; [ bartsch dezgeg samueldr lopsided98 ];
+    } // extraMeta;
+  } // removeAttrs args [ "extraMeta" ]));
+in {
+  inherit buildUBoot;
+
+  ubootTools = buildUBoot {
+    defconfig = "tools-only_defconfig";
+    installDir = "$out/bin";
+    hardeningDisable = [];
+    dontStrip = false;
+    extraMeta.platforms = lib.platforms.linux;
+    extraMakeFlags = [ "HOST_TOOLS_ALL=y" "CROSS_BUILD_TOOLS=1" "NO_SDL=1" "tools" ];
+    filesToInstall = [
+      "tools/dumpimage"
+      "tools/fdtgrep"
+      "tools/kwboot"
+      "tools/mkenvimage"
+      "tools/mkimage"
+    ];
+  };
+
+  ubootA20OlinuxinoLime = buildUBoot {
+    defconfig = "A20-OLinuXino-Lime_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootA20OlinuxinoLime2EMMC = buildUBoot {
+    defconfig = "A20-OLinuXino-Lime2-eMMC_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootAmx335xEVM = buildUBoot {
+    defconfig = "am335x_evm_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["MLO" "u-boot.img"];
+  };
+
+  ubootBananaPi = buildUBoot {
+    defconfig = "Bananapi_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootBananaPim3 = buildUBoot {
+    defconfig = "Sinovoip_BPI_M3_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootBananaPim64 = buildUBoot {
+    defconfig = "bananapi_m64_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinner}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  # http://git.denx.de/?p=u-boot.git;a=blob;f=board/solidrun/clearfog/README;hb=refs/heads/master
+  ubootClearfog = buildUBoot {
+    defconfig = "clearfog_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-spl.kwb"];
+  };
+
+  ubootCubieboard2 = buildUBoot {
+    defconfig = "Cubieboard2_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootGuruplug = buildUBoot {
+    defconfig = "guruplug_defconfig";
+    extraMeta.platforms = ["armv5tel-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootJetsonTK1 = buildUBoot {
+    defconfig = "jetson-tk1_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot" "u-boot.dtb" "u-boot-dtb-tegra.bin" "u-boot-nodtb-tegra.bin"];
+    # tegra-uboot-flasher expects this exact directory layout, sigh...
+    postInstall = ''
+      mkdir -p $out/spl
+      cp spl/u-boot-spl $out/spl/
+    '';
+  };
+
+  # Flashing instructions:
+  # dd if=u-boot.gxl.sd.bin of=<sdcard> conv=fsync,notrunc bs=512 skip=1 seek=1
+  # dd if=u-boot.gxl.sd.bin of=<sdcard> conv=fsync,notrunc bs=1 count=444
+  ubootLibreTechCC = let
+    firmwareImagePkg = fetchFromGitHub {
+      owner = "LibreELEC";
+      repo = "amlogic-boot-fip";
+      rev = "4369a138ca24c5ab932b8cbd1af4504570b709df";
+      sha256 = "sha256-mGRUwdh3nW4gBwWIYHJGjzkezHxABwcwk/1gVRis7Tc=";
+      meta.license = lib.licenses.unfreeRedistributableFirmware;
+    };
+  in
+  assert stdenv.buildPlatform.system == "x86_64-linux"; # aml_encrypt_gxl is a x86_64 binary
+  buildUBoot {
+    defconfig = "libretech-cc_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = ["u-boot.bin"];
+    postBuild = ''
+      # Copy binary files & tools from LibreELEC/amlogic-boot-fip, and u-boot build to working dir
+      mkdir $out tmp
+      cp ${firmwareImagePkg}/lepotato/{acs.bin,bl2.bin,bl21.bin,bl30.bin,bl301.bin,bl31.img} \
+         ${firmwareImagePkg}/lepotato/{acs_tool.py,aml_encrypt_gxl,blx_fix.sh} \
+         u-boot.bin tmp/
+      cd tmp
+      python3 acs_tool.py bl2.bin bl2_acs.bin acs.bin 0
+
+      bash -e blx_fix.sh bl2_acs.bin zero bl2_zero.bin bl21.bin bl21_zero.bin bl2_new.bin bl2
+      [ -f zero ] && rm zero
+
+      bash -e blx_fix.sh bl30.bin zero bl30_zero.bin bl301.bin bl301_zero.bin bl30_new.bin bl30
+      [ -f zero ] && rm zero
+
+      ./aml_encrypt_gxl --bl2sig --input bl2_new.bin --output bl2.n.bin.sig
+      ./aml_encrypt_gxl --bl3enc --input bl30_new.bin --output bl30_new.bin.enc
+      ./aml_encrypt_gxl --bl3enc --input bl31.img --output bl31.img.enc
+      ./aml_encrypt_gxl --bl3enc --input u-boot.bin --output bl33.bin.enc
+      ./aml_encrypt_gxl --bootmk --output $out/u-boot.gxl \
+        --bl2 bl2.n.bin.sig --bl30 bl30_new.bin.enc --bl31 bl31.img.enc --bl33 bl33.bin.enc
+    '';
+  };
+
+  ubootNanoPCT4 = buildUBoot rec {
+    rkbin = fetchFromGitHub {
+      owner = "armbian";
+      repo = "rkbin";
+      rev = "3bd0321cae5ef881a6005fb470009ad5a5d1462d";
+      sha256 = "09r4dzxsbs3pff4sh70qnyp30s3rc7pkc46v1m3152s7jqjasp31";
+    };
+
+    defconfig = "nanopc-t4-rk3399_defconfig";
+
+    extraMeta = {
+      platforms = ["aarch64-linux"];
+      license = lib.licenses.unfreeRedistributableFirmware;
+    };
+    BL31="${armTrustedFirmwareRK3399}/bl31.elf";
+    filesToInstall = ["u-boot.itb" "idbloader.img"];
+    postBuild = ''
+      ./tools/mkimage -n rk3399 -T rksd -d ${rkbin}/rk33/rk3399_ddr_800MHz_v1.24.bin idbloader.img
+      cat ${rkbin}/rk33/rk3399_miniloader_v1.19.bin >> idbloader.img
+    '';
+  };
+
+  ubootNovena = buildUBoot {
+    defconfig = "novena_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-dtb.img" "SPL"];
+  };
+
+  # Flashing instructions:
+  # dd if=bl1.bin.hardkernel of=<device> conv=fsync bs=1 count=442
+  # dd if=bl1.bin.hardkernel of=<device> conv=fsync bs=512 skip=1 seek=1
+  # dd if=u-boot.gxbb of=<device> conv=fsync bs=512 seek=97
+  ubootOdroidC2 = let
+    firmwareBlobs = fetchFromGitHub {
+      owner = "armbian";
+      repo = "odroidc2-blobs";
+      rev = "47c5aac4bcac6f067cebe76e41fb9924d45b429c";
+      sha256 = "1ns0a130yxnxysia8c3q2fgyjp9k0nkr689dxk88qh2vnibgchnp";
+      meta.license = lib.licenses.unfreeRedistributableFirmware;
+    };
+  in buildUBoot {
+    defconfig = "odroid-c2_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = ["u-boot.bin" "u-boot.gxbb" "${firmwareBlobs}/bl1.bin.hardkernel"];
+    postBuild = ''
+      # BL301 image needs at least 64 bytes of padding after it to place
+      # signing headers (with amlbootsig)
+      truncate -s 64 bl301.padding.bin
+      cat '${firmwareBlobs}/gxb/bl301.bin' bl301.padding.bin > bl301.padded.bin
+      # The downstream fip_create tool adds a custom TOC entry with UUID
+      # AABBCCDD-ABCD-EFEF-ABCD-12345678ABCD for the BL301 image. It turns out
+      # that the firmware blob does not actually care about UUIDs, only the
+      # order the images appear in the file. Because fiptool does not know
+      # about the BL301 UUID, we would have to use the --blob option, which adds
+      # the image to the end of the file, causing the boot to fail. Instead, we
+      # take advantage of the fact that UUIDs are ignored and just put the
+      # images in the right order with the wrong UUIDs. In the command below,
+      # --tb-fw is really --scp-fw and --scp-fw is the BL301 image.
+      #
+      # See https://github.com/afaerber/meson-tools/issues/3 for more
+      # information.
+      '${buildPackages.armTrustedFirmwareTools}/bin/fiptool' create \
+        --align 0x4000 \
+        --tb-fw '${firmwareBlobs}/gxb/bl30.bin' \
+        --scp-fw bl301.padded.bin \
+        --soc-fw '${armTrustedFirmwareS905}/bl31.bin' \
+        --nt-fw u-boot.bin \
+        fip.bin
+      cat '${firmwareBlobs}/gxb/bl2.package' fip.bin > boot_new.bin
+      '${buildPackages.meson-tools}/bin/amlbootsig' boot_new.bin u-boot.img
+      dd if=u-boot.img of=u-boot.gxbb bs=512 skip=96
+    '';
+  };
+
+  ubootOdroidXU3 = buildUBoot {
+    defconfig = "odroid-xu3_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-dtb.bin"];
+  };
+
+  ubootOlimexA64Olinuxino = buildUBoot {
+    defconfig = "a64-olinuxino-emmc_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinner}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootOrangePiPc = buildUBoot {
+    defconfig = "orangepi_pc_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootOrangePiZeroPlus2H5 = buildUBoot {
+    defconfig = "orangepi_zero_plus2_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinner}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootOrangePiZero = buildUBoot {
+    defconfig = "orangepi_zero_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootOrangePiZero2 = buildUBoot {
+    defconfig = "orangepi_zero2_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinnerH616}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootOrangePi3 = buildUBoot {
+    defconfig = "orangepi_3_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinnerH6}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootPcduino3Nano = buildUBoot {
+    defconfig = "Linksprite_pcDuino3_Nano_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootPine64 = buildUBoot {
+    defconfig = "pine64_plus_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinner}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootPine64LTS = buildUBoot {
+    defconfig = "pine64-lts_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinner}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootPinebook = buildUBoot {
+    defconfig = "pinebook_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinner}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootPinebookPro = buildUBoot {
+    defconfig = "pinebook-pro-rk3399_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareRK3399}/bl31.elf";
+    filesToInstall = [ "u-boot.itb" "idbloader.img"];
+  };
+
+  ubootQemuAarch64 = buildUBoot {
+    defconfig = "qemu_arm64_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootQemuArm = buildUBoot {
+    defconfig = "qemu_arm_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootQemuRiscv64Smode = buildUBoot {
+    defconfig = "qemu-riscv64_smode_defconfig";
+    extraMeta.platforms = ["riscv64-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootQemuX86 = buildUBoot {
+    defconfig = "qemu-x86_defconfig";
+    extraConfig = ''
+      CONFIG_USB_UHCI_HCD=y
+      CONFIG_USB_EHCI_HCD=y
+      CONFIG_USB_EHCI_GENERIC=y
+      CONFIG_USB_XHCI_HCD=y
+    '';
+    extraMeta.platforms = [ "i686-linux" "x86_64-linux" ];
+    filesToInstall = [ "u-boot.rom" ];
+  };
+
+  ubootRaspberryPi = buildUBoot {
+    defconfig = "rpi_defconfig";
+    extraMeta.platforms = ["armv6l-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootRaspberryPi2 = buildUBoot {
+    defconfig = "rpi_2_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootRaspberryPi3_32bit = buildUBoot {
+    defconfig = "rpi_3_32b_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootRaspberryPi3_64bit = buildUBoot {
+    defconfig = "rpi_3_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootRaspberryPi4_32bit = buildUBoot {
+    defconfig = "rpi_4_32b_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootRaspberryPi4_64bit = buildUBoot {
+    defconfig = "rpi_4_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootRaspberryPiZero = buildUBoot {
+    defconfig = "rpi_0_w_defconfig";
+    extraMeta.platforms = ["armv6l-linux"];
+    filesToInstall = ["u-boot.bin"];
+  };
+
+  ubootRock64 = let
+    rkbin = fetchFromGitHub {
+      owner = "ayufan-rock64";
+      repo = "rkbin";
+      rev = "f79a708978232a2b6b06c2e4173c5314559e0d3a";
+      sha256 = "0h7xm4ck3p3380c6bqm5ixrkxwcx6z5vysqdwvfa7gcqx5d6x5zz";
+    };
+  in buildUBoot {
+    defconfig = "rock64-rk3328_defconfig";
+    extraMeta = {
+      platforms = [ "aarch64-linux" ];
+      license = lib.licenses.unfreeRedistributableFirmware;
+    };
+    BL31="${armTrustedFirmwareRK3328}/bl31.elf";
+    filesToInstall = [ "u-boot.itb" "idbloader.img"];
+    # Derive MAC address from cpuid
+    # Submitted upstream: https://patchwork.ozlabs.org/patch/1203686/
+    extraConfig = ''
+      CONFIG_MISC_INIT_R=y
+    '';
+    # Close to being blob free, but the U-Boot TPL causes random memory
+    # corruption
+    postBuild = ''
+      ./tools/mkimage -n rk3328 -T rksd -d ${rkbin}/rk33/rk3328_ddr_786MHz_v1.13.bin idbloader.img
+      cat spl/u-boot-spl.bin >> idbloader.img
+    '';
+  };
+
+  ubootRockPro64 = buildUBoot {
+    extraPatches = [
+      # https://patchwork.ozlabs.org/project/uboot/list/?series=237654&archive=both&state=*
+      (fetchpatch {
+        url = "https://patchwork.ozlabs.org/series/237654/mbox/";
+        sha256 = "0aiw9zk8w4msd3v8nndhkspjify0yq6a5f0zdy6mhzs0ilq896c3";
+      })
+    ];
+    defconfig = "rockpro64-rk3399_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31="${armTrustedFirmwareRK3399}/bl31.elf";
+    filesToInstall = [ "u-boot.itb" "idbloader.img"];
+  };
+
+  ubootROCPCRK3399 = buildUBoot {
+    defconfig = "roc-pc-rk3399_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    filesToInstall = [ "spl/u-boot-spl.bin" "u-boot.itb" "idbloader.img"];
+    BL31 = "${armTrustedFirmwareRK3399}/bl31.elf";
+  };
+
+  ubootSheevaplug = buildUBoot {
+    defconfig = "sheevaplug_defconfig";
+    extraMeta.platforms = ["armv5tel-linux"];
+    filesToInstall = ["u-boot.kwb"];
+  };
+
+  ubootSopine = buildUBoot {
+    defconfig = "sopine_baseboard_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareAllwinner}/bl31.bin";
+    filesToInstall = ["u-boot-sunxi-with-spl.bin"];
+  };
+
+  ubootUtilite = buildUBoot {
+    defconfig = "cm_fx6_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot-with-nand-spl.imx"];
+    buildFlags = [ "u-boot-with-nand-spl.imx" ];
+    extraConfig = ''
+      CONFIG_CMD_SETEXPR=y
+    '';
+    # sata init; load sata 0 $loadaddr u-boot-with-nand-spl.imx
+    # sf probe; sf update $loadaddr 0 80000
+  };
+
+  ubootWandboard = buildUBoot {
+    defconfig = "wandboard_defconfig";
+    extraMeta.platforms = ["armv7l-linux"];
+    filesToInstall = ["u-boot.img" "SPL"];
+  };
+
+  ubootRockPi4 = buildUBoot {
+    defconfig = "rock-pi-4-rk3399_defconfig";
+    extraMeta.platforms = ["aarch64-linux"];
+    BL31 = "${armTrustedFirmwareRK3399}/bl31.elf";
+    filesToInstall = [ "u-boot.itb" "idbloader.img"];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/uq/default.nix b/nixpkgs/pkgs/misc/uq/default.nix
new file mode 100755
index 000000000000..e0c62ca92cab
--- /dev/null
+++ b/nixpkgs/pkgs/misc/uq/default.nix
@@ -0,0 +1,25 @@
+{ lib
+, fetchFromGitHub
+, rustPlatform
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "uq";
+  version = "unstable-2018-05-27";
+
+  src = fetchFromGitHub {
+    owner = "lostutils";
+    repo = "uq";
+    rev = "118bc2f3b1cf292afdffbc1cb4415d150b323165";
+    sha256 = "1qqqmdk0v1d3ckasmmw5lbrkvhkv0nws4bzi9cfi1ndhrbvbkbxb";
+  };
+
+  cargoSha256 = "1p6008vxm2pi9v31qhsq7zysanal6rcvcl8553373bkqlfd7w5c4";
+
+  meta = with lib; {
+    description = "A simple, user-friendly alternative to sort | uniq";
+    homepage = "https://github.com/lostutils/uq";
+    license = licenses.mit;
+    maintainers = with maintainers; [ doronbehar ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/urbit/default.nix b/nixpkgs/pkgs/misc/urbit/default.nix
new file mode 100644
index 000000000000..81dd6b81badc
--- /dev/null
+++ b/nixpkgs/pkgs/misc/urbit/default.nix
@@ -0,0 +1,39 @@
+{ stdenv
+, lib
+, fetchzip
+}:
+
+let
+  os = if stdenv.isDarwin then "macos" else "linux";
+  arch = if stdenv.isAarch64 then "aarch64" else "x86_64";
+  platform = "${os}-${arch}";
+in
+stdenv.mkDerivation rec {
+  pname = "urbit";
+  version = "2.11";
+
+  src = fetchzip {
+    url = "https://github.com/urbit/vere/releases/download/vere-v${version}/${platform}.tgz";
+    sha256 = {
+      x86_64-linux = "sha256-k2zmcjZ9NXmwZf93LIAg1jx4IRprKUgdkvwzxEOKWDY=";
+      aarch64-linux = "sha256-atMBXyXwavpSDTZxUnXIq+NV4moKGRWLaFTM9Kuzt94=";
+      x86_64-darwin = "sha256-LSJ9jVY3fETlpRAkyUWa/2vZ5xAFmmMssvbzUfIBY/4=";
+      aarch64-darwin = "sha256-AViUt2N+YCgMWOcv3ZI0GfdYVOiRLbhseQ7TTq4zCiQ=";
+    }.${stdenv.hostPlatform.system} or (throw "unsupported system ${stdenv.hostPlatform.system}");
+  };
+
+  postInstall = ''
+    install -m755 -D vere-v${version}-${platform} $out/bin/urbit
+  '';
+
+  passthru.updateScript = ./update-bin.sh;
+
+  meta = with lib; {
+    homepage = "https://urbit.org";
+    description = "An operating function";
+    platforms = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"];
+    maintainers = [ maintainers.matthew-levan ];
+    license = licenses.mit;
+    sourceProvenance = with sourceTypes; [ binaryNativeCode ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/urbit/update-bin.sh b/nixpkgs/pkgs/misc/urbit/update-bin.sh
new file mode 100755
index 000000000000..b7ee514e10a7
--- /dev/null
+++ b/nixpkgs/pkgs/misc/urbit/update-bin.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i bash -p curl common-updater-scripts nix-prefetch
+
+set -euo pipefail
+
+ROOT="$(dirname "$(readlink -f "$0")")"
+NIX_DRV="$ROOT/default.nix"
+if [ ! -f "$NIX_DRV" ]; then
+  echo "ERROR: cannot find urbit in $ROOT"
+  exit 1
+fi
+
+fetch_arch() {
+  VER="$1"; ARCH="$2"
+  URL="https://github.com/urbit/vere/releases/download/vere-v${VER}/${ARCH}.tgz";
+  nix-prefetch "{ stdenv, fetchzip }:
+stdenv.mkDerivation rec {
+  pname = \"vere\"; version = \"${VER}\";
+  src = fetchzip { url = \"$URL\"; };
+}
+"
+}
+
+replace_sha() {
+  sed -i "s#$1 = \"sha256-.\{44\}\"#$1 = \"$2\"#" "$NIX_DRV"
+}
+
+VERE_VER=$(curl https://bootstrap.urbit.org/vere/live/last)
+
+VERE_LINUX_AARCH64_SHA256=$(fetch_arch "$VERE_VER" "linux-aarch64")
+VERE_LINUX_X64_SHA256=$(fetch_arch "$VERE_VER" "linux-x86_64")
+VERE_DARWIN_AARCH64_SHA256=$(fetch_arch "$VERE_VER" "macos-aarch64")
+VERE_DARWIN_X64_SHA256=$(fetch_arch "$VERE_VER" "macos-x86_64")
+
+sed -i "s/version = \".*\"/version = \"$VERE_VER\"/" "$NIX_DRV"
+
+replace_sha "aarch64-linux" "$VERE_LINUX_AARCH64_SHA256"
+replace_sha "x86_64-linux" "$VERE_LINUX_X64_SHA256"
+replace_sha "aarch64-darwin" "$VERE_DARWIN_AARCH64_SHA256"
+replace_sha "x86_64-darwin" "$VERE_DARWIN_X64_SHA256"
diff --git a/nixpkgs/pkgs/misc/vencord/default.nix b/nixpkgs/pkgs/misc/vencord/default.nix
new file mode 100644
index 000000000000..99d11b06976f
--- /dev/null
+++ b/nixpkgs/pkgs/misc/vencord/default.nix
@@ -0,0 +1,66 @@
+{ buildNpmPackage
+, fetchFromGitHub
+, lib
+, substituteAll
+, esbuild
+, buildGoModule
+, buildWebExtension ? false
+}:
+buildNpmPackage rec {
+  pname = "vencord";
+  version = "1.3.4";
+
+  src = fetchFromGitHub {
+    owner = "Vendicated";
+    repo = "Vencord";
+    rev = "v${version}";
+    sha256 = "sha256-r+VgxXwsBOfMggcVlr5q1/ONfp13CpX4ssrLQtmdLe8=";
+  };
+
+  ESBUILD_BINARY_PATH = lib.getExe (esbuild.override {
+    buildGoModule = args: buildGoModule (args // rec {
+      version = "0.15.18";
+      src = fetchFromGitHub {
+        owner = "evanw";
+        repo = "esbuild";
+        rev = "v${version}";
+        hash = "sha256-b9R1ML+pgRg9j2yrkQmBulPuLHYLUQvW+WTyR/Cq6zE=";
+      };
+      vendorHash = "sha256-+BfxCyg0KkDQpHt/wycy/8CTG6YBA/VJvJFhhzUnSiQ=";
+    });
+  });
+
+  # Supresses an error about esbuild's version.
+  npmRebuildFlags = [ "|| true" ];
+
+  npmDepsHash = "sha256-HJK88z4Gs8mqd28zKrsTtk34VcRqIyb6aURbvRZLN0I=";
+  npmFlags = [ "--legacy-peer-deps" ];
+  npmBuildScript = if buildWebExtension then "buildWeb" else "build";
+  npmBuildFlags = [ "--" "--standalone" ];
+
+  prePatch = ''
+    cp ${./package-lock.json} ./package-lock.json
+  '';
+
+  patches = [
+    (substituteAll {
+      src = ./replace-git.patch;
+      inherit version;
+    })
+    ./disable-updater-ui.patch
+  ];
+
+  installPhase =
+    if buildWebExtension then ''
+      cp -r dist/chromium-unpacked/ $out
+    '' else ''
+      cp -r dist/ $out
+    '';
+
+  meta = with lib; {
+    description = "Vencord web extension";
+    homepage = "https://github.com/Vendicated/Vencord";
+    license = licenses.gpl3Only;
+    maintainers = with maintainers; [ FlafyDev NotAShelf Scrumplex ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/vencord/disable-updater-ui.patch b/nixpkgs/pkgs/misc/vencord/disable-updater-ui.patch
new file mode 100644
index 000000000000..6682d814b862
--- /dev/null
+++ b/nixpkgs/pkgs/misc/vencord/disable-updater-ui.patch
@@ -0,0 +1,35 @@
+diff --git a/src/components/VencordSettings/UpdaterTab.tsx b/src/components/VencordSettings/UpdaterTab.tsx
+index 4d0b86c..0f1d87f 100644
+--- a/src/components/VencordSettings/UpdaterTab.tsx
++++ b/src/components/VencordSettings/UpdaterTab.tsx
+@@ -249,4 +249,4 @@ function Updater() {
+     );
+ }
+ 
+-export default IS_WEB ? null : wrapTab(Updater, "Updater");
++export default null;
+diff --git a/src/plugins/_core/settings.tsx b/src/plugins/_core/settings.tsx
+index 3ea5a43..da63213 100644
+--- a/src/plugins/_core/settings.tsx
++++ b/src/plugins/_core/settings.tsx
+@@ -105,7 +105,7 @@ export default definePlugin({
+                 label: "Themes",
+                 element: require("@components/VencordSettings/ThemesTab").default,
+             },
+-            !IS_WEB && {
++            false && !IS_WEB && {
+                 section: "VencordUpdater",
+                 label: "Updater",
+                 element: require("@components/VencordSettings/UpdaterTab").default,
+diff --git a/src/utils/updater.ts b/src/utils/updater.ts
+index 2e2bfe1..5ebd06e 100644
+--- a/src/utils/updater.ts
++++ b/src/utils/updater.ts
+@@ -38,6 +38,7 @@ async function Unwrap<T>(p: Promise<IpcRes<T>>) {
+ }
+ 
+ export async function checkForUpdates() {
++    return false;
+     changes = await Unwrap(VencordNative.updater.getUpdates());
+     if (changes.some(c => c.hash === gitHash)) {
+         isNewer = true;
diff --git a/nixpkgs/pkgs/misc/vencord/package-lock.json b/nixpkgs/pkgs/misc/vencord/package-lock.json
new file mode 100644
index 000000000000..c75130a7e6fa
--- /dev/null
+++ b/nixpkgs/pkgs/misc/vencord/package-lock.json
@@ -0,0 +1,5743 @@
+{
+    "name": "vencord",
+    "version": "1.3.4",
+    "lockfileVersion": 3,
+    "requires": true,
+    "packages": {
+        "": {
+            "name": "vencord",
+            "version": "1.3.4",
+            "license": "GPL-3.0",
+            "dependencies": {
+                "@vap/core": "0.0.12",
+                "@vap/shiki": "0.10.5",
+                "fflate": "^0.7.4",
+                "nanoid": "^4.0.2",
+                "virtual-merge": "^1.0.1"
+            },
+            "devDependencies": {
+                "@types/diff": "^5.0.3",
+                "@types/lodash": "^4.14.194",
+                "@types/node": "^18.16.3",
+                "@types/react": "^18.2.0",
+                "@types/react-dom": "^18.2.1",
+                "@types/yazl": "^2.4.2",
+                "@typescript-eslint/eslint-plugin": "^5.59.1",
+                "@typescript-eslint/parser": "^5.59.1",
+                "diff": "^5.1.0",
+                "discord-types": "^1.3.26",
+                "esbuild": "^0.15.18",
+                "eslint": "^8.28.0",
+                "eslint-import-resolver-alias": "^1.1.2",
+                "eslint-plugin-header": "^3.1.1",
+                "eslint-plugin-path-alias": "^1.0.0",
+                "eslint-plugin-simple-import-sort": "^10.0.0",
+                "eslint-plugin-unused-imports": "^2.0.0",
+                "highlight.js": "10.6.0",
+                "moment": "^2.29.4",
+                "puppeteer-core": "^19.11.1",
+                "standalone-electron-types": "^1.0.0",
+                "stylelint": "^15.6.0",
+                "stylelint-config-standard": "^33.0.0",
+                "tsx": "^3.12.7",
+                "type-fest": "^3.9.0",
+                "typescript": "^5.0.4"
+            },
+            "engines": {
+                "node": ">=18",
+                "pnpm": ">=8"
+            }
+        },
+        "node_modules/@babel/code-frame": {
+            "version": "7.22.5",
+            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+            "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+            "dev": true,
+            "dependencies": {
+                "@babel/highlight": "^7.22.5"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/helper-validator-identifier": {
+            "version": "7.22.5",
+            "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+            "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/highlight": {
+            "version": "7.22.5",
+            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+            "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+            "dev": true,
+            "dependencies": {
+                "@babel/helper-validator-identifier": "^7.22.5",
+                "chalk": "^2.0.0",
+                "js-tokens": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=6.9.0"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/ansi-styles": {
+            "version": "3.2.1",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^1.9.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/chalk": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+            "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/color-convert": {
+            "version": "1.9.3",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "1.1.3"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/color-name": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+            "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+            "dev": true
+        },
+        "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+            "version": "1.0.5",
+            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+            "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.0"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/has-flag": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+            "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@babel/highlight/node_modules/supports-color": {
+            "version": "5.5.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/@csstools/css-parser-algorithms": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.2.0.tgz",
+            "integrity": "sha512-9BoQ/jSrPq4vv3b9jjLW+PNNv56KlDH5JMx5yASSNrCtvq70FCNZUjXRvbCeR9hYj9ZyhURtqpU/RFIgg6kiOw==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/csstools"
+                },
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/csstools"
+                }
+            ],
+            "engines": {
+                "node": "^14 || ^16 || >=18"
+            },
+            "peerDependencies": {
+                "@csstools/css-tokenizer": "^2.1.1"
+            }
+        },
+        "node_modules/@csstools/css-tokenizer": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz",
+            "integrity": "sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA==",
+            "dev": true,
+            "engines": {
+                "node": "^14 || ^16 || >=18"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/csstools"
+            }
+        },
+        "node_modules/@csstools/media-query-list-parser": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.0.tgz",
+            "integrity": "sha512-MXkR+TeaS2q9IkpyO6jVCdtA/bfpABJxIrfkLswThFN8EZZgI2RfAHhm6sDNDuYV25d5+b8Lj1fpTccIcSLPsQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/csstools"
+                },
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/csstools"
+                }
+            ],
+            "engines": {
+                "node": "^14 || ^16 || >=18"
+            },
+            "peerDependencies": {
+                "@csstools/css-parser-algorithms": "^2.1.1",
+                "@csstools/css-tokenizer": "^2.1.1"
+            }
+        },
+        "node_modules/@csstools/selector-specificity": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz",
+            "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==",
+            "dev": true,
+            "engines": {
+                "node": "^14 || ^16 || >=18"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/csstools"
+            },
+            "peerDependencies": {
+                "postcss-selector-parser": "^6.0.10"
+            }
+        },
+        "node_modules/@esbuild-kit/cjs-loader": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.2.tgz",
+            "integrity": "sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==",
+            "dev": true,
+            "dependencies": {
+                "@esbuild-kit/core-utils": "^3.0.0",
+                "get-tsconfig": "^4.4.0"
+            }
+        },
+        "node_modules/@esbuild-kit/core-utils": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.1.0.tgz",
+            "integrity": "sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==",
+            "dev": true,
+            "dependencies": {
+                "esbuild": "~0.17.6",
+                "source-map-support": "^0.5.21"
+            }
+        },
+        "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
+            "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz",
+            "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==",
+            "cpu": [
+                "loong64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz",
+            "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==",
+            "dev": true,
+            "hasInstallScript": true,
+            "bin": {
+                "esbuild": "bin/esbuild"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "optionalDependencies": {
+                "@esbuild/android-arm": "0.17.19",
+                "@esbuild/android-arm64": "0.17.19",
+                "@esbuild/android-x64": "0.17.19",
+                "@esbuild/darwin-arm64": "0.17.19",
+                "@esbuild/darwin-x64": "0.17.19",
+                "@esbuild/freebsd-arm64": "0.17.19",
+                "@esbuild/freebsd-x64": "0.17.19",
+                "@esbuild/linux-arm": "0.17.19",
+                "@esbuild/linux-arm64": "0.17.19",
+                "@esbuild/linux-ia32": "0.17.19",
+                "@esbuild/linux-loong64": "0.17.19",
+                "@esbuild/linux-mips64el": "0.17.19",
+                "@esbuild/linux-ppc64": "0.17.19",
+                "@esbuild/linux-riscv64": "0.17.19",
+                "@esbuild/linux-s390x": "0.17.19",
+                "@esbuild/linux-x64": "0.17.19",
+                "@esbuild/netbsd-x64": "0.17.19",
+                "@esbuild/openbsd-x64": "0.17.19",
+                "@esbuild/sunos-x64": "0.17.19",
+                "@esbuild/win32-arm64": "0.17.19",
+                "@esbuild/win32-ia32": "0.17.19",
+                "@esbuild/win32-x64": "0.17.19"
+            }
+        },
+        "node_modules/@esbuild-kit/esm-loader": {
+            "version": "2.5.5",
+            "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.5.tgz",
+            "integrity": "sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==",
+            "dev": true,
+            "dependencies": {
+                "@esbuild-kit/core-utils": "^3.0.0",
+                "get-tsconfig": "^4.4.0"
+            }
+        },
+        "node_modules/@esbuild/android-arm": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz",
+            "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-arm64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz",
+            "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/android-x64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz",
+            "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/darwin-arm64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz",
+            "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/darwin-x64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz",
+            "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/freebsd-arm64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz",
+            "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/freebsd-x64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz",
+            "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-arm": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz",
+            "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-arm64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz",
+            "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-ia32": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz",
+            "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-loong64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz",
+            "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==",
+            "cpu": [
+                "loong64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-mips64el": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz",
+            "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==",
+            "cpu": [
+                "mips64el"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-ppc64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz",
+            "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-riscv64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz",
+            "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==",
+            "cpu": [
+                "riscv64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-s390x": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz",
+            "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==",
+            "cpu": [
+                "s390x"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/linux-x64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz",
+            "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/netbsd-x64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz",
+            "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "netbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/openbsd-x64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz",
+            "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "openbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/sunos-x64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz",
+            "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "sunos"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-arm64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz",
+            "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-ia32": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz",
+            "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@esbuild/win32-x64": {
+            "version": "0.17.19",
+            "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz",
+            "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/@eslint-community/eslint-utils": {
+            "version": "4.4.0",
+            "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+            "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+            "dev": true,
+            "dependencies": {
+                "eslint-visitor-keys": "^3.3.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "peerDependencies": {
+                "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+            }
+        },
+        "node_modules/@eslint-community/regexpp": {
+            "version": "4.5.1",
+            "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
+            "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
+            "dev": true,
+            "engines": {
+                "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+            }
+        },
+        "node_modules/@eslint/eslintrc": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz",
+            "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==",
+            "dev": true,
+            "dependencies": {
+                "ajv": "^6.12.4",
+                "debug": "^4.3.2",
+                "espree": "^9.5.2",
+                "globals": "^13.19.0",
+                "ignore": "^5.2.0",
+                "import-fresh": "^3.2.1",
+                "js-yaml": "^4.1.0",
+                "minimatch": "^3.1.2",
+                "strip-json-comments": "^3.1.1"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/@eslint/js": {
+            "version": "8.43.0",
+            "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz",
+            "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            }
+        },
+        "node_modules/@humanwhocodes/config-array": {
+            "version": "0.11.10",
+            "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+            "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+            "dev": true,
+            "dependencies": {
+                "@humanwhocodes/object-schema": "^1.2.1",
+                "debug": "^4.1.1",
+                "minimatch": "^3.0.5"
+            },
+            "engines": {
+                "node": ">=10.10.0"
+            }
+        },
+        "node_modules/@humanwhocodes/module-importer": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+            "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+            "dev": true,
+            "engines": {
+                "node": ">=12.22"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/nzakas"
+            }
+        },
+        "node_modules/@humanwhocodes/object-schema": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+            "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+            "dev": true
+        },
+        "node_modules/@nodelib/fs.scandir": {
+            "version": "2.1.5",
+            "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+            "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+            "dev": true,
+            "dependencies": {
+                "@nodelib/fs.stat": "2.0.5",
+                "run-parallel": "^1.1.9"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.stat": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+            "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@nodelib/fs.walk": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+            "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+            "dev": true,
+            "dependencies": {
+                "@nodelib/fs.scandir": "2.1.5",
+                "fastq": "^1.6.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/@puppeteer/browsers": {
+            "version": "0.5.0",
+            "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.5.0.tgz",
+            "integrity": "sha512-Uw6oB7VvmPRLE4iKsjuOh8zgDabhNX67dzo8U/BB0f9527qx+4eeUs+korU98OhG5C4ubg7ufBgVi63XYwS6TQ==",
+            "dev": true,
+            "dependencies": {
+                "debug": "4.3.4",
+                "extract-zip": "2.0.1",
+                "https-proxy-agent": "5.0.1",
+                "progress": "2.0.3",
+                "proxy-from-env": "1.1.0",
+                "tar-fs": "2.1.1",
+                "unbzip2-stream": "1.4.3",
+                "yargs": "17.7.1"
+            },
+            "bin": {
+                "browsers": "lib/cjs/main-cli.js"
+            },
+            "engines": {
+                "node": ">=14.1.0"
+            },
+            "peerDependencies": {
+                "typescript": ">= 4.7.4"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@types/diff": {
+            "version": "5.0.3",
+            "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.0.3.tgz",
+            "integrity": "sha512-amrLbRqTU9bXMCc6uX0sWpxsQzRIo9z6MJPkH1pkez/qOxuqSZVuryJAWoBRq94CeG8JxY+VK4Le9HtjQR5T9A==",
+            "dev": true
+        },
+        "node_modules/@types/json-schema": {
+            "version": "7.0.12",
+            "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz",
+            "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==",
+            "dev": true
+        },
+        "node_modules/@types/lodash": {
+            "version": "4.14.195",
+            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz",
+            "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==",
+            "dev": true
+        },
+        "node_modules/@types/minimist": {
+            "version": "1.2.2",
+            "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+            "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+            "dev": true
+        },
+        "node_modules/@types/node": {
+            "version": "18.16.18",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.18.tgz",
+            "integrity": "sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw==",
+            "dev": true
+        },
+        "node_modules/@types/normalize-package-data": {
+            "version": "2.4.1",
+            "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+            "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+            "dev": true
+        },
+        "node_modules/@types/prop-types": {
+            "version": "15.7.5",
+            "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
+            "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
+            "dev": true
+        },
+        "node_modules/@types/react": {
+            "version": "18.2.12",
+            "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.12.tgz",
+            "integrity": "sha512-ndmBMLCgn38v3SntMeoJaIrO6tGHYKMEBohCUmw8HoLLQdRMOIGXfeYaBTLe2lsFaSB3MOK1VXscYFnmLtTSmw==",
+            "dev": true,
+            "dependencies": {
+                "@types/prop-types": "*",
+                "@types/scheduler": "*",
+                "csstype": "^3.0.2"
+            }
+        },
+        "node_modules/@types/react-dom": {
+            "version": "18.2.5",
+            "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.5.tgz",
+            "integrity": "sha512-sRQsOS/sCLnpQhR4DSKGTtWFE3FZjpQa86KPVbhUqdYMRZ9FEFcfAytKhR/vUG2rH1oFbOOej6cuD7MFSobDRQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/react": "*"
+            }
+        },
+        "node_modules/@types/scheduler": {
+            "version": "0.16.3",
+            "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
+            "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
+            "dev": true
+        },
+        "node_modules/@types/semver": {
+            "version": "7.5.0",
+            "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz",
+            "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==",
+            "dev": true
+        },
+        "node_modules/@types/yauzl": {
+            "version": "2.10.0",
+            "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+            "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
+            "dev": true,
+            "optional": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@types/yazl": {
+            "version": "2.4.2",
+            "resolved": "https://registry.npmjs.org/@types/yazl/-/yazl-2.4.2.tgz",
+            "integrity": "sha512-T+9JH8O2guEjXNxqmybzQ92mJUh2oCwDDMSSimZSe1P+pceZiFROZLYmcbqkzV5EUwz6VwcKXCO2S2yUpra6XQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "*"
+            }
+        },
+        "node_modules/@typescript-eslint/eslint-plugin": {
+            "version": "5.59.11",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz",
+            "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==",
+            "dev": true,
+            "dependencies": {
+                "@eslint-community/regexpp": "^4.4.0",
+                "@typescript-eslint/scope-manager": "5.59.11",
+                "@typescript-eslint/type-utils": "5.59.11",
+                "@typescript-eslint/utils": "5.59.11",
+                "debug": "^4.3.4",
+                "grapheme-splitter": "^1.0.4",
+                "ignore": "^5.2.0",
+                "natural-compare-lite": "^1.4.0",
+                "semver": "^7.3.7",
+                "tsutils": "^3.21.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependencies": {
+                "@typescript-eslint/parser": "^5.0.0",
+                "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@typescript-eslint/parser": {
+            "version": "5.59.11",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz",
+            "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/scope-manager": "5.59.11",
+                "@typescript-eslint/types": "5.59.11",
+                "@typescript-eslint/typescript-estree": "5.59.11",
+                "debug": "^4.3.4"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependencies": {
+                "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@typescript-eslint/scope-manager": {
+            "version": "5.59.11",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz",
+            "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/types": "5.59.11",
+                "@typescript-eslint/visitor-keys": "5.59.11"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            }
+        },
+        "node_modules/@typescript-eslint/type-utils": {
+            "version": "5.59.11",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz",
+            "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/typescript-estree": "5.59.11",
+                "@typescript-eslint/utils": "5.59.11",
+                "debug": "^4.3.4",
+                "tsutils": "^3.21.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependencies": {
+                "eslint": "*"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@typescript-eslint/types": {
+            "version": "5.59.11",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz",
+            "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            }
+        },
+        "node_modules/@typescript-eslint/typescript-estree": {
+            "version": "5.59.11",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz",
+            "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/types": "5.59.11",
+                "@typescript-eslint/visitor-keys": "5.59.11",
+                "debug": "^4.3.4",
+                "globby": "^11.1.0",
+                "is-glob": "^4.0.3",
+                "semver": "^7.3.7",
+                "tsutils": "^3.21.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/@typescript-eslint/utils": {
+            "version": "5.59.11",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz",
+            "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==",
+            "dev": true,
+            "dependencies": {
+                "@eslint-community/eslint-utils": "^4.2.0",
+                "@types/json-schema": "^7.0.9",
+                "@types/semver": "^7.3.12",
+                "@typescript-eslint/scope-manager": "5.59.11",
+                "@typescript-eslint/types": "5.59.11",
+                "@typescript-eslint/typescript-estree": "5.59.11",
+                "eslint-scope": "^5.1.1",
+                "semver": "^7.3.7"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            },
+            "peerDependencies": {
+                "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+            }
+        },
+        "node_modules/@typescript-eslint/visitor-keys": {
+            "version": "5.59.11",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz",
+            "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==",
+            "dev": true,
+            "dependencies": {
+                "@typescript-eslint/types": "5.59.11",
+                "eslint-visitor-keys": "^3.3.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/typescript-eslint"
+            }
+        },
+        "node_modules/@vap/core": {
+            "version": "0.0.12",
+            "resolved": "https://registry.npmjs.org/@vap/core/-/core-0.0.12.tgz",
+            "integrity": "sha512-3csHpkE1zUSRTZwl7xIf2uXg1cD4IhhtUm0F6K/dWydc95R5Nj+krB4OTNATuqkewIv/ViCbwjPfkafAgvZQSg==",
+            "dependencies": {
+                "eventemitter3": "^4.0.7"
+            }
+        },
+        "node_modules/@vap/shiki": {
+            "version": "0.10.5",
+            "resolved": "https://registry.npmjs.org/@vap/shiki/-/shiki-0.10.5.tgz",
+            "integrity": "sha512-5BHVGvQT8qonbLSASon5aQFQ18OZU4FxSl9tLSj6oJ0sap3KdMbYcfGq25M9zFZR1g1dJN7fgjmZXBIS5omIdw==",
+            "dependencies": {
+                "jsonc-parser": "^3.0.0",
+                "vscode-oniguruma": "^1.6.1",
+                "vscode-textmate": "5.2.0"
+            }
+        },
+        "node_modules/acorn": {
+            "version": "8.9.0",
+            "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz",
+            "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==",
+            "dev": true,
+            "bin": {
+                "acorn": "bin/acorn"
+            },
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/acorn-jsx": {
+            "version": "5.3.2",
+            "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+            "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+            "dev": true,
+            "peerDependencies": {
+                "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+            }
+        },
+        "node_modules/agent-base": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+            "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+            "dev": true,
+            "dependencies": {
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6.0.0"
+            }
+        },
+        "node_modules/ajv": {
+            "version": "6.12.6",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+            "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+            "dev": true,
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "fast-json-stable-stringify": "^2.0.0",
+                "json-schema-traverse": "^0.4.1",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin"
+            }
+        },
+        "node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "dev": true,
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/argparse": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+            "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+            "dev": true
+        },
+        "node_modules/arr-diff": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+            "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/arr-union": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+            "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/array-union": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+            "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/array-unique": {
+            "version": "0.3.2",
+            "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+            "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/arrify": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+            "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/assign-symbols": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+            "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/astral-regex": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+            "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/atob": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+            "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+            "dev": true,
+            "bin": {
+                "atob": "bin/atob.js"
+            },
+            "engines": {
+                "node": ">= 4.5.0"
+            }
+        },
+        "node_modules/balanced-match": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+            "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+            "dev": true
+        },
+        "node_modules/base": {
+            "version": "0.11.2",
+            "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+            "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+            "dev": true,
+            "dependencies": {
+                "cache-base": "^1.0.1",
+                "class-utils": "^0.3.5",
+                "component-emitter": "^1.2.1",
+                "define-property": "^1.0.0",
+                "isobject": "^3.0.1",
+                "mixin-deep": "^1.2.0",
+                "pascalcase": "^0.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/base/node_modules/define-property": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+            "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+            "dev": true,
+            "dependencies": {
+                "is-descriptor": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/base64-js": {
+            "version": "1.5.1",
+            "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+            "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/bl": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+            "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+            "dev": true,
+            "dependencies": {
+                "buffer": "^5.5.0",
+                "inherits": "^2.0.4",
+                "readable-stream": "^3.4.0"
+            }
+        },
+        "node_modules/brace-expansion": {
+            "version": "1.1.11",
+            "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+            "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+            "dev": true,
+            "dependencies": {
+                "balanced-match": "^1.0.0",
+                "concat-map": "0.0.1"
+            }
+        },
+        "node_modules/braces": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+            "dev": true,
+            "dependencies": {
+                "fill-range": "^7.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/buffer": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+            "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "dependencies": {
+                "base64-js": "^1.3.1",
+                "ieee754": "^1.1.13"
+            }
+        },
+        "node_modules/buffer-crc32": {
+            "version": "0.2.13",
+            "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+            "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+            "dev": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/buffer-from": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+            "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+            "dev": true
+        },
+        "node_modules/cache-base": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+            "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+            "dev": true,
+            "dependencies": {
+                "collection-visit": "^1.0.0",
+                "component-emitter": "^1.2.1",
+                "get-value": "^2.0.6",
+                "has-value": "^1.0.0",
+                "isobject": "^3.0.1",
+                "set-value": "^2.0.0",
+                "to-object-path": "^0.3.0",
+                "union-value": "^1.0.0",
+                "unset-value": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/callsites": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+            "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/camelcase": {
+            "version": "5.3.1",
+            "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+            "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/camelcase-keys": {
+            "version": "6.2.2",
+            "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+            "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+            "dev": true,
+            "dependencies": {
+                "camelcase": "^5.3.1",
+                "map-obj": "^4.0.0",
+                "quick-lru": "^4.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/chalk": {
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+            "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.1.0",
+                "supports-color": "^7.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/chalk?sponsor=1"
+            }
+        },
+        "node_modules/chownr": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+            "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+            "dev": true
+        },
+        "node_modules/chromium-bidi": {
+            "version": "0.4.7",
+            "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.7.tgz",
+            "integrity": "sha512-6+mJuFXwTMU6I3vYLs6IL8A1DyQTPjCfIL971X0aMPVGRbGnNfl6i6Cl0NMbxi2bRYLGESt9T2ZIMRM5PAEcIQ==",
+            "dev": true,
+            "dependencies": {
+                "mitt": "3.0.0"
+            },
+            "peerDependencies": {
+                "devtools-protocol": "*"
+            }
+        },
+        "node_modules/class-utils": {
+            "version": "0.3.6",
+            "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+            "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+            "dev": true,
+            "dependencies": {
+                "arr-union": "^3.1.0",
+                "define-property": "^0.2.5",
+                "isobject": "^3.0.0",
+                "static-extend": "^0.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/class-utils/node_modules/define-property": {
+            "version": "0.2.5",
+            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+            "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+            "dev": true,
+            "dependencies": {
+                "is-descriptor": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/class-utils/node_modules/is-accessor-descriptor": {
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+            "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/class-utils/node_modules/is-data-descriptor": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+            "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/class-utils/node_modules/is-descriptor": {
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+            "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+            "dev": true,
+            "dependencies": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/class-utils/node_modules/kind-of": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+            "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/cliui": {
+            "version": "8.0.1",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+            "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+            "dev": true,
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.1",
+                "wrap-ansi": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/collection-visit": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+            "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
+            "dev": true,
+            "dependencies": {
+                "map-visit": "^1.0.0",
+                "object-visit": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "dev": true,
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "dev": true
+        },
+        "node_modules/colord": {
+            "version": "2.9.3",
+            "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+            "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+            "dev": true
+        },
+        "node_modules/component-emitter": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+            "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+            "dev": true
+        },
+        "node_modules/concat-map": {
+            "version": "0.0.1",
+            "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+            "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+            "dev": true
+        },
+        "node_modules/copy-descriptor": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+            "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/cosmiconfig": {
+            "version": "8.2.0",
+            "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz",
+            "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==",
+            "dev": true,
+            "dependencies": {
+                "import-fresh": "^3.2.1",
+                "js-yaml": "^4.1.0",
+                "parse-json": "^5.0.0",
+                "path-type": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/d-fischer"
+            }
+        },
+        "node_modules/cross-fetch": {
+            "version": "3.1.5",
+            "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
+            "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+            "dev": true,
+            "dependencies": {
+                "node-fetch": "2.6.7"
+            }
+        },
+        "node_modules/cross-spawn": {
+            "version": "7.0.3",
+            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+            "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+            "dev": true,
+            "dependencies": {
+                "path-key": "^3.1.0",
+                "shebang-command": "^2.0.0",
+                "which": "^2.0.1"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/css-functions-list": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz",
+            "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==",
+            "dev": true,
+            "engines": {
+                "node": ">=12.22"
+            }
+        },
+        "node_modules/css-tree": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+            "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+            "dev": true,
+            "dependencies": {
+                "mdn-data": "2.0.30",
+                "source-map-js": "^1.0.1"
+            },
+            "engines": {
+                "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+            }
+        },
+        "node_modules/cssesc": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+            "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+            "dev": true,
+            "bin": {
+                "cssesc": "bin/cssesc"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/csstype": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+            "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
+            "dev": true
+        },
+        "node_modules/debug": {
+            "version": "4.3.4",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+            "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.1.2"
+            },
+            "engines": {
+                "node": ">=6.0"
+            },
+            "peerDependenciesMeta": {
+                "supports-color": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/decamelize": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+            "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/decamelize-keys": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+            "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+            "dev": true,
+            "dependencies": {
+                "decamelize": "^1.1.0",
+                "map-obj": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/decamelize-keys/node_modules/map-obj": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+            "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/decode-uri-component": {
+            "version": "0.2.2",
+            "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+            "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/deep-is": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+            "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+            "dev": true
+        },
+        "node_modules/define-property": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+            "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+            "dev": true,
+            "dependencies": {
+                "is-descriptor": "^1.0.2",
+                "isobject": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/devtools-protocol": {
+            "version": "0.0.1107588",
+            "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz",
+            "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg==",
+            "dev": true
+        },
+        "node_modules/diff": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
+            "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.3.1"
+            }
+        },
+        "node_modules/dir-glob": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+            "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+            "dev": true,
+            "dependencies": {
+                "path-type": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/discord-types": {
+            "version": "1.3.26",
+            "resolved": "https://registry.npmjs.org/discord-types/-/discord-types-1.3.26.tgz",
+            "integrity": "sha512-ToG51AOCH+JTQf7b+8vuYQe5Iqwz7nZ7StpECAZ/VZcI1ZhQk13pvt9KkRTfRv1xNvwJ2qib4e3+RifQlo8VPQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/react": "17.0.2",
+                "moment": "^2.29.1"
+            }
+        },
+        "node_modules/discord-types/node_modules/@types/react": {
+            "version": "17.0.2",
+            "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.2.tgz",
+            "integrity": "sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==",
+            "dev": true,
+            "dependencies": {
+                "@types/prop-types": "*",
+                "csstype": "^3.0.2"
+            }
+        },
+        "node_modules/doctrine": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+            "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+            "dev": true,
+            "dependencies": {
+                "esutils": "^2.0.2"
+            },
+            "engines": {
+                "node": ">=6.0.0"
+            }
+        },
+        "node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+            "dev": true
+        },
+        "node_modules/end-of-stream": {
+            "version": "1.4.4",
+            "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+            "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+            "dev": true,
+            "dependencies": {
+                "once": "^1.4.0"
+            }
+        },
+        "node_modules/error-ex": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+            "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+            "dev": true,
+            "dependencies": {
+                "is-arrayish": "^0.2.1"
+            }
+        },
+        "node_modules/esbuild": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz",
+            "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==",
+            "dev": true,
+            "hasInstallScript": true,
+            "bin": {
+                "esbuild": "bin/esbuild"
+            },
+            "engines": {
+                "node": ">=12"
+            },
+            "optionalDependencies": {
+                "@esbuild/android-arm": "0.15.18",
+                "@esbuild/linux-loong64": "0.15.18",
+                "esbuild-android-64": "0.15.18",
+                "esbuild-android-arm64": "0.15.18",
+                "esbuild-darwin-64": "0.15.18",
+                "esbuild-darwin-arm64": "0.15.18",
+                "esbuild-freebsd-64": "0.15.18",
+                "esbuild-freebsd-arm64": "0.15.18",
+                "esbuild-linux-32": "0.15.18",
+                "esbuild-linux-64": "0.15.18",
+                "esbuild-linux-arm": "0.15.18",
+                "esbuild-linux-arm64": "0.15.18",
+                "esbuild-linux-mips64le": "0.15.18",
+                "esbuild-linux-ppc64le": "0.15.18",
+                "esbuild-linux-riscv64": "0.15.18",
+                "esbuild-linux-s390x": "0.15.18",
+                "esbuild-netbsd-64": "0.15.18",
+                "esbuild-openbsd-64": "0.15.18",
+                "esbuild-sunos-64": "0.15.18",
+                "esbuild-windows-32": "0.15.18",
+                "esbuild-windows-64": "0.15.18",
+                "esbuild-windows-arm64": "0.15.18"
+            }
+        },
+        "node_modules/esbuild-android-64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz",
+            "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-android-arm64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz",
+            "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "android"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-darwin-64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz",
+            "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-darwin-arm64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz",
+            "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-freebsd-64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz",
+            "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-freebsd-arm64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz",
+            "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "freebsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-32": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz",
+            "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz",
+            "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-arm": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz",
+            "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==",
+            "cpu": [
+                "arm"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-arm64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz",
+            "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-mips64le": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz",
+            "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==",
+            "cpu": [
+                "mips64el"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-ppc64le": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz",
+            "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==",
+            "cpu": [
+                "ppc64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-riscv64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz",
+            "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==",
+            "cpu": [
+                "riscv64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-linux-s390x": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz",
+            "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==",
+            "cpu": [
+                "s390x"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "linux"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-netbsd-64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz",
+            "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "netbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-openbsd-64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz",
+            "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "openbsd"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-sunos-64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz",
+            "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "sunos"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-windows-32": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz",
+            "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==",
+            "cpu": [
+                "ia32"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-windows-64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz",
+            "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==",
+            "cpu": [
+                "x64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/esbuild-windows-arm64": {
+            "version": "0.15.18",
+            "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz",
+            "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==",
+            "cpu": [
+                "arm64"
+            ],
+            "dev": true,
+            "optional": true,
+            "os": [
+                "win32"
+            ],
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/escalade": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+            "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/escape-string-regexp": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+            "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/eslint": {
+            "version": "8.43.0",
+            "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz",
+            "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==",
+            "dev": true,
+            "dependencies": {
+                "@eslint-community/eslint-utils": "^4.2.0",
+                "@eslint-community/regexpp": "^4.4.0",
+                "@eslint/eslintrc": "^2.0.3",
+                "@eslint/js": "8.43.0",
+                "@humanwhocodes/config-array": "^0.11.10",
+                "@humanwhocodes/module-importer": "^1.0.1",
+                "@nodelib/fs.walk": "^1.2.8",
+                "ajv": "^6.10.0",
+                "chalk": "^4.0.0",
+                "cross-spawn": "^7.0.2",
+                "debug": "^4.3.2",
+                "doctrine": "^3.0.0",
+                "escape-string-regexp": "^4.0.0",
+                "eslint-scope": "^7.2.0",
+                "eslint-visitor-keys": "^3.4.1",
+                "espree": "^9.5.2",
+                "esquery": "^1.4.2",
+                "esutils": "^2.0.2",
+                "fast-deep-equal": "^3.1.3",
+                "file-entry-cache": "^6.0.1",
+                "find-up": "^5.0.0",
+                "glob-parent": "^6.0.2",
+                "globals": "^13.19.0",
+                "graphemer": "^1.4.0",
+                "ignore": "^5.2.0",
+                "import-fresh": "^3.0.0",
+                "imurmurhash": "^0.1.4",
+                "is-glob": "^4.0.0",
+                "is-path-inside": "^3.0.3",
+                "js-yaml": "^4.1.0",
+                "json-stable-stringify-without-jsonify": "^1.0.1",
+                "levn": "^0.4.1",
+                "lodash.merge": "^4.6.2",
+                "minimatch": "^3.1.2",
+                "natural-compare": "^1.4.0",
+                "optionator": "^0.9.1",
+                "strip-ansi": "^6.0.1",
+                "strip-json-comments": "^3.1.0",
+                "text-table": "^0.2.0"
+            },
+            "bin": {
+                "eslint": "bin/eslint.js"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint-import-resolver-alias": {
+            "version": "1.1.2",
+            "resolved": "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz",
+            "integrity": "sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4"
+            },
+            "peerDependencies": {
+                "eslint-plugin-import": ">=1.4.0"
+            }
+        },
+        "node_modules/eslint-plugin-header": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz",
+            "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==",
+            "dev": true,
+            "peerDependencies": {
+                "eslint": ">=7.7.0"
+            }
+        },
+        "node_modules/eslint-plugin-path-alias": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/eslint-plugin-path-alias/-/eslint-plugin-path-alias-1.0.0.tgz",
+            "integrity": "sha512-FXus57yC+Zd3sMv46pbloXYwFeNVNHJqlACr9V68FG/IzGFBBokGJpmjDbEjpt8ZCeVSndUubeDWWl2A8sCNVQ==",
+            "dev": true,
+            "dependencies": {
+                "nanomatch": "^1.2.13"
+            },
+            "peerDependencies": {
+                "eslint": "^7"
+            }
+        },
+        "node_modules/eslint-plugin-simple-import-sort": {
+            "version": "10.0.0",
+            "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz",
+            "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==",
+            "dev": true,
+            "peerDependencies": {
+                "eslint": ">=5.0.0"
+            }
+        },
+        "node_modules/eslint-plugin-unused-imports": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz",
+            "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==",
+            "dev": true,
+            "dependencies": {
+                "eslint-rule-composer": "^0.3.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "peerDependencies": {
+                "@typescript-eslint/eslint-plugin": "^5.0.0",
+                "eslint": "^8.0.0"
+            },
+            "peerDependenciesMeta": {
+                "@typescript-eslint/eslint-plugin": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/eslint-rule-composer": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
+            "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/eslint-scope": {
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+            "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+            "dev": true,
+            "dependencies": {
+                "esrecurse": "^4.3.0",
+                "estraverse": "^4.1.1"
+            },
+            "engines": {
+                "node": ">=8.0.0"
+            }
+        },
+        "node_modules/eslint-visitor-keys": {
+            "version": "3.4.1",
+            "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+            "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+            "dev": true,
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint/node_modules/eslint-scope": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
+            "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
+            "dev": true,
+            "dependencies": {
+                "esrecurse": "^4.3.0",
+                "estraverse": "^5.2.0"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/eslint/node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/espree": {
+            "version": "9.5.2",
+            "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz",
+            "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==",
+            "dev": true,
+            "dependencies": {
+                "acorn": "^8.8.0",
+                "acorn-jsx": "^5.3.2",
+                "eslint-visitor-keys": "^3.4.1"
+            },
+            "engines": {
+                "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+            },
+            "funding": {
+                "url": "https://opencollective.com/eslint"
+            }
+        },
+        "node_modules/esquery": {
+            "version": "1.5.0",
+            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+            "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+            "dev": true,
+            "dependencies": {
+                "estraverse": "^5.1.0"
+            },
+            "engines": {
+                "node": ">=0.10"
+            }
+        },
+        "node_modules/esquery/node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esrecurse": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+            "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+            "dev": true,
+            "dependencies": {
+                "estraverse": "^5.2.0"
+            },
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esrecurse/node_modules/estraverse": {
+            "version": "5.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+            "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/estraverse": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+            "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+            "dev": true,
+            "engines": {
+                "node": ">=4.0"
+            }
+        },
+        "node_modules/esutils": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+            "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/eventemitter3": {
+            "version": "4.0.7",
+            "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+            "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+        },
+        "node_modules/extend-shallow": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+            "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
+            "dev": true,
+            "dependencies": {
+                "assign-symbols": "^1.0.0",
+                "is-extendable": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/extract-zip": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+            "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+            "dev": true,
+            "dependencies": {
+                "debug": "^4.1.1",
+                "get-stream": "^5.1.0",
+                "yauzl": "^2.10.0"
+            },
+            "bin": {
+                "extract-zip": "cli.js"
+            },
+            "engines": {
+                "node": ">= 10.17.0"
+            },
+            "optionalDependencies": {
+                "@types/yauzl": "^2.9.1"
+            }
+        },
+        "node_modules/fast-deep-equal": {
+            "version": "3.1.3",
+            "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+            "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+            "dev": true
+        },
+        "node_modules/fast-glob": {
+            "version": "3.2.12",
+            "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+            "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+            "dev": true,
+            "dependencies": {
+                "@nodelib/fs.stat": "^2.0.2",
+                "@nodelib/fs.walk": "^1.2.3",
+                "glob-parent": "^5.1.2",
+                "merge2": "^1.3.0",
+                "micromatch": "^4.0.4"
+            },
+            "engines": {
+                "node": ">=8.6.0"
+            }
+        },
+        "node_modules/fast-glob/node_modules/glob-parent": {
+            "version": "5.1.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+            "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+            "dev": true,
+            "dependencies": {
+                "is-glob": "^4.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/fast-json-stable-stringify": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+            "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+            "dev": true
+        },
+        "node_modules/fast-levenshtein": {
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+            "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+            "dev": true
+        },
+        "node_modules/fastest-levenshtein": {
+            "version": "1.0.16",
+            "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+            "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4.9.1"
+            }
+        },
+        "node_modules/fastq": {
+            "version": "1.15.0",
+            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+            "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+            "dev": true,
+            "dependencies": {
+                "reusify": "^1.0.4"
+            }
+        },
+        "node_modules/fd-slicer": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+            "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+            "dev": true,
+            "dependencies": {
+                "pend": "~1.2.0"
+            }
+        },
+        "node_modules/fflate": {
+            "version": "0.7.4",
+            "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz",
+            "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw=="
+        },
+        "node_modules/file-entry-cache": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+            "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+            "dev": true,
+            "dependencies": {
+                "flat-cache": "^3.0.4"
+            },
+            "engines": {
+                "node": "^10.12.0 || >=12.0.0"
+            }
+        },
+        "node_modules/fill-range": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+            "dev": true,
+            "dependencies": {
+                "to-regex-range": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/find-up": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+            "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+            "dev": true,
+            "dependencies": {
+                "locate-path": "^6.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/flat-cache": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+            "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+            "dev": true,
+            "dependencies": {
+                "flatted": "^3.1.0",
+                "rimraf": "^3.0.2"
+            },
+            "engines": {
+                "node": "^10.12.0 || >=12.0.0"
+            }
+        },
+        "node_modules/flatted": {
+            "version": "3.2.7",
+            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+            "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
+            "dev": true
+        },
+        "node_modules/for-in": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+            "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/fragment-cache": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+            "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
+            "dev": true,
+            "dependencies": {
+                "map-cache": "^0.2.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/fs-constants": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+            "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+            "dev": true
+        },
+        "node_modules/fs.realpath": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+            "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+            "dev": true
+        },
+        "node_modules/fsevents": {
+            "version": "2.3.2",
+            "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+            "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+            "dev": true,
+            "hasInstallScript": true,
+            "optional": true,
+            "os": [
+                "darwin"
+            ],
+            "engines": {
+                "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+            }
+        },
+        "node_modules/function-bind": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+            "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+            "dev": true
+        },
+        "node_modules/get-caller-file": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+            "dev": true,
+            "engines": {
+                "node": "6.* || 8.* || >= 10.*"
+            }
+        },
+        "node_modules/get-stream": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+            "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+            "dev": true,
+            "dependencies": {
+                "pump": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/get-tsconfig": {
+            "version": "4.6.0",
+            "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.0.tgz",
+            "integrity": "sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==",
+            "dev": true,
+            "dependencies": {
+                "resolve-pkg-maps": "^1.0.0"
+            },
+            "funding": {
+                "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
+            }
+        },
+        "node_modules/get-value": {
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+            "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/glob": {
+            "version": "7.2.3",
+            "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+            "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+            "dev": true,
+            "dependencies": {
+                "fs.realpath": "^1.0.0",
+                "inflight": "^1.0.4",
+                "inherits": "2",
+                "minimatch": "^3.1.1",
+                "once": "^1.3.0",
+                "path-is-absolute": "^1.0.0"
+            },
+            "engines": {
+                "node": "*"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/glob-parent": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+            "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+            "dev": true,
+            "dependencies": {
+                "is-glob": "^4.0.3"
+            },
+            "engines": {
+                "node": ">=10.13.0"
+            }
+        },
+        "node_modules/global-modules": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+            "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+            "dev": true,
+            "dependencies": {
+                "global-prefix": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/global-prefix": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+            "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+            "dev": true,
+            "dependencies": {
+                "ini": "^1.3.5",
+                "kind-of": "^6.0.2",
+                "which": "^1.3.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/global-prefix/node_modules/which": {
+            "version": "1.3.1",
+            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+            "dev": true,
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "which": "bin/which"
+            }
+        },
+        "node_modules/globals": {
+            "version": "13.20.0",
+            "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+            "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+            "dev": true,
+            "dependencies": {
+                "type-fest": "^0.20.2"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/globals/node_modules/type-fest": {
+            "version": "0.20.2",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+            "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/globby": {
+            "version": "11.1.0",
+            "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+            "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+            "dev": true,
+            "dependencies": {
+                "array-union": "^2.1.0",
+                "dir-glob": "^3.0.1",
+                "fast-glob": "^3.2.9",
+                "ignore": "^5.2.0",
+                "merge2": "^1.4.1",
+                "slash": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/globjoin": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+            "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
+            "dev": true
+        },
+        "node_modules/grapheme-splitter": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+            "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+            "dev": true
+        },
+        "node_modules/graphemer": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+            "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+            "dev": true
+        },
+        "node_modules/hard-rejection": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+            "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/has": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+            "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+            "dev": true,
+            "dependencies": {
+                "function-bind": "^1.1.1"
+            },
+            "engines": {
+                "node": ">= 0.4.0"
+            }
+        },
+        "node_modules/has-flag": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+            "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/has-value": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+            "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
+            "dev": true,
+            "dependencies": {
+                "get-value": "^2.0.6",
+                "has-values": "^1.0.0",
+                "isobject": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/has-values": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+            "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
+            "dev": true,
+            "dependencies": {
+                "is-number": "^3.0.0",
+                "kind-of": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/has-values/node_modules/kind-of": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+            "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/highlight.js": {
+            "version": "10.6.0",
+            "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.6.0.tgz",
+            "integrity": "sha512-8mlRcn5vk/r4+QcqerapwBYTe+iPL5ih6xrNylxrnBdHQiijDETfXX7VIxC3UiCRiINBJfANBAsPzAvRQj8RpQ==",
+            "dev": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/hosted-git-info": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+            "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/html-tags": {
+            "version": "3.3.1",
+            "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+            "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/https-proxy-agent": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+            "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+            "dev": true,
+            "dependencies": {
+                "agent-base": "6",
+                "debug": "4"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/ieee754": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+            "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/ignore": {
+            "version": "5.2.4",
+            "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+            "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+            "dev": true,
+            "engines": {
+                "node": ">= 4"
+            }
+        },
+        "node_modules/import-fresh": {
+            "version": "3.3.0",
+            "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+            "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+            "dev": true,
+            "dependencies": {
+                "parent-module": "^1.0.0",
+                "resolve-from": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/import-lazy": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
+            "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/imurmurhash": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+            "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.8.19"
+            }
+        },
+        "node_modules/indent-string": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+            "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/inflight": {
+            "version": "1.0.6",
+            "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+            "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+            "dev": true,
+            "dependencies": {
+                "once": "^1.3.0",
+                "wrappy": "1"
+            }
+        },
+        "node_modules/inherits": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+            "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+            "dev": true
+        },
+        "node_modules/ini": {
+            "version": "1.3.8",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+            "dev": true
+        },
+        "node_modules/is-accessor-descriptor": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+            "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-arrayish": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+            "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+            "dev": true
+        },
+        "node_modules/is-buffer": {
+            "version": "1.1.6",
+            "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+            "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+            "dev": true
+        },
+        "node_modules/is-core-module": {
+            "version": "2.12.1",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+            "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+            "dev": true,
+            "dependencies": {
+                "has": "^1.0.3"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/is-data-descriptor": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+            "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-descriptor": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+            "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+            "dev": true,
+            "dependencies": {
+                "is-accessor-descriptor": "^1.0.0",
+                "is-data-descriptor": "^1.0.0",
+                "kind-of": "^6.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-extendable": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+            "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+            "dev": true,
+            "dependencies": {
+                "is-plain-object": "^2.0.4"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-extglob": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+            "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-glob": {
+            "version": "4.0.3",
+            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+            "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+            "dev": true,
+            "dependencies": {
+                "is-extglob": "^2.1.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-number": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+            "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-number/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-path-inside": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+            "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/is-plain-obj": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+            "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-plain-object": {
+            "version": "2.0.4",
+            "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+            "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+            "dev": true,
+            "dependencies": {
+                "isobject": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/is-windows": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+            "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/isarray": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+            "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+            "dev": true
+        },
+        "node_modules/isexe": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+            "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+            "dev": true
+        },
+        "node_modules/isobject": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+            "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/js-tokens": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+            "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+            "dev": true
+        },
+        "node_modules/js-yaml": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+            "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+            "dev": true,
+            "dependencies": {
+                "argparse": "^2.0.1"
+            },
+            "bin": {
+                "js-yaml": "bin/js-yaml.js"
+            }
+        },
+        "node_modules/json-parse-even-better-errors": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+            "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+            "dev": true
+        },
+        "node_modules/json-schema-traverse": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+            "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+            "dev": true
+        },
+        "node_modules/json-stable-stringify-without-jsonify": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+            "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+            "dev": true
+        },
+        "node_modules/jsonc-parser": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+            "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="
+        },
+        "node_modules/kind-of": {
+            "version": "6.0.3",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+            "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/known-css-properties": {
+            "version": "0.27.0",
+            "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.27.0.tgz",
+            "integrity": "sha512-uMCj6+hZYDoffuvAJjFAPz56E9uoowFHmTkqRtRq5WyC5Q6Cu/fTZKNQpX/RbzChBYLLl3lo8CjFZBAZXq9qFg==",
+            "dev": true
+        },
+        "node_modules/levn": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+            "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+            "dev": true,
+            "dependencies": {
+                "prelude-ls": "^1.2.1",
+                "type-check": "~0.4.0"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/lines-and-columns": {
+            "version": "1.2.4",
+            "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+            "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+            "dev": true
+        },
+        "node_modules/locate-path": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+            "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+            "dev": true,
+            "dependencies": {
+                "p-locate": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/lodash.merge": {
+            "version": "4.6.2",
+            "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+            "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+            "dev": true
+        },
+        "node_modules/lodash.truncate": {
+            "version": "4.4.2",
+            "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+            "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+            "dev": true
+        },
+        "node_modules/lru-cache": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+            "dev": true,
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/map-cache": {
+            "version": "0.2.2",
+            "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+            "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/map-obj": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+            "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/map-visit": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+            "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
+            "dev": true,
+            "dependencies": {
+                "object-visit": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/mathml-tag-names": {
+            "version": "2.1.3",
+            "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+            "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+            "dev": true,
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/wooorm"
+            }
+        },
+        "node_modules/mdn-data": {
+            "version": "2.0.30",
+            "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+            "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+            "dev": true
+        },
+        "node_modules/meow": {
+            "version": "9.0.0",
+            "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+            "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+            "dev": true,
+            "dependencies": {
+                "@types/minimist": "^1.2.0",
+                "camelcase-keys": "^6.2.2",
+                "decamelize": "^1.2.0",
+                "decamelize-keys": "^1.1.0",
+                "hard-rejection": "^2.1.0",
+                "minimist-options": "4.1.0",
+                "normalize-package-data": "^3.0.0",
+                "read-pkg-up": "^7.0.1",
+                "redent": "^3.0.0",
+                "trim-newlines": "^3.0.0",
+                "type-fest": "^0.18.0",
+                "yargs-parser": "^20.2.3"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/meow/node_modules/type-fest": {
+            "version": "0.18.1",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+            "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/merge2": {
+            "version": "1.4.1",
+            "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+            "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+            "dev": true,
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/micromatch": {
+            "version": "4.0.5",
+            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+            "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+            "dev": true,
+            "dependencies": {
+                "braces": "^3.0.2",
+                "picomatch": "^2.3.1"
+            },
+            "engines": {
+                "node": ">=8.6"
+            }
+        },
+        "node_modules/min-indent": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+            "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/minimatch": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+            "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+            "dev": true,
+            "dependencies": {
+                "brace-expansion": "^1.1.7"
+            },
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/minimist-options": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+            "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+            "dev": true,
+            "dependencies": {
+                "arrify": "^1.0.1",
+                "is-plain-obj": "^1.1.0",
+                "kind-of": "^6.0.3"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/mitt": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
+            "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==",
+            "dev": true
+        },
+        "node_modules/mixin-deep": {
+            "version": "1.3.2",
+            "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+            "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+            "dev": true,
+            "dependencies": {
+                "for-in": "^1.0.2",
+                "is-extendable": "^1.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/mkdirp-classic": {
+            "version": "0.5.3",
+            "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+            "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+            "dev": true
+        },
+        "node_modules/moment": {
+            "version": "2.29.4",
+            "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
+            "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
+            "dev": true,
+            "engines": {
+                "node": "*"
+            }
+        },
+        "node_modules/ms": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+            "dev": true
+        },
+        "node_modules/nanoid": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
+            "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "bin": {
+                "nanoid": "bin/nanoid.js"
+            },
+            "engines": {
+                "node": "^14 || ^16 || >=18"
+            }
+        },
+        "node_modules/nanomatch": {
+            "version": "1.2.13",
+            "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+            "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+            "dev": true,
+            "dependencies": {
+                "arr-diff": "^4.0.0",
+                "array-unique": "^0.3.2",
+                "define-property": "^2.0.2",
+                "extend-shallow": "^3.0.2",
+                "fragment-cache": "^0.2.1",
+                "is-windows": "^1.0.2",
+                "kind-of": "^6.0.2",
+                "object.pick": "^1.3.0",
+                "regex-not": "^1.0.0",
+                "snapdragon": "^0.8.1",
+                "to-regex": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/natural-compare": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+            "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+            "dev": true
+        },
+        "node_modules/natural-compare-lite": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+            "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+            "dev": true
+        },
+        "node_modules/node-fetch": {
+            "version": "2.6.7",
+            "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+            "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+            "dev": true,
+            "dependencies": {
+                "whatwg-url": "^5.0.0"
+            },
+            "engines": {
+                "node": "4.x || >=6.0.0"
+            },
+            "peerDependencies": {
+                "encoding": "^0.1.0"
+            },
+            "peerDependenciesMeta": {
+                "encoding": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/normalize-package-data": {
+            "version": "3.0.3",
+            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+            "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+            "dev": true,
+            "dependencies": {
+                "hosted-git-info": "^4.0.1",
+                "is-core-module": "^2.5.0",
+                "semver": "^7.3.4",
+                "validate-npm-package-license": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/normalize-path": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+            "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-copy": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+            "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
+            "dev": true,
+            "dependencies": {
+                "copy-descriptor": "^0.1.0",
+                "define-property": "^0.2.5",
+                "kind-of": "^3.0.3"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-copy/node_modules/define-property": {
+            "version": "0.2.5",
+            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+            "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+            "dev": true,
+            "dependencies": {
+                "is-descriptor": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-copy/node_modules/is-accessor-descriptor": {
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+            "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-copy/node_modules/is-data-descriptor": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+            "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-copy/node_modules/is-descriptor": {
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+            "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+            "dev": true,
+            "dependencies": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+            "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-copy/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object-visit": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+            "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
+            "dev": true,
+            "dependencies": {
+                "isobject": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/object.pick": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+            "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
+            "dev": true,
+            "dependencies": {
+                "isobject": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/once": {
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+            "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+            "dev": true,
+            "dependencies": {
+                "wrappy": "1"
+            }
+        },
+        "node_modules/optionator": {
+            "version": "0.9.1",
+            "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+            "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+            "dev": true,
+            "dependencies": {
+                "deep-is": "^0.1.3",
+                "fast-levenshtein": "^2.0.6",
+                "levn": "^0.4.1",
+                "prelude-ls": "^1.2.1",
+                "type-check": "^0.4.0",
+                "word-wrap": "^1.2.3"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/p-limit": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+            "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+            "dev": true,
+            "dependencies": {
+                "yocto-queue": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-locate": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+            "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+            "dev": true,
+            "dependencies": {
+                "p-limit": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/p-try": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+            "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/parent-module": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+            "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+            "dev": true,
+            "dependencies": {
+                "callsites": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/parse-json": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+            "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+            "dev": true,
+            "dependencies": {
+                "@babel/code-frame": "^7.0.0",
+                "error-ex": "^1.3.1",
+                "json-parse-even-better-errors": "^2.3.0",
+                "lines-and-columns": "^1.1.6"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/pascalcase": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+            "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-exists": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+            "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-is-absolute": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+            "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/path-key": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+            "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/path-parse": {
+            "version": "1.0.7",
+            "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+            "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+            "dev": true
+        },
+        "node_modules/path-type": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+            "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/pend": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+            "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+            "dev": true
+        },
+        "node_modules/picocolors": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+            "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+            "dev": true
+        },
+        "node_modules/picomatch": {
+            "version": "2.3.1",
+            "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+            "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8.6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/jonschlinkert"
+            }
+        },
+        "node_modules/postcss": {
+            "version": "8.4.24",
+            "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz",
+            "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "opencollective",
+                    "url": "https://opencollective.com/postcss/"
+                },
+                {
+                    "type": "tidelift",
+                    "url": "https://tidelift.com/funding/github/npm/postcss"
+                },
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "dependencies": {
+                "nanoid": "^3.3.6",
+                "picocolors": "^1.0.0",
+                "source-map-js": "^1.0.2"
+            },
+            "engines": {
+                "node": "^10 || ^12 || >=14"
+            }
+        },
+        "node_modules/postcss-media-query-parser": {
+            "version": "0.2.3",
+            "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+            "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+            "dev": true
+        },
+        "node_modules/postcss-resolve-nested-selector": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+            "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==",
+            "dev": true
+        },
+        "node_modules/postcss-safe-parser": {
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz",
+            "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=12.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/postcss/"
+            },
+            "peerDependencies": {
+                "postcss": "^8.3.3"
+            }
+        },
+        "node_modules/postcss-selector-parser": {
+            "version": "6.0.13",
+            "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+            "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+            "dev": true,
+            "dependencies": {
+                "cssesc": "^3.0.0",
+                "util-deprecate": "^1.0.2"
+            },
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/postcss-value-parser": {
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+            "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+            "dev": true
+        },
+        "node_modules/postcss/node_modules/nanoid": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+            "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/ai"
+                }
+            ],
+            "bin": {
+                "nanoid": "bin/nanoid.cjs"
+            },
+            "engines": {
+                "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+            }
+        },
+        "node_modules/prelude-ls": {
+            "version": "1.2.1",
+            "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+            "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/progress": {
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+            "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/proxy-from-env": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+            "dev": true
+        },
+        "node_modules/pump": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+            "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+            "dev": true,
+            "dependencies": {
+                "end-of-stream": "^1.1.0",
+                "once": "^1.3.1"
+            }
+        },
+        "node_modules/punycode": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+            "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+            "dev": true,
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/puppeteer-core": {
+            "version": "19.11.1",
+            "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.11.1.tgz",
+            "integrity": "sha512-qcuC2Uf0Fwdj9wNtaTZ2OvYRraXpAK+puwwVW8ofOhOgLPZyz1c68tsorfIZyCUOpyBisjr+xByu7BMbEYMepA==",
+            "dev": true,
+            "dependencies": {
+                "@puppeteer/browsers": "0.5.0",
+                "chromium-bidi": "0.4.7",
+                "cross-fetch": "3.1.5",
+                "debug": "4.3.4",
+                "devtools-protocol": "0.0.1107588",
+                "extract-zip": "2.0.1",
+                "https-proxy-agent": "5.0.1",
+                "proxy-from-env": "1.1.0",
+                "tar-fs": "2.1.1",
+                "unbzip2-stream": "1.4.3",
+                "ws": "8.13.0"
+            },
+            "engines": {
+                "node": ">=14.14.0"
+            },
+            "peerDependencies": {
+                "typescript": ">= 4.7.4"
+            },
+            "peerDependenciesMeta": {
+                "typescript": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/queue-microtask": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+            "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/quick-lru": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+            "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/read-pkg": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+            "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+            "dev": true,
+            "dependencies": {
+                "@types/normalize-package-data": "^2.4.0",
+                "normalize-package-data": "^2.5.0",
+                "parse-json": "^5.0.0",
+                "type-fest": "^0.6.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/read-pkg-up": {
+            "version": "7.0.1",
+            "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+            "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+            "dev": true,
+            "dependencies": {
+                "find-up": "^4.1.0",
+                "read-pkg": "^5.2.0",
+                "type-fest": "^0.8.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/find-up": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+            "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+            "dev": true,
+            "dependencies": {
+                "locate-path": "^5.0.0",
+                "path-exists": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/locate-path": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+            "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+            "dev": true,
+            "dependencies": {
+                "p-locate": "^4.1.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/p-limit": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+            "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+            "dev": true,
+            "dependencies": {
+                "p-try": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=6"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/p-locate": {
+            "version": "4.1.0",
+            "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+            "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+            "dev": true,
+            "dependencies": {
+                "p-limit": "^2.2.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/read-pkg-up/node_modules/type-fest": {
+            "version": "0.8.1",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+            "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/read-pkg/node_modules/hosted-git-info": {
+            "version": "2.8.9",
+            "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+            "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+            "dev": true
+        },
+        "node_modules/read-pkg/node_modules/normalize-package-data": {
+            "version": "2.5.0",
+            "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+            "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+            "dev": true,
+            "dependencies": {
+                "hosted-git-info": "^2.1.4",
+                "resolve": "^1.10.0",
+                "semver": "2 || 3 || 4 || 5",
+                "validate-npm-package-license": "^3.0.1"
+            }
+        },
+        "node_modules/read-pkg/node_modules/semver": {
+            "version": "5.7.1",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+            "dev": true,
+            "bin": {
+                "semver": "bin/semver"
+            }
+        },
+        "node_modules/read-pkg/node_modules/type-fest": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+            "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/readable-stream": {
+            "version": "3.6.2",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+            "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+            "dev": true,
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/redent": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+            "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+            "dev": true,
+            "dependencies": {
+                "indent-string": "^4.0.0",
+                "strip-indent": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/regex-not": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+            "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+            "dev": true,
+            "dependencies": {
+                "extend-shallow": "^3.0.2",
+                "safe-regex": "^1.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-directory": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/require-from-string": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+            "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/resolve": {
+            "version": "1.22.2",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+            "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+            "dev": true,
+            "dependencies": {
+                "is-core-module": "^2.11.0",
+                "path-parse": "^1.0.7",
+                "supports-preserve-symlinks-flag": "^1.0.0"
+            },
+            "bin": {
+                "resolve": "bin/resolve"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/resolve-from": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+            "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+            "dev": true,
+            "engines": {
+                "node": ">=4"
+            }
+        },
+        "node_modules/resolve-pkg-maps": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+            "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
+            "dev": true,
+            "funding": {
+                "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
+            }
+        },
+        "node_modules/resolve-url": {
+            "version": "0.2.1",
+            "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+            "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
+            "deprecated": "https://github.com/lydell/resolve-url#deprecated",
+            "dev": true
+        },
+        "node_modules/ret": {
+            "version": "0.1.15",
+            "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+            "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.12"
+            }
+        },
+        "node_modules/reusify": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+            "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+            "dev": true,
+            "engines": {
+                "iojs": ">=1.0.0",
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/rimraf": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+            "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+            "dev": true,
+            "dependencies": {
+                "glob": "^7.1.3"
+            },
+            "bin": {
+                "rimraf": "bin.js"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/run-parallel": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+            "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "dependencies": {
+                "queue-microtask": "^1.2.2"
+            }
+        },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "dev": true,
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ]
+        },
+        "node_modules/safe-regex": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+            "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+            "dev": true,
+            "dependencies": {
+                "ret": "~0.1.10"
+            }
+        },
+        "node_modules/semver": {
+            "version": "7.5.2",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz",
+            "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==",
+            "dev": true,
+            "dependencies": {
+                "lru-cache": "^6.0.0"
+            },
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/set-value": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+            "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+            "dev": true,
+            "dependencies": {
+                "extend-shallow": "^2.0.1",
+                "is-extendable": "^0.1.1",
+                "is-plain-object": "^2.0.3",
+                "split-string": "^3.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/set-value/node_modules/extend-shallow": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+            "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+            "dev": true,
+            "dependencies": {
+                "is-extendable": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/set-value/node_modules/is-extendable": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+            "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/shebang-command": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+            "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+            "dev": true,
+            "dependencies": {
+                "shebang-regex": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/shebang-regex": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+            "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/signal-exit": {
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz",
+            "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=14"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/isaacs"
+            }
+        },
+        "node_modules/slash": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+            "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/slice-ansi": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+            "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "astral-regex": "^2.0.0",
+                "is-fullwidth-code-point": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+            }
+        },
+        "node_modules/snapdragon": {
+            "version": "0.8.2",
+            "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+            "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+            "dev": true,
+            "dependencies": {
+                "base": "^0.11.1",
+                "debug": "^2.2.0",
+                "define-property": "^0.2.5",
+                "extend-shallow": "^2.0.1",
+                "map-cache": "^0.2.2",
+                "source-map": "^0.5.6",
+                "source-map-resolve": "^0.5.0",
+                "use": "^3.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/debug": {
+            "version": "2.6.9",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "dev": true,
+            "dependencies": {
+                "ms": "2.0.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/define-property": {
+            "version": "0.2.5",
+            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+            "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+            "dev": true,
+            "dependencies": {
+                "is-descriptor": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/extend-shallow": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+            "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+            "dev": true,
+            "dependencies": {
+                "is-extendable": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/is-accessor-descriptor": {
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+            "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/is-data-descriptor": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+            "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/is-descriptor": {
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+            "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+            "dev": true,
+            "dependencies": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/is-extendable": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+            "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/kind-of": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+            "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/snapdragon/node_modules/ms": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+            "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+            "dev": true
+        },
+        "node_modules/source-map": {
+            "version": "0.5.7",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+            "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-js": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+            "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-resolve": {
+            "version": "0.5.3",
+            "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+            "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+            "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
+            "dev": true,
+            "dependencies": {
+                "atob": "^2.1.2",
+                "decode-uri-component": "^0.2.0",
+                "resolve-url": "^0.2.1",
+                "source-map-url": "^0.4.0",
+                "urix": "^0.1.0"
+            }
+        },
+        "node_modules/source-map-support": {
+            "version": "0.5.21",
+            "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+            "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+            "dev": true,
+            "dependencies": {
+                "buffer-from": "^1.0.0",
+                "source-map": "^0.6.0"
+            }
+        },
+        "node_modules/source-map-support/node_modules/source-map": {
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/source-map-url": {
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+            "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+            "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
+            "dev": true
+        },
+        "node_modules/spdx-correct": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+            "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+            "dev": true,
+            "dependencies": {
+                "spdx-expression-parse": "^3.0.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-exceptions": {
+            "version": "2.3.0",
+            "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+            "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+            "dev": true
+        },
+        "node_modules/spdx-expression-parse": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+            "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+            "dev": true,
+            "dependencies": {
+                "spdx-exceptions": "^2.1.0",
+                "spdx-license-ids": "^3.0.0"
+            }
+        },
+        "node_modules/spdx-license-ids": {
+            "version": "3.0.13",
+            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz",
+            "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==",
+            "dev": true
+        },
+        "node_modules/split-string": {
+            "version": "3.1.0",
+            "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+            "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+            "dev": true,
+            "dependencies": {
+                "extend-shallow": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/standalone-electron-types": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/standalone-electron-types/-/standalone-electron-types-1.0.0.tgz",
+            "integrity": "sha512-0HOi/tlTz3mjWhsAz4uRbpQcHMZ+ifj1JzWW9nugykOHClBBG77ps8QinrzX1eow4Iw2pnC+RFaSYRgufF4BOg==",
+            "dev": true,
+            "dependencies": {
+                "@types/node": "^18.8.4"
+            }
+        },
+        "node_modules/static-extend": {
+            "version": "0.1.2",
+            "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+            "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
+            "dev": true,
+            "dependencies": {
+                "define-property": "^0.2.5",
+                "object-copy": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/static-extend/node_modules/define-property": {
+            "version": "0.2.5",
+            "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+            "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+            "dev": true,
+            "dependencies": {
+                "is-descriptor": "^0.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/static-extend/node_modules/is-accessor-descriptor": {
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+            "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/static-extend/node_modules/is-data-descriptor": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+            "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/static-extend/node_modules/is-descriptor": {
+            "version": "0.1.6",
+            "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+            "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+            "dev": true,
+            "dependencies": {
+                "is-accessor-descriptor": "^0.1.6",
+                "is-data-descriptor": "^0.1.4",
+                "kind-of": "^5.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/static-extend/node_modules/kind-of": {
+            "version": "5.1.0",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+            "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "dev": true,
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
+        "node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "dev": true,
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "dev": true,
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-indent": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+            "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+            "dev": true,
+            "dependencies": {
+                "min-indent": "^1.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-json-comments": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+            "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/style-search": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+            "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
+            "dev": true
+        },
+        "node_modules/stylelint": {
+            "version": "15.8.0",
+            "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.8.0.tgz",
+            "integrity": "sha512-x9qBk84F3MEjMEUNCE7MtWmfj9G9y5XzJ0cpQeJdy2l/IoqjC8Ih0N0ytmOTnXE4Yv0J7I1cmVRQUVNSPCxTsA==",
+            "dev": true,
+            "dependencies": {
+                "@csstools/css-parser-algorithms": "^2.2.0",
+                "@csstools/css-tokenizer": "^2.1.1",
+                "@csstools/media-query-list-parser": "^2.1.0",
+                "@csstools/selector-specificity": "^2.2.0",
+                "balanced-match": "^2.0.0",
+                "colord": "^2.9.3",
+                "cosmiconfig": "^8.2.0",
+                "css-functions-list": "^3.1.0",
+                "css-tree": "^2.3.1",
+                "debug": "^4.3.4",
+                "fast-glob": "^3.2.12",
+                "fastest-levenshtein": "^1.0.16",
+                "file-entry-cache": "^6.0.1",
+                "global-modules": "^2.0.0",
+                "globby": "^11.1.0",
+                "globjoin": "^0.1.4",
+                "html-tags": "^3.3.1",
+                "ignore": "^5.2.4",
+                "import-lazy": "^4.0.0",
+                "imurmurhash": "^0.1.4",
+                "is-plain-object": "^5.0.0",
+                "known-css-properties": "^0.27.0",
+                "mathml-tag-names": "^2.1.3",
+                "meow": "^9.0.0",
+                "micromatch": "^4.0.5",
+                "normalize-path": "^3.0.0",
+                "picocolors": "^1.0.0",
+                "postcss": "^8.4.24",
+                "postcss-media-query-parser": "^0.2.3",
+                "postcss-resolve-nested-selector": "^0.1.1",
+                "postcss-safe-parser": "^6.0.0",
+                "postcss-selector-parser": "^6.0.13",
+                "postcss-value-parser": "^4.2.0",
+                "resolve-from": "^5.0.0",
+                "string-width": "^4.2.3",
+                "strip-ansi": "^6.0.1",
+                "style-search": "^0.1.0",
+                "supports-hyperlinks": "^3.0.0",
+                "svg-tags": "^1.0.0",
+                "table": "^6.8.1",
+                "write-file-atomic": "^5.0.1"
+            },
+            "bin": {
+                "stylelint": "bin/stylelint.js"
+            },
+            "engines": {
+                "node": "^14.13.1 || >=16.0.0"
+            },
+            "funding": {
+                "type": "opencollective",
+                "url": "https://opencollective.com/stylelint"
+            }
+        },
+        "node_modules/stylelint-config-recommended": {
+            "version": "12.0.0",
+            "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-12.0.0.tgz",
+            "integrity": "sha512-x6x8QNARrGO2sG6iURkzqL+Dp+4bJorPMMRNPScdvaUK8PsynriOcMW7AFDKqkWAS5wbue/u8fUT/4ynzcmqdQ==",
+            "dev": true,
+            "peerDependencies": {
+                "stylelint": "^15.5.0"
+            }
+        },
+        "node_modules/stylelint-config-standard": {
+            "version": "33.0.0",
+            "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-33.0.0.tgz",
+            "integrity": "sha512-eyxnLWoXImUn77+ODIuW9qXBDNM+ALN68L3wT1lN2oNspZ7D9NVGlNHb2QCUn4xDug6VZLsh0tF8NyoYzkgTzg==",
+            "dev": true,
+            "dependencies": {
+                "stylelint-config-recommended": "^12.0.0"
+            },
+            "peerDependencies": {
+                "stylelint": "^15.5.0"
+            }
+        },
+        "node_modules/stylelint/node_modules/balanced-match": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+            "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+            "dev": true
+        },
+        "node_modules/stylelint/node_modules/is-plain-object": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+            "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/stylelint/node_modules/resolve-from": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+            "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-color": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/supports-hyperlinks": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz",
+            "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==",
+            "dev": true,
+            "dependencies": {
+                "has-flag": "^4.0.0",
+                "supports-color": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=14.18"
+            }
+        },
+        "node_modules/supports-preserve-symlinks-flag": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+            "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+            "dev": true,
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/svg-tags": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+            "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+            "dev": true
+        },
+        "node_modules/table": {
+            "version": "6.8.1",
+            "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz",
+            "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==",
+            "dev": true,
+            "dependencies": {
+                "ajv": "^8.0.1",
+                "lodash.truncate": "^4.4.2",
+                "slice-ansi": "^4.0.0",
+                "string-width": "^4.2.3",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=10.0.0"
+            }
+        },
+        "node_modules/table/node_modules/ajv": {
+            "version": "8.12.0",
+            "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
+            "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+            "dev": true,
+            "dependencies": {
+                "fast-deep-equal": "^3.1.1",
+                "json-schema-traverse": "^1.0.0",
+                "require-from-string": "^2.0.2",
+                "uri-js": "^4.2.2"
+            },
+            "funding": {
+                "type": "github",
+                "url": "https://github.com/sponsors/epoberezkin"
+            }
+        },
+        "node_modules/table/node_modules/json-schema-traverse": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+            "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+            "dev": true
+        },
+        "node_modules/tar-fs": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+            "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+            "dev": true,
+            "dependencies": {
+                "chownr": "^1.1.1",
+                "mkdirp-classic": "^0.5.2",
+                "pump": "^3.0.0",
+                "tar-stream": "^2.1.4"
+            }
+        },
+        "node_modules/tar-stream": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+            "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+            "dev": true,
+            "dependencies": {
+                "bl": "^4.0.3",
+                "end-of-stream": "^1.4.1",
+                "fs-constants": "^1.0.0",
+                "inherits": "^2.0.3",
+                "readable-stream": "^3.1.1"
+            },
+            "engines": {
+                "node": ">=6"
+            }
+        },
+        "node_modules/text-table": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+            "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+            "dev": true
+        },
+        "node_modules/through": {
+            "version": "2.3.8",
+            "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+            "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+            "dev": true
+        },
+        "node_modules/to-object-path": {
+            "version": "0.3.0",
+            "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+            "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+            "dev": true,
+            "dependencies": {
+                "kind-of": "^3.0.2"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/to-object-path/node_modules/kind-of": {
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+            "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+            "dev": true,
+            "dependencies": {
+                "is-buffer": "^1.1.5"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/to-regex": {
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+            "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+            "dev": true,
+            "dependencies": {
+                "define-property": "^2.0.2",
+                "extend-shallow": "^3.0.2",
+                "regex-not": "^1.0.2",
+                "safe-regex": "^1.1.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/to-regex-range": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+            "dev": true,
+            "dependencies": {
+                "is-number": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=8.0"
+            }
+        },
+        "node_modules/to-regex-range/node_modules/is-number": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.12.0"
+            }
+        },
+        "node_modules/tr46": {
+            "version": "0.0.3",
+            "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+            "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+            "dev": true
+        },
+        "node_modules/trim-newlines": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+            "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+            "dev": true,
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/tslib": {
+            "version": "1.14.1",
+            "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+            "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+            "dev": true
+        },
+        "node_modules/tsutils": {
+            "version": "3.21.0",
+            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+            "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+            "dev": true,
+            "dependencies": {
+                "tslib": "^1.8.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            },
+            "peerDependencies": {
+                "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+            }
+        },
+        "node_modules/tsx": {
+            "version": "3.12.7",
+            "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.12.7.tgz",
+            "integrity": "sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==",
+            "dev": true,
+            "dependencies": {
+                "@esbuild-kit/cjs-loader": "^2.4.2",
+                "@esbuild-kit/core-utils": "^3.0.0",
+                "@esbuild-kit/esm-loader": "^2.5.5"
+            },
+            "bin": {
+                "tsx": "dist/cli.js"
+            },
+            "optionalDependencies": {
+                "fsevents": "~2.3.2"
+            }
+        },
+        "node_modules/type-check": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+            "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+            "dev": true,
+            "dependencies": {
+                "prelude-ls": "^1.2.1"
+            },
+            "engines": {
+                "node": ">= 0.8.0"
+            }
+        },
+        "node_modules/type-fest": {
+            "version": "3.12.0",
+            "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.12.0.tgz",
+            "integrity": "sha512-qj9wWsnFvVEMUDbESiilKeXeHL7FwwiFcogfhfyjmvT968RXSvnl23f1JOClTHYItsi7o501C/7qVllscUP3oA==",
+            "dev": true,
+            "engines": {
+                "node": ">=14.16"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        },
+        "node_modules/typescript": {
+            "version": "5.1.3",
+            "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz",
+            "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==",
+            "dev": true,
+            "bin": {
+                "tsc": "bin/tsc",
+                "tsserver": "bin/tsserver"
+            },
+            "engines": {
+                "node": ">=14.17"
+            }
+        },
+        "node_modules/unbzip2-stream": {
+            "version": "1.4.3",
+            "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+            "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+            "dev": true,
+            "dependencies": {
+                "buffer": "^5.2.1",
+                "through": "^2.3.8"
+            }
+        },
+        "node_modules/union-value": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+            "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+            "dev": true,
+            "dependencies": {
+                "arr-union": "^3.1.0",
+                "get-value": "^2.0.6",
+                "is-extendable": "^0.1.1",
+                "set-value": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/union-value/node_modules/is-extendable": {
+            "version": "0.1.1",
+            "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+            "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/unset-value": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+            "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+            "dev": true,
+            "dependencies": {
+                "has-value": "^0.3.1",
+                "isobject": "^3.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/unset-value/node_modules/has-value": {
+            "version": "0.3.1",
+            "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+            "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
+            "dev": true,
+            "dependencies": {
+                "get-value": "^2.0.3",
+                "has-values": "^0.1.4",
+                "isobject": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+            "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
+            "dev": true,
+            "dependencies": {
+                "isarray": "1.0.0"
+            },
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/unset-value/node_modules/has-values": {
+            "version": "0.1.4",
+            "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+            "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/uri-js": {
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+            "dev": true,
+            "dependencies": {
+                "punycode": "^2.1.0"
+            }
+        },
+        "node_modules/urix": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+            "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
+            "deprecated": "Please see https://github.com/lydell/urix#deprecated",
+            "dev": true
+        },
+        "node_modules/use": {
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+            "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/util-deprecate": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+            "dev": true
+        },
+        "node_modules/validate-npm-package-license": {
+            "version": "3.0.4",
+            "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+            "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+            "dev": true,
+            "dependencies": {
+                "spdx-correct": "^3.0.0",
+                "spdx-expression-parse": "^3.0.0"
+            }
+        },
+        "node_modules/virtual-merge": {
+            "version": "1.0.1",
+            "resolved": "https://registry.npmjs.org/virtual-merge/-/virtual-merge-1.0.1.tgz",
+            "integrity": "sha512-h7rzV6n5fZJbDu2lP4iu+IOtsZ00uqECFUxFePK1uY0pz/S5B7FNDJpmdDVfyGL7poyJECEHfTaIpJaknNkU0Q=="
+        },
+        "node_modules/vscode-oniguruma": {
+            "version": "1.7.0",
+            "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
+            "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA=="
+        },
+        "node_modules/vscode-textmate": {
+            "version": "5.2.0",
+            "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz",
+            "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ=="
+        },
+        "node_modules/webidl-conversions": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+            "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+            "dev": true
+        },
+        "node_modules/whatwg-url": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+            "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+            "dev": true,
+            "dependencies": {
+                "tr46": "~0.0.3",
+                "webidl-conversions": "^3.0.0"
+            }
+        },
+        "node_modules/which": {
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+            "dev": true,
+            "dependencies": {
+                "isexe": "^2.0.0"
+            },
+            "bin": {
+                "node-which": "bin/node-which"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/word-wrap": {
+            "version": "1.2.3",
+            "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+            "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+            "dev": true,
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/wrap-ansi": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "dev": true,
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
+        "node_modules/wrappy": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+            "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+            "dev": true
+        },
+        "node_modules/write-file-atomic": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+            "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+            "dev": true,
+            "dependencies": {
+                "imurmurhash": "^0.1.4",
+                "signal-exit": "^4.0.1"
+            },
+            "engines": {
+                "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+            }
+        },
+        "node_modules/ws": {
+            "version": "8.13.0",
+            "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
+            "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10.0.0"
+            },
+            "peerDependencies": {
+                "bufferutil": "^4.0.1",
+                "utf-8-validate": ">=5.0.2"
+            },
+            "peerDependenciesMeta": {
+                "bufferutil": {
+                    "optional": true
+                },
+                "utf-8-validate": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/y18n": {
+            "version": "5.0.8",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "dev": true
+        },
+        "node_modules/yargs": {
+            "version": "17.7.1",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
+            "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
+            "dev": true,
+            "dependencies": {
+                "cliui": "^8.0.1",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.3",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^21.1.1"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/yargs-parser": {
+            "version": "20.2.9",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+            "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/yargs/node_modules/yargs-parser": {
+            "version": "21.1.1",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+            "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+            "dev": true,
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/yauzl": {
+            "version": "2.10.0",
+            "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+            "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+            "dev": true,
+            "dependencies": {
+                "buffer-crc32": "~0.2.3",
+                "fd-slicer": "~1.1.0"
+            }
+        },
+        "node_modules/yocto-queue": {
+            "version": "0.1.0",
+            "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+            "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+            "dev": true,
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/sindresorhus"
+            }
+        }
+    }
+}
diff --git a/nixpkgs/pkgs/misc/vencord/replace-git.patch b/nixpkgs/pkgs/misc/vencord/replace-git.patch
new file mode 100644
index 000000000000..829321638bf2
--- /dev/null
+++ b/nixpkgs/pkgs/misc/vencord/replace-git.patch
@@ -0,0 +1,26 @@
+diff --git a/scripts/build/common.mjs b/scripts/build/common.mjs
+index 7ff599a..85b3bfa 100644
+--- a/scripts/build/common.mjs
++++ b/scripts/build/common.mjs
+@@ -24,7 +24,7 @@ import { promisify } from "util";
+ 
+ export const watch = process.argv.includes("--watch");
+ export const isStandalone = JSON.stringify(process.argv.includes("--standalone"));
+-export const gitHash = execSync("git rev-parse --short HEAD", { encoding: "utf-8" }).trim();
++export const gitHash = "v@version@";
+ export const banner = {
+     js: `
+ // Vencord ${gitHash}
+@@ -124,11 +124,7 @@ export const gitRemotePlugin = {
+             namespace: "git-remote", path: args.path
+         }));
+         build.onLoad({ filter, namespace: "git-remote" }, async () => {
+-            const res = await promisify(exec)("git remote get-url origin", { encoding: "utf-8" });
+-            const remote = res.stdout.trim()
+-                .replace("https://github.com/", "")
+-                .replace("git@github.com:", "")
+-                .replace(/.git$/, "");
++            const remote = "Vendicated/Vencord";
+ 
+             return { contents: `export default "${remote}"` };
+         });
diff --git a/nixpkgs/pkgs/misc/wiki-tui/default.nix b/nixpkgs/pkgs/misc/wiki-tui/default.nix
new file mode 100644
index 000000000000..89959e3fcf78
--- /dev/null
+++ b/nixpkgs/pkgs/misc/wiki-tui/default.nix
@@ -0,0 +1,42 @@
+{ lib
+, stdenv
+, rustPlatform
+, fetchFromGitHub
+, ncurses
+, openssl
+, pkg-config
+, Security
+}:
+
+rustPlatform.buildRustPackage rec {
+  pname = "wiki-tui";
+  version = "0.8.0";
+
+  src = fetchFromGitHub {
+    owner = "Builditluc";
+    repo = pname;
+    rev = "v${version}";
+    hash = "sha256-WEB6tzHeP7fX+KyNOqAADKHT6IE1t8af889XcHH/48Q=";
+  };
+
+  nativeBuildInputs = [
+    pkg-config
+  ];
+
+  buildInputs = [
+    ncurses
+    openssl
+  ] ++ lib.optionals stdenv.isDarwin [
+    Security
+  ];
+
+  cargoHash = "sha256-pLAUwkn4w/vwg/znBtjxc+og2yJn5uABY3Au9AYkpM4=";
+
+  meta = with lib; {
+    description = "A simple and easy to use Wikipedia Text User Interface";
+    homepage = "https://github.com/builditluc/wiki-tui";
+    changelog = "https://github.com/Builditluc/wiki-tui/releases/tag/v${version}";
+    license = licenses.mit;
+    maintainers = with maintainers; [ lom builditluc ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/xosd/default.nix b/nixpkgs/pkgs/misc/xosd/default.nix
new file mode 100644
index 000000000000..3190cfb380d8
--- /dev/null
+++ b/nixpkgs/pkgs/misc/xosd/default.nix
@@ -0,0 +1,21 @@
+{ lib, stdenv, fetchurl, libX11, libXext, libXt, xorgproto }:
+
+stdenv.mkDerivation rec {
+  pname = "xosd";
+  version = "2.2.14";
+
+  src = fetchurl {
+    url = "mirror://sourceforge/libxosd/${pname}-${version}.tar.gz";
+    sha256 = "025m7ha89q29swkc7s38knnbn8ysl24g2h5s7imfxflm91psj7sg";
+  };
+
+  buildInputs = [ libX11 libXext libXt xorgproto ];
+
+  meta = with lib; {
+    description = "Displays text on your screen";
+    homepage = "https://sourceforge.net/projects/libxosd";
+    license = licenses.gpl2;
+    platforms = platforms.linux ++ platforms.darwin;
+    maintainers = with maintainers; [ pSub ];
+  };
+}
diff --git a/nixpkgs/pkgs/misc/zeyple/default.nix b/nixpkgs/pkgs/misc/zeyple/default.nix
new file mode 100644
index 000000000000..a14996e1d7d1
--- /dev/null
+++ b/nixpkgs/pkgs/misc/zeyple/default.nix
@@ -0,0 +1,27 @@
+{ lib, python3Packages, fetchFromGitHub }:
+
+python3Packages.buildPythonApplication rec {
+  pname = "zeyple";
+  version = "unstable-2021-04-10";
+
+  format = "other";
+
+  src = fetchFromGitHub {
+    owner = "infertux";
+    repo = "zeyple";
+    rev = "cc125b7b44432542b227887fd7e2701f77fd8ca2";
+    sha256 = "0r2d1drg2zvwmn3zg0qb32i9mh03r5di9q1yszx23r32rsax9mxh";
+  };
+
+  propagatedBuildInputs = [ python3Packages.pygpgme ];
+  installPhase = ''
+    install -Dm755 $src/zeyple/zeyple.py $out/bin/zeyple
+  '';
+
+  meta = with lib; {
+    description = "Utility program to automatically encrypt outgoing emails with GPG";
+    homepage = "https://infertux.com/labs/zeyple/";
+    maintainers = with maintainers; [ ettom ];
+    license = licenses.agpl3Plus;
+  };
+}