pkgsrc-WIP-changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Import electron44



Module Name:	pkgsrc-wip
Committed By:	kikadf <kikadf.01%gmail.com@localhost>
Pushed By:	kikadf
Date:		Tue Nov 3 20:12:24 2026 +0100
Changeset:	d2c21d1df6efd94a157548242bea2cd3b2ad23ec

Modified Files:
	Makefile
Added Files:
	electron44/DESCR
	electron44/Makefile
	electron44/PLIST
	electron44/cargo-depends.mk
	electron44/distinfo
	electron44/electron.mk
	electron44/files/apply-electron-patches.sh
	electron44/files/gen-electron-node-modules.sh
	electron44/options.mk
	electron44/patches/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc
	electron44/patches/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.h
	electron44/patches/patch-chrome_browser_process__singleton__posix.cc
	electron44/patches/patch-components_os__crypt_sync_os__crypt.h
	electron44/patches/patch-components_os__crypt_sync_os__crypt__unittest.cc
	electron44/patches/patch-content_browser_child__process__launcher__helper__linux.cc
	electron44/patches/patch-electron_BUILD.gn
	electron44/patches/patch-electron_build_args_all.gn
	electron44/patches/patch-electron_default__app_default__app.ts
	electron44/patches/patch-electron_filenames.gni
	electron44/patches/patch-electron_lib_browser_api_app.ts
	electron44/patches/patch-electron_lib_browser_api_dialog.ts
	electron44/patches/patch-electron_lib_browser_api_menu-item-roles.ts
	electron44/patches/patch-electron_lib_browser_api_power-monitor.ts
	electron44/patches/patch-electron_lib_browser_init.ts
	electron44/patches/patch-electron_lib_renderer_security-warnings.ts
	electron44/patches/patch-electron_node__modules_@sentry_cli_scripts_install.js
	electron44/patches/patch-electron_npm_install.js
	electron44/patches/patch-electron_script_lib_config.py
	electron44/patches/patch-electron_script_lib_utils.js
	electron44/patches/patch-electron_script_pgo_collect-profile.js
	electron44/patches/patch-electron_script_spec-runner.js
	electron44/patches/patch-electron_shell_app_electron__crash__reporter__client.cc
	electron44/patches/patch-electron_shell_app_electron__crash__reporter__client.h
	electron44/patches/patch-electron_shell_app_electron__main__delegate.cc
	electron44/patches/patch-electron_shell_app_node__main.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__app.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__base__window.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__base__window.h
	electron44/patches/patch-electron_shell_browser_api_electron__api__clipboard.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h
	electron44/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__safe__storage.h
	electron44/patches/patch-electron_shell_browser_api_electron__api__screen.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__system__preferences.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__system__preferences.h
	electron44/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc
	electron44/patches/patch-electron_shell_browser_api_electron__api__web__contents.h
	electron44/patches/patch-electron_shell_browser_api_process__metric.h
	electron44/patches/patch-electron_shell_browser_browser.cc
	electron44/patches/patch-electron_shell_browser_browser__linux.cc
	electron44/patches/patch-electron_shell_browser_browser__process__impl.cc
	electron44/patches/patch-electron_shell_browser_browser__process__impl.h
	electron44/patches/patch-electron_shell_browser_electron__browser__main__parts.cc
	electron44/patches/patch-electron_shell_browser_electron__browser__main__parts.h
	electron44/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
	electron44/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
	electron44/patches/patch-electron_shell_browser_feature__list.cc
	electron44/patches/patch-electron_shell_browser_linux_x11__util.cc
	electron44/patches/patch-electron_shell_browser_native__window.cc
	electron44/patches/patch-electron_shell_browser_native__window__views.cc
	electron44/patches/patch-electron_shell_browser_native__window__views.h
	electron44/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc
	electron44/patches/patch-electron_shell_browser_osr_osr__host__display__client.h
	electron44/patches/patch-electron_shell_browser_osr_osr__paint__event.h
	electron44/patches/patch-electron_shell_browser_osr_osr__video__consumer.cc
	electron44/patches/patch-electron_shell_browser_printing_printing__utils.cc
	electron44/patches/patch-electron_shell_browser_relauncher__linux.cc
	electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc
	electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view.cc
	electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
	electron44/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
	electron44/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h
	electron44/patches/patch-electron_shell_browser_ui_views_menu__bar.cc
	electron44/patches/patch-electron_shell_browser_ui_views_menu__bar.h
	electron44/patches/patch-electron_shell_browser_ui_views_submenu__button.cc
	electron44/patches/patch-electron_shell_common_api_electron__api__native__image.cc
	electron44/patches/patch-electron_shell_common_api_electron__api__native__image.h
	electron44/patches/patch-electron_shell_common_api_electron__api__shared__texture.cc
	electron44/patches/patch-electron_shell_common_api_electron__api__testing.cc
	electron44/patches/patch-electron_shell_common_api_electron__bindings.cc
	electron44/patches/patch-electron_shell_common_electron__command__line.cc
	electron44/patches/patch-electron_shell_common_electron__command__line.h
	electron44/patches/patch-electron_shell_common_electron__paths.cc
	electron44/patches/patch-electron_shell_common_electron__paths.h
	electron44/patches/patch-electron_shell_common_gin__converters_osr__converter.cc
	electron44/patches/patch-electron_shell_common_gin__converters_std__converter.h
	electron44/patches/patch-electron_shell_common_node__bindings.cc
	electron44/patches/patch-electron_shell_common_node__bindings__linux.cc
	electron44/patches/patch-electron_shell_common_platform__util.h
	electron44/patches/patch-electron_shell_common_v8__oom__diagnostics.cc
	electron44/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
	electron44/patches/patch-electron_shell_services_node_node__service.cc
	electron44/patches/patch-electron_spec_api-app.spec.ts
	electron44/patches/patch-electron_spec_api-browser-window-ignore-mouse-events.spec.ts
	electron44/patches/patch-electron_spec_api-browser-window.spec.ts
	electron44/patches/patch-electron_spec_api-clipboard.spec.ts
	electron44/patches/patch-electron_spec_api-content-tracing.spec.ts
	electron44/patches/patch-electron_spec_api-crash-reporter.spec.ts
	electron44/patches/patch-electron_spec_api-desktop-capturer.spec.ts
	electron44/patches/patch-electron_spec_api-dialog.spec.ts
	electron44/patches/patch-electron_spec_api-media-handler.spec.ts
	electron44/patches/patch-electron_spec_api-menu.spec.ts
	electron44/patches/patch-electron_spec_api-native-image.spec.ts
	electron44/patches/patch-electron_spec_api-net-log.spec.ts
	electron44/patches/patch-electron_spec_api-net.spec.ts
	electron44/patches/patch-electron_spec_api-notification-dbus.spec.ts
	electron44/patches/patch-electron_spec_api-power-monitor.spec.ts
	electron44/patches/patch-electron_spec_api-process.spec.ts
	electron44/patches/patch-electron_spec_api-safe-storage.spec.ts
	electron44/patches/patch-electron_spec_api-screen.spec.ts
	electron44/patches/patch-electron_spec_api-shell.spec.ts
	electron44/patches/patch-electron_spec_api-subframe.spec.ts
	electron44/patches/patch-electron_spec_api-system-preferences.spec.ts
	electron44/patches/patch-electron_spec_api-tray.spec.ts
	electron44/patches/patch-electron_spec_api-utility-process.spec.ts
	electron44/patches/patch-electron_spec_api-web-contents.spec.ts
	electron44/patches/patch-electron_spec_asar.spec.ts
	electron44/patches/patch-electron_spec_chromium.spec.ts
	electron44/patches/patch-electron_spec_crash.spec.ts
	electron44/patches/patch-electron_spec_desktop-name.spec.ts
	electron44/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
	electron44/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
	electron44/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
	electron44/patches/patch-electron_spec_lib_spec-helpers.ts
	electron44/patches/patch-electron_spec_node.spec.ts
	electron44/patches/patch-electron_spec_spellchecker.spec.ts
	electron44/patches/patch-electron_spec_visibility-state.spec.ts
	electron44/patches/patch-electron_spec_webview.spec.ts
	electron44/patches/patch-net_dns_dns__config__service__posix.cc
	electron44/patches/patch-rollup_rust_bindings__napi_Cargo.toml
	electron44/patches/patch-rollup_rust_bindings__napi_src_lib.rs
	electron44/patches/patch-third__party_electron__node_common.gypi
	electron44/patches/patch-third__party_electron__node_configure
	electron44/patches/patch-third__party_electron__node_deps_cares_cares.gyp
	electron44/patches/patch-third__party_electron__node_deps_cares_config_netbsd_ares__config.h
	electron44/patches/patch-third__party_electron__node_deps_cares_unofficial.gni
	electron44/patches/patch-third__party_electron__node_deps_histogram_src_hdr__histogram.c
	electron44/patches/patch-third__party_electron__node_deps_histogram_unofficial.gni
	electron44/patches/patch-third__party_electron__node_deps_openssl_unofficial.gni
	electron44/patches/patch-third__party_electron__node_deps_uv_common.gypi
	electron44/patches/patch-third__party_electron__node_deps_uv_src_unix_pipe.c
	electron44/patches/patch-third__party_electron__node_deps_uv_unofficial.gni
	electron44/patches/patch-third__party_electron__node_deps_uvwasi_include_wasi__serdes.h
	electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_memory.h
	electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-freebsd.cc
	electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-openbsd.cc
	electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-posix.cc
	electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_semaphore.cc
	electron44/patches/patch-third__party_electron__node_deps_v8_src_base_strings.h
	electron44/patches/patch-third__party_electron__node_deps_v8_src_codegen_arm_cpu-arm.cc
	electron44/patches/patch-third__party_electron__node_deps_v8_src_common_globals.h
	electron44/patches/patch-third__party_electron__node_deps_v8_src_compiler_turboshaft_int64-lowering-reducer.h
	electron44/patches/patch-third__party_electron__node_deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc
	electron44/patches/patch-third__party_electron__node_deps_v8_tools_profiling_run-llprof.sh
	electron44/patches/patch-third__party_electron__node_node.gypi
	electron44/patches/patch-third__party_electron__node_src_compile__cache.cc
	electron44/patches/patch-third__party_electron__node_src_crypto_crypto__rsa.cc
	electron44/patches/patch-third__party_electron__node_src_inspector__agent.cc
	electron44/patches/patch-third__party_electron__node_src_node__platform.cc
	electron44/patches/patch-third__party_electron__node_src_node__platform.h
	electron44/patches/patch-third__party_electron__node_src_node__postmortem__metadata.cc
	electron44/patches/patch-third__party_electron__node_tools_generate__config__gypi.py
	electron44/patches/patch-third__party_electron__node_tools_gyp_pylib_gyp_generator_make.py
	electron44/patches/patch-third__party_electron__node_tools_gyp_pylib_gyp_xcode__emulation.py
	electron44/patches/patch-third__party_electron__node_tools_install.py
	electron44/patches/patch-third__party_electron__node_tools_v8__gypfiles_v8.gyp
	electron44/patches/patch-third__party_electron__node_unofficial.gni
	electron44/patches/patch-ui_gfx_font__util.cc
	electron44/patches/patch-ui_gtk_gtk__compat.cc
	electron44/patches/patch-ui_shell__dialogs_select__file__dialog.h

Log Message:
Import electron44

To see a diff of this commit:
https://wip.pkgsrc.org/cgi-bin/gitweb.cgi?p=pkgsrc-wip.git;a=commitdiff;h=d2c21d1df6efd94a157548242bea2cd3b2ad23ec

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

diffstat:
 Makefile                                           |   1 +
 electron44/DESCR                                   |   5 +
 electron44/Makefile                                | 413 +++++++++++
 electron44/PLIST                                   | 590 +++++++++++++++
 electron44/cargo-depends.mk                        | 206 ++++++
 electron44/distinfo                                | 814 +++++++++++++++++++++
 electron44/electron.mk                             | 100 +++
 electron44/files/apply-electron-patches.sh         |  14 +
 electron44/files/gen-electron-node-modules.sh      |  29 +
 electron44/options.mk                              |  62 ++
 ...e__file__system__access__permission__context.cc | 229 ++++++
 ...me__file__system__access__permission__context.h |  17 +
 ...tch-chrome_browser_process__singleton__posix.cc |  17 +
 .../patch-components_os__crypt_sync_os__crypt.h    | 118 +++
 ...omponents_os__crypt_sync_os__crypt__unittest.cc |  35 +
 ...wser_child__process__launcher__helper__linux.cc |  34 +
 electron44/patches/patch-electron_BUILD.gn         | 155 ++++
 .../patches/patch-electron_build_args_all.gn       |  19 +
 .../patch-electron_default__app_default__app.ts    |  17 +
 electron44/patches/patch-electron_filenames.gni    |  19 +
 .../patches/patch-electron_lib_browser_api_app.ts  |  17 +
 .../patch-electron_lib_browser_api_dialog.ts       |  17 +
 ...tch-electron_lib_browser_api_menu-item-roles.ts |  17 +
 ...patch-electron_lib_browser_api_power-monitor.ts |  17 +
 .../patches/patch-electron_lib_browser_init.ts     |  17 +
 ...atch-electron_lib_renderer_security-warnings.ts |  16 +
 ...on_node__modules_@sentry_cli_scripts_install.js |  16 +
 electron44/patches/patch-electron_npm_install.js   |  16 +
 .../patches/patch-electron_script_lib_config.py    |  20 +
 .../patches/patch-electron_script_lib_utils.js     |  17 +
 .../patch-electron_script_pgo_collect-profile.js   |  17 +
 .../patches/patch-electron_script_spec-runner.js   |  35 +
 ..._shell_app_electron__crash__reporter__client.cc |  26 +
 ...n_shell_app_electron__crash__reporter__client.h |  26 +
 ...-electron_shell_app_electron__main__delegate.cc |  71 ++
 .../patches/patch-electron_shell_app_node__main.cc |  43 ++
 ...lectron_shell_browser_api_electron__api__app.cc |  62 ++
 ...hell_browser_api_electron__api__base__window.cc |  44 ++
 ...shell_browser_api_electron__api__base__window.h |  17 +
 ...n_shell_browser_api_electron__api__clipboard.cc |  26 +
 ...l_browser_api_electron__api__crash__reporter.cc |  80 ++
 ...browser_api_electron__api__desktop__capturer.cc |  17 +
 ...ll_browser_api_electron__api__power__monitor.cc |  29 +
 ...ell_browser_api_electron__api__power__monitor.h |  17 +
 ...ell_browser_api_electron__api__safe__storage.cc |  44 ++
 ...hell_browser_api_electron__api__safe__storage.h |  17 +
 ...tron_shell_browser_api_electron__api__screen.cc |  53 ++
 ...owser_api_electron__api__system__preferences.cc |  35 +
 ...rowser_api_electron__api__system__preferences.h |  44 ++
 ...ell_browser_api_electron__api__web__contents.cc |  83 +++
 ...hell_browser_api_electron__api__web__contents.h |  17 +
 ...ch-electron_shell_browser_api_process__metric.h |  26 +
 .../patch-electron_shell_browser_browser.cc        |  17 +
 .../patch-electron_shell_browser_browser__linux.cc |  17 +
 ...lectron_shell_browser_browser__process__impl.cc |  62 ++
 ...electron_shell_browser_browser__process__impl.h |  35 +
 ...shell_browser_electron__browser__main__parts.cc | 164 +++++
 ..._shell_browser_electron__browser__main__parts.h |  17 +
 ...rowser_electron__browser__main__parts__posix.cc |  26 +
 ...api_runtime_electron__runtime__api__delegate.cc |  19 +
 .../patch-electron_shell_browser_feature__list.cc  |  17 +
 ...patch-electron_shell_browser_linux_x11__util.cc |  26 +
 .../patch-electron_shell_browser_native__window.cc |  26 +
 ...electron_shell_browser_native__window__views.cc | 251 +++++++
 ...-electron_shell_browser_native__window__views.h |  62 ++
 ...shell_browser_osr_osr__host__display__client.cc |  17 +
 ..._shell_browser_osr_osr__host__display__client.h |  17 +
 ...-electron_shell_browser_osr_osr__paint__event.h |  17 +
 ...ctron_shell_browser_osr_osr__video__consumer.cc |  26 +
 ...ctron_shell_browser_printing_printing__utils.cc |  17 +
 ...tch-electron_shell_browser_relauncher__linux.cc |  38 +
 ..._shell_browser_ui_inspectable__web__contents.cc |  17 +
 ..._browser_ui_inspectable__web__contents__view.cc |  17 +
 ...ui_inspectable__web__contents__view__delegate.h |  17 +
 ...l_browser_ui_views_electron__views__delegate.cc |  17 +
 ...ll_browser_ui_views_electron__views__delegate.h |  17 +
 ...ch-electron_shell_browser_ui_views_menu__bar.cc |  44 ++
 ...tch-electron_shell_browser_ui_views_menu__bar.h |  17 +
 ...ctron_shell_browser_ui_views_submenu__button.cc |  17 +
 ...hell_common_api_electron__api__native__image.cc |  17 +
 ...shell_common_api_electron__api__native__image.h |  17 +
 ...ll_common_api_electron__api__shared__texture.cc |  44 ++
 ...tron_shell_common_api_electron__api__testing.cc |  35 +
 ...electron_shell_common_api_electron__bindings.cc |  26 +
 ...lectron_shell_common_electron__command__line.cc |  17 +
 ...electron_shell_common_electron__command__line.h |  17 +
 .../patch-electron_shell_common_electron__paths.cc |  26 +
 .../patch-electron_shell_common_electron__paths.h  |  17 +
 ..._shell_common_gin__converters_osr__converter.cc |  26 +
 ...n_shell_common_gin__converters_std__converter.h |  17 +
 .../patch-electron_shell_common_node__bindings.cc  |  44 ++
 ...-electron_shell_common_node__bindings__linux.cc |  76 ++
 .../patch-electron_shell_common_platform__util.h   |  17 +
 ...h-electron_shell_common_v8__oom__diagnostics.cc |  25 +
 ...api_electron__api__crash__reporter__renderer.cc |  42 ++
 ...h-electron_shell_services_node_node__service.cc |  26 +
 .../patches/patch-electron_spec_api-app.spec.ts    | 220 ++++++
 ..._api-browser-window-ignore-mouse-events.spec.ts |  22 +
 .../patch-electron_spec_api-browser-window.spec.ts | 179 +++++
 .../patch-electron_spec_api-clipboard.spec.ts      |  53 ++
 ...patch-electron_spec_api-content-tracing.spec.ts |  26 +
 .../patch-electron_spec_api-crash-reporter.spec.ts |  44 ++
 ...atch-electron_spec_api-desktop-capturer.spec.ts |  80 ++
 .../patches/patch-electron_spec_api-dialog.spec.ts |  17 +
 .../patch-electron_spec_api-media-handler.spec.ts  |  17 +
 .../patches/patch-electron_spec_api-menu.spec.ts   |  17 +
 .../patch-electron_spec_api-native-image.spec.ts   |  17 +
 .../patch-electron_spec_api-net-log.spec.ts        |  35 +
 .../patches/patch-electron_spec_api-net.spec.ts    |  17 +
 ...tch-electron_spec_api-notification-dbus.spec.ts |  17 +
 .../patch-electron_spec_api-power-monitor.spec.ts  |  17 +
 .../patch-electron_spec_api-process.spec.ts        |  35 +
 .../patch-electron_spec_api-safe-storage.spec.ts   |  26 +
 .../patches/patch-electron_spec_api-screen.spec.ts |  35 +
 .../patches/patch-electron_spec_api-shell.spec.ts  |  34 +
 .../patch-electron_spec_api-subframe.spec.ts       |  17 +
 ...ch-electron_spec_api-system-preferences.spec.ts |  19 +
 .../patches/patch-electron_spec_api-tray.spec.ts   |  33 +
 ...patch-electron_spec_api-utility-process.spec.ts |  26 +
 .../patch-electron_spec_api-web-contents.spec.ts   |  35 +
 .../patches/patch-electron_spec_asar.spec.ts       |  17 +
 .../patches/patch-electron_spec_chromium.spec.ts   |  52 ++
 .../patches/patch-electron_spec_crash.spec.ts      |  17 +
 .../patch-electron_spec_desktop-name.spec.ts       |  17 +
 ...c_fixtures_api_safe-storage_decrypt-app_main.js |  17 +
 ...c_fixtures_api_safe-storage_encrypt-app_main.js |  17 +
 ...n_spec_fixtures_native-addon_uv-dlopen_index.js |  17 +
 .../patch-electron_spec_lib_spec-helpers.ts        |  17 +
 .../patches/patch-electron_spec_node.spec.ts       |  17 +
 .../patch-electron_spec_spellchecker.spec.ts       |  17 +
 .../patch-electron_spec_visibility-state.spec.ts   |  17 +
 .../patches/patch-electron_spec_webview.spec.ts    |  17 +
 .../patch-net_dns_dns__config__service__posix.cc   |  16 +
 .../patch-rollup_rust_bindings__napi_Cargo.toml    |  26 +
 .../patch-rollup_rust_bindings__napi_src_lib.rs    |  17 +
 .../patch-third__party_electron__node_common.gypi  |  22 +
 .../patch-third__party_electron__node_configure    |  25 +
 ...hird__party_electron__node_deps_cares_cares.gyp |  19 +
 ...n__node_deps_cares_config_netbsd_ares__config.h |  24 +
 ..._party_electron__node_deps_cares_unofficial.gni |  44 ++
 ...ctron__node_deps_histogram_src_hdr__histogram.c |  21 +
 ...ty_electron__node_deps_histogram_unofficial.gni |  17 +
 ...arty_electron__node_deps_openssl_unofficial.gni |  17 +
 ...third__party_electron__node_deps_uv_common.gypi |  17 +
 ...d__party_electron__node_deps_uv_src_unix_pipe.c |  24 +
 ...rd__party_electron__node_deps_uv_unofficial.gni |  60 ++
 ...ectron__node_deps_uvwasi_include_wasi__serdes.h |  22 +
 ...ectron__node_deps_v8_src_base_platform_memory.h |  17 +
 ...e_deps_v8_src_base_platform_platform-freebsd.cc |  35 +
 ...e_deps_v8_src_base_platform_platform-openbsd.cc |  57 ++
 ...ode_deps_v8_src_base_platform_platform-posix.cc |  66 ++
 ...on__node_deps_v8_src_base_platform_semaphore.cc |  19 +
 ...party_electron__node_deps_v8_src_base_strings.h |  16 +
 ...ectron__node_deps_v8_src_codegen_arm_cpu-arm.cc |  28 +
 ...rty_electron__node_deps_v8_src_common_globals.h |  16 +
 ...rc_compiler_turboshaft_int64-lowering-reducer.h |  26 +
 ...-cpp_absl_debugging_internal_elf__mem__image.cc |  17 +
 ...ron__node_deps_v8_tools_profiling_run-llprof.sh |  17 +
 .../patch-third__party_electron__node_node.gypi    |  16 +
 ...ird__party_electron__node_src_compile__cache.cc |  58 ++
 ..._party_electron__node_src_crypto_crypto__rsa.cc |  39 +
 ...d__party_electron__node_src_inspector__agent.cc |  17 +
 ...ird__party_electron__node_src_node__platform.cc |  47 ++
 ...hird__party_electron__node_src_node__platform.h |  16 +
 ...lectron__node_src_node__postmortem__metadata.cc |  19 +
 ..._electron__node_tools_generate__config__gypi.py |  17 +
 ...ron__node_tools_gyp_pylib_gyp_generator_make.py |  26 +
 ...n__node_tools_gyp_pylib_gyp_xcode__emulation.py |  26 +
 ...ch-third__party_electron__node_tools_install.py |  20 +
 ..._party_electron__node_tools_v8__gypfiles_v8.gyp |  21 +
 ...atch-third__party_electron__node_unofficial.gni |  49 ++
 electron44/patches/patch-ui_gfx_font__util.cc      |  22 +
 electron44/patches/patch-ui_gtk_gtk__compat.cc     |  24 +
 .../patch-ui_shell__dialogs_select__file__dialog.h |  17 +
 174 files changed, 7812 insertions(+)

diffs:
diff --git a/Makefile b/Makefile
index 2114be51bd..f4d1863b24 100644
--- a/Makefile
+++ b/Makefile
@@ -858,6 +858,7 @@ SUBDIR+=	eksctl
 SUBDIR+=	electricsheep
 SUBDIR+=	electricsheep-git
 SUBDIR+=	electron43
+SUBDIR+=	electron44
 SUBDIR+=	elegent
 SUBDIR+=	elementary-calculator
 SUBDIR+=	elementary-code
diff --git a/electron44/DESCR b/electron44/DESCR
new file mode 100644
index 0000000000..e528f88331
--- /dev/null
+++ b/electron44/DESCR
@@ -0,0 +1,5 @@
+Electron is a framework for building desktop applications
+using JavaScript, HTML, and CSS. By embedding Chromium and
+Node.js into its binary, Electron allows you to maintain
+one JavaScript codebase and create cross-platform apps that
+work on the supported operating systems.
diff --git a/electron44/Makefile b/electron44/Makefile
new file mode 100644
index 0000000000..57c0c6e54c
--- /dev/null
+++ b/electron44/Makefile
@@ -0,0 +1,413 @@
+# $NetBSD$
+
+DISTNAME=			${ELECTRON}-${ELECTRON_VER}
+CATEGORIES=			devel
+MASTER_SITES=			${MASTER_SITE_GITHUB:=electron/}
+GITHUB_PROJECT=			electron
+GITHUB_TAG=			v${PKGVERSION_NOREV}
+EXTRACT_SUFX_C=			.tar.xz
+
+CHROMIUM_DISTFILE=		chromium-${CHROMIUM_VERSION}-pkgsrc${EXTRACT_SUFX_C}
+MASTER_SITES+=			${MASTER_SITE_GITHUB:=kikadf/}chromium-tarballs/releases/download/${CHROMIUM_VERSION}/
+NODE_MODULES=			${ELECTRON}-node_modules-${ELECTRON_VER}.tar.gz
+MASTER_SITES+=			https://distfiles.borderland.hu/
+DISTFILES+=			${CHROMIUM_DISTFILE}
+DISTFILES+=			${NODE_MODULES}
+DISTFILES+=			${DEFAULT_DISTFILES}
+
+# See ${WRKSRC}/electron/DEPS for versions
+CHROMIUM_VERSION=		152.0.7977.169
+AUDIOIO_VERSION=		151.1
+ROLLUP_VERSION=			4.60.4
+EB_DISTNAME=			${MAKE} -C ../../www/esbuild -V DISTNAME
+ESBUILD_VERSION=		${EB_DISTNAME:sh:C/^.*-//}
+NODE_VERSION=			24.22.1
+NAN_VERSION=			675cefebca42410733da8a454c8d9391fcebfbc2
+SQUIRREL_VERSION=		fffea30e4a339a7f7d69a3391314b72548d209bd
+REACTIVEOBJC_VERSION=		74ab5baccc6f7202c8ac69a8d1e152c29dc1ea76
+MANTLE_VERSION=			2a8e2123a3931038179ee06105c9e6ec336b12ea
+SPARKLE_VERSION=		79bc9e872948e47877e76f194cb0c8e0412b0b90
+LLVM_VERSION=			${MAKE} -C ../../lang/llvm -V LLVM_VERSION
+LLVM_MV=			${LLVM_VERSION:sh:C/\..*//}
+
+GITHUB_SUBMODULES=		kikadf chromium-nb v${AUDIOIO_VERSION} pkgsrc/chromium-nb
+GITHUB_SUBMODULES+=		nodejs node v${NODE_VERSION} pkgsrc/electron_node
+GITHUB_SUBMODULES+=		nodejs nan ${NAN_VERSION} pkgsrc/nan
+GITHUB_SUBMODULES+=		Squirrel Squirrel.Mac ${SQUIRREL_VERSION} pkgsrc/squirrel.mac
+GITHUB_SUBMODULES+=		ReactiveCocoa ReactiveObjC ${REACTIVEOBJC_VERSION} pkgsrc/squirrel.mac/vendor/ReactiveObjC
+GITHUB_SUBMODULES+=		Mantle Mantle ${MANTLE_VERSION} pkgsrc/squirrel.mac/vendor/Mantle
+GITHUB_SUBMODULES+=		evanw esbuild v${ESBUILD_VERSION} pkgsrc/esbuild
+GITHUB_SUBMODULES+=		rollup rollup v${ROLLUP_VERSION} pkgsrc/rollup
+GITHUB_SUBMODULES+=		sparkle-project Sparkle ${SPARKLE_VERSION} pkgsrc/squirrel.mac/vendor/Sparkle
+CARGO_WRKSRC=			${WRKSRC}/rollup/rust
+.include "cargo-depends.mk"
+
+MAINTAINER=			kikadf%NetBSD.org@localhost
+HOMEPAGE=			https://electronjs.org/
+COMMENT=			Build cross-platform desktop apps with JavaScript, HTML, and CSS
+LICENSE=			modified-bsd AND gnu-lgpl-v3 AND mpl-2.0 AND mit
+
+USE_TOOLS+=			bash bison flex:pkgsrc gmake pax perl pkg-config
+TOOLS_PLATFORM.flex=		# override the platform definition to use pkgsrc's flex.
+USE_LANGUAGES=			c c++
+
+CHECK_PORTABILITY_SKIP+=	docs/website/site/for-testers/bug-reporting-guidelines/hanging-tabs/crash-with-gdb
+CHECK_PORTABILITY_SKIP+=	remoting/host/installer/mac/Scripts/remoting_preflight.sh
+CHECK_PORTABILITY_SKIP+=	remoting/host/installer/mac/Scripts/remoting_postflight.sh
+CHECK_PORTABILITY_SKIP+=	remoting/host/installer/mac/tools/ksregister.sh
+CHECK_PORTABILITY_SKIP+=	remoting/host/installer/mac/tools/ksunregister.sh
+CHECK_PORTABILITY_SKIP+=	remoting/tools/get_mac_crd_version.sh
+CHECK_PORTABILITY_SKIP+=	remoting/tools/register_local_nm_hosts.sh
+CHECK_PORTABILITY_SKIP+=	remoting/tools/set_android_flags.sh
+CHECK_PORTABILITY_SKIP+=	third_party/dawn/third_party/directx-shader-compiler/src/utils/buildit/build_llvm
+CHECK_PORTABILITY_SKIP+=	third_party/sqlite/src/configure
+CHECK_PORTABILITY_SKIP+=	third_party/protobuf/post_process_dist.sh
+CHECK_PORTABILITY_SKIP+=	third_party/ffmpeg/configure
+CHECK_PORTABILITY_SKIP+=	third_party/flatbuffers/src/tests/KotlinTest.sh
+CHECK_PORTABILITY_SKIP+=	third_party/fontconfig/src/.gitlab-ci/fedora-cross.sh
+CHECK_PORTABILITY_SKIP+=	third_party/litert/src/tflite/swift/docsgen/TensorFlowLiteSwift/scripts/download_frameworks.sh
+CHECK_PORTABILITY_SKIP+=	third_party/llvm/flang/tools/f18/flang.sh.in
+CHECK_PORTABILITY_SKIP+=	third_party/nearby/src/embedded/build.sh
+CHECK_PORTABILITY_SKIP+=	third_party/openscreen/src/third_party/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh
+CHECK_PORTABILITY_SKIP+=	third_party/protobuf/post_process_dist.sh
+CHECK_PORTABILITY_SKIP+=	third_party/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh
+CHECK_PORTABILITY_SKIP+=	third_party/rust-src/vendor/libdbus-sys-0.2.5/vendor/dbus/tools/cmake-format
+CHECK_PORTABILITY_SKIP+=	third_party/rust-toolchain/lib/rustlib/src/rust/vendor/libdbus-sys-0.2.5/vendor/dbus/tools/cmake-format
+CHECK_PORTABILITY_SKIP+=	third_party/sqlite/src/configure
+CHECK_PORTABILITY_SKIP+=	third_party/tflite/src/tensorflow/lite/swift/docsgen/TensorFlowLiteSwift/scripts/download_frameworks.sh
+CHECK_PORTABILITY_SKIP+=	third_party/xdg-utils/scripts/xdg-terminal
+CHECK_PORTABILITY_SKIP+=	third_party/xdg-utils/scripts/xdg-terminal.in
+CHECK_PORTABILITY_SKIP+=	tools/perf/cli_tools/android/record-hardware-events
+CHECK_PORTABILITY_SKIP+=	v8/tools/cppgc/export_to_github.sh
+CHECK_PORTABILITY_SKIP+=	v8/tools/cppgc/test_cmake.sh
+CHECK_PORTABILITY_SKIP+=	v8/tools/profiling/run-llprof.sh
+CHECK_PORTABILITY_SKIP+=	v8/tools/run-llprof.sh
+CHECK_PORTABILITY_SKIP+=	third_party/electron_node/deps/v8/tools/profiling/run-llprof.sh
+
+TOOL_DEPENDS+=			cmake-[0-9]*:../../devel/cmake
+TOOL_DEPENDS+=			git-base-[0-9]*:../../devel/git-base
+TOOL_DEPENDS+=			gperf>=3.0.1:../../devel/gperf
+TOOL_DEPENDS+=			esbuild>=${ESBUILD_VERSION}:../../www/esbuild
+TOOL_DEPENDS+=			nasm-[0-9]*:../../devel/nasm
+TOOL_DEPENDS+=			ninja-build-[0-9]*:../../devel/ninja-build
+TOOL_DEPENDS+=			${PYPKGPREFIX}-html5lib-[0-9]*:../../textproc/py-html5lib
+TOOL_DEPENDS+=			${PYPKGPREFIX}-beautifulsoup4-[0-9]*:../../www/py-beautifulsoup4
+TOOL_DEPENDS+=			${PYPKGPREFIX}-ply-[0-9]*:../../devel/py-ply
+TOOL_DEPENDS+=			rust-bindgen-[0-9]*:../../devel/rust-bindgen
+TOOL_DEPENDS+=			yarn-[0-9]*:../../devel/yarn
+
+DEPENDS+=			xdg-utils-[0-9]*:../../misc/xdg-utils
+
+.include "electron.mk"
+.include "../../mk/compiler.mk"
+
+.include "../../mk/dlopen.buildlink3.mk"
+BUILDLINK_TRANSFORM+=		opt:-ldl:${BUILDLINK_LDADD.dl:Q}
+
+# Let to chromium use the -Wl,-z,relro flag
+BUILDLINK_TRANSFORM+=		rm:-Wl,-zrelro
+
+# Do not use alloca(3) in libc.
+BUILDLINK_TRANSFORM+=		opt:-std=c11:-std=gnu11
+BUILDLINK_TRANSFORM+=		opt:-std=c99:-std=gnu99
+BUILDLINK_TRANSFORM+=		opt:-std=c++14:-std=gnu++14
+BUILDLINK_TRANSFORM+=		opt:-std=c++17:-std=gnu++17
+BUILDLINK_TRANSFORM+=		opt:-std=c++20:-std=gnu++20
+
+REPLACE_BASH=		chrome/tools/build/linux/chrome-wrapper
+FILES_SUBST+=		PYTHONBIN=${PYTHONBIN:Q}
+
+SUBST_CLASSES+=		path
+SUBST_STAGE.path=	pre-configure
+SUBST_MESSAGE.path=	Fixing pathes
+SUBST_FILES.path+=	base/base_paths_posix.cc
+SUBST_FILES.path+=	base/process/process_handle_openbsd.cc
+SUBST_FILES.path+=	build/config/rust.gni
+SUBST_FILES.path+=	build/linux/strip_binary.gni
+SUBST_FILES.path+=	build/gn_run_binary.py
+SUBST_FILES.path+=	build/rust/rust_bindgen.gni
+SUBST_FILES.path+=	build/rust/rust_bindgen_generator.gni
+SUBST_FILES.path+=	chrome/common/chrome_paths.cc
+SUBST_FILES.path+=	components/policy/core/common/policy_paths.cc
+SUBST_FILES.path+=	sandbox/policy/openbsd/sandbox_openbsd.cc
+SUBST_FILES.path+=	services/device/hid/hid_service_freebsd.cc
+SUBST_FILES.path+=	services/device/time_zone_monitor/time_zone_monitor_linux.cc
+SUBST_FILES.path+=	third_party/blink/renderer/build/scripts/run_with_pythonpath.py
+SUBST_FILES.path+=	electron/spec/api-app.spec.ts
+SUBST_FILES.path+=	third_party/electron_node/tools/generate_config_gypi.py
+SUBST_FILES.path+=	third_party/perfetto/src/base/utils.cc
+SUBST_FILES.path+=	third_party/test_fonts/fontconfig/BUILD.gn
+SUBST_FILES.path+=	third_party/vulkan-loader/src/BUILD.gn
+SUBST_FILES.path+=	third_party/wayland/BUILD.gn
+SUBST_FILES.path+=	tools/protoc_wrapper/protoc_wrapper.py
+SUBST_FILES.path+=	v8/tools/run.py
+SUBST_FILES.path+=	v8/tools/run-paxctl.py
+SUBST_VARS.path+=	PREFIX PKG_SYSCONFBASE VARBASE QTDIR X11BASE PYTHONBIN
+SUBST_VARS.path+=	WRKSRC SH
+
+.include "options.mk"
+
+BUILDTYPE=	Release
+MAKE_ENV+=	BUILDTYPE=${BUILDTYPE}
+MAKE_ENV+=	GPERF=${PREFIX}/bin/gperf
+TARGET=		electron electron:node_headers
+#TARGET+=	chromedriver
+TARGET+=	licenses version
+
+# These libraries are used from the system and the build infrastructure
+# removes them from the bundled third_party directory and replaces them
+# with hooks to use them from the system.
+GN_SYSTEM_LIBS=		dav1d
+GN_SYSTEM_LIBS+=	fontconfig
+#GN_SYSTEM_LIBS+=	icu
+GN_SYSTEM_LIBS+=	libaom
+GN_SYSTEM_LIBS+=	libjpeg # libjpeg-turbo
+GN_SYSTEM_LIBS+=	libpng
+GN_SYSTEM_LIBS+=	libvpx
+GN_SYSTEM_LIBS+=	libxml
+GN_SYSTEM_LIBS+=	libxslt
+GN_SYSTEM_LIBS+=	openh264
+GN_SYSTEM_LIBS+=	opus
+
+GN_ARGS+=	chrome_pgo_phase=0
+GN_ARGS+=	clang_use_chrome_plugins=false
+GN_ARGS+=	disable_fieldtrial_testing_config=true
+GN_ARGS+=	enable_backup_ref_ptr_support=false
+GN_ARGS+=	enable_hangout_services_extension=true
+GN_ARGS+=	enable_remoting=false
+GN_ARGS+=	enable_resource_allowlist_generation=false
+GN_ARGS+=	fatal_linker_warnings=false
+GN_ARGS+=	icu_use_data_file=false
+GN_ARGS+=	is_cfi=false
+GN_ARGS+=	is_clang=true
+GN_ARGS+=	is_component_build=false
+GN_ARGS+=	is_debug=false
+GN_ARGS+=	is_official_build=true
+GN_ARGS+=	moc_qt6_path="${PREFIX}/qt6/libexec"
+GN_ARGS+=	optimize_webui=true
+GN_ARGS+=	override_electron_version="${ELECTRON_VER}"
+GN_ARGS+=	thin_lto_enable_optimizations=true
+GN_ARGS+=	treat_warnings_as_errors=false
+GN_ARGS+=	use_allocator_shim=false
+GN_ARGS+=	use_cups=true
+GN_ARGS+=	use_custom_libcxx=true
+GN_ARGS+=	use_custom_libunwind=true
+GN_ARGS+=	use_kerberos=false
+GN_ARGS+=	use_lld=false
+GN_ARGS+=	use_partition_alloc=true
+GN_ARGS+=	use_partition_alloc_as_malloc=false
+GN_ARGS+=	use_qt5=false
+GN_ARGS+=	use_qt6=true
+GN_ARGS+=	use_sndio=false
+GN_ARGS+=	use_sysroot=false
+GN_ARGS+=	use_system_freetype=true
+GN_ARGS+=	use_system_harfbuzz=true
+GN_ARGS+=	use_system_libdrm=true
+GN_ARGS+=	use_system_libjpeg=true #libjpeg-turbo
+GN_ARGS+=	use_thin_lto=false
+#GN_ARGS+=	use_typescript_go=false
+GN_ARGS+=	use_udev=true
+GN_ARGS+=	use_vaapi=false
+GN_ARGS+=	v8_enable_cet_ibt=true
+GN_ARGS+=	v8_builtins_profiling_log_file=""
+
+# flags
+CFLAGS+=	-fno-stack-protector
+CFLAGS+=	-isystem${PREFIX}/lib/clang/${LLVM_MV}/include # third_party/zlib with clang
+CFLAGS+=	-Wno-error=unused-command-line-argument
+CFLAGS+=	-Wno-unknown-warning-option
+CFLAGS+=	-I${PREFIX}/include/node
+
+EXTRA_LDFLAGS=	-L${PREFIX}/lib \
+		-L${X11BASE}/lib \
+		${COMPILER_RPATH_FLAG}${PREFIX}/lib \
+		${COMPILER_RPATH_FLAG}${PREFIX}/lib/nspr \
+		${COMPILER_RPATH_FLAG}${PREFIX}/lib/nss \
+		${COMPILER_RPATH_FLAG}${X11BASE}/lib
+EXTRA_CXXFLAGS=	-Wno-unknown-warning-option \
+		-I${BUILDLINK_DIR}/include \
+		-I${BUILDLINK_DIR}/include/libepoll-shim \
+		-I${BUILDLINK_DIR}/include/glib \
+		-I${BUILDLINK_DIR}/include/nss
+
+# rust
+MAKE_ENV+=	RUSTC_BOOTSTRAP=1
+GN_ARGS+=	enable_rust=true
+GN_ARGS+=	rust_sysroot_absolute="${PREFIX}"
+
+FFMPEG_PARTS=		config.h config_components.h libavcodec libavformat libavutil
+.if ${MACHINE_ARCH} == "aarch64"
+FFMPEG_TARGET=		arm64
+.elif ${MACHINE_ARCH} == "x86_64"
+TOOL_DEPENDS+=		nasm-[0-9]*:../../devel/nasm
+FFMPEG_PARTS+=		config.asm config_components.asm
+FFMPEG_TARGET=		x64
+.endif
+
+GN_ARGS+=	extra_cxxflags="${EXTRA_CXXFLAGS}" \
+		extra_ldflags="${EXTRA_LDFLAGS}"
+
+# Proprietary codecs are enabled.
+FFMPEG_BRAND=	Chrome
+FFMPEG_BDIR=	${WRKSRC}/third_party/ffmpeg/build.${FFMPEG_TARGET}.${LOWER_OPSYS}/${FFMPEG_BRAND}
+FFMPEG_CDIR=	${WRKSRC}/third_party/ffmpeg/chromium/config/${FFMPEG_BRAND}/${LOWER_OPSYS}/${FFMPEG_TARGET}
+
+GN_ARGS+=	proprietary_codecs=true \
+		ffmpeg_branding="${FFMPEG_BRAND}"
+
+GN_BOOTSTRAP_FLAGS+=	--no-clean --no-rebuild
+GN_BOOTSTRAP_FLAGS+=	--skip-generate-buildfiles
+
+# API key and OAuth credential for Google.
+# This is pkgsrc use only.
+#GN_ARGS+=	google_api_key=\"AIzaSyAT_3ogzNMKbBMFk3xQ6T35fg52Y9GrFBg\"
+
+PLIST_SUBST+=		ELECTRONBASE=${PKGBASE}
+PLIST_SUBST+=		ELECTRON_MAJOR=${ELECTRON_MAJOR}
+PRINT_PLIST_AWK+=	{ gsub(/^lib\/${PKGBASE}\//, "lib/$${ELECTRONBASE}/"); }
+PRINT_PLIST_AWK+=	{ gsub(/^bin\/electron${ELECTRON_MAJOR}/, "bin/electron$${ELECTRON_MAJOR}"); }
+
+NOT_PAX_MPROTECT_SAFE+=	lib/${PKGBASE}/electron
+
+PKG_CC=			clang
+PKG_CXX=		clang++
+
+UNLIMIT_RESOURCES=	datasize
+
+post-extract:
+	# Make source tree
+	${MV} ${WRKSRC} ${WRKDIR}/temp
+	${MV} ${WRKDIR}/chromium-${CHROMIUM_VERSION} ${WRKSRC}
+	cd ${WRKDIR}/temp/pkgsrc/chromium-nb && \
+		${FIND} . -type f -print | pax -rw -pmp ${WRKSRC}
+	${MV} ${WRKDIR}/temp/pkgsrc/electron_node ${WRKSRC}/third_party/electron_node
+	${MV} ${WRKDIR}/temp/pkgsrc/nan ${WRKSRC}/third_party/nan
+	${MV} ${WRKDIR}/temp/pkgsrc/squirrel.mac ${WRKSRC}/third_party/squirrel.mac
+	${MV} ${WRKDIR}/temp/pkgsrc/rollup ${WRKSRC}/rollup
+	${MV} ${WRKDIR}/temp/pkgsrc/esbuild ${WRKSRC}/esbuild
+	${MV} ${WRKDIR}/temp ${WRKSRC}/electron
+
+	# Install node modules for electron
+	${SED} -i.bak '/.*prepare.*husky.*/d' ${WRKSRC}/electron/package.json
+	cd ${WRKSRC}/electron && ${SETENV} \
+		HOME=${WRKDIR}/.home XDG_CACHE_HOME=${WRKDIR}/.cache \
+		YARN_GLOBAL_FOLDER=${WRKDIR}/.home/.yarn-global \
+		YARN_CACHE_FOLDER=${WRKDIR}/${ELECTRON}-node_modules-${ELECTRON_VER} \
+		YARN_ENABLE_GLOBAL_CACHE=false YARN_ENABLE_NETWORK=0 \
+		YARN_ENABLE_TELEMETRY=0 YARN_ENABLE_PROGRESS_BARS=0 \
+		yarn install --immutable --immutable-cache --mode=skip-build
+
+	# Apply electron patches
+	cd ${WRKSRC} && \
+		${SH} ${FILESDIR}/apply-electron-patches.sh
+
+pre-configure:
+	# Prepare node modules for electron
+	cd ${WRKSRC}/electron && ${SETENV} ${MAKE_ENV} \
+		HOME=${WRKDIR}/.home XDG_CACHE_HOME=${WRKDIR}/.cache \
+		YARN_GLOBAL_FOLDER=${WRKDIR}/.home/.yarn-global \
+		YARN_CACHE_FOLDER=${WRKDIR}/${ELECTRON}-node_modules-${ELECTRON_VER} \
+		YARN_ENABLE_GLOBAL_CACHE=false YARN_ENABLE_NETWORK=0 \
+		YARN_ENABLE_TELEMETRY=0 YARN_ENABLE_PROGRESS_BARS=0 \
+		npm_config_nodedir=${PREFIX} SENTRYCLI_SKIP_DOWNLOAD=1 \
+		yarn rebuild
+
+	# Prepare internal ffmpeg
+	cd ${WRKSRC}/media/ffmpeg && \
+		${PYTHONBIN} scripts/build_ffmpeg.py \
+		${LOWER_OPSYS} ${FFMPEG_TARGET} --config-only --branding=${FFMPEG_BRAND}
+	cd ${FFMPEG_BDIR} && ${GMAKE} ffversion.h
+	${INSTALL_DATA_DIR} ${FFMPEG_CDIR}
+.for ffmpeg_part in ${FFMPEG_PARTS}
+	cp -pR ${FFMPEG_BDIR}/${ffmpeg_part} ${FFMPEG_CDIR}
+.endfor
+
+	# Prepare rust-toolchain
+	${MKDIR} ${WRKSRC}/third_party/rust-toolchain/bin
+	${LN} -sf ${PREFIX}/bin/rustc \
+		${WRKSRC}/third_party/rust-toolchain/bin/rustc
+
+	# Prepare gperf
+	${LN} -sf ${PREFIX}/bin/gperf \
+		${WRKSRC}/third_party/gperf/cipd/bin/gperf
+
+	# Prepare nodejs
+	${MKDIR} ${WRKSRC}/third_party/node/${LOWER_OPSYS}/node-${LOWER_OPSYS}/bin
+	${LN} -sf ${PREFIX}/bin/node \
+		${WRKSRC}/third_party/node/${LOWER_OPSYS}/node-${LOWER_OPSYS}/bin/node
+
+	# Prepare esbuild
+	${LN} -sf ${PREFIX}/bin/esbuild \
+		${WRKSRC}/third_party/devtools-frontend/src/third_party/esbuild/esbuild
+
+	# Prepare rollup
+	${MKDIR} ${WRKSRC}/third_party/devtools-frontend/src/node_modules/@rollup/rollup-${LOWER_OPSYS}
+
+do-configure:
+	${RUN} cd ${WRKSRC}/esbuild && \
+		${WRKSRC}/third_party/node/${LOWER_OPSYS}/node-${LOWER_OPSYS}/bin/node scripts/esbuild.js \
+		${WRKSRC}/third_party/devtools-frontend/src/third_party/esbuild/esbuild --neutral
+	${RM} -rf ${WRKSRC}/third_party/devtools-frontend/src/node_modules/esbuild
+	${LN} -sf ${WRKSRC}/esbuild/npm/esbuild \
+		${WRKSRC}/third_party/devtools-frontend/src/node_modules/esbuild
+
+	cd ${WRKSRC} && \
+		${SETENV} ${MAKE_ENV} ${PYTHONBIN} ./build/linux/unbundle/replace_gn_files.py \
+		--system-libraries ${GN_SYSTEM_LIBS} || ${FALSE}
+
+	cd ${WRKSRC}/tools/gn && \
+		${SETENV} ${MAKE_ENV} ${PYTHONBIN} bootstrap/bootstrap.py ${GN_BOOTSTRAP_FLAGS}
+
+	cd ${WRKSRC} && \
+		${SETENV} ${CONFIGURE_ENV} ./out/${BUILDTYPE}/gn \
+		gen --args='import("//electron/build/args/${GN_FILE}") ${GN_ARGS}' \
+		--script-executable="${PYTHONBIN}" ${GN_VERBOSE} out/${BUILDTYPE}
+
+do-build: do-cargo-build
+	cd ${WRKSRC}/third_party/devtools-frontend/src/node_modules/@rollup && \
+	${CP} ${WRKSRC}/rollup/rust/target/release/libbindings_napi.so \
+		rollup-${LOWER_OPSYS}/rollup.${LOWER_OPSYS}.node && \
+		${ECHO} '{ "main": "./rollup.${LOWER_OPSYS}.node" }' > rollup-${LOWER_OPSYS}/package.json
+	${RUN} ${_ULIMIT_CMD} cd ${WRKSRC} && \
+	${SETENV} ${MAKE_ENV} ${PREFIX}/bin/ninja -j ${_MAKE_JOBS_N} -C out/${BUILDTYPE} ${TARGET}
+
+
+BUILDDIR=		${WRKSRC}/out/${BUILDTYPE}
+INSTALLATION_DIRS+=	lib/${PKGBASE}
+INSTALLATION_DIRS+=	bin
+
+ELECTRON_LIBS+=		libEGL.so
+ELECTRON_LIBS+=		libGLESv2.so
+ELECTRON_LIBS+=		libVkICD_mock_icd.so
+ELECTRON_LIBS+=		libffmpeg.so
+.if ${MACHINE_ARCH} != "aarch64"
+ELECTRON_LIBS+=		libvk_swiftshader.so
+ELECTRON_LIBS+=		vk_swiftshader_icd.json
+.endif
+
+do-install:
+.for i in electron mksnapshot v8_context_snapshot_generator
+	${INSTALL_PROGRAM} ${BUILDDIR}/${i} ${DESTDIR}${PREFIX}/lib/${PKGBASE}
+.endfor
+	${LN} -s ${PREFIX}/lib/${PKGBASE}/electron ${DESTDIR}${PREFIX}/bin/${PKGBASE}
+	#${INSTALL_PROGRAM} ${BUILDDIR}/chromedriver.unstripped  ${DESTDIR}${PREFIX}/lib/${PKGBASE}/chromedriver
+.for i in ${ELECTRON_LIBS}
+	${INSTALL_LIB} ${BUILDDIR}/${i} ${DESTDIR}${PREFIX}/lib/${PKGBASE}
+.endfor
+	${INSTALL_LIB} ${BUILDDIR}/libvulkan.so.1 ${DESTDIR}${PREFIX}/lib/${PKGBASE}/libvulkan.so
+	${INSTALL_DATA} ${BUILDDIR}/*.pak ${DESTDIR}${PREFIX}/lib/${PKGBASE}
+.for i in locales resources gen/electron/buildflags gen/v8/embedded.S gen/electron/tsc
+	cd ${WRKSRC}/out/${BUILDTYPE} && \
+		${FIND} ${i} -type f -print | pax -rw -pmp ${DESTDIR}${PREFIX}/lib/${PKGBASE}
+.endfor
+	cd ${WRKSRC}/out/${BUILDTYPE}/gen && \
+		${FIND} node_headers -type f -print | pax -rw -pmp ${DESTDIR}${PREFIX}/lib/${PKGBASE}
+.for f in snapshot_blob.bin v8_context_snapshot.bin LICENSE LICENSES.chromium.html version
+	${INSTALL_DATA} ${BUILDDIR}/${f} ${DESTDIR}${PREFIX}/lib/${PKGBASE}
+.endfor
+
+BUILDLINK_DEPMETHOD.clang=	build
+.include "../../lang/clang/buildlink3.mk"
+.include "../../lang/rust/cargo.mk"
+.include "../../sysutils/desktop-file-utils/desktopdb.mk"
+.include "../../mk/bsd.pkg.mk"
diff --git a/electron44/PLIST b/electron44/PLIST
new file mode 100644
index 0000000000..598bc33e00
--- /dev/null
+++ b/electron44/PLIST
@@ -0,0 +1,590 @@
+@comment $NetBSD$
+bin/electron${ELECTRON_MAJOR}
+lib/${ELECTRONBASE}/LICENSE
+lib/${ELECTRONBASE}/LICENSES.chromium.html
+lib/${ELECTRONBASE}/chrome_100_percent.pak
+lib/${ELECTRONBASE}/chrome_200_percent.pak
+lib/${ELECTRONBASE}/electron
+lib/${ELECTRONBASE}/gen/electron/buildflags/buildflags.h
+lib/${ELECTRONBASE}/gen/electron/tsc/typings/electron.d.ts
+lib/${ELECTRONBASE}/gen/v8/embedded.S
+lib/${ELECTRONBASE}/libEGL.so
+lib/${ELECTRONBASE}/libGLESv2.so
+lib/${ELECTRONBASE}/libVkICD_mock_icd.so
+lib/${ELECTRONBASE}/libffmpeg.so
+${PLIST.swiftshader}lib/${ELECTRONBASE}/libvk_swiftshader.so
+lib/${ELECTRONBASE}/libvulkan.so
+lib/${ELECTRONBASE}/locales/af.pak
+lib/${ELECTRONBASE}/locales/af.pak.info
+lib/${ELECTRONBASE}/locales/af_FEMININE.pak
+lib/${ELECTRONBASE}/locales/af_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/af_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/af_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/af_NEUTER.pak
+lib/${ELECTRONBASE}/locales/af_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/am.pak
+lib/${ELECTRONBASE}/locales/am.pak.info
+lib/${ELECTRONBASE}/locales/am_FEMININE.pak
+lib/${ELECTRONBASE}/locales/am_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/am_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/am_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/am_NEUTER.pak
+lib/${ELECTRONBASE}/locales/am_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ar.pak
+lib/${ELECTRONBASE}/locales/ar.pak.info
+lib/${ELECTRONBASE}/locales/ar_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ar_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ar_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ar_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ar_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ar_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/bg.pak
+lib/${ELECTRONBASE}/locales/bg.pak.info
+lib/${ELECTRONBASE}/locales/bg_FEMININE.pak
+lib/${ELECTRONBASE}/locales/bg_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/bg_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/bg_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/bg_NEUTER.pak
+lib/${ELECTRONBASE}/locales/bg_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/bn.pak
+lib/${ELECTRONBASE}/locales/bn.pak.info
+lib/${ELECTRONBASE}/locales/bn_FEMININE.pak
+lib/${ELECTRONBASE}/locales/bn_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/bn_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/bn_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/bn_NEUTER.pak
+lib/${ELECTRONBASE}/locales/bn_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ca.pak
+lib/${ELECTRONBASE}/locales/ca.pak.info
+lib/${ELECTRONBASE}/locales/ca_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ca_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ca_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ca_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ca_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ca_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/cs.pak
+lib/${ELECTRONBASE}/locales/cs.pak.info
+lib/${ELECTRONBASE}/locales/cs_FEMININE.pak
+lib/${ELECTRONBASE}/locales/cs_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/cs_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/cs_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/cs_NEUTER.pak
+lib/${ELECTRONBASE}/locales/cs_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/da.pak
+lib/${ELECTRONBASE}/locales/da.pak.info
+lib/${ELECTRONBASE}/locales/da_FEMININE.pak
+lib/${ELECTRONBASE}/locales/da_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/da_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/da_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/da_NEUTER.pak
+lib/${ELECTRONBASE}/locales/da_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/de.pak
+lib/${ELECTRONBASE}/locales/de.pak.info
+lib/${ELECTRONBASE}/locales/de_FEMININE.pak
+lib/${ELECTRONBASE}/locales/de_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/de_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/de_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/de_NEUTER.pak
+lib/${ELECTRONBASE}/locales/de_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/el.pak
+lib/${ELECTRONBASE}/locales/el.pak.info
+lib/${ELECTRONBASE}/locales/el_FEMININE.pak
+lib/${ELECTRONBASE}/locales/el_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/el_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/el_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/el_NEUTER.pak
+lib/${ELECTRONBASE}/locales/el_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/en-GB.pak
+lib/${ELECTRONBASE}/locales/en-GB.pak.info
+lib/${ELECTRONBASE}/locales/en-GB_FEMININE.pak
+lib/${ELECTRONBASE}/locales/en-GB_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/en-GB_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/en-GB_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/en-GB_NEUTER.pak
+lib/${ELECTRONBASE}/locales/en-GB_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/en-US.pak
+lib/${ELECTRONBASE}/locales/en-US.pak.info
+lib/${ELECTRONBASE}/locales/en-US_FEMININE.pak
+lib/${ELECTRONBASE}/locales/en-US_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/en-US_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/en-US_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/en-US_NEUTER.pak
+lib/${ELECTRONBASE}/locales/en-US_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/es-419.pak
+lib/${ELECTRONBASE}/locales/es-419.pak.info
+lib/${ELECTRONBASE}/locales/es-419_FEMININE.pak
+lib/${ELECTRONBASE}/locales/es-419_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/es-419_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/es-419_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/es-419_NEUTER.pak
+lib/${ELECTRONBASE}/locales/es-419_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/es.pak
+lib/${ELECTRONBASE}/locales/es.pak.info
+lib/${ELECTRONBASE}/locales/es_FEMININE.pak
+lib/${ELECTRONBASE}/locales/es_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/es_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/es_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/es_NEUTER.pak
+lib/${ELECTRONBASE}/locales/es_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/et.pak
+lib/${ELECTRONBASE}/locales/et.pak.info
+lib/${ELECTRONBASE}/locales/et_FEMININE.pak
+lib/${ELECTRONBASE}/locales/et_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/et_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/et_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/et_NEUTER.pak
+lib/${ELECTRONBASE}/locales/et_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/fa.pak
+lib/${ELECTRONBASE}/locales/fa.pak.info
+lib/${ELECTRONBASE}/locales/fa_FEMININE.pak
+lib/${ELECTRONBASE}/locales/fa_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/fa_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/fa_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/fa_NEUTER.pak
+lib/${ELECTRONBASE}/locales/fa_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/fi.pak
+lib/${ELECTRONBASE}/locales/fi.pak.info
+lib/${ELECTRONBASE}/locales/fi_FEMININE.pak
+lib/${ELECTRONBASE}/locales/fi_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/fi_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/fi_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/fi_NEUTER.pak
+lib/${ELECTRONBASE}/locales/fi_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/fil.pak
+lib/${ELECTRONBASE}/locales/fil.pak.info
+lib/${ELECTRONBASE}/locales/fil_FEMININE.pak
+lib/${ELECTRONBASE}/locales/fil_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/fil_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/fil_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/fil_NEUTER.pak
+lib/${ELECTRONBASE}/locales/fil_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/fr.pak
+lib/${ELECTRONBASE}/locales/fr.pak.info
+lib/${ELECTRONBASE}/locales/fr_FEMININE.pak
+lib/${ELECTRONBASE}/locales/fr_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/fr_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/fr_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/fr_NEUTER.pak
+lib/${ELECTRONBASE}/locales/fr_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/gu.pak
+lib/${ELECTRONBASE}/locales/gu.pak.info
+lib/${ELECTRONBASE}/locales/gu_FEMININE.pak
+lib/${ELECTRONBASE}/locales/gu_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/gu_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/gu_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/gu_NEUTER.pak
+lib/${ELECTRONBASE}/locales/gu_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/he.pak
+lib/${ELECTRONBASE}/locales/he.pak.info
+lib/${ELECTRONBASE}/locales/he_FEMININE.pak
+lib/${ELECTRONBASE}/locales/he_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/he_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/he_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/he_NEUTER.pak
+lib/${ELECTRONBASE}/locales/he_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/hi.pak
+lib/${ELECTRONBASE}/locales/hi.pak.info
+lib/${ELECTRONBASE}/locales/hi_FEMININE.pak
+lib/${ELECTRONBASE}/locales/hi_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/hi_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/hi_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/hi_NEUTER.pak
+lib/${ELECTRONBASE}/locales/hi_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/hr.pak
+lib/${ELECTRONBASE}/locales/hr.pak.info
+lib/${ELECTRONBASE}/locales/hr_FEMININE.pak
+lib/${ELECTRONBASE}/locales/hr_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/hr_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/hr_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/hr_NEUTER.pak
+lib/${ELECTRONBASE}/locales/hr_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/hu.pak
+lib/${ELECTRONBASE}/locales/hu.pak.info
+lib/${ELECTRONBASE}/locales/hu_FEMININE.pak
+lib/${ELECTRONBASE}/locales/hu_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/hu_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/hu_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/hu_NEUTER.pak
+lib/${ELECTRONBASE}/locales/hu_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/id.pak
+lib/${ELECTRONBASE}/locales/id.pak.info
+lib/${ELECTRONBASE}/locales/id_FEMININE.pak
+lib/${ELECTRONBASE}/locales/id_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/id_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/id_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/id_NEUTER.pak
+lib/${ELECTRONBASE}/locales/id_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/it.pak
+lib/${ELECTRONBASE}/locales/it.pak.info
+lib/${ELECTRONBASE}/locales/it_FEMININE.pak
+lib/${ELECTRONBASE}/locales/it_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/it_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/it_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/it_NEUTER.pak
+lib/${ELECTRONBASE}/locales/it_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ja.pak
+lib/${ELECTRONBASE}/locales/ja.pak.info
+lib/${ELECTRONBASE}/locales/ja_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ja_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ja_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ja_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ja_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ja_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/kn.pak
+lib/${ELECTRONBASE}/locales/kn.pak.info
+lib/${ELECTRONBASE}/locales/kn_FEMININE.pak
+lib/${ELECTRONBASE}/locales/kn_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/kn_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/kn_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/kn_NEUTER.pak
+lib/${ELECTRONBASE}/locales/kn_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ko.pak
+lib/${ELECTRONBASE}/locales/ko.pak.info
+lib/${ELECTRONBASE}/locales/ko_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ko_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ko_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ko_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ko_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ko_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/lt.pak
+lib/${ELECTRONBASE}/locales/lt.pak.info
+lib/${ELECTRONBASE}/locales/lt_FEMININE.pak
+lib/${ELECTRONBASE}/locales/lt_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/lt_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/lt_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/lt_NEUTER.pak
+lib/${ELECTRONBASE}/locales/lt_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/lv.pak
+lib/${ELECTRONBASE}/locales/lv.pak.info
+lib/${ELECTRONBASE}/locales/lv_FEMININE.pak
+lib/${ELECTRONBASE}/locales/lv_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/lv_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/lv_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/lv_NEUTER.pak
+lib/${ELECTRONBASE}/locales/lv_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ml.pak
+lib/${ELECTRONBASE}/locales/ml.pak.info
+lib/${ELECTRONBASE}/locales/ml_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ml_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ml_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ml_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ml_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ml_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/mr.pak
+lib/${ELECTRONBASE}/locales/mr.pak.info
+lib/${ELECTRONBASE}/locales/mr_FEMININE.pak
+lib/${ELECTRONBASE}/locales/mr_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/mr_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/mr_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/mr_NEUTER.pak
+lib/${ELECTRONBASE}/locales/mr_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ms.pak
+lib/${ELECTRONBASE}/locales/ms.pak.info
+lib/${ELECTRONBASE}/locales/ms_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ms_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ms_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ms_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ms_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ms_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/nb.pak
+lib/${ELECTRONBASE}/locales/nb.pak.info
+lib/${ELECTRONBASE}/locales/nb_FEMININE.pak
+lib/${ELECTRONBASE}/locales/nb_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/nb_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/nb_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/nb_NEUTER.pak
+lib/${ELECTRONBASE}/locales/nb_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/nl.pak
+lib/${ELECTRONBASE}/locales/nl.pak.info
+lib/${ELECTRONBASE}/locales/nl_FEMININE.pak
+lib/${ELECTRONBASE}/locales/nl_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/nl_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/nl_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/nl_NEUTER.pak
+lib/${ELECTRONBASE}/locales/nl_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/pl.pak
+lib/${ELECTRONBASE}/locales/pl.pak.info
+lib/${ELECTRONBASE}/locales/pl_FEMININE.pak
+lib/${ELECTRONBASE}/locales/pl_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/pl_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/pl_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/pl_NEUTER.pak
+lib/${ELECTRONBASE}/locales/pl_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/pt-BR.pak
+lib/${ELECTRONBASE}/locales/pt-BR.pak.info
+lib/${ELECTRONBASE}/locales/pt-BR_FEMININE.pak
+lib/${ELECTRONBASE}/locales/pt-BR_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/pt-BR_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/pt-BR_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/pt-BR_NEUTER.pak
+lib/${ELECTRONBASE}/locales/pt-BR_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/pt-PT.pak
+lib/${ELECTRONBASE}/locales/pt-PT.pak.info
+lib/${ELECTRONBASE}/locales/pt-PT_FEMININE.pak
+lib/${ELECTRONBASE}/locales/pt-PT_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/pt-PT_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/pt-PT_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/pt-PT_NEUTER.pak
+lib/${ELECTRONBASE}/locales/pt-PT_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ro.pak
+lib/${ELECTRONBASE}/locales/ro.pak.info
+lib/${ELECTRONBASE}/locales/ro_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ro_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ro_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ro_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ro_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ro_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ru.pak
+lib/${ELECTRONBASE}/locales/ru.pak.info
+lib/${ELECTRONBASE}/locales/ru_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ru_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ru_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ru_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ru_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ru_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/sk.pak
+lib/${ELECTRONBASE}/locales/sk.pak.info
+lib/${ELECTRONBASE}/locales/sk_FEMININE.pak
+lib/${ELECTRONBASE}/locales/sk_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/sk_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/sk_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/sk_NEUTER.pak
+lib/${ELECTRONBASE}/locales/sk_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/sl.pak
+lib/${ELECTRONBASE}/locales/sl.pak.info
+lib/${ELECTRONBASE}/locales/sl_FEMININE.pak
+lib/${ELECTRONBASE}/locales/sl_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/sl_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/sl_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/sl_NEUTER.pak
+lib/${ELECTRONBASE}/locales/sl_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/sr.pak
+lib/${ELECTRONBASE}/locales/sr.pak.info
+lib/${ELECTRONBASE}/locales/sr_FEMININE.pak
+lib/${ELECTRONBASE}/locales/sr_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/sr_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/sr_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/sr_NEUTER.pak
+lib/${ELECTRONBASE}/locales/sr_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/sv.pak
+lib/${ELECTRONBASE}/locales/sv.pak.info
+lib/${ELECTRONBASE}/locales/sv_FEMININE.pak
+lib/${ELECTRONBASE}/locales/sv_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/sv_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/sv_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/sv_NEUTER.pak
+lib/${ELECTRONBASE}/locales/sv_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/sw.pak
+lib/${ELECTRONBASE}/locales/sw.pak.info
+lib/${ELECTRONBASE}/locales/sw_FEMININE.pak
+lib/${ELECTRONBASE}/locales/sw_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/sw_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/sw_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/sw_NEUTER.pak
+lib/${ELECTRONBASE}/locales/sw_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ta.pak
+lib/${ELECTRONBASE}/locales/ta.pak.info
+lib/${ELECTRONBASE}/locales/ta_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ta_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ta_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ta_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ta_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ta_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/te.pak
+lib/${ELECTRONBASE}/locales/te.pak.info
+lib/${ELECTRONBASE}/locales/te_FEMININE.pak
+lib/${ELECTRONBASE}/locales/te_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/te_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/te_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/te_NEUTER.pak
+lib/${ELECTRONBASE}/locales/te_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/th.pak
+lib/${ELECTRONBASE}/locales/th.pak.info
+lib/${ELECTRONBASE}/locales/th_FEMININE.pak
+lib/${ELECTRONBASE}/locales/th_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/th_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/th_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/th_NEUTER.pak
+lib/${ELECTRONBASE}/locales/th_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/tr.pak
+lib/${ELECTRONBASE}/locales/tr.pak.info
+lib/${ELECTRONBASE}/locales/tr_FEMININE.pak
+lib/${ELECTRONBASE}/locales/tr_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/tr_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/tr_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/tr_NEUTER.pak
+lib/${ELECTRONBASE}/locales/tr_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/uk.pak
+lib/${ELECTRONBASE}/locales/uk.pak.info
+lib/${ELECTRONBASE}/locales/uk_FEMININE.pak
+lib/${ELECTRONBASE}/locales/uk_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/uk_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/uk_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/uk_NEUTER.pak
+lib/${ELECTRONBASE}/locales/uk_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/ur.pak
+lib/${ELECTRONBASE}/locales/ur.pak.info
+lib/${ELECTRONBASE}/locales/ur_FEMININE.pak
+lib/${ELECTRONBASE}/locales/ur_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/ur_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/ur_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/ur_NEUTER.pak
+lib/${ELECTRONBASE}/locales/ur_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/vi.pak
+lib/${ELECTRONBASE}/locales/vi.pak.info
+lib/${ELECTRONBASE}/locales/vi_FEMININE.pak
+lib/${ELECTRONBASE}/locales/vi_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/vi_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/vi_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/vi_NEUTER.pak
+lib/${ELECTRONBASE}/locales/vi_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/zh-CN.pak
+lib/${ELECTRONBASE}/locales/zh-CN.pak.info
+lib/${ELECTRONBASE}/locales/zh-CN_FEMININE.pak
+lib/${ELECTRONBASE}/locales/zh-CN_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/zh-CN_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/zh-CN_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/zh-CN_NEUTER.pak
+lib/${ELECTRONBASE}/locales/zh-CN_NEUTER.pak.info
+lib/${ELECTRONBASE}/locales/zh-TW.pak
+lib/${ELECTRONBASE}/locales/zh-TW.pak.info
+lib/${ELECTRONBASE}/locales/zh-TW_FEMININE.pak
+lib/${ELECTRONBASE}/locales/zh-TW_FEMININE.pak.info
+lib/${ELECTRONBASE}/locales/zh-TW_MASCULINE.pak
+lib/${ELECTRONBASE}/locales/zh-TW_MASCULINE.pak.info
+lib/${ELECTRONBASE}/locales/zh-TW_NEUTER.pak
+lib/${ELECTRONBASE}/locales/zh-TW_NEUTER.pak.info
+lib/${ELECTRONBASE}/mksnapshot
+lib/${ELECTRONBASE}/node_headers/include/node/common.gypi
+lib/${ELECTRONBASE}/node_headers/include/node/config.gypi
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/allocation.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/common.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/cross-thread-persistent.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/custom-space.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/default-platform.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/explicit-management.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/garbage-collected.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/heap-consistency.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/heap-handle.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/heap-state.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/heap-statistics.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/heap.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/api-constants.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/atomic-entry-flag.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/base-page-handle.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/caged-heap-local-data.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/caged-heap.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/compiler-specific.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/conditional-stack-allocated.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/finalizer-trait.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/gc-info.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/logging.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/member-storage.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/name-trait.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/persistent-node.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/pointer-policies.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/internal/write-barrier.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/liveness-broker.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/macros.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/member.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/name-provider.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/object-size-trait.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/persistent.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/platform.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/prefinalizer.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/process-heap-statistics.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/sentinel-pointer.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/source-location.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/testing.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/trace-trait.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/type-traits.h
+lib/${ELECTRONBASE}/node_headers/include/node/cppgc/visitor.h
+lib/${ELECTRONBASE}/node_headers/include/node/js_native_api.h
+lib/${ELECTRONBASE}/node_headers/include/node/js_native_api_types.h
+lib/${ELECTRONBASE}/node_headers/include/node/libplatform/libplatform-export.h
+lib/${ELECTRONBASE}/node_headers/include/node/libplatform/libplatform.h
+lib/${ELECTRONBASE}/node_headers/include/node/libplatform/v8-tracing.h
+lib/${ELECTRONBASE}/node_headers/include/node/node.h
+lib/${ELECTRONBASE}/node_headers/include/node/node_api.h
+lib/${ELECTRONBASE}/node_headers/include/node/node_api_types.h
+lib/${ELECTRONBASE}/node_headers/include/node/node_buffer.h
+lib/${ELECTRONBASE}/node_headers/include/node/node_object_wrap.h
+lib/${ELECTRONBASE}/node_headers/include/node/node_version.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/aix.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/bsd.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/darwin.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/errno.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/linux.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/os390.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/posix.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/sunos.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/threadpool.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/tree.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/unix.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/version.h
+lib/${ELECTRONBASE}/node_headers/include/node/uv/win.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-array-buffer.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-callbacks.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-container.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-context.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-cppgc.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-data.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-date.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-debug.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-embedder-heap.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-embedder-state-scope.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-exception.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-extension.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-external.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-forward.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-function-callback.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-function.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-handle-base.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-initialization.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-internal.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-isolate.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-json.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-local-handle.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-locker.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-maybe.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-memory-span.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-message.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-microtask-queue.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-microtask.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-object.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-persistent-handle.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-platform.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-primitive-object.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-primitive.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-profiler.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-promise.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-proxy.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-regexp.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-sandbox.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-script.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-snapshot.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-source-location.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-statistics.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-template.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-traced-handle.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-typed-array.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-unwinder.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-value-serializer.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-value.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-version.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-wasm.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8-weak-callback-info.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8.h
+lib/${ELECTRONBASE}/node_headers/include/node/v8config.h
+lib/${ELECTRONBASE}/node_headers/include/node/zconf.h
+lib/${ELECTRONBASE}/node_headers/include/node/zlib.h
+lib/${ELECTRONBASE}/resources.pak
+lib/${ELECTRONBASE}/resources/default_app.asar
+lib/${ELECTRONBASE}/resources/inspector_overlay/inspector_overlay_resources.grd
+lib/${ELECTRONBASE}/resources/inspector_overlay/main.js
+lib/${ELECTRONBASE}/snapshot_blob.bin
+lib/${ELECTRONBASE}/v8_context_snapshot.bin
+lib/${ELECTRONBASE}/v8_context_snapshot_generator
+lib/${ELECTRONBASE}/version
+${PLIST.swiftshader}lib/${ELECTRONBASE}/vk_swiftshader_icd.json
diff --git a/electron44/cargo-depends.mk b/electron44/cargo-depends.mk
new file mode 100644
index 0000000000..b80b863b52
--- /dev/null
+++ b/electron44/cargo-depends.mk
@@ -0,0 +1,206 @@
+# $NetBSD: $
+
+CARGO_CRATE_DEPENDS+=	ahash-0.8.12
+CARGO_CRATE_DEPENDS+=	aho-corasick-1.1.4
+CARGO_CRATE_DEPENDS+=	allocator-api2-0.2.21
+CARGO_CRATE_DEPENDS+=	anyhow-1.0.102
+CARGO_CRATE_DEPENDS+=	ar_archive_writer-0.5.1
+CARGO_CRATE_DEPENDS+=	arrayvec-0.7.6
+CARGO_CRATE_DEPENDS+=	ascii-1.1.0
+CARGO_CRATE_DEPENDS+=	ast_node-5.0.0
+CARGO_CRATE_DEPENDS+=	autocfg-1.5.0
+CARGO_CRATE_DEPENDS+=	base-encode-0.3.1
+CARGO_CRATE_DEPENDS+=	base64-0.22.1
+CARGO_CRATE_DEPENDS+=	base64-simd-0.8.0
+CARGO_CRATE_DEPENDS+=	better_scoped_tls-1.0.1
+CARGO_CRATE_DEPENDS+=	bitflags-2.11.1
+CARGO_CRATE_DEPENDS+=	bitvec-1.0.1
+CARGO_CRATE_DEPENDS+=	bstr-1.12.1
+CARGO_CRATE_DEPENDS+=	bumpalo-3.20.2
+CARGO_CRATE_DEPENDS+=	bytes-1.11.1
+CARGO_CRATE_DEPENDS+=	bytes-str-0.2.7
+CARGO_CRATE_DEPENDS+=	castaway-0.2.4
+CARGO_CRATE_DEPENDS+=	cc-1.2.61
+CARGO_CRATE_DEPENDS+=	cfg-if-1.0.4
+CARGO_CRATE_DEPENDS+=	cmake-0.1.58
+CARGO_CRATE_DEPENDS+=	compact_str-0.7.1
+CARGO_CRATE_DEPENDS+=	console_error_panic_hook-0.1.7
+CARGO_CRATE_DEPENDS+=	convert_case-0.11.0
+CARGO_CRATE_DEPENDS+=	ctor-0.11.1
+CARGO_CRATE_DEPENDS+=	dashmap-5.5.3
+CARGO_CRATE_DEPENDS+=	data-encoding-2.11.0
+CARGO_CRATE_DEPENDS+=	debugid-0.8.0
+CARGO_CRATE_DEPENDS+=	displaydoc-0.2.5
+CARGO_CRATE_DEPENDS+=	dragonbox_ecma-0.1.12
+CARGO_CRATE_DEPENDS+=	either-1.15.0
+CARGO_CRATE_DEPENDS+=	equivalent-1.0.2
+CARGO_CRATE_DEPENDS+=	find-msvc-tools-0.1.9
+CARGO_CRATE_DEPENDS+=	fixedbitset-0.5.7
+CARGO_CRATE_DEPENDS+=	foldhash-0.2.0
+CARGO_CRATE_DEPENDS+=	form_urlencoded-1.2.2
+CARGO_CRATE_DEPENDS+=	from_variant-3.0.0
+CARGO_CRATE_DEPENDS+=	funty-2.0.0
+CARGO_CRATE_DEPENDS+=	futures-0.3.32
+CARGO_CRATE_DEPENDS+=	futures-channel-0.3.32
+CARGO_CRATE_DEPENDS+=	futures-core-0.3.32
+CARGO_CRATE_DEPENDS+=	futures-executor-0.3.32
+CARGO_CRATE_DEPENDS+=	futures-io-0.3.32
+CARGO_CRATE_DEPENDS+=	futures-macro-0.3.32
+CARGO_CRATE_DEPENDS+=	futures-sink-0.3.32
+CARGO_CRATE_DEPENDS+=	futures-task-0.3.32
+CARGO_CRATE_DEPENDS+=	futures-util-0.3.32
+CARGO_CRATE_DEPENDS+=	globset-0.4.18
+CARGO_CRATE_DEPENDS+=	hashbrown-0.14.5
+CARGO_CRATE_DEPENDS+=	hashbrown-0.16.1
+CARGO_CRATE_DEPENDS+=	hashbrown-0.17.0
+CARGO_CRATE_DEPENDS+=	heck-0.5.0
+CARGO_CRATE_DEPENDS+=	hermit-abi-0.5.2
+CARGO_CRATE_DEPENDS+=	hstr-3.0.4
+CARGO_CRATE_DEPENDS+=	icu_collections-2.2.0
+CARGO_CRATE_DEPENDS+=	icu_locale_core-2.2.0
+CARGO_CRATE_DEPENDS+=	icu_normalizer-2.2.0
+CARGO_CRATE_DEPENDS+=	icu_normalizer_data-2.2.0
+CARGO_CRATE_DEPENDS+=	icu_properties-2.2.0
+CARGO_CRATE_DEPENDS+=	icu_properties_data-2.2.0
+CARGO_CRATE_DEPENDS+=	icu_provider-2.2.0
+CARGO_CRATE_DEPENDS+=	idna-1.1.0
+CARGO_CRATE_DEPENDS+=	idna_adapter-1.2.2
+CARGO_CRATE_DEPENDS+=	if_chain-1.0.3
+CARGO_CRATE_DEPENDS+=	indexmap-2.14.0
+CARGO_CRATE_DEPENDS+=	is-macro-0.3.7
+CARGO_CRATE_DEPENDS+=	itoa-1.0.18
+CARGO_CRATE_DEPENDS+=	js-sys-0.3.98
+CARGO_CRATE_DEPENDS+=	libc-0.2.186
+CARGO_CRATE_DEPENDS+=	libloading-0.9.0
+CARGO_CRATE_DEPENDS+=	libmimalloc-sys2-0.1.54
+CARGO_CRATE_DEPENDS+=	litemap-0.8.2
+CARGO_CRATE_DEPENDS+=	lock_api-0.4.14
+CARGO_CRATE_DEPENDS+=	memchr-2.8.0
+CARGO_CRATE_DEPENDS+=	mimalloc-safe-0.1.58
+CARGO_CRATE_DEPENDS+=	napi-3.8.6
+CARGO_CRATE_DEPENDS+=	napi-build-2.3.1
+CARGO_CRATE_DEPENDS+=	napi-derive-3.5.5
+CARGO_CRATE_DEPENDS+=	napi-derive-backend-5.0.4
+CARGO_CRATE_DEPENDS+=	napi-sys-3.2.1
+CARGO_CRATE_DEPENDS+=	new_debug_unreachable-1.0.6
+CARGO_CRATE_DEPENDS+=	nohash-hasher-0.2.0
+CARGO_CRATE_DEPENDS+=	num-bigint-0.4.6
+CARGO_CRATE_DEPENDS+=	num-integer-0.1.46
+CARGO_CRATE_DEPENDS+=	num-traits-0.2.19
+CARGO_CRATE_DEPENDS+=	num_cpus-1.17.0
+CARGO_CRATE_DEPENDS+=	object-0.37.3
+CARGO_CRATE_DEPENDS+=	once_cell-1.21.4
+CARGO_CRATE_DEPENDS+=	outref-0.5.2
+CARGO_CRATE_DEPENDS+=	par-core-2.0.0
+CARGO_CRATE_DEPENDS+=	par-iter-2.0.0
+CARGO_CRATE_DEPENDS+=	parking_lot-0.12.5
+CARGO_CRATE_DEPENDS+=	parking_lot_core-0.9.12
+CARGO_CRATE_DEPENDS+=	pathdiff-0.2.3
+CARGO_CRATE_DEPENDS+=	percent-encoding-2.3.2
+CARGO_CRATE_DEPENDS+=	petgraph-0.7.1
+CARGO_CRATE_DEPENDS+=	phf-0.11.3
+CARGO_CRATE_DEPENDS+=	phf_generator-0.11.3
+CARGO_CRATE_DEPENDS+=	phf_macros-0.11.3
+CARGO_CRATE_DEPENDS+=	phf_shared-0.11.3
+CARGO_CRATE_DEPENDS+=	pin-project-lite-0.2.17
+CARGO_CRATE_DEPENDS+=	potential_utf-0.1.5
+CARGO_CRATE_DEPENDS+=	proc-macro2-1.0.106
+CARGO_CRATE_DEPENDS+=	psm-0.1.31
+CARGO_CRATE_DEPENDS+=	quote-1.0.45
+CARGO_CRATE_DEPENDS+=	radium-0.7.0
+CARGO_CRATE_DEPENDS+=	radix_fmt-1.0.0
+CARGO_CRATE_DEPENDS+=	rand-0.8.6
+CARGO_CRATE_DEPENDS+=	rand_core-0.6.4
+CARGO_CRATE_DEPENDS+=	redox_syscall-0.5.18
+CARGO_CRATE_DEPENDS+=	regex-1.12.3
+CARGO_CRATE_DEPENDS+=	regex-automata-0.4.14
+CARGO_CRATE_DEPENDS+=	regex-syntax-0.8.10
+CARGO_CRATE_DEPENDS+=	regress-0.10.5
+CARGO_CRATE_DEPENDS+=	rustc-hash-2.1.2
+CARGO_CRATE_DEPENDS+=	rustversion-1.0.22
+CARGO_CRATE_DEPENDS+=	ryu-1.0.23
+CARGO_CRATE_DEPENDS+=	ryu-js-1.0.2
+CARGO_CRATE_DEPENDS+=	scoped-tls-1.0.1
+CARGO_CRATE_DEPENDS+=	scopeguard-1.2.0
+CARGO_CRATE_DEPENDS+=	semver-1.0.28
+CARGO_CRATE_DEPENDS+=	seq-macro-0.3.6
+CARGO_CRATE_DEPENDS+=	serde-1.0.228
+CARGO_CRATE_DEPENDS+=	serde_core-1.0.228
+CARGO_CRATE_DEPENDS+=	serde_derive-1.0.228
+CARGO_CRATE_DEPENDS+=	serde_json-1.0.149
+CARGO_CRATE_DEPENDS+=	shlex-1.3.0
+CARGO_CRATE_DEPENDS+=	siphasher-0.3.11
+CARGO_CRATE_DEPENDS+=	siphasher-1.0.3
+CARGO_CRATE_DEPENDS+=	slab-0.4.12
+CARGO_CRATE_DEPENDS+=	smallvec-1.15.1
+CARGO_CRATE_DEPENDS+=	smartstring-1.0.1
+CARGO_CRATE_DEPENDS+=	stable_deref_trait-1.2.1
+CARGO_CRATE_DEPENDS+=	stacker-0.1.23
+CARGO_CRATE_DEPENDS+=	static_assertions-1.1.0
+CARGO_CRATE_DEPENDS+=	string_enum-1.0.2
+CARGO_CRATE_DEPENDS+=	swc_allocator-4.0.1
+CARGO_CRATE_DEPENDS+=	swc_atoms-9.0.0
+CARGO_CRATE_DEPENDS+=	swc_common-21.0.1
+CARGO_CRATE_DEPENDS+=	swc_compiler_base-55.0.0
+CARGO_CRATE_DEPENDS+=	swc_config-4.0.1
+CARGO_CRATE_DEPENDS+=	swc_config_macro-1.0.1
+CARGO_CRATE_DEPENDS+=	swc_ecma_ast-23.0.0
+CARGO_CRATE_DEPENDS+=	swc_ecma_codegen-26.0.1
+CARGO_CRATE_DEPENDS+=	swc_ecma_codegen_macros-2.0.2
+CARGO_CRATE_DEPENDS+=	swc_ecma_hooks-0.7.0
+CARGO_CRATE_DEPENDS+=	swc_ecma_minifier-52.0.4
+CARGO_CRATE_DEPENDS+=	swc_ecma_parser-39.0.2
+CARGO_CRATE_DEPENDS+=	swc_ecma_transforms_base-42.0.0
+CARGO_CRATE_DEPENDS+=	swc_ecma_transforms_optimization-44.0.0
+CARGO_CRATE_DEPENDS+=	swc_ecma_utils-29.1.0
+CARGO_CRATE_DEPENDS+=	swc_ecma_visit-23.0.0
+CARGO_CRATE_DEPENDS+=	swc_eq_ignore_macros-1.0.1
+CARGO_CRATE_DEPENDS+=	swc_macros_common-1.0.1
+CARGO_CRATE_DEPENDS+=	swc_sourcemap-10.0.2
+CARGO_CRATE_DEPENDS+=	swc_timer-1.0.0
+CARGO_CRATE_DEPENDS+=	swc_visit-2.0.1
+CARGO_CRATE_DEPENDS+=	syn-2.0.117
+CARGO_CRATE_DEPENDS+=	synstructure-0.13.2
+CARGO_CRATE_DEPENDS+=	tap-1.0.1
+CARGO_CRATE_DEPENDS+=	tinystr-0.8.3
+CARGO_CRATE_DEPENDS+=	tracing-0.1.44
+CARGO_CRATE_DEPENDS+=	tracing-attributes-0.1.31
+CARGO_CRATE_DEPENDS+=	tracing-core-0.1.36
+CARGO_CRATE_DEPENDS+=	triomphe-0.1.15
+CARGO_CRATE_DEPENDS+=	unicode-id-start-1.4.0
+CARGO_CRATE_DEPENDS+=	unicode-ident-1.0.24
+CARGO_CRATE_DEPENDS+=	unicode-segmentation-1.13.2
+CARGO_CRATE_DEPENDS+=	unicode-width-0.2.2
+CARGO_CRATE_DEPENDS+=	url-2.5.8
+CARGO_CRATE_DEPENDS+=	utf8_iter-1.0.4
+CARGO_CRATE_DEPENDS+=	uuid-1.23.1
+CARGO_CRATE_DEPENDS+=	version_check-0.9.5
+CARGO_CRATE_DEPENDS+=	vsimd-0.8.0
+CARGO_CRATE_DEPENDS+=	wasm-bindgen-0.2.121
+CARGO_CRATE_DEPENDS+=	wasm-bindgen-macro-0.2.121
+CARGO_CRATE_DEPENDS+=	wasm-bindgen-macro-support-0.2.121
+CARGO_CRATE_DEPENDS+=	wasm-bindgen-shared-0.2.121
+CARGO_CRATE_DEPENDS+=	windows-link-0.2.1
+CARGO_CRATE_DEPENDS+=	windows-sys-0.59.0
+CARGO_CRATE_DEPENDS+=	windows-targets-0.52.6
+CARGO_CRATE_DEPENDS+=	windows_aarch64_gnullvm-0.52.6
+CARGO_CRATE_DEPENDS+=	windows_aarch64_msvc-0.52.6
+CARGO_CRATE_DEPENDS+=	windows_i686_gnu-0.52.6
+CARGO_CRATE_DEPENDS+=	windows_i686_gnullvm-0.52.6
+CARGO_CRATE_DEPENDS+=	windows_i686_msvc-0.52.6
+CARGO_CRATE_DEPENDS+=	windows_x86_64_gnu-0.52.6
+CARGO_CRATE_DEPENDS+=	windows_x86_64_gnullvm-0.52.6
+CARGO_CRATE_DEPENDS+=	windows_x86_64_msvc-0.52.6
+CARGO_CRATE_DEPENDS+=	writeable-0.6.3
+CARGO_CRATE_DEPENDS+=	wyz-0.5.1
+CARGO_CRATE_DEPENDS+=	xxhash-rust-0.8.15
+CARGO_CRATE_DEPENDS+=	yoke-0.8.2
+CARGO_CRATE_DEPENDS+=	yoke-derive-0.8.2
+CARGO_CRATE_DEPENDS+=	zerocopy-0.8.48
+CARGO_CRATE_DEPENDS+=	zerocopy-derive-0.8.48
+CARGO_CRATE_DEPENDS+=	zerofrom-0.1.7
+CARGO_CRATE_DEPENDS+=	zerofrom-derive-0.1.7
+CARGO_CRATE_DEPENDS+=	zerotrie-0.2.4
+CARGO_CRATE_DEPENDS+=	zerovec-0.11.6
+CARGO_CRATE_DEPENDS+=	zerovec-derive-0.11.3
+CARGO_CRATE_DEPENDS+=	zmij-1.0.21
diff --git a/electron44/distinfo b/electron44/distinfo
new file mode 100644
index 0000000000..85bf83a440
--- /dev/null
+++ b/electron44/distinfo
@@ -0,0 +1,814 @@
+$NetBSD$
+
+BLAKE2s (Mantle-Mantle-2a8e2123a3931038179ee06105c9e6ec336b12ea.tar.gz) = 6a72ade2488aa0e55cafd31c980dea215c930a45618a7727c9e194356b378b1a
+SHA512 (Mantle-Mantle-2a8e2123a3931038179ee06105c9e6ec336b12ea.tar.gz) = b6e4ba3749c90163922ccbcac741fccc08004816f185c65c8462678ed7041fc57bb6537d12d020c714a72c5c9832674bf771b899b57aaefbadd697329b55adc8
+Size (Mantle-Mantle-2a8e2123a3931038179ee06105c9e6ec336b12ea.tar.gz) = 81605 bytes
+BLAKE2s (ReactiveCocoa-ReactiveObjC-74ab5baccc6f7202c8ac69a8d1e152c29dc1ea76.tar.gz) = 86a1c3a076e90f554e3d233086d6767e1d5ecf72dfe56dcb70c8405f28c6a44c
+SHA512 (ReactiveCocoa-ReactiveObjC-74ab5baccc6f7202c8ac69a8d1e152c29dc1ea76.tar.gz) = 66b114e2911555f32376fde8e11123d43d05e78574f0f955056e8de2fc7c24b520e1d39768820ed6f8e65021d7ab3e535892d377c805d8356783bc80ad0a8306
+Size (ReactiveCocoa-ReactiveObjC-74ab5baccc6f7202c8ac69a8d1e152c29dc1ea76.tar.gz) = 1136238 bytes
+BLAKE2s (Squirrel-Squirrel.Mac-fffea30e4a339a7f7d69a3391314b72548d209bd.tar.gz) = 00c2c7b79ac650b7efab2d887232df62718c84b77cb2ed72773f7a8e165822fb
+SHA512 (Squirrel-Squirrel.Mac-fffea30e4a339a7f7d69a3391314b72548d209bd.tar.gz) = 54b39a13c3371cc641f449a536aee1b1727072cd1fbe76706ea514ae6906fa42d5eed57244948a77d929a101550dfed3c4738d9cf71a7929fe21e73acc267658
+Size (Squirrel-Squirrel.Mac-fffea30e4a339a7f7d69a3391314b72548d209bd.tar.gz) = 2140370 bytes
+BLAKE2s (ahash-0.8.12.crate) = 157e4e2836883526fa391419f08c2aa4c932fb96ddf2b254bb436193691754c4
+SHA512 (ahash-0.8.12.crate) = 872e5fa0d1334abac96d10eca18f32c2b1a1e0b38671c132b6effd029e9f0147ddcef79f4d85c8baf0537ddfb8c39a85f61d073e1fb3143dba659a8385641e1b
+Size (ahash-0.8.12.crate) = 43413 bytes
+BLAKE2s (aho-corasick-1.1.4.crate) = 1419308c5b0745af6cfa18dd4c9639f7078f564e9dacbe2b17b03df42c393409
+SHA512 (aho-corasick-1.1.4.crate) = c77e35191b00546f5e499fab154170cedd619599e7250f92db9fba0a41c833eb426f214e58b00c5c39f8757406b33492b3241cb8cb233ce384ad0683c3ee4b62
+Size (aho-corasick-1.1.4.crate) = 184015 bytes
+BLAKE2s (allocator-api2-0.2.21.crate) = 19229533116e7c08961658159a3a9779307bf1241963efefbcb34168b00ed036
+SHA512 (allocator-api2-0.2.21.crate) = 1bb5711ed6041b0d7eae2ec784b8aa9d215db0f49cf79c692946eeb0db545d358cbcaa8156ae34e51d05287c08574f1da251ee574f2392949e4ed26d04770d03
+Size (allocator-api2-0.2.21.crate) = 63622 bytes
+BLAKE2s (anyhow-1.0.102.crate) = 26be8358bef190b04de5f1b7d362aaa57a257601ae31709ea515b461dc770f52
+SHA512 (anyhow-1.0.102.crate) = 18064a92b6d577151b6f1be3df0985fdefdc5f7089ac0aa9bc92a2034c780eac5b71b8fbb260217aea122bee7c950ff00abf4b6d8f4143dff889b7164c7d6f0b
+Size (anyhow-1.0.102.crate) = 48658 bytes
+BLAKE2s (ar_archive_writer-0.5.1.crate) = 453504e9db9b64e6daf4b79de197c01f9f54650aacd39c714c6dfe8633551927
+SHA512 (ar_archive_writer-0.5.1.crate) = 63c6aca1b7122bf846db957e3cc8737e9b56bf5a6a09574bd58a02464f4f149a0cf6931f1fe59c731f56a5832c35891f172e16bbcc8c5fb56c413dcdbb8ce99b
+Size (ar_archive_writer-0.5.1.crate) = 85345 bytes
+BLAKE2s (arrayvec-0.7.6.crate) = ae779f4d40d8bea2f15396d81e905c8e88b941279c0a4545b47e667ab8235e1c
+SHA512 (arrayvec-0.7.6.crate) = b1f320746018a7f32340a833420089446ec5cefb7f299b4506eab7423d5db49f00b72d8aa8c6600f9159b9480d5eb3ce69407d93f5c9934147860c83e4d6eca8
+Size (arrayvec-0.7.6.crate) = 31237 bytes
+BLAKE2s (ascii-1.1.0.crate) = ca239f8104b811c105efb7e7a01e7077477e8d324d23a5f1d2bf328dc9edd071
+SHA512 (ascii-1.1.0.crate) = d74982ad87796f0d745bfd654450dc74174fdc6aa2a0047e5d250f76dd6079189dc0f05d02a73a85b1d3a86c163524d1f43f5d014de0153cd69fad4de26cf0ec
+Size (ascii-1.1.0.crate) = 36075 bytes
+BLAKE2s (ast_node-5.0.0.crate) = 35bdbc1e3796080cdc4d92d3d5aa074a05ae51fc623b7f557fa795c668576ef6
+SHA512 (ast_node-5.0.0.crate) = 414cb87c6009b936b2e34b98b74ea0e5eba2c7ff3374174599475d23a41871d01411e0aa453d3ed7ee35b994e9baf4e0882502cfa206672de6c21ab3e81062d2
+Size (ast_node-5.0.0.crate) = 12169 bytes
+BLAKE2s (autocfg-1.5.0.crate) = d9738bc6755bf80a73705691ef930ca883cd58e4a2d1162b5c0a09cdc7029304
+SHA512 (autocfg-1.5.0.crate) = f279856f234d39d369623576acf9546a1ca24d7fe449f36d4fb93ea75a7efaf2c4015b9616a69bbbed358c5e5882e16b045352f046aa4c049b3d13b1e8257b08
+Size (autocfg-1.5.0.crate) = 18729 bytes
+BLAKE2s (base-encode-0.3.1.crate) = 78a8878f27175129a2edeacf2a0bfeff49e84a56b44e4bc35e33ca361eb62a43
+SHA512 (base-encode-0.3.1.crate) = 92256cfe5677a6b2f5257ca478750ae67a54da95cade5914e88a0d39d68aec789e7b8ff8878058768c0401a8ccbde2513dc7246e4a437d455425aca12afce5ab
+Size (base-encode-0.3.1.crate) = 3630 bytes
+BLAKE2s (base64-0.22.1.crate) = fe73b3b9d1780e56d1208d2e9084cafa72d5e488ef081927b03ccae3108e058a
+SHA512 (base64-0.22.1.crate) = 91cf2e4e7fc8815f9b8a86a7fa722a20eee3dc1dd57111b29e420de87ce7836bcdb1db01d3cafb9a977710ef63e7cc41b7772762323e68e0e832156858aace20
+Size (base64-0.22.1.crate) = 81597 bytes
+BLAKE2s (base64-simd-0.8.0.crate) = 3a509431fbfea7823fa9bd78a49c3ae0566e9640918099d730a24420ae138f18
+SHA512 (base64-simd-0.8.0.crate) = 9f5bb9b28ab502e52b5f755a5ffe213bb4ed392313ba2e43d3ff5bc193eff87e348f651eeb46599308d650348534e79081ab183ad7bb1636a7db6722f8ee96b2
+Size (base64-simd-0.8.0.crate) = 12531 bytes
+BLAKE2s (better_scoped_tls-1.0.1.crate) = 130d3b01ddc785420d5ed62a81ca72f023ce09ab18b9a27bf5fffaf5312963c8
+SHA512 (better_scoped_tls-1.0.1.crate) = 92125cecf8ab88ca69ef987fde768b438508f4b87ef43eaf3dbaaa8d6cf5b09964d700b6ab6eebc2c0ea790f89617812e64765993e1f65dc54b8b3ec505649e6
+Size (better_scoped_tls-1.0.1.crate) = 2140 bytes
+BLAKE2s (bitflags-2.11.1.crate) = 8ee2524fdd029e0c4ea54bb386b8077da59a12bb7a668a1bcf884a09369a6b8b
+SHA512 (bitflags-2.11.1.crate) = c91b5a8b420d8e875a0906ef9b518a392487fba5399355aa5e908132149ddea7cc4222dd271cd5072e50dd9abd6e56420f4205652ba32a57af46bf07636604b7
+Size (bitflags-2.11.1.crate) = 49082 bytes
+BLAKE2s (bitvec-1.0.1.crate) = a905d786a2b567b464d433de34f400310ddb3d60a2195db6a52c332e6cbe0d88
+SHA512 (bitvec-1.0.1.crate) = 83d643c5aca020ebbe9094b5aaba6a796e7c3c509228a4348444e57a06bc3a5dd042eed57a2254d91661e73bdab2bc0d1bd02be376906acc6b6d75b5354a8d8e
+Size (bitvec-1.0.1.crate) = 224375 bytes
+BLAKE2s (bstr-1.12.1.crate) = bf738250e22e04ffa6d9ae59e16bec4997bc7307983bb39e1672cea8cba81d6f
+SHA512 (bstr-1.12.1.crate) = 63a1e62d43c4dce00f287421b1ec76accbbab7f0897c8df26227f533af325896c0c8921a873f4125381e7b89fbb69a4358a96698ec6ee61191955464ff1c84ac
+Size (bstr-1.12.1.crate) = 354916 bytes
+BLAKE2s (bumpalo-3.20.2.crate) = 1c169a9ea0cdd68b6d07273892294f6418aec6c962abc2d67bfcc2b93590433e
+SHA512 (bumpalo-3.20.2.crate) = 4c725a4eb436fc9b3302430f5bec699563bed4b6a86c187defba9a83b749089eb6b00a6855afa4d42ac5eb324088eada3c0713f3e8c2d1c85bea4dcca83a4a60
+Size (bumpalo-3.20.2.crate) = 97696 bytes
+BLAKE2s (bytes-1.11.1.crate) = e4ce48a397044050caef043589fe6c291f600bf26019ec0443bb9bb963b24789
+SHA512 (bytes-1.11.1.crate) = 7933d18c1a2c1496add2c7193e92c3aa17029c530b7031604ccb7c77c68903f53cf7d41396448b32bdd4f540fef4b37564972dac7b225e6e2ca99cd61179a6ab
+Size (bytes-1.11.1.crate) = 78584 bytes
+BLAKE2s (bytes-str-0.2.7.crate) = 42974dacea296881dd900c2f7a9a0b743561c86a291290f8ff524b550bbb077e
+SHA512 (bytes-str-0.2.7.crate) = 38ca1de9070ba07bf5bac7f1e51c52e2ec454b50d29a303605251e70515d5ce560ae77f8521ea67614733cddfeb70a168519ffb3e14194fee57fd707ecf019cc
+Size (bytes-str-0.2.7.crate) = 10230 bytes
+BLAKE2s (castaway-0.2.4.crate) = ef3d95ac9709ba3fd42e6f70548f6f70f0f058382754343736f131b9ab68289a
+SHA512 (castaway-0.2.4.crate) = 15b88016bbeae50146401607549b077b329c9bbae25768536360a964bd5c3b598feedce0365ca4b2662c7b94081062fc469f6a1049fc38187d79daac77b20481
+Size (castaway-0.2.4.crate) = 12546 bytes
+BLAKE2s (cc-1.2.61.crate) = 0b60299e73ef8bf81b23df3890de858dbfed89c669e6723837ddee17b48bbcbb
+SHA512 (cc-1.2.61.crate) = 4728983b06cf6cfb8a042759b7da2d9123939cb3c87fd78d3d7dc565871b5a4aa522afe515bbfff62218d8ef5ca16ed88f777c30b746820c13c9a6bf98dc7ddd
+Size (cc-1.2.61.crate) = 97163 bytes
+BLAKE2s (cfg-if-1.0.4.crate) = 517b7cff4f133f9b02492c0db281822fd02c24941a7aa4f9b1502895dc5e58d9
+SHA512 (cfg-if-1.0.4.crate) = 176e04df7ba783b7143bb84397b777f5c5a1305c08a5c3a218d4a66830620be89ed68992ba27686165bcd3fb2f34b2daf80b2a1d4b481ecc267c988e84d28e9d
+Size (cfg-if-1.0.4.crate) = 9360 bytes
+BLAKE2s (chromium-152.0.7977.169-pkgsrc.tar.xz) = 83a2106de0de2565cf45d4c612cf7dc8b584ca7becdb31c4b61c6fcfcdc4db65
+SHA512 (chromium-152.0.7977.169-pkgsrc.tar.xz) = a5cee133cd8759c55f47e47a3fb5ac5e43025c2038b23b41a105ea31d04f492c4b41ed8ee11a843351cec43d13d5ea8d242b807760fbabd33817c85f6f681ce5
+Size (chromium-152.0.7977.169-pkgsrc.tar.xz) = 1769340836 bytes
+BLAKE2s (cmake-0.1.58.crate) = a4568b73f30075a127114fb24a891b182573483d81080643888ecbd5e954efe7
+SHA512 (cmake-0.1.58.crate) = 49420a5d7d71ddccc21b71373769e1e28ab98c9af1a0c5d59fc3127e6dcc45cb1b7c6b5a37c9110907daceda7fd10bb59344f2bb8f041b18d62b16c22c5d0d60
+Size (cmake-0.1.58.crate) = 20474 bytes
+BLAKE2s (compact_str-0.7.1.crate) = 6234bde96a6aaacbdd67197e14225b43fe01f80421b3c6cc1839bf17cf7ed8fa
+SHA512 (compact_str-0.7.1.crate) = 29ed591024f8f1b478722384664f5700fbde97b44af82fa32a8d1ccdedca9dc425555f9e5a4431a6c954d58cd90d60a25a9ed7f18773ede13edfc68094a23275
+Size (compact_str-0.7.1.crate) = 57246 bytes
+BLAKE2s (console_error_panic_hook-0.1.7.crate) = 9b63b62dfc7dda93c501477c7c08398275c1f7a8286bf58b5b45906d95630922
+SHA512 (console_error_panic_hook-0.1.7.crate) = 49f4fb2175c0068981678f291422ace3737dab7033b1a49d78fd821512c92fdd023c3fe28c7daed88c8f338c30a9c7f82f18bb4583c3fe7839ad8dcd0addd6b9
+Size (console_error_panic_hook-0.1.7.crate) = 507196 bytes
+BLAKE2s (convert_case-0.11.0.crate) = 66e4936df86cfe54fc57bf1999321a39eb3443deab2a5bb05b1b38b31ae579fe
+SHA512 (convert_case-0.11.0.crate) = 6775a77a4ce8b74dd8eb60a5f63f0e4e70446f64ea920872929c4d50de8516ab2c6de3470932c1613f895ae7303c527cae9b2dfbf6731072113fea95e01a6137
+Size (convert_case-0.11.0.crate) = 31545 bytes
+BLAKE2s (ctor-0.11.1.crate) = cad95f0755dea70104e5dd4d51eaeda5e6be65dbd4923b03c3709f1eb0a50936
+SHA512 (ctor-0.11.1.crate) = 89c08f617611ef365783adec025b7574e3bbcaf52045d0d7ab2fe5924fcae3809fa444f0bb2d88e575552418079da119064f7b127fee4b64ac9c81f2f698647f
+Size (ctor-0.11.1.crate) = 32910 bytes
+BLAKE2s (dashmap-5.5.3.crate) = 273c6a6b269681d84d8d390a812c68c63f0ce2c602927104c9f3acca5bd002a0
+SHA512 (dashmap-5.5.3.crate) = 15079a921d768224defebdf8d5339257c9e94a46d115b37ddfca8eb83718b2448555a8982bcf0381a915d292aff9d271a89d3398d2ae2f396dd581cc6883963a
+Size (dashmap-5.5.3.crate) = 24061 bytes
+BLAKE2s (data-encoding-2.11.0.crate) = 56f6ef12fc494fcd46699128d79332448e70d1e6efbedf786df4c96e8a817e95
+SHA512 (data-encoding-2.11.0.crate) = 2e70bca84d0545e59d4ae4ad1ef61afef6c55a09a2056dd8f88bbc1ddd22318eba6faf1be4e0529d4e89bc7b3094798cf4597a1efcff1a4e9b7f3f3d037e5bb3
+Size (data-encoding-2.11.0.crate) = 22677 bytes
+BLAKE2s (debugid-0.8.0.crate) = b21fcf1b06f4321e71bc04c0c4348b142ccae50e4638fe1116469d7d50b9efcb
+SHA512 (debugid-0.8.0.crate) = db992fefad93629dc15aaa8af17b6ba99df9c861a5e148ba388d158143e0bbdca1436e004296860d533431512a5da9d72ac63b09d2c051e95cd3f899df4a62c3
+Size (debugid-0.8.0.crate) = 12757 bytes
+BLAKE2s (displaydoc-0.2.5.crate) = db46de71ab8b2a18c01291fa33a3b3e081dbddc7e8ea1278b6d444e6284eebf2
+SHA512 (displaydoc-0.2.5.crate) = 5ca35fa59f263162389c1180331e9df607d9374bcb056cb04bc46c98e4d87277162ddb2335ffa8a8c5f69218abc3eabccdcaa71c21b8dd9081cc4146f266b948
+Size (displaydoc-0.2.5.crate) = 24219 bytes
+BLAKE2s (dragonbox_ecma-0.1.12.crate) = dafc13d4b3b5f33dbc29b0377b7db59ed8fd92d4325e7393663f4bd455678c59
+SHA512 (dragonbox_ecma-0.1.12.crate) = 77a50c05af4e5631969cbd66c81a5ae3622188d7af80df7675377c531146e0cb6823cb400a2c45bfd280a38fef4ec9d8032e844af6997d25287817df96a4303e
+Size (dragonbox_ecma-0.1.12.crate) = 46796 bytes
+BLAKE2s (either-1.15.0.crate) = 7c84d6a0e5f2b2ab835c6a5a557e2b80af4b533e6d792d546a42ac2f5b846e22
+SHA512 (either-1.15.0.crate) = d70c34d903e8e5088fd065a6da6673eadb569a20af183fa9bd6418940b37c8c2a777c44dbdab1b9960890cba5cb7464b805667ac42f4e05499ddcd4277d24e3f
+Size (either-1.15.0.crate) = 20114 bytes
+BLAKE2s (electron44-44.10.1.tar.gz) = 044e70bf03d53817f95198ebee67d0ceae9b19e84c2b2057d7ea2857f5498a93
+SHA512 (electron44-44.10.1.tar.gz) = 3326e7c390853e20aae9169b946b2ddf5e240e92905b4b2a2d32c9ae8b9c13011fc2381fedc6e5bc58517d12614917f535011faa49911709038f124a9d003c25
+Size (electron44-44.10.1.tar.gz) = 20916579 bytes
+BLAKE2s (electron44-node_modules-44.10.1.tar.gz) = d85c189be946a0df12e70ce794ec54ada2241d8ea42bd30b82fe2e2d7d253d74
+SHA512 (electron44-node_modules-44.10.1.tar.gz) = 7e95e58be4e90ca393864866f9797ff3a60863d169f5e270b205eb4c3428210089eaddbe763d8b6c6abdb6085d4ec76a2383447cd8921611736e2db936e9816d
+Size (electron44-node_modules-44.10.1.tar.gz) = 71721479 bytes
+BLAKE2s (equivalent-1.0.2.crate) = ecc976834a05d886b02d4691be4fa79ccdc19070d8548d36b740fe8f3f137bd6
+SHA512 (equivalent-1.0.2.crate) = 8e0e2dc070794a85b276e93f9e4a65d3bbb8587b33fda211c34479a0b88504c913d8bef9e84d7996254aeabe1efe4ff1ef6259ff4fe3f9ccb90dd90070b3e4d4
+Size (equivalent-1.0.2.crate) = 7419 bytes
+BLAKE2s (evanw-esbuild-v0.28.2.tar.gz) = 0a4c994d6121c5b7d2615c7ad1759a8e76822c61a1c632349e6cb03feb3b0b36
+SHA512 (evanw-esbuild-v0.28.2.tar.gz) = c4cb2ef32e147ebc5099ab501ebcb5fb4e3f16a143a0fd1f9b74efb90e0c24309ab61b236b6e6cf86a235187368bed660ae19403bbda9a84328157fe45ffc5b8
+Size (evanw-esbuild-v0.28.2.tar.gz) = 2008796 bytes
+BLAKE2s (find-msvc-tools-0.1.9.crate) = a62ce966e69815f44f2749cda23bae8872df3012f2bfd0c3c9b0fc988ed3bfae
+SHA512 (find-msvc-tools-0.1.9.crate) = 729b3c1c1d520dffe5d88fc8b58e47fb7e86dc26e568fc317eea5ca8de0ee953fbafaa20ab34a6bfb43173bab39a90ff6954c11dab8d545e902305dafc8cd3de
+Size (find-msvc-tools-0.1.9.crate) = 31493 bytes
+BLAKE2s (fixedbitset-0.5.7.crate) = 926fb5915717b54428ca06ff6b4683a3c8bd976c8920040652b7d88926add2ca
+SHA512 (fixedbitset-0.5.7.crate) = 320b1b47a9f93590f24d5c111c171c401f15a50dc29617c8715b6c9d0b3f26e17f966a87d8628661dfc62ff8dee98524f3b6f4f4391725b1b77db714eb6eef60
+Size (fixedbitset-0.5.7.crate) = 26537 bytes
+BLAKE2s (foldhash-0.2.0.crate) = 093b2ace06b78950fe9cb5eb123449fc6b9454138ee56a7df3db9b9b46153560
+SHA512 (foldhash-0.2.0.crate) = 1495281089a8a1b7bbacf8004a5e8051bb00bf37718e9ddce9d43e4e198f529135f864b6850ee4422456b0d4731ae58647f0a1aaae0d67921c389f5d108fc163
+Size (foldhash-0.2.0.crate) = 23329 bytes
+BLAKE2s (form_urlencoded-1.2.2.crate) = a2bd40109d330e88635133e0c0fda55eb32549353cef6e88f29f37fe4ef801c6
+SHA512 (form_urlencoded-1.2.2.crate) = 07d27d852504e146d586d007b090e53cbe740da140859dfb7d647c83c1b55265a83ea0a0e514587699b1dc6b6ffea2fc913319bcc83b55ebe191801a3b429c8a
+Size (form_urlencoded-1.2.2.crate) = 9347 bytes
+BLAKE2s (from_variant-3.0.0.crate) = 7b033f8223b74ba6d84826e94e721d25e84ea8c2871fdfcaa660f5aad437f1e5
+SHA512 (from_variant-3.0.0.crate) = b46abd3a9169b2a4310bb46588ae6a4b7dd6969c79afbc7f261a69345312add5ef810127121ee61c6004e6f82f7c8c9c58f3944884fe40369632f224f55d2841
+Size (from_variant-3.0.0.crate) = 2391 bytes
+BLAKE2s (funty-2.0.0.crate) = 8d172966af708ab5af6afda0e8b645d9a9b3324905ce19020d65507211602578
+SHA512 (funty-2.0.0.crate) = 691e1c275b648110ef42c4adece8178cf037bad40d469780280eb2ebe07aa4b0406737c5ba02c9f9f63ee57a99fec27e5e51712e2113655f7522c8678f689155
+Size (funty-2.0.0.crate) = 13160 bytes
+BLAKE2s (futures-0.3.32.crate) = df0ee5938fd9c4f425bb82b33faca5ceb49133efe76305cd060241886a2f6883
+SHA512 (futures-0.3.32.crate) = ba0fab7062af4d01143ebaab728b9d836a6589821e49347751add959f7b85c685f91f99b6a31e44988d887c4301bf657c0f8d969cb3ae219235aef2528aeb4ae
+Size (futures-0.3.32.crate) = 61234 bytes
+BLAKE2s (futures-channel-0.3.32.crate) = e2060fda6660cf92e9260151e883bdd8e621637e56c6fb7471b66829ed82ea9f
+SHA512 (futures-channel-0.3.32.crate) = eb60ed5ee42df0778123c5967de28ca29764f518e586768cbed9b43b64c9e44812e2eb551a5259499ec81f693f00b914993bc910dd1f1f50b6a826cb3d76a8ab
+Size (futures-channel-0.3.32.crate) = 33213 bytes
+BLAKE2s (futures-core-0.3.32.crate) = b8086876300298daef1298ef71c3837955efda2a78b6b7b886205ef84fac5a52
+SHA512 (futures-core-0.3.32.crate) = 5848937ad4135fcc488690bc681bf66d6c353f063f87dfe1ea4b79259b9b402896276c10ea80b159a9adfa551abdb5b00a2c6b332af9a898766f87f177a40137
+Size (futures-core-0.3.32.crate) = 14684 bytes
+BLAKE2s (futures-executor-0.3.32.crate) = 833e62bdf4c740ad0857af01fa9c8c44bb9a46c5367055919afe452439f1f118
+SHA512 (futures-executor-0.3.32.crate) = 1bd682040fa15d7b6370b6c57d8109cc6e151230a3ecdede1485906c95feef911cffd15a8bdd3114e87efbba79ce444c05baa7dad6dd74aec09f2f00c645b040
+Size (futures-executor-0.3.32.crate) = 18581 bytes
+BLAKE2s (futures-io-0.3.32.crate) = d990a88137473c14ffe69f7980dccdc44b522656713c97f94a7077c32cda07b8
+SHA512 (futures-io-0.3.32.crate) = df7447fcc2046d5453d26913109bde4dfcfee2cb6914e963b090c68b32fd5256c65697235fa5ca960659791bf787ca6ac88b6b09c42abc82527f3d3c6de5ac61
+Size (futures-io-0.3.32.crate) = 9191 bytes
+BLAKE2s (futures-macro-0.3.32.crate) = 33265c2bf63819be394e511455ab48901f1a6724fae388fb878177addd42a994
+SHA512 (futures-macro-0.3.32.crate) = 39a5d7d4e610521d1d6d285a5ffec43b7d331d92d80e60890448d016ceb30ea577c93eb961321cf6c314273e566964dd879f7cd4b855b9f5e141dffe8e83aff9
+Size (futures-macro-0.3.32.crate) = 11929 bytes
+BLAKE2s (futures-sink-0.3.32.crate) = 61fede39273cddbf5c0d1fc3abbd71a28a6ab484587f5e8dcf58a6c5e2c26691
+SHA512 (futures-sink-0.3.32.crate) = 05438809ce417dc5dc46c14b9190cf798e0ab5b7dd5b442adba2ba344618e076807d4884f4a8cdf2f321a27557b3e3b563805fbd51a9561e9224d7502d4a6bd3
+Size (futures-sink-0.3.32.crate) = 8106 bytes
+BLAKE2s (futures-task-0.3.32.crate) = 21c7cf75266fdeb6a25b736e143bec878e87ad5a5974a417c4b5e2c67cf43376
+SHA512 (futures-task-0.3.32.crate) = eea93a8490d7083566d7f723c0bfae01583787028ae5d8bba851625b1ccb2587d27db0cbf3d7fbfa36b51bd6d444c54905cc4d56021f43a5a440cc8b0ed73520
+Size (futures-task-0.3.32.crate) = 11377 bytes
+BLAKE2s (futures-util-0.3.32.crate) = 2712629417e34728bd0b98b8f5d922ace765c4e359287f75b8b3b7283b9ec4e9
+SHA512 (futures-util-0.3.32.crate) = 77705985b5cefd5a9009e631689f5967320cbd1363888cc8b7eef3f7457afb38c793499fc3edd4453bc8771c43436e5da1538ce0c5ef655a5e597f4fda2727b1
+Size (futures-util-0.3.32.crate) = 168797 bytes
+BLAKE2s (globset-0.4.18.crate) = e11bcd40201278f23b7b3aa74f96441bf85cc94e4c3364847ce6c15c4e5d1115
+SHA512 (globset-0.4.18.crate) = 44afbcdaff506dba351b967ff435752988f7d980e0b908c248c2aa462dcc95c94907a6d9ec7aec28599dc29d3fbd421cdf0bc8082042263b6af69b36fc1a2c54
+Size (globset-0.4.18.crate) = 28970 bytes
+BLAKE2s (hashbrown-0.14.5.crate) = df2dc611777412ee614bffffa4bfd1ffbdb023961c82ec606d14782febc01949
+SHA512 (hashbrown-0.14.5.crate) = 215ea860bd3de80e2dd2d4647c9dd31c0ac895ea7c08b87256dc11d36407e412ffefaebc6cdbec024057dd4f24b3762b4fe427be307e15d1e68ccfde89a99742
+Size (hashbrown-0.14.5.crate) = 141498 bytes
+BLAKE2s (hashbrown-0.16.1.crate) = 008312b14ac41a35952dfcc9eb9e7d5c89ab81567d4251ea5848b6615c7530f4
+SHA512 (hashbrown-0.16.1.crate) = 0739f1b2101488f88778e221d86738ce557b8ae12470e2a4444099eb90d876382030d00e789dd4ee44dcd7833a87a6e570fa11ba5823beb1cab3a56784ec2669
+Size (hashbrown-0.16.1.crate) = 147785 bytes
+BLAKE2s (hashbrown-0.17.0.crate) = a88039d0e8a163584b14fb77bf2778b3003d23f1d7ea860f1fa3d25984a07adb
+SHA512 (hashbrown-0.17.0.crate) = 248f5333b23cb83fd8e439a17df85d0f5bea6dadb0e7cf2cd2d3bd0049494c125ea4fdf74ce2623884d2a3884d444689a0a7cfc9b52ad3d8de40f7498c56ef06
+Size (hashbrown-0.17.0.crate) = 154597 bytes
+BLAKE2s (heck-0.5.0.crate) = 0bc71a5746c9d1e7c913d096fb68f1d422464744e18adc592540b291882f5660
+SHA512 (heck-0.5.0.crate) = f044fc9c3d22466629fd8f772ec0555350fd611c0cfadca51d99a3d2f10e155f77c1091916c8a95a6b9b499f366c2e99a5fbf45b010f988bfb9b2501bf9f6a76
+Size (heck-0.5.0.crate) = 11517 bytes
+BLAKE2s (hermit-abi-0.5.2.crate) = 21b3cc4de2925b458fc585a30e2262593681dd87bc051496a3ea82509b670a62
+SHA512 (hermit-abi-0.5.2.crate) = 0392a8350288e5d500967bee8e98626024b47a7da331f833b9528bd7318cf43f41eefa46aa6aebd19febfadcbcb2d7c9f70d6ca3631c1618d63c60366dbe7c15
+Size (hermit-abi-0.5.2.crate) = 17435 bytes
+BLAKE2s (hstr-3.0.4.crate) = 5363ed07918d7482bbefd75c053f1ae70cbf952a0e2dbd686dcd80f4c5384d9b
+SHA512 (hstr-3.0.4.crate) = 3dd7b9f1caa25fad86414a899e7b9b9e2884d882a5fdb4bc38359f4e53e245b26fd09062607f6fea08902853c3545e9c2b8d64868a125c6709e1b2965b752219
+Size (hstr-3.0.4.crate) = 41168 bytes
+BLAKE2s (icu_collections-2.2.0.crate) = f5e40e8bb134d2b9d955854388d022482d8db58d8b1d8ac99493b9002ced0a48
+SHA512 (icu_collections-2.2.0.crate) = e7997eca01778c9635fd918d05c850d43abc3cada2b1e79c0a4043f2bf275c238d185f1c55ef06548de88eb3d02c3d04f74061cc20e0843ee46f4776e701818e
+Size (icu_collections-2.2.0.crate) = 88011 bytes
+BLAKE2s (icu_locale_core-2.2.0.crate) = a41c1e8bad1d30b8715082d2eafcb1ff7d8aae4fbe08d03eed9f1dbf879fbc18
+SHA512 (icu_locale_core-2.2.0.crate) = bf29c3f1cd5cea979ce82243aa19d4dada121448ddd974b27cb325ac92e18953fa4e9af2758198ba6a41c367ea659c92e450328e85ebf73d231126674e238c2c
+Size (icu_locale_core-2.2.0.crate) = 78639 bytes
+BLAKE2s (icu_normalizer-2.2.0.crate) = f56569561d55d62c132f531763a8c6023db1470259f6759f71acd593e7debab8
+SHA512 (icu_normalizer-2.2.0.crate) = 98e48fcfe47623c592feee082264f50e96a82d89fa17e89d5d94de8e1cf3ec2529625954947d9b3bf9746f1cf0062b3abfd2d8f7cfa3b8e445c98284fbbc7023
+Size (icu_normalizer-2.2.0.crate) = 78154 bytes
+BLAKE2s (icu_normalizer_data-2.2.0.crate) = b9f66acf17911878fc034b6a74279e6e38ee55d316ba3a4f23e9e4900d565984
+SHA512 (icu_normalizer_data-2.2.0.crate) = 494559893b3db0960fc04294e1f606bf466c3970153335f48ff475d22fae614626d66d46130f0943d5345489ed5aa8118737d27b6e883d331993206a39a7484f
+Size (icu_normalizer_data-2.2.0.crate) = 67134 bytes
+BLAKE2s (icu_properties-2.2.0.crate) = 0a26c4d04476a316c0cc039231c09335e3a7994f8b04f818e9f2580d6016b422
+SHA512 (icu_properties-2.2.0.crate) = 880c0e19ca4ea3abe1322f9ce70c7138b0275dfa6c21b32ef65112d30059173b6d532aca0464f6b161aaa94ad56a0bd06b45156ba0c5ecdfab6f9fc52ab73bbc
+Size (icu_properties-2.2.0.crate) = 63950 bytes
+BLAKE2s (icu_properties_data-2.2.0.crate) = 407c818e537ddfb72fe6945ec86c14139e3d0c4af8b671964f63daccde607d5c
+SHA512 (icu_properties_data-2.2.0.crate) = 35330585d459673096b545753e36cdbd3e26b202c2b905032dfcb477c546e4cca6d323d3b5d2f0e7b0e4a983094f048c1543d215fec68535fd5655e839dfbfb7
+Size (icu_properties_data-2.2.0.crate) = 168901 bytes
+BLAKE2s (icu_provider-2.2.0.crate) = 03d31a1383ac97e8c1f7b6e07f01efa7ea382f62affe99958f965eed3cfb161c
+SHA512 (icu_provider-2.2.0.crate) = a1a193fc08ebe34782efd21b70778c38fd9f6d99c08321cd2bb457d6cc91593ecb806dd61b8179fe9b66d99d79d518081eb1d1e2933b08a3b28158806ad6169a
+Size (icu_provider-2.2.0.crate) = 51620 bytes
+BLAKE2s (idna-1.1.0.crate) = 0515fede863b0e4cd8d159ce5125a674a13e5b57e290c307825ab5eed2a34edf
+SHA512 (idna-1.1.0.crate) = 1d49993145fe694f33f7c71ebe62face416f2229b12690cec23ae2e4be2fc1c5aa5ad5651d815ab70057b68edc450ef6004306a775b920b8773c221c0fe6c106
+Size (idna-1.1.0.crate) = 148747 bytes
+BLAKE2s (idna_adapter-1.2.2.crate) = 1b56e16057793f5a80a750123bedb2b4787e4fab7e2c229e3a3ec184b9a8b9e2
+SHA512 (idna_adapter-1.2.2.crate) = c80655c107506022fe6b6d69af7ca2418b070ee66150d743b662e656a2ae04d4ea7b41f7f182fda9fedfa2626e70db30734f8e9af18d23ee39da0c2d4a21949a
+Size (idna_adapter-1.2.2.crate) = 10444 bytes
+BLAKE2s (if_chain-1.0.3.crate) = f403508f256facddc4754aaf60b6a04d8bdc058f2c0b2b399acf87369a241d6c
+SHA512 (if_chain-1.0.3.crate) = 88c4c4521b5cba0be9c8652f19cc0d8c45077100de6a7e6a5aa3ae4b26340e987893081215b2595f94a0e79dcb293bfed8f2f2866dcd66fc189219b3427fbfd9
+Size (if_chain-1.0.3.crate) = 8384 bytes
+BLAKE2s (indexmap-2.14.0.crate) = 6f827c3e302f65a44ef7e6e971d803204f4a3f625e328eba190b015c7ae4263f
+SHA512 (indexmap-2.14.0.crate) = fa6bcaaf1b9bacabc72ae9d0569065325a6741b9ba5dff168ada6ece460175be47741d906d9326b48d30f6c55805d33fb64bfb497490482b4e412ac15a8ea55f
+Size (indexmap-2.14.0.crate) = 104085 bytes
+BLAKE2s (is-macro-0.3.7.crate) = a87a3e16aebb38e79e195305b321b4e58c6bf1d54d7c3ff7de47a9b58faf9469
+SHA512 (is-macro-0.3.7.crate) = 3b56dc6a95566711dac83c0b890b53ef86d9ea8ae6f2f51d8ae7b799f4daea372c353ed0a0429c35342934d4d71609194506782714d7816c6bb97cb4a4c87b5b
+Size (is-macro-0.3.7.crate) = 9060 bytes
+BLAKE2s (itoa-1.0.18.crate) = b4c525cfe99837e3afd95733435e0353ba9116ecebc7a2ec73f3b84db383ba91
+SHA512 (itoa-1.0.18.crate) = 8dbad156e2863c28e2b380901a92414ef00e39f1fcdb06d91a0f3fb73108c2f7f36b699ccd93287808c24c29cca7f1783d48d5ca95f2173502963c0abcb2d09c
+Size (itoa-1.0.18.crate) = 15935 bytes
+BLAKE2s (js-sys-0.3.98.crate) = e9b382a9356de4c5fe798e8976d38babf522d7b75481c3f448385e53fdf81bfb
+SHA512 (js-sys-0.3.98.crate) = afeec49d8a6894d1c7a10d80a6d6500d8677f0c769f74beae8da820932da8ff91ff0e9abcc48fde251e617903578e65af4a9cf88972510e78ae8e1284780675c
+Size (js-sys-0.3.98.crate) = 108519 bytes
+BLAKE2s (kikadf-chromium-nb-v151.1.tar.gz) = 7be745647b792185cb8e178bb6bffac2e42b28307788843944baeed4d8b80670
+SHA512 (kikadf-chromium-nb-v151.1.tar.gz) = 1b0917bfe37ae6b861f9b6bd7ea71c520933d6332b0e703e122d37c681edcb0be526aa398ad1944ee93e54bd03695c9f22cb1e8e1e6f4591efd5600561017bae
+Size (kikadf-chromium-nb-v151.1.tar.gz) = 22480 bytes
+BLAKE2s (libc-0.2.186.crate) = e4ae2a7c2182c3a4f54e39cfed3d574220b3a6d54af5a40aadfd814bb8a12c6a
+SHA512 (libc-0.2.186.crate) = 6a58e671ec6811dff9a0d7d4db8f37d38bcbca9efff20dad4706190e5cdb77b426567754bcf0ef0f2d0c31d6506401f724f3ca500b9bed57bb8605b1141ed690
+Size (libc-0.2.186.crate) = 821883 bytes
+BLAKE2s (libloading-0.9.0.crate) = 509038d74706932445be77ebd156c188cdfea3c92f7c260763e54fa4b309b775
+SHA512 (libloading-0.9.0.crate) = b44399fc7402aee700c04d1ebd45844498b789b35b031c95c58f40d37cc4448750a1a3dd468669461852392ba1c6d602458eb4456ccf1b6eda0da65a43cc4986
+Size (libloading-0.9.0.crate) = 33816 bytes
+BLAKE2s (libmimalloc-sys2-0.1.54.crate) = 342065a230b27c30d8493cce85f0d65b372d9540a3ec9f8c9a788045358bea6c
+SHA512 (libmimalloc-sys2-0.1.54.crate) = 96e80c9afa217c53f4e910cf0632bfebea26912e5990b4836441b37a6fe5dd47766d02d41a0eccd0df227c4a55f85f12e0f810f64a2a3d19a009af6e5a01a4ff
+Size (libmimalloc-sys2-0.1.54.crate) = 1642853 bytes
+BLAKE2s (litemap-0.8.2.crate) = 7a8abd4396eb1d5e14e055c2380afe0f55b1876db8ba87bbbdc9689ffb1de32d
+SHA512 (litemap-0.8.2.crate) = 3afcc1a89aab55368bdfe6848aa1268d37ea8a03130f1f0e1e77d6709e437070be83e9e457bb51a7096c3d93ee0155740e33cab03f7584ff3cd7d8992524a7f6
+Size (litemap-0.8.2.crate) = 34572 bytes
+BLAKE2s (lock_api-0.4.14.crate) = 81b23bbcb4983647d2dc3e3dc9bcf73995d6e7a937b0f2910e42f44595b060cc
+SHA512 (lock_api-0.4.14.crate) = 73164d411c9899323b3bbff4fd6824e2b9ff44971ddd267629ae5a70b456c1ca945716e952412790d35331993ae71600b0e6a2aeefcdda117b26a7222ed97bf0
+Size (lock_api-0.4.14.crate) = 29249 bytes
+BLAKE2s (memchr-2.8.0.crate) = 9d6dade02bc948818801a90933500c8aecf86116a976d3c68dfc7e427b027efd
+SHA512 (memchr-2.8.0.crate) = 8089238153493a0ff6adf980efd1ea2ba10eeff9f33fff200268692662d24152a8c14a4dac37fbc6a55dca741701fd256174f10a9838ca66f038f08e090de12f
+Size (memchr-2.8.0.crate) = 97780 bytes
+BLAKE2s (mimalloc-safe-0.1.58.crate) = 4d75b7cacb4c293dac14ab8e58af930558d46d46ba484fe508fa3c1924443f7f
+SHA512 (mimalloc-safe-0.1.58.crate) = ca8f147973e96bb09b6295c5ffba6da011dd12ff6ecbb705fe9d36d13e664320825276e84fcd97cceaf219ead800172e2620b3588a7b598161ab9d23b19f7ced
+Size (mimalloc-safe-0.1.58.crate) = 7282 bytes
+BLAKE2s (napi-3.8.6.crate) = a8e25b513b486a4d405601c9a3c4d28e1c31b1960b58a72a89f9aab901e8e1ce
+SHA512 (napi-3.8.6.crate) = 48f2f05ba4129d90980c57690718783e7035b8f1870ecbd200fea1e204be6f7bfc7b594d4f95fb41910437bb49ece3d425de03bdcbdc5507f05e2e74b1e05e0f
+Size (napi-3.8.6.crate) = 129092 bytes
+BLAKE2s (napi-build-2.3.1.crate) = 3b0b453a5fd0a4ca728ec1cef380a639b50553cd86ccea7484bba31d8ed87309
+SHA512 (napi-build-2.3.1.crate) = d6dab189e8ad0840f8b4bb9da83052d1d4a378dbbb6f7f66925824a087ea31553e3acbdc5689baffa072adf84d3d0a0d679d0b844171d61c471fd3dc4489a8f2
+Size (napi-build-2.3.1.crate) = 3233 bytes
+BLAKE2s (napi-derive-3.5.5.crate) = 6949af15e5c2ca6f2f4951414b07854f65a551c2284b49a2e6a897633710c90c
+SHA512 (napi-derive-3.5.5.crate) = 7114c5344bfa3d7b4367ff598dc201bed20160c4e8452f6bb6ba7add3abad28f9ae9b28d3f1daa30059e892d90df489bd0f6b2b7d7102390911d2e8acb15428a
+Size (napi-derive-3.5.5.crate) = 22629 bytes
+BLAKE2s (napi-derive-backend-5.0.4.crate) = de543f46c37fb031448cd5cc2fae54eedbed42d0795d5dd4371cfba4bf154584
+SHA512 (napi-derive-backend-5.0.4.crate) = a67d58278c1fd39665b86a90879b6034a87b8ebf0031a70aa9561e02dfce154cfe6c0b0d102663c059a6dafa847a276552562941f31c3e8ef8bd878d0ccf4319
+Size (napi-derive-backend-5.0.4.crate) = 35478 bytes
+BLAKE2s (napi-sys-3.2.1.crate) = f674a4804d4114f7fa383a6ad15a47e2b75e66653bd9550ea0e1207cc482b3a5
+SHA512 (napi-sys-3.2.1.crate) = fb9c96f074030b829e9a335c267a4f65abd0eda4fb8e4a87567c6c08dc883ff9ca1dc0253837da16431c172dcc668bc74a30ecf4c44df9e47f942f90c66ed54f
+Size (napi-sys-3.2.1.crate) = 7465 bytes
+BLAKE2s (new_debug_unreachable-1.0.6.crate) = 62de597a11b53c7adc89a6a92d570f20af21b06ec3177185c2d83f037060818b
+SHA512 (new_debug_unreachable-1.0.6.crate) = 73a61acbc9b20b3595925360827ba8798f3338471b291fa37c72a1c9505b3ec9f688808fcaac9a2eb494e5f3ea5331d30545d5f21f89559111bec6126ac90b48
+Size (new_debug_unreachable-1.0.6.crate) = 2582 bytes
+BLAKE2s (nodejs-nan-675cefebca42410733da8a454c8d9391fcebfbc2.tar.gz) = a0b2f536757207f66940b0257c5f0ee6e2178d70dd12dfb8d20320e1273b76bc
+SHA512 (nodejs-nan-675cefebca42410733da8a454c8d9391fcebfbc2.tar.gz) = dc611da5992e5e203d60ff224cd8b694485755a4bd9f1cb21e039ef2065bbcb1bd4b61b4f2bf609fb45b953c0a40f53585c6541db1418331dfb75661eac25294
+Size (nodejs-nan-675cefebca42410733da8a454c8d9391fcebfbc2.tar.gz) = 111323 bytes
+BLAKE2s (nodejs-node-v24.22.1.tar.gz) = a08778a278f9599e572be38e708e599bba59979f205fe5fe52903db37fe486dc
+SHA512 (nodejs-node-v24.22.1.tar.gz) = 39c8610219e2e4a1fdf3f937b98e67e093dd52f91a49ed23235ec2c2fa75a3a79a9eda8233dddd547c58a40da0f5f1010842568f241407643053e5b5c7933b64
+Size (nodejs-node-v24.22.1.tar.gz) = 130124976 bytes
+BLAKE2s (nohash-hasher-0.2.0.crate) = 48e61ae7c7a2c7cc641828b9833364b6227180d0cb0b1463b33b4152ca374b9b
+SHA512 (nohash-hasher-0.2.0.crate) = b1b754262471ac1fb074559c264321f8f08c46c55752187f51a93cdc73509551b43008751ff9db4aa5b47fbfdda783904f5492349546ad14856fe485ccec55d8
+Size (nohash-hasher-0.2.0.crate) = 8051 bytes
+BLAKE2s (num-bigint-0.4.6.crate) = 8dfb5819f891ded0398ebe71d36bcdc24f03a6ead03591742b17e39304e1a6cb
+SHA512 (num-bigint-0.4.6.crate) = 19d14a7755de2b559026547d9e3e1775e636781bdfdd418f2e1d962c51411a0973a46d84d0356e30c0f708a7c7b2097926611960043f71391919cab1aeb6aa04
+Size (num-bigint-0.4.6.crate) = 102801 bytes
+BLAKE2s (num-integer-0.1.46.crate) = 30d326e4be64cf2f9c9c8066c928b4f142db6fb7e5a15d45985091e652274588
+SHA512 (num-integer-0.1.46.crate) = e27986d91f6c6dc3d5a0900defe28ab5f47905cde3f84d0914b7acee076dca8fec6fdb7b631ac94d3a31eb01ecbc5854e51afc3187cd1abfa21e1bfafdc700ae
+Size (num-integer-0.1.46.crate) = 22331 bytes
+BLAKE2s (num-traits-0.2.19.crate) = 3c64996b86a2f99ad0c535cac3e95e5ca227315695c078d5b17ca8e1b7e47244
+SHA512 (num-traits-0.2.19.crate) = 180018a5eceb45085e4e8d103ff21bb4d5079cea874c42a0ad4c76c99d275d434bbc1cc289f0cdec172866daa89dbfe0871410b2cc3407233fe1129786905956
+Size (num-traits-0.2.19.crate) = 51631 bytes
+BLAKE2s (num_cpus-1.17.0.crate) = bceefcd38aa3357413ea219f505148e618fd0b8bdf578e8ac41656afefc945cd
+SHA512 (num_cpus-1.17.0.crate) = b2d7f664214bceb8acca0758bde4d516267c0c76a70fafa25ed6204eebedd69a110f045682f50cfe6759a9c2178b026df077c5f0f85d020712dab65cf65d0aff
+Size (num_cpus-1.17.0.crate) = 15874 bytes
+BLAKE2s (object-0.37.3.crate) = b4b7425736e758d27bf85879153d4d01e01a43650a32e7e23e6ca03cb453e591
+SHA512 (object-0.37.3.crate) = e6a72ff6ed5066e0b6fd4b5c37dc0c3d334052f3d123fa0aea2dfa45c8ba5700fd6a66f4f76efbd8823f0935c6d1bf9cb3aadcb8eec1370b0126511606038aa8
+Size (object-0.37.3.crate) = 344032 bytes
+BLAKE2s (once_cell-1.21.4.crate) = 5945879c1e46e46585a2692e5f3ac0beaa15f111aa45611e0419b50abb21fb4e
+SHA512 (once_cell-1.21.4.crate) = af67669b0107f44268ba74c355200cb2ed1aab235a6989a8bc54323eb2c9a45677010f8672e7790edadd4c981e939436e0c3a099d33c06dce9c14fd5ede86155
+Size (once_cell-1.21.4.crate) = 35010 bytes
+BLAKE2s (outref-0.5.2.crate) = 73ed851a3f019a8f48f0a49bb5edcd37a6a29d64fd75fc039e544e5395621b68
+SHA512 (outref-0.5.2.crate) = a352eee5f77ca697300d46835deb88821dd9af8165918fee3f32de2f18e529e0fbca5c982454f0a9c9a4596a5e99671ee3e56bdcf3e036af232f013ee8260416
+Size (outref-0.5.2.crate) = 5621 bytes
+BLAKE2s (par-core-2.0.0.crate) = 3cf91b9097683724c8b7f80c108af26e44cb4bfb4530a47ef604ef365b05f081
+SHA512 (par-core-2.0.0.crate) = dbb5ddc1dcb16c7a4e7ec62ff6c433bb8780a36706116b0acbce0de12f63ce737f31483ea8c3d01329161a5f73902d1680c0db347f13b6a9222316cb26cd2df2
+Size (par-core-2.0.0.crate) = 2443 bytes
+BLAKE2s (par-iter-2.0.0.crate) = 94e5f4a59f26a7d307b2d858403c805020ddb4a6d8aca6853083813836232d0b
+SHA512 (par-iter-2.0.0.crate) = 9f7db42aa0b04477d08215ffdfee6babaa1bd6618eb5e636a11d3ddea6fe610462c56fbe2120770f457661870c0c9b47e409f9ded61b8b2aff10adb263f7c710
+Size (par-iter-2.0.0.crate) = 152109 bytes
+BLAKE2s (parking_lot-0.12.5.crate) = f86e6bdc40967ff502a1eaba85db1839de193ad43b44729ea4f92ce6104e6d27
+SHA512 (parking_lot-0.12.5.crate) = 432639d4a14acfa20127f03741e1101fa591fc63048b0b0369b44ad269d3dcb6fbab7947eb9995c7948f6fba90245abf82154a70df2b7a99aa7365b0b88666ca
+Size (parking_lot-0.12.5.crate) = 46735 bytes
+BLAKE2s (parking_lot_core-0.9.12.crate) = f405d2bbb06365d3878603031d54c79175a227308548799846f6d5f5bca6f3bd
+SHA512 (parking_lot_core-0.9.12.crate) = 6ce29df4aa9eb0ccfe9020b066832f2ba27afe41a48792d935d0051a595367f71d50f6862b921d91312a1ea80f087a416388d4b29a11de17373483e529f12d8d
+Size (parking_lot_core-0.9.12.crate) = 34110 bytes
+BLAKE2s (pathdiff-0.2.3.crate) = 9319f95e99985041354c9f58f54796cef161dc47d23b5ec490a3e6e0e4680827
+SHA512 (pathdiff-0.2.3.crate) = 54938b311d4eeb49d1d7418d2ab7ffd19bd308c36419cf3ad3ae58785b971fbb2fd2d8f5907e0c47be7bf74ded98c62deeb90f509e6cb0edc6d3c1a69dce3bf7
+Size (pathdiff-0.2.3.crate) = 7495 bytes
+BLAKE2s (percent-encoding-2.3.2.crate) = 81bf57454974d77f50aa665cf53179715469e81774d992a2d3769ad118d70d5b
+SHA512 (percent-encoding-2.3.2.crate) = 495b4aac88a7a46420811671d6bd82817e4eb2fe51d5068d11c5b50d0d927895d54c855cb07d4f4ad5a2d42b22f9419ad0183c14781dbfa240804fd49761035a
+Size (percent-encoding-2.3.2.crate) = 11583 bytes
+BLAKE2s (petgraph-0.7.1.crate) = 9fc84f0947856818d1907eb1b84288ef84b209696dc780bec7ddc3c02bf39333
+SHA512 (petgraph-0.7.1.crate) = 3b93ef0b9b92618b7d5fda4fa35322815ff102065d6eb08dd71706473cbe679994014536ffe2b3aad72a82f1e04b78e5878aecf4893fa6bed0ee17f2ad2db873
+Size (petgraph-0.7.1.crate) = 736025 bytes
+BLAKE2s (phf-0.11.3.crate) = 98266b6e46b32cb844dcd5a80f317bd2fe3bf84fe8aa7c505b2a2c8d510f24ad
+SHA512 (phf-0.11.3.crate) = 20a834481bc43ac8c560b00e337294d3c14d1fe359e7f78ed08166b096305e40277f4cd3c179a740911b5c241aeb4e263afa1a50d37f383ef63da113bd6270a9
+Size (phf-0.11.3.crate) = 23231 bytes
+BLAKE2s (phf_generator-0.11.3.crate) = 71ff6addf52a906f33b23b970d64fd9d93e68e35aa40860934604b4edddc430c
+SHA512 (phf_generator-0.11.3.crate) = 52998e20648b6ecd1eaafa407f7da4667fa829d48fe0c9f8f718377cc86a232a6261fc2f831ffc7051b62dbdb880654b1207ac314e57b23d2b70f634d07c2115
+Size (phf_generator-0.11.3.crate) = 15431 bytes
+BLAKE2s (phf_macros-0.11.3.crate) = 1e52dcb14d1b591469e2c22efd363a0a890835a270d9d66070bac7fa3db9dff5
+SHA512 (phf_macros-0.11.3.crate) = 331d3392dfd3e48eab0e65c3daca469c3abaf902989ed912e394175876f36c14d06fd1ba4ed03e01234608faf1189743e6dcde75eccdf2f4fe0dc8ffb15e720f
+Size (phf_macros-0.11.3.crate) = 18436 bytes
+BLAKE2s (phf_shared-0.11.3.crate) = a9cf5897cf023d61d53296d21db9d309c3829fbac3759f1b9774a7dd8d364386
+SHA512 (phf_shared-0.11.3.crate) = 34bc3c0dff5568f0276777614d92d87882ca6be9e3d405c1e7de90ac16ec52a12acc30ea9ab2033074d0e988fa514247f37de1a21a3727de0ef43f42f477e27e
+Size (phf_shared-0.11.3.crate) = 15199 bytes
+BLAKE2s (pin-project-lite-0.2.17.crate) = eec243c604d00a363522121c01823158a8ed81bbf8f9274b1944784d973c8ee8
+SHA512 (pin-project-lite-0.2.17.crate) = 0cff4338e3c7b71600fb41db013efe0d01b9cb3fdf95192dc16c5bea58a0f157207ef285ceb01b6b30956f9e751577c5d2a3803103f89a8a0cc6ea728d97a4df
+Size (pin-project-lite-0.2.17.crate) = 31034 bytes
+BLAKE2s (potential_utf-0.1.5.crate) = fc38d3a77dc1ab746af790e61608cd397049c01320d59d6d07eacb74531e3951
+SHA512 (potential_utf-0.1.5.crate) = 72950504acbd0aeeff44e0169f1857461f7627e7c638698ee005958c14cc0e68b2cfde33a91afafdcce98eac7ba7d54a125ae22562c4120c31e4b745bf298b54
+Size (potential_utf-0.1.5.crate) = 10189 bytes
+BLAKE2s (proc-macro2-1.0.106.crate) = d914a8fc313c5a898a0a9381a19dfbdfe9b94efba3f431759ea2c7ce43cd5362
+SHA512 (proc-macro2-1.0.106.crate) = b726e2c92af434bfa88cd4f53c3fe6db647503567675fb439890dee3d15f5111137e3242b28d164114ce081c10acf3fd11950753ddb349190c87ee04e7d97744
+Size (proc-macro2-1.0.106.crate) = 59765 bytes
+BLAKE2s (psm-0.1.31.crate) = b6ab398d3b3df0a40f9acfa2e11c5881413319448a96f42879b9b95cd509d986
+SHA512 (psm-0.1.31.crate) = 2519a981b0e1312c39757119285011df67e4d46dea6c996819516a966571aece2b8952325a6126340c6d0a226a310186b2ef1d21dff3216bdaa8e481b8067563
+Size (psm-0.1.31.crate) = 25059 bytes
+BLAKE2s (quote-1.0.45.crate) = 20533b49c424d16a57b48d77fd05ff08c31355221b3dd0d6fd917c60da7f748b
+SHA512 (quote-1.0.45.crate) = df96ede01ebd0ed642b758bf1d0862d0e116fc2b3343e14edb657ce5438ccabe743dec4a0a40de4dee98c134d169af9aba459faadf9c7a832b26377e755d49b0
+Size (quote-1.0.45.crate) = 31564 bytes
+BLAKE2s (radium-0.7.0.crate) = dd6a6e5f2d5676a559e17f11a37bd2353c6d703ce516b5a6ca71b6a0a85e7727
+SHA512 (radium-0.7.0.crate) = 51e23cf52997b46c0018a94b0259b29d7bf33ddba19f6db406ca57ee5b1417d7e5f27dda3bb487d0099886011a97f238e8b3dd4d6c86e8464c0b471c1a7622a0
+Size (radium-0.7.0.crate) = 10906 bytes
+BLAKE2s (radix_fmt-1.0.0.crate) = 84fc84897474260214b7d4134ed8636c44ccc5999e1a7c93656d868dbedf37af
+SHA512 (radix_fmt-1.0.0.crate) = 87175440dd09cb0a8dac809d9fcb94b83c4d7099b054652a57d10fe737acec6c202db226fa51f346012706e6fd855b18321f8bba7b2a440e335f750a974ee0bf
+Size (radix_fmt-1.0.0.crate) = 8743 bytes
+BLAKE2s (rand-0.8.6.crate) = 8a10d9cba48bc8caa80d76cc71312db13b1ebb939674b28f2b269c6e8a0d54d5
+SHA512 (rand-0.8.6.crate) = d7e887b161dd9191cab618efc367364c6bd5b31a55753f63aa08442b370c159673f21b0dbe020880601caed25535bda9e6b59e171699b00191db7668747b712e
+Size (rand-0.8.6.crate) = 83339 bytes
+BLAKE2s (rand_core-0.6.4.crate) = 0d23245a02d2c434b28af3a0ef8fe79b824ac79a8fb84f1c90a68a5bf5bfb6a6
+SHA512 (rand_core-0.6.4.crate) = 36c67eb845aa2ccca49d6d680f28d418229bbc5a050729e487fe6b9f9f384fdd7b8d67fc6508b90b79ffb3c26688e72feceb3ecae57d3d7f59338aeb62296f79
+Size (rand_core-0.6.4.crate) = 22666 bytes
+BLAKE2s (redox_syscall-0.5.18.crate) = 15142008cfcffdfe12059e4c1415d354d0a1f60e4fd392dcf9ac888821a0988b
+SHA512 (redox_syscall-0.5.18.crate) = 69f1cfb215666f1243616366711dbd8cadd6bb411121f48f6e4ffd7b25479efa6f900dd072d7cc6e6fb8130d95cdb42f4c0cb4ba9e05b09b1fa676ca32932101
+Size (redox_syscall-0.5.18.crate) = 30747 bytes
+BLAKE2s (regex-1.12.3.crate) = b1a49b0967c35b376a28040bf064a2f904f55eb3861a24cea49e9669507eae85
+SHA512 (regex-1.12.3.crate) = 73ea9581c861490ad4c8c767c09f1f39be525f4298f5b19ba7b658dfade4c91f7ffd170214382ef4694855c0a48a4db57c39b75d8fa6a9312b07409170c66000
+Size (regex-1.12.3.crate) = 153392 bytes
+BLAKE2s (regex-automata-0.4.14.crate) = db6e26a850671bb6e76cafa2bd631093c92119fd8b4df006574b833101b4614d
+SHA512 (regex-automata-0.4.14.crate) = 58f8e7c41f71c1df50fc2f4e70ea7f5ab762170494497541b9a09076058f94a799b6fc4da13c40fc26a2f1a0b650b499cb9830338152e96a24e3a32b4994a5e0
+Size (regex-automata-0.4.14.crate) = 618012 bytes
+BLAKE2s (regex-syntax-0.8.10.crate) = e2ae5809632d9dadfe451ea51eef4cc65796237eb50568db33594de2e308b06f
+SHA512 (regex-syntax-0.8.10.crate) = ca9c36c963c81c2fa36e1105cdd193a9b99ee259de1765e6e8010fb4091e49ac100e2ba0cd117adb0890b32e74421581dd6397eb896772168c6eae9da0a938c3
+Size (regex-syntax-0.8.10.crate) = 358781 bytes
+BLAKE2s (regress-0.10.5.crate) = 8ab43ea5153decc96f4207b259f9d6002603cdd91d2c82e9a09ec203979a4475
+SHA512 (regress-0.10.5.crate) = cff4de66493c2dc000ccd18293f114661f631df971697f67f2b2b8998ee85c0ccece6fcf3c9192f49358c151abad3f4cc8396faa6c2464c928bf4eb0adb9fd82
+Size (regress-0.10.5.crate) = 346868 bytes
+BLAKE2s (rollup-rollup-v4.60.4.tar.gz) = 002ca0c9246889aa0485ab75d369e24357738678cb26c9428966367b17c86daa
+SHA512 (rollup-rollup-v4.60.4.tar.gz) = ddf802ccf79626b91e54b7018ce833c058b0e8a7c711878c363b83bdabce762f4bbc39aa3b1f60fc92cca47e31a38d12a14a5eede0367fde5b5d71b7d299b3ad
+Size (rollup-rollup-v4.60.4.tar.gz) = 2249970 bytes
+BLAKE2s (rustc-hash-2.1.2.crate) = 15a9d16e54f34911d607cc0abde8812aec4f6098d7ab72d6c243c036e2056294
+SHA512 (rustc-hash-2.1.2.crate) = 0e63079dabc124395e73b585b7c68ce00be583e0809c3ecd2d1cfe0b4d64e2f2870294372c658051fdaeafc51fdd348a461ceaf1b87ebd5f2e2dfc717c2ac5e1
+Size (rustc-hash-2.1.2.crate) = 14754 bytes
+BLAKE2s (rustversion-1.0.22.crate) = 94885d422b9c942ceab679e86d0a2b8e6f322f655091475a6a475f0b796f48b9
+SHA512 (rustversion-1.0.22.crate) = 7929352df3e5279ac88cebb26ca89bb13c755f46986d2d1f514d18a3239a63638bf64f8ff153920569d173185d988d692ee676335afba0bf72d47f71babe0e15
+Size (rustversion-1.0.22.crate) = 21096 bytes
+BLAKE2s (ryu-1.0.23.crate) = 8739b21bbc56ca49dd5f0fa4374e8dc68f5388f3bf04924ee70589f76c402100
+SHA512 (ryu-1.0.23.crate) = 46257bb145f9f083347b808ecf5932dc66ffa656550494788c1011116976ec811531cd27e3c28677cfb774fba5effc310bd232e697ebb4f25f059acfb9c82937
+Size (ryu-1.0.23.crate) = 52823 bytes
+BLAKE2s (ryu-js-1.0.2.crate) = 824c7738dcb5850e48bffd79d7cea72682f72fe6df8a9bd23e2b7294004f1180
+SHA512 (ryu-js-1.0.2.crate) = 015ae923e11d08d83abc07099f4ef3957fe8cd8fbf7e7ae726b8c233fa739ee836997cf5cd7f42e064d96f7d23673db6707de1e6ebadb41c1cfbf6ff961b492e
+Size (ryu-js-1.0.2.crate) = 75035 bytes
+BLAKE2s (scoped-tls-1.0.1.crate) = 6c26ce57d3252ba15d330e92a54add4aefcd80402734fd0105d09b3bf561f92f
+SHA512 (scoped-tls-1.0.1.crate) = 342f43d53edd33ea3e2197faf5dce37bfbeb0b20b6f0febad4dc6244c3185df127b2c10488e95561260a0ef968f32707460f2d0d23667cebece19b167c0a0c25
+Size (scoped-tls-1.0.1.crate) = 8202 bytes
+BLAKE2s (scopeguard-1.2.0.crate) = 4daf97de7fabaf7fe5ba6000f7132a46cc0bab2a297127580d9ac127d0a8fcec
+SHA512 (scopeguard-1.2.0.crate) = 6247719a15fe1e4e2d179127b9a934bd2f99367724f41175ed9522f58824b6bc69b35002eae66b35880375ff61d77ac43ddaa78cbde7160a35183a1da32d3fbb
+Size (scopeguard-1.2.0.crate) = 11619 bytes
+BLAKE2s (semver-1.0.28.crate) = cc54fd8b7e1ad8e773e58137625a19c3ca7c46fec285a7eec1685230a1e9b88f
+SHA512 (semver-1.0.28.crate) = bb44373e60fccb83bc95e4277ea0abdd756a3f77b3334cf6d6b5fceac086910661ab94eb326cdc8fefce0c09220933bdf03bfd142c1594a92c9c1e4e931114b7
+Size (semver-1.0.28.crate) = 33064 bytes
+BLAKE2s (seq-macro-0.3.6.crate) = 439cca384e382de93745b4e1653aa4236a9e62acf13f93a16d300dc5b15875dd
+SHA512 (seq-macro-0.3.6.crate) = e871abbba0e31edbb2ffd245b14ae57a9508bed8721ab7b828a85b2cbd2e56de4c9d2054ec7b334123e69aae177360964aa5087bd9142636737ea9af7c0b19e3
+Size (seq-macro-0.3.6.crate) = 16031 bytes
+BLAKE2s (serde-1.0.228.crate) = 6d35ddc61aef1dd8524d6730c719753730adcf3b2ecc0bb3f54af53f74384a99
+SHA512 (serde-1.0.228.crate) = 9b645d6214203533b303fc5e88ad4f7686c22df084878d18a0209a92304a340fcb62fdde88a7080cf7a7348d47b9b363885c4e1da90dba08cc99ff620f375e97
+Size (serde-1.0.228.crate) = 83652 bytes
+BLAKE2s (serde_core-1.0.228.crate) = c3ea455d91e83c2bd00cc5627f0c256b89e4defeacb70b76aa1f21ed33aabbec
+SHA512 (serde_core-1.0.228.crate) = 43897e3a7ebdc85d81d1cb30cda8f0a11610f6f551529c8a21462c24fb83110652b462846aa3e1bed5fbf8b5d7927018845a524ee9e079e2c8acf2c687efd6c4
+Size (serde_core-1.0.228.crate) = 63111 bytes
+BLAKE2s (serde_derive-1.0.228.crate) = 96ba1b9a1d86ef1d6189da828e4acb22c58e4c75bb851d67131f2b85dd11d75c
+SHA512 (serde_derive-1.0.228.crate) = 8bfdfeee10ee7ef0670972aa963ef63b13e8eb2c8a09b9e0b717f92551aa89b3dd2a0dcbae6ccf20a1caece07e6adb18f0db56fdac020e4e0281b0d24e376003
+Size (serde_derive-1.0.228.crate) = 59605 bytes
+BLAKE2s (serde_json-1.0.149.crate) = 2d8799691eba81211f3c93711b5afe6f051948eb7ed4d813d2e4dba1b4e95ed0
+SHA512 (serde_json-1.0.149.crate) = 85fa8cb7b479f8241a4fd2255dd80e346fa5cde103aa7f25c14ccbcdf0e3276578fd0645e1d2542ee07c7e08c32058ff662bbf03926cd796c38622a12f423d43
+Size (serde_json-1.0.149.crate) = 155994 bytes
+BLAKE2s (shlex-1.3.0.crate) = 00a54f2882a7a2c2170fca55bd1acd51eea79f115f972ce143b5f4c9c974ee43
+SHA512 (shlex-1.3.0.crate) = 5c8cedbe666a14b8a0874defb9208146ce64579cde52ed483e4a794cac5dde6a24bf8d684404edff582f842e1fd4fa3fbeddbe074f191e4ec4aa517aa456fe8a
+Size (shlex-1.3.0.crate) = 18713 bytes
+BLAKE2s (siphasher-0.3.11.crate) = 360ca5a8becabb9e6bcee4a0a11b775521d89a87ad610257f5cf6450dbe2c825
+SHA512 (siphasher-0.3.11.crate) = 601121bd41da896142dc6ccc74a6eec3ebee3e976857ab8b5d21e915fdc8bc6e979af66a489c406371fbbbfc7a13338cc4b3744aa981206e43c53998f3e1699b
+Size (siphasher-0.3.11.crate) = 10442 bytes
+BLAKE2s (siphasher-1.0.3.crate) = ccfa023fabdd24ffa0a54aacace8d9859d7d61559285f55c70bda0463f697180
+SHA512 (siphasher-1.0.3.crate) = dd0416e6fa8e835c25b10bf93c793c263679d64b8d56288313bf93b989e4a5b271065da11e9af266e9878db7dd73396852e2e9b164aea6c2ad837c8ff0f73bcc
+Size (siphasher-1.0.3.crate) = 11643 bytes
+BLAKE2s (slab-0.4.12.crate) = 559f0b4110089a3259a5b4140d3577d827bfe96b67286f5cda9a93a9039388c0
+SHA512 (slab-0.4.12.crate) = cf7c971b99b043d8bc102732a109717cbbec114160e4f7cc4009c66739177778623403c33d6a32efd1620e0ac7b8743c36e0e5563082af7f92f1e4caeceea0d9
+Size (slab-0.4.12.crate) = 19080 bytes
+BLAKE2s (smallvec-1.15.1.crate) = 4cc77213990608a8c3cffe9d6fa5cf81e66038510f1e853a27ca2ed027bb1e1b
+SHA512 (smallvec-1.15.1.crate) = c26b097a063353beedfcc921129cd0fb838c1c9420218993a05b2655b47b6ec16f11e0054312018658b4abd893beee140c5d2739401a5e5aea2e64575f237047
+Size (smallvec-1.15.1.crate) = 38116 bytes
+BLAKE2s (smartstring-1.0.1.crate) = 720a22c0050e9f6f4f4f6905c466e2b36828ff596137e859b845f58a1800108b
+SHA512 (smartstring-1.0.1.crate) = 18e359d869bf006d49d6981c26a31ed73424c2734d8225c235b5f3c65124e5ca9d5f5bc95f4b190dc65746b73f31e2588bf9f50eb2b30535e5d05ebcd23ad760
+Size (smartstring-1.0.1.crate) = 29555 bytes
+BLAKE2s (sparkle-project-Sparkle-79bc9e872948e47877e76f194cb0c8e0412b0b90.tar.gz) = 5a0001a8f999986de62d7d0a9dbaa02dfa79a60e8133499d9bbe02494cd831c9
+SHA512 (sparkle-project-Sparkle-79bc9e872948e47877e76f194cb0c8e0412b0b90.tar.gz) = 57b634092a900d96e6b4187d94b3249925b14aeacc6e94a782d7ebf8aa1e76b48b23607ee75291f41e753a69ddfa6585b1334b670a7658f51896ef793cd01b82
+Size (sparkle-project-Sparkle-79bc9e872948e47877e76f194cb0c8e0412b0b90.tar.gz) = 15364053 bytes
+BLAKE2s (stable_deref_trait-1.2.1.crate) = b10100bc26d661fd9dce98e4be90e31ae3e6a0e723a77659f2ae67327ec492ce
+SHA512 (stable_deref_trait-1.2.1.crate) = 630721d3f8e9f3290efc250c42aba13e2325839e62167a2a611618c18c6aa58c08a53622db61a9aa920284570626b98df26b3c28009cf45b6ce1ec134b9c9f5c
+Size (stable_deref_trait-1.2.1.crate) = 8186 bytes
+BLAKE2s (stacker-0.1.23.crate) = caf72d39b9a27e68f39e1ebbc9e160be11cb85fce7030baf41033a1594923432
+SHA512 (stacker-0.1.23.crate) = 5a5c421e4a83f0b32938e87303da72dc01d56ddee3e4dbee9bb85e8c9763d389998c4ac87c027ec9d0261f59a686d0508cf5a9b7e2d996ef153ad4d29dd3985c
+Size (stacker-0.1.23.crate) = 17813 bytes
+BLAKE2s (static_assertions-1.1.0.crate) = eb3218e3c4d41feda9dac8901108477074703c4ed397618b14cbe86bfb1ccbe6
+SHA512 (static_assertions-1.1.0.crate) = 46d0e35f77941dee6f60f574c130472248063dc38494c1c4f84f7c048244cc2a58a86fe17c0990e3f0f01406b75ed385a13d00058612b27cf0e867c8d31c92ee
+Size (static_assertions-1.1.0.crate) = 18480 bytes
+BLAKE2s (string_enum-1.0.2.crate) = 1c883123945e785d143fbbc027471f2211f3d633831287d3ffb6d25953fb632e
+SHA512 (string_enum-1.0.2.crate) = b2ac8002fe3f779d12f079037d779d3a1fe35d7ffde25cbd105fb10b014b7780c7beba84dcd24beeb1aeb5b5a82a76da0c30471edd55001aec66752d1945de38
+Size (string_enum-1.0.2.crate) = 4523 bytes
+BLAKE2s (swc_allocator-4.0.1.crate) = 0dd6dd44a4d19b6d65536e5e2a54ee7f272e11a8ba2d5258a0a2427a3113df8b
+SHA512 (swc_allocator-4.0.1.crate) = f9efdb63066f1d6392e4cf849d9c3a8e2261e3e1e29947c6d12a2141d44b9a7363b1ce8847345dbfaede3799ea84eb10c08513885ac208ba28a2d0831cb82481
+Size (swc_allocator-4.0.1.crate) = 10424 bytes
+BLAKE2s (swc_atoms-9.0.0.crate) = 01508b5111b551a76650cd869aa713b691a5c56c4a764068ad137ecbaae262d5
+SHA512 (swc_atoms-9.0.0.crate) = d487822f6b838db428d31ed865e7cd6b0542a4b5d97530c9dadc204f67b46def21323ab18d687d541d9dc15662901587120afbf1fa13c08e367156bd2fa107b6
+Size (swc_atoms-9.0.0.crate) = 8934 bytes
+BLAKE2s (swc_common-21.0.1.crate) = ed1f993bae05e9bfbd406a3395201ef91665b13a99be3949976d9473fa7893aa
+SHA512 (swc_common-21.0.1.crate) = 7c45c064a67e077b63d36f85bdc7f5022f2cffd7d61d7b210a9a3b3e6d657c3f71cb9b8f62e89324626714139fdfe88990d48fa709526f83631e37fdb653bf3f
+Size (swc_common-21.0.1.crate) = 100154 bytes
+BLAKE2s (swc_compiler_base-55.0.0.crate) = 989dbca6932cbbaa9dd9cc160bea59a762d6074c282cf89c86c7239be21cf1be
+SHA512 (swc_compiler_base-55.0.0.crate) = c7069b1d34df1985cffa747ec1a5eb72f7dea96e3fdb0dcd1180dbd1dac4c541ee22ca05d057f142a4ef3128ff5ffbb86366982777e4f5f55a67a57e1c4abf2b
+Size (swc_compiler_base-55.0.0.crate) = 23316 bytes
+BLAKE2s (swc_config-4.0.1.crate) = 056996ee7db9687c97b393769bfc0667b76a262373ee82382cdee1deb33f5b6d
+SHA512 (swc_config-4.0.1.crate) = 58c591de16a5f1788e1e12106ce46899f04ecff7316d77eefeb683ff111b5019544db9951dc4625dd8906afadde582ea2479b564052fcc2082dd4387aca589a4
+Size (swc_config-4.0.1.crate) = 12778 bytes
+BLAKE2s (swc_config_macro-1.0.1.crate) = 2aa3bd479906d49eb92012d5ad9b70adea245d2995fbb497ef8faaabfb26058c
+SHA512 (swc_config_macro-1.0.1.crate) = 5b64be40a7ab047acac0ddd999f8f2c24e4ea81128ebac69b745ad7b616de4d2448748f46ed51889641ac262f7691806b1dbb8dea6efe07ee54bd18b5d7372ca
+Size (swc_config_macro-1.0.1.crate) = 2221 bytes
+BLAKE2s (swc_ecma_ast-23.0.0.crate) = db5abbce3f081cc987a6246f684281b95f6b69e7618ef46c7bc26303532b7c1a
+SHA512 (swc_ecma_ast-23.0.0.crate) = e992bbfaa691b52c88d7e8788af1e0d9e243893cb4c1235ff75daf4e4eb0f281b7d4d974de4144bbfb2786d10c2194da5278da3ae225e71a7f8f61441d6c6617
+Size (swc_ecma_ast-23.0.0.crate) = 50591 bytes
+BLAKE2s (swc_ecma_codegen-26.0.1.crate) = 50c89e6ee04339b9c8243e43084e6845ec5ddffac53aa6d187b4ee9c80745a08
+SHA512 (swc_ecma_codegen-26.0.1.crate) = cebee36c16729a46c52a52bad38d6423b76f33fd5ad0656463079eaf31468adc8765016ef7bcedabe4b8c69fd7cdaed2f5f94a67f8d9e936f97539f53f49ee79
+Size (swc_ecma_codegen-26.0.1.crate) = 63550 bytes
+BLAKE2s (swc_ecma_codegen_macros-2.0.2.crate) = 9bca1311bed1a961a81b775bdd169bcde02d1956585aae1f376d021b59ecf106
+SHA512 (swc_ecma_codegen_macros-2.0.2.crate) = 3497b1e9c8b751fd99014afab36996ab285fec532cafca53ce3c26865d2f21e076c20631711c696268a48f8f2f4ce6100ad13e89595bca467d2aa9ba04362892
+Size (swc_ecma_codegen_macros-2.0.2.crate) = 2549 bytes
+BLAKE2s (swc_ecma_hooks-0.7.0.crate) = 3cbb6538b3c653f0f9f13e0e1144b87cc1eead9e4c78b2660504cee95a10445d
+SHA512 (swc_ecma_hooks-0.7.0.crate) = 09a909dc88ad83be3a75be10d5597868e32c29e4273f305bcf883ab764b1ecfa4866a86480529c503f9466f6684b10f04eb80b52116b8907ec9461262a06b252
+Size (swc_ecma_hooks-0.7.0.crate) = 88056 bytes
+BLAKE2s (swc_ecma_minifier-52.0.4.crate) = ecf1a56028cc4111f7cc84d6e977ff73eb5283157d9dde6f11de7dd94fb2ccbd
+SHA512 (swc_ecma_minifier-52.0.4.crate) = 2050a48f2bcdf7ea68a8c5de044662de6f8759a91a5ea84c64f1afdaa890a6d58e754a061f46821c94e6a82657374519f9ab0ce45fa6c9d56f40c5fedc43875d
+Size (swc_ecma_minifier-52.0.4.crate) = 279744 bytes
+BLAKE2s (swc_ecma_parser-39.0.2.crate) = 913390ac4c9fab0daf02132f1d4bf47c1f38ffea5f54b1fae37a3142f7a9af15
+SHA512 (swc_ecma_parser-39.0.2.crate) = 3dfb81ed4cf72adcbd2ccd49688c89e3586f405fb6d98c51e6b90982266a336d1392316ff95914416cd25221a402e1b3be2e189ee405507b3d4cc40fbea12dab
+Size (swc_ecma_parser-39.0.2.crate) = 181929 bytes
+BLAKE2s (swc_ecma_transforms_base-42.0.0.crate) = 1b502621bb9a151f7a19dcb469502fde888c3ff33feb01eb4b7d9b6acff7b400
+SHA512 (swc_ecma_transforms_base-42.0.0.crate) = 4d46612936c808e3a1c7bcde7952454aa200a0dee6bb025e7eab56611556c4f7af9467baa09884928d6ffa4dc3093b32a70c4344e3a4682396a80e39ce620498
+Size (swc_ecma_transforms_base-42.0.0.crate) = 93990 bytes
+BLAKE2s (swc_ecma_transforms_optimization-44.0.0.crate) = 41782f9b176d58b0e0f6267e20613c1aabffbbc5b03b1c54b7015863a49b8ce7
+SHA512 (swc_ecma_transforms_optimization-44.0.0.crate) = 0ab1494f759572bba8646e0ef8e91bd8054717ca39068faf61bda6531a2b45b9084488f2e2dd789f34b018adb454e8c437985cadbfde711f5aa2b86b82774cdf
+Size (swc_ecma_transforms_optimization-44.0.0.crate) = 80660 bytes
+BLAKE2s (swc_ecma_utils-29.1.0.crate) = 3c011765163604c20a790a75ba004064a0e9883fcd5455bc4627d5771edc77f4
+SHA512 (swc_ecma_utils-29.1.0.crate) = 7556fa3af9b05e5a7eb9545426b74d9a0bceae5c190106629edd9071c8516dce67c3e0d2a65e6f2cee0582ab38393fe947f7bb239bc9500f7a505e2b580e6610
+Size (swc_ecma_utils-29.1.0.crate) = 44910 bytes
+BLAKE2s (swc_ecma_visit-23.0.0.crate) = bba0a6a1d469f823d3affd72f015398fb0b39fe1e1d539f7070f7bce220976d4
+SHA512 (swc_ecma_visit-23.0.0.crate) = 8dd0029815ad4ed03630bf421901783dd710b1ffe815eb2a2e2c319c0a0a375171b5c81e9a4751523d00053e1a6832498c6659c76af9a0a465d963c058af08c3
+Size (swc_ecma_visit-23.0.0.crate) = 330047 bytes
+BLAKE2s (swc_eq_ignore_macros-1.0.1.crate) = c84e3dbaf4f633cc8af0600262ea98247603cad3b6d23990258dcb71cdb28c07
+SHA512 (swc_eq_ignore_macros-1.0.1.crate) = 52eccdc5140771907cd4b98df1a21b5f0f8a0e5dd136db0bcffbff808683685ef9fa8d5da10280e83bc5b068da225e722e83af1d3a2e52fd53276d0f4269f974
+Size (swc_eq_ignore_macros-1.0.1.crate) = 3313 bytes
+BLAKE2s (swc_macros_common-1.0.1.crate) = 78786db8b6c97ac37419b2b9ba0cda212ff3a3c942e59e66564dfef7da4ff254
+SHA512 (swc_macros_common-1.0.1.crate) = 69fa17d9ff05c11f2ea2ed8c62bf32d890f7b1e97efcc72059c97c1cb10590da2b0c8014651bd140a4c1e2a2f64f5ac360fc7cf2454917fd6d59269dd97153f7
+Size (swc_macros_common-1.0.1.crate) = 7108 bytes
+BLAKE2s (swc_sourcemap-10.0.2.crate) = e6379b35219ec3a07d0e5a38f1c9ef9eba89a0ee9d8ea2beef5176e917cb4ce1
+SHA512 (swc_sourcemap-10.0.2.crate) = 8c1e538be257ef7443f5abfd2e317ded277d160ea5e1b960d9eb8fec252f12406ae7121cea8f82ce42d8b424f283821cdf49f2fce8ff9bbfd38e6cf712188d99
+Size (swc_sourcemap-10.0.2.crate) = 113214 bytes
+BLAKE2s (swc_timer-1.0.0.crate) = d570f1672db5eb83f011f9427ceaba059eb59ab81173cf2e20da8bbc3981ac55
+SHA512 (swc_timer-1.0.0.crate) = fa70dd999c585e7a9e8693047eff8fb65fe7c4092295caf999f6f5c04533270a2408ee255b00bfff61411cdd918df0c526bb07e4411efa1bbb48227f91f0d406
+Size (swc_timer-1.0.0.crate) = 1685 bytes
+BLAKE2s (swc_visit-2.0.1.crate) = fa700ccb42a425fb3c69d2e4108a2a5c82cc30f7fb8491509763d1b8588e6d43
+SHA512 (swc_visit-2.0.1.crate) = 26229bde37696ad47387945e83dd3f52689abd4a2659f3f2cf6e042e56a6881f4767da716792d10c37411d1916ff42eabe14599f12fc4c371f859393ead51d4a
+Size (swc_visit-2.0.1.crate) = 5576 bytes
+BLAKE2s (syn-2.0.117.crate) = 03f50444ef7a3b5f28a72c59696d1676df1b8f5c334b19648d2755927e8b2f43
+SHA512 (syn-2.0.117.crate) = 035c2e63542592b6a4058a2a82d4c2c1f5793f84fb1b04cbd393337a26fcf661a1f3bea439ce98a1fe943b1c4d36d2bda16df3bbc3fa6ca35e1548d530dc8416
+Size (syn-2.0.117.crate) = 306011 bytes
+BLAKE2s (synstructure-0.13.2.crate) = 674ef97e051051a22c4ec20f4b53a60e382b933bd94e75d853ebb2f98a3a797d
+SHA512 (synstructure-0.13.2.crate) = 2698f4e80b93f7cf1d8ae97c4c42a7f61e7b7081f7f1bbb94d7f48ab7ae813a666d73c49ba3812cda9155e0138b55cc246fb96e5858e411a8d32bafb3e2b2afb
+Size (synstructure-0.13.2.crate) = 18950 bytes
+BLAKE2s (tap-1.0.1.crate) = 53f99ee7163ca9302a9cd35c56302c86e113c8c1c27902da720035740dd6ea34
+SHA512 (tap-1.0.1.crate) = d69ff11a46e2fbc276212511878f48eb93640c0b147df6578ea057b23625f9366a7fc3926693fc3809688537af5ca919c91605beed364decf83c35a032310995
+Size (tap-1.0.1.crate) = 11316 bytes
+BLAKE2s (tinystr-0.8.3.crate) = 2684c8d423f00c5ccf8ee7ac0e6c508bbc37f144856339e07b93ea826bc295f5
+SHA512 (tinystr-0.8.3.crate) = 1208a3502aad5783a99d05c6c546f0f9de5b468b273c0931a33829c857a159679f8720622ee0700bb8df397baa590e0411f89116327759a859ff46438ac73bfa
+Size (tinystr-0.8.3.crate) = 24710 bytes
+BLAKE2s (tracing-0.1.44.crate) = c8b96501c5de427e26fd8b39c09146b04d6d62a501295fccdbad9e6f2f30e41c
+SHA512 (tracing-0.1.44.crate) = 383404a78c9bcb9dee947140082420673688dabc54eff334460222abddfc246b0256996ecb456d5b6325c029fcb2e641c95ff659a08366089b8b79784cb28869
+Size (tracing-0.1.44.crate) = 463135 bytes
+BLAKE2s (tracing-attributes-0.1.31.crate) = 69a82fa5f0a7f44b019d18f8e7cd65124d878bc67471ed620bfd94e5bd2baf34
+SHA512 (tracing-attributes-0.1.31.crate) = 6954ce397903cfced12ef495d46885e8320233cb631116b0c35731c89c51d2cf2532c77ed02d9b708375b5555f3580a197dd63ad6899a32c87e34e2da2733bfa
+Size (tracing-attributes-0.1.31.crate) = 39733 bytes
+BLAKE2s (tracing-core-0.1.36.crate) = 24c04587b1a94653596f1545b54f29c58ccd6d2b7450885228939926d916e0d8
+SHA512 (tracing-core-0.1.36.crate) = 7cecb6c2f1deeb6d23ab466c376e1c1300dd9226301c112deeb2483eea13f7bb514fe57ece707a8c67450245062060872dd4d7be390462008b369ca3dfc57dc6
+Size (tracing-core-0.1.36.crate) = 63967 bytes
+BLAKE2s (triomphe-0.1.15.crate) = fec0e4db93223e5032b28b416cc47277eb0859227d22205a93e249f789d0641b
+SHA512 (triomphe-0.1.15.crate) = 43e82d5389061764cfcb13877c9bf1a71150f698a08347aa1dd168e1bf5b615d1e0f11a81b1b4742737d735a2615781cc5bcdfc7a1582f9fd0f204d20b6e92cf
+Size (triomphe-0.1.15.crate) = 34711 bytes
+BLAKE2s (unicode-id-start-1.4.0.crate) = f94014cf15b84e1e1488a19dc942b0b395115ee1243ca9a4a2fb329e4dd8ef50
+SHA512 (unicode-id-start-1.4.0.crate) = f095a3db207648f6f34e57df105a7d742344af56de7066309a397cf914db2254d9d9057a839ef33342ff54020e3a982113ddf2098fa77dc023aac8811bdf46a1
+Size (unicode-id-start-1.4.0.crate) = 48270 bytes
+BLAKE2s (unicode-ident-1.0.24.crate) = 48314ea8c9272549000bbd39fab6a52df9a467bedfcdcda02f183d7549b620b2
+SHA512 (unicode-ident-1.0.24.crate) = 7be712d8d0075ac9341790180e312f66264d3e0255c91b38df0951baa5e446dec24551bb2125a66a1cb9b6ca2f1ea37c0cc15fa3dd74f398ecf4d5302c7dc259
+Size (unicode-ident-1.0.24.crate) = 49298 bytes
+BLAKE2s (unicode-segmentation-1.13.2.crate) = 45dc74c693e5a005a20f549a24d8008d3cd390f123078b49c93c1dac316d04b1
+SHA512 (unicode-segmentation-1.13.2.crate) = 79652f9c22e755530e3910e8a4e176cc882c4b9895755e1539e20820b6dd74cbd52dcc9185eb11f3f150214fb6a822a4aadb6fe967e9a590602008587c67cf77
+Size (unicode-segmentation-1.13.2.crate) = 111829 bytes
+BLAKE2s (unicode-width-0.2.2.crate) = 770d8dc1245680ff01e5014e31cd470f221eded531e5ffdd84823bcd5ceaf62a
+SHA512 (unicode-width-0.2.2.crate) = a0ff6ccc1d154e5a100808d3109fe30afa048c3ff402f0a0de34dbff2d58a7403903002185b33bee7b04dcb578c9dea66225a8697f3cd997205680ae3abce965
+Size (unicode-width-0.2.2.crate) = 282768 bytes
+BLAKE2s (url-2.5.8.crate) = e3ca74f997fda512d3fb06b936955ab713c0961d06fda13e6af520654d75368a
+SHA512 (url-2.5.8.crate) = 5848b47d63ae9c195fd5f82bd8333c53cb399f383240e84a606c486d3dbb37db4e268b01a147deb8cdf5bc534a4ebc7b11391e73f81dc3ea3ad7254507ac0c6c
+Size (url-2.5.8.crate) = 86512 bytes
+BLAKE2s (utf8_iter-1.0.4.crate) = 7d16264d69ba5aa53edad665e3589efb6594cc14c68e5e832371862aa286787d
+SHA512 (utf8_iter-1.0.4.crate) = a72671995b3eb295581c60dc632e4a25ba257227fb5d58a8bec322428b6d69529bba79a6f02b8e7ee6698b7779d9d6695f5badad73e07c254b00c9d6256c9090
+Size (utf8_iter-1.0.4.crate) = 10437 bytes
+BLAKE2s (uuid-1.23.1.crate) = ed23e10afa3a5eb3bff30d07f384a71e6af046cd4d855e10a9cd796ce41a4c48
+SHA512 (uuid-1.23.1.crate) = 7f9222285c9e6635d9ed0b03ae945c2037bd7f7486bb05214355c19eb3fc0f7685b3f6b3bb58e158e1dd26cbf4772af7180420305f2ff001a69e90ea6f2c428e
+Size (uuid-1.23.1.crate) = 62932 bytes
+BLAKE2s (version_check-0.9.5.crate) = 7db65df351b4ee3b22c2160742d0e3888659f56f84217198ae842260cf55171e
+SHA512 (version_check-0.9.5.crate) = d11d5a2240ab0c67ea69db56561ce202201edeef9a8e5eda3d9ae7ab7bb5752d8f343fe7f6536d8383de8d55f9024efa84f66a0c21e69563b7a38c4a628014db
+Size (version_check-0.9.5.crate) = 15554 bytes
+BLAKE2s (vsimd-0.8.0.crate) = 0ccafdbac2062449b4719e9b2cc406bf3f728a1362ac4069a979dc26746c2c91
+SHA512 (vsimd-0.8.0.crate) = 2c9c186369161dcedb6e1a5d95310a2886287d400a03ed507cdf1cccad02f2024fb727037aac0848d26a50a6ff1fe17d3902d60b876e9ca3a73b41482b536e54
+Size (vsimd-0.8.0.crate) = 21377 bytes
+BLAKE2s (wasm-bindgen-0.2.121.crate) = 4c050ee9a1749906dc1c5a7103f3db644457f6bbd4d8b00143ae4aa6955b2f5b
+SHA512 (wasm-bindgen-0.2.121.crate) = a3420d0fc119b9e1b091afa24b08c9b3692bff28d0488426641c9478ca795a0fe3564120ddbdbb2856f44864e622bea715ce13012d45a6e1b0795ae7057b55df
+Size (wasm-bindgen-0.2.121.crate) = 65838 bytes
+BLAKE2s (wasm-bindgen-macro-0.2.121.crate) = d499ec0a7e9f00b5a5c1bcaadf8f800abc8d921bae429956d2042cb234ceb8f0
+SHA512 (wasm-bindgen-macro-0.2.121.crate) = 844c4aceb5c1eef783d4ab678b189da004bbea4274de9744ea832d9644bbc08ea8b4a365ab2fcf33295fde235bfe53b21c29e7e30847d1cb0e265ed62302a1fe
+Size (wasm-bindgen-macro-0.2.121.crate) = 9294 bytes
+BLAKE2s (wasm-bindgen-macro-support-0.2.121.crate) = f84661f19791d6d0b48bfa361a108c2027fe788886639443d14562500d8b75f9
+SHA512 (wasm-bindgen-macro-support-0.2.121.crate) = ac01daf74ee83db1fd35a7733caeff29f29e1eace54b8b415c935b32b2d48d8802b30ffeea12f73f16785b670c25e5128c894a9bf173e2b112970c3ee1475197
+Size (wasm-bindgen-macro-support-0.2.121.crate) = 79901 bytes
+BLAKE2s (wasm-bindgen-shared-0.2.121.crate) = 2aad9b272751cf54d04914f163837c8adcd690496b9ff46aa05b4a7534caaa33
+SHA512 (wasm-bindgen-shared-0.2.121.crate) = 33c037993258552abebe2e3cb3fcd7064e768a4917c1ef3c87ba79b40a3201bdfd27793e78794ec09d7e257dae61a5a8ed283b7651be31c74c2384d4d62b8a86
+Size (wasm-bindgen-shared-0.2.121.crate) = 11270 bytes
+BLAKE2s (windows-link-0.2.1.crate) = b399f8b2d800cac2bef8e258bd19baf94c010ce1b58723ccfda65f4451b8f1a2
+SHA512 (windows-link-0.2.1.crate) = afb0c87beb8914fd9a3e52db6f2f64a840470b9751b66c83892c24cb1c46cda63fb16b1aeafcaa5a1fc7c5ba01da46be63e5227cc108dede8b0bd27785498a6b
+Size (windows-link-0.2.1.crate) = 6133 bytes
+BLAKE2s (windows-sys-0.59.0.crate) = 5d2e4c909fd9f3bde5e2eb73f2e77acec19a71a0f60d12047657922b583cbb26
+SHA512 (windows-sys-0.59.0.crate) = d35e009e979633a1f3c8468cd038bd5c8c0381405165ce03497decd7d9edaaac485d704487e4a61d9aaf4e4d011b4248408912df6a0044d50e8457259867e061
+Size (windows-sys-0.59.0.crate) = 2387323 bytes
+BLAKE2s (windows-targets-0.52.6.crate) = fed2bcf4841033cc3a74ee335a8e3914c4857457f829c88977081182cc6498b9
+SHA512 (windows-targets-0.52.6.crate) = d6d2dbd96096c6c396dba141a9817e377c35877f3b2fe58b2553280c7cfcb1ed6ee75bd4d62c9b882662de67ddaf0c1049b91530d29c94dd709c230e08eb895f
+Size (windows-targets-0.52.6.crate) = 6403 bytes
+BLAKE2s (windows_aarch64_gnullvm-0.52.6.crate) = 22fddd2aa2d7419001b540e1cb9c3702ae4fb2972cd94448e325c00729033c87
+SHA512 (windows_aarch64_gnullvm-0.52.6.crate) = f62b2d942bdb3a9353465b07d47b93de179bb706511aa497e4addd74cff95e689a9b633e7801ce786e73b5ae5f30b506b6faa199c5ab86eefdc1d94652df79c5
+Size (windows_aarch64_gnullvm-0.52.6.crate) = 435718 bytes
+BLAKE2s (windows_aarch64_msvc-0.52.6.crate) = 8f50e782f7ff109325620b809e13c08b948f85e0519cf249f70c5b605866d07c
+SHA512 (windows_aarch64_msvc-0.52.6.crate) = a3e21305ad0e6de38f5b5ed5d37ee5825b7521064163bcdf31d63341cd87983f54377865d2daf3bb480d2d0aa66d6f598fa09540ec1d71baea74569c86bd213b
+Size (windows_aarch64_msvc-0.52.6.crate) = 832615 bytes
+BLAKE2s (windows_i686_gnu-0.52.6.crate) = 2bf3eede03990415b9bd6ab49e4d91d962d8ebe6303560848a2e9ef9f316331a
+SHA512 (windows_i686_gnu-0.52.6.crate) = a1f6b5dd23d17ec3567bc9d11a4be6f35e196eee21ca342e9b88dbaa6a5f7c46e439c834b77e724f32ac22c0d81573746b3b513a6c944a221b92b2c76fe98822
+Size (windows_i686_gnu-0.52.6.crate) = 880402 bytes
+BLAKE2s (windows_i686_gnullvm-0.52.6.crate) = eafa7c3fdf8ce35ecee51ebf161ba59c582395537555921b94b8af952c9dd38c
+SHA512 (windows_i686_gnullvm-0.52.6.crate) = 95f13af855d530acc0b856214478d4b11b8dbab3f8f79dd223d0b009790c0e46d096fc1773e0277997deb2d5b96c704f17f23c7df11411524629f75415dec99f
+Size (windows_i686_gnullvm-0.52.6.crate) = 475940 bytes
+BLAKE2s (windows_i686_msvc-0.52.6.crate) = 085f4ed29405a0351ecf62874780f2692e011dc0cedbd945270fe7d1f032987a
+SHA512 (windows_i686_msvc-0.52.6.crate) = ca97913ce202d73266cf55947b868bea7e964a4516b6a096a81aeab6a60ee73867171032ced35e3afccff741ddfb2def7468343b6eceb95253e4d4f349efbf96
+Size (windows_i686_msvc-0.52.6.crate) = 901163 bytes
+BLAKE2s (windows_x86_64_gnu-0.52.6.crate) = 72ec3c98937b6cb854cb09a78dabd88a71f56e96cdc99a3b46d4641b395f81ec
+SHA512 (windows_x86_64_gnu-0.52.6.crate) = c4086bb0280042f2bef9b556283b67f8a5cacddd209e1c5fabec63decec6d4fd2d6a7071407973981b98ae0c0cf7034fc612f9e70dc6d3eed9acdec771ae31cb
+Size (windows_x86_64_gnu-0.52.6.crate) = 836363 bytes
+BLAKE2s (windows_x86_64_gnullvm-0.52.6.crate) = ad13afdffbbdfe4ac64f82de4ee71ba660793294c737412ddc7aa3f47109ddb3
+SHA512 (windows_x86_64_gnullvm-0.52.6.crate) = 67681f5859e249c56b0183181811f6212cc7008d6471dad78aecc7ebe3d027686b19210b8aa9014c554410f69f913d21ce2aca928eea905eab779bea26464cbd
+Size (windows_x86_64_gnullvm-0.52.6.crate) = 435707 bytes
+BLAKE2s (windows_x86_64_msvc-0.52.6.crate) = 5b8f356fbbd3d304c939f19f79a10b72a39c1b27decca9b0449a4af3761e9a79
+SHA512 (windows_x86_64_msvc-0.52.6.crate) = 21944cd8e3a481b514509e73ae3f62722fe7ed380d37ea0c25f8fbdeba79174dd52ff65d898838da5df4197894b74e00f45d47489418e978753b4e55c7e623e7
+Size (windows_x86_64_msvc-0.52.6.crate) = 832564 bytes
+BLAKE2s (writeable-0.6.3.crate) = 53c01bade7fa841f47bb3ab4d69c3a6c6634ce4a3fb181d341127fec0ec409a7
+SHA512 (writeable-0.6.3.crate) = e3c1c498b7901f6287024ddf47862e0caf7759edde25a219304209a46ca183af15fb5fb33f87b84b2ce0ed531161d8414743bb424a7446d88b2a0c6d034bb87f
+Size (writeable-0.6.3.crate) = 26685 bytes
+BLAKE2s (wyz-0.5.1.crate) = dc39cd7a740b1e5bc6799cf3f502684350913a83f457249d2c868ede49ad0849
+SHA512 (wyz-0.5.1.crate) = 15d86c167145c90e3fbabcefd11754fb1cb835896e32d1bb7f4b027e5b2092f5fdbdca4062c129bc38e655cb87c6a3f4e181747ee25d89db5e01fb1fcac18fe9
+Size (wyz-0.5.1.crate) = 18790 bytes
+BLAKE2s (xxhash-rust-0.8.15.crate) = f8b410b180188e604835318a587d088af98a5164142fde2862b4a6461cac2f1e
+SHA512 (xxhash-rust-0.8.15.crate) = 80a73a93249cfa0043a743e883f078d9e4bbedc236dec239d9f89b6816715c614f212930fe8842f0598275d2676a0e406a1ab7101158c163f50b9d1d00265925
+Size (xxhash-rust-0.8.15.crate) = 21515 bytes
+BLAKE2s (yoke-0.8.2.crate) = afdcfe10b32f07509936dcfe029a055725b45be0c50840fef14f8f2055466ad8
+SHA512 (yoke-0.8.2.crate) = fc4d0a912d531d661dc21000ea50eb18cb96b471f60f0624c644e055337c50523bf0b89d222e759e0e6fda1ae2debc9d87efa26b3427504456e3fd241658bb32
+Size (yoke-0.8.2.crate) = 32790 bytes
+BLAKE2s (yoke-derive-0.8.2.crate) = 5552ca3b0c844667a0532da6e6a4bbfc41777d56d6615f80ca4c90020a50dedf
+SHA512 (yoke-derive-0.8.2.crate) = ed37289fe2dfcafda13be24b3e4aae1fbbdd6f52c42a1f2d770771f458af0d17b4cbe487941381b4bd692388e9818b45c686bdcd6229918e0f5b6fced1068ca3
+Size (yoke-derive-0.8.2.crate) = 15077 bytes
+BLAKE2s (zerocopy-0.8.48.crate) = adfa1e7357f650579ca377259ac6839afb63ee2c903eb3a162a7663e56b4886d
+SHA512 (zerocopy-0.8.48.crate) = c66a2a301bebfcb6519ac122d5b03a5f5ea2443d83ebcacfacc564d01b9d6173581fcb4df122444c910ea0b0e420d1529e3318d60695cec3d9df28a1837b9f9e
+Size (zerocopy-0.8.48.crate) = 287554 bytes
+BLAKE2s (zerocopy-derive-0.8.48.crate) = 7b4aafffc631f3141669ed016a036eda0bfa12d0a850a7d393bbf19eb633866e
+SHA512 (zerocopy-derive-0.8.48.crate) = 7dd11845b9c07fcc6c7289f792a27c30b2eb6122a403e9cfaa59177a953a60e5e412040a085d12b31a4c52306d3e3517a7f295ba62fb4441aac8e2d5f052e3c3
+Size (zerocopy-derive-0.8.48.crate) = 97646 bytes
+BLAKE2s (zerofrom-0.1.7.crate) = 713206a7ab4ab52c79581e43c5cfef5c37480dae2b4b9859e5e6f047c25eba69
+SHA512 (zerofrom-0.1.7.crate) = e189816b92ca0f51a009b7bd63b07995aa1543ef5e69cf049ffc7f3605cd0ed48cfce958384a5775e233c25004e2289195e8c8ee1a8032f3cfc14a5e4b2cb446
+Size (zerofrom-0.1.7.crate) = 6140 bytes
+BLAKE2s (zerofrom-derive-0.1.7.crate) = 52b904d29063b9715093de99a7d4cf41fbc97b1b2960aa85c3fee707fdaed051
+SHA512 (zerofrom-derive-0.1.7.crate) = 22de0ee75a7463e6b263f17d91291d2e2800ae0b5066304b24459b58de8e528e36de77dda149d74abdecd26cab58f0ed34aa603b3361f00976929efdb3371da6
+Size (zerofrom-derive-0.1.7.crate) = 8853 bytes
+BLAKE2s (zerotrie-0.2.4.crate) = 598277dafb06f822150ebec2accf1b8ee21b21f3e9c06fbb25f2740bacd92ac7
+SHA512 (zerotrie-0.2.4.crate) = daaa133ef8916a14ee12af2de5e042086d6817822fe498c49fbadd2c03c5512f0adcd5ada268fa5bf70ae2dd23f14245a0f099a37abe09251478303c069a410d
+Size (zerotrie-0.2.4.crate) = 83690 bytes
+BLAKE2s (zerovec-0.11.6.crate) = 5f1496ff27bceddc4422d64619588e721d0ae1752020f136e2ca9c28be2996be
+SHA512 (zerovec-0.11.6.crate) = 9a0b22654ce3b76cd5e9bdfbcf8d5344dff4116f37f6e22ee4687677c7fe8a69122a2cc86b0d722ff2040547a810528a5a0d9bb5d8c4ac2d3fa0323dcd18320d
+Size (zerovec-0.11.6.crate) = 128583 bytes
+BLAKE2s (zerovec-derive-0.11.3.crate) = ce2e0a4b320a155a388b6e0931e4d05178e67f7758c3f98f273091f826891dfa
+SHA512 (zerovec-derive-0.11.3.crate) = 1195cf266a28cf1bdc48a02b2b721f24c785b317dc421475818cc0fe616230bbb91468ab2f67981bf6d3ea2b830eca2e10b85502f622ecb06880e4fff376d29f
+Size (zerovec-derive-0.11.3.crate) = 22115 bytes
+BLAKE2s (zmij-1.0.21.crate) = a2d1e7214230c8f4e8c946d28215765c131da3aac89f1001daf534335307648e
+SHA512 (zmij-1.0.21.crate) = a488f11ec8721ddfe42e61d028a128818551de8fccd69d7824504e4ae2efccdc38f716fa5a10ef4de07a8a087e75e819c4a1e0790817e8539b5db697bde14585
+Size (zmij-1.0.21.crate) = 26665 bytes
+SHA1 (patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc) = 4fcc7a7462421a95212780f62934823f3c7a70ab
+SHA1 (patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.h) = f122ff2a800d0c3404f7c7bcca65478d07e4d016
+SHA1 (patch-chrome_browser_process__singleton__posix.cc) = b0519cdd9c1defbcea07502c5f7c01e83e10fadb
+SHA1 (patch-components_os__crypt_sync_os__crypt.h) = bfef4f83009da6fc4329b2c8bb8fe8a86046479d
+SHA1 (patch-components_os__crypt_sync_os__crypt__unittest.cc) = e5187e0a5a3254b250f096103f23554a23643821
+SHA1 (patch-content_browser_child__process__launcher__helper__linux.cc) = 249e584a14226fec8b08bd2d6ae44f967af0c4a6
+SHA1 (patch-electron_BUILD.gn) = b4ad70f2745965fe0e6cf75b4906628a815f2419
+SHA1 (patch-electron_build_args_all.gn) = 8ad193b1767e69e4d4a808326ff42c8011a66aff
+SHA1 (patch-electron_default__app_default__app.ts) = d34d190af4aa07729710ddeeb4fb74d66ab9fa9a
+SHA1 (patch-electron_filenames.gni) = 40b40a42df2f39324697fd311e5c9f5378676579
+SHA1 (patch-electron_lib_browser_api_app.ts) = 6cc6bc92cd0a898ba7e3f2b19712b4af8c9fc755
+SHA1 (patch-electron_lib_browser_api_dialog.ts) = e7383ca12fd69b2dbe929b9d9735658cf664fd41
+SHA1 (patch-electron_lib_browser_api_menu-item-roles.ts) = 746cd276f451456e98a76400f122bbfba8abfccd
+SHA1 (patch-electron_lib_browser_api_power-monitor.ts) = e447125b125d28a3a855ce7044f28af2f47b91b0
+SHA1 (patch-electron_lib_browser_init.ts) = b8f52c86601ad97ebd1797aaf5b7c3e32b37f292
+SHA1 (patch-electron_lib_renderer_security-warnings.ts) = 4d0ca14ec37dcb7917260722b5dcd085d5e3cfd2
+SHA1 (patch-electron_node__modules_@sentry_cli_scripts_install.js) = 99db0868ef682cffe6024a2113351228d10ca14e
+SHA1 (patch-electron_npm_install.js) = 51b796b0185cbde05c8146c966e56ff04bbc67df
+SHA1 (patch-electron_script_lib_config.py) = 85bd71b804d6b4ca352b27568ccbf3716294c19a
+SHA1 (patch-electron_script_lib_utils.js) = c2a4905fe60b415ebadc0a82fb17d25d337144be
+SHA1 (patch-electron_script_pgo_collect-profile.js) = 10d5fcc5bf5b3194066825f27b4a6de951b6fc8d
+SHA1 (patch-electron_script_spec-runner.js) = 57b36cbe9dc7d7bf60a6f6123eecb520fc1a4d54
+SHA1 (patch-electron_shell_app_electron__crash__reporter__client.cc) = 37ffb69e570da628b6d3a19bdc1d8e1db15260c5
+SHA1 (patch-electron_shell_app_electron__crash__reporter__client.h) = c23077e49fa7213a76b178f11e35d73fbf1749fa
+SHA1 (patch-electron_shell_app_electron__main__delegate.cc) = 9b7e4b3eff16a57a8d5b8c511a7eda7b02dc3ca3
+SHA1 (patch-electron_shell_app_node__main.cc) = 07e9223bece554dd118e5d64af8613ea07f30bcc
+SHA1 (patch-electron_shell_browser_api_electron__api__app.cc) = ebfccb8444092afa6e1f82fcd33f6af03468a53f
+SHA1 (patch-electron_shell_browser_api_electron__api__base__window.cc) = cd9c8ef5042c15642f11fd915edd20d831b47a9a
+SHA1 (patch-electron_shell_browser_api_electron__api__base__window.h) = 4b44492b6338ee624ca97b029bac975a56b0da68
+SHA1 (patch-electron_shell_browser_api_electron__api__clipboard.cc) = 24c8ef2504389f59d19aac5acba0661c54c5848e
+SHA1 (patch-electron_shell_browser_api_electron__api__crash__reporter.cc) = 04c8137536401db5c45cb27e916bb1e426671173
+SHA1 (patch-electron_shell_browser_api_electron__api__desktop__capturer.cc) = f31d2d6535d3fb5a8c68c5368e0f4b9e309937a5
+SHA1 (patch-electron_shell_browser_api_electron__api__power__monitor.cc) = 71f25f579d797d8be6fe6cad082a953b5aeba55b
+SHA1 (patch-electron_shell_browser_api_electron__api__power__monitor.h) = 76ae079eee0149f7ff55b4c96fbf1095527562de
+SHA1 (patch-electron_shell_browser_api_electron__api__safe__storage.cc) = 9b6a3586f29a18d6f4188a7818ff1b31cb169c1d
+SHA1 (patch-electron_shell_browser_api_electron__api__safe__storage.h) = e5cee22fc43d4a27786421b331045e2d6c641f44
+SHA1 (patch-electron_shell_browser_api_electron__api__screen.cc) = f5f67a9f5d1c11e589ff0569c001ebdf89224e18
+SHA1 (patch-electron_shell_browser_api_electron__api__system__preferences.cc) = d43548efa0137ccca02a57518d441d70a226fac8
+SHA1 (patch-electron_shell_browser_api_electron__api__system__preferences.h) = 86033e4255562d91b879b4e65488ee95f5831579
+SHA1 (patch-electron_shell_browser_api_electron__api__web__contents.cc) = 80b54525d2044969eca05f4cb508c62fe55d47f5
+SHA1 (patch-electron_shell_browser_api_electron__api__web__contents.h) = d59d71388e6e4180f2e3dc695edddce36d9cf806
+SHA1 (patch-electron_shell_browser_api_process__metric.h) = 801c204854f8c574fc61c53ab8438f749fbdb4ab
+SHA1 (patch-electron_shell_browser_browser.cc) = aa21e0e41c12001cfaab5d66138bdd9e543466ca
+SHA1 (patch-electron_shell_browser_browser__linux.cc) = 5cd9d2488bd24c4305fe6e2fd88aac3311a3d83b
+SHA1 (patch-electron_shell_browser_browser__process__impl.cc) = 4287868763e5edde3f78977466016aa4b2601a36
+SHA1 (patch-electron_shell_browser_browser__process__impl.h) = cf5493c128336e5b44279dc1f796a24085f16f34
+SHA1 (patch-electron_shell_browser_electron__browser__main__parts.cc) = b4c7b7c63ba982bbcdc4d9b995ed0565f0434441
+SHA1 (patch-electron_shell_browser_electron__browser__main__parts.h) = 2213b1a12b3ca60e6a302a972e2e931928da6207
+SHA1 (patch-electron_shell_browser_electron__browser__main__parts__posix.cc) = e6acd7558b9f082e3c9b479f8df0f169a5bf7112
+SHA1 (patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc) = d79888838c936e1e553b68d5e54c9f8767145393
+SHA1 (patch-electron_shell_browser_feature__list.cc) = 35ff3003d17eb6f4061fb5a6b39e3ca3784c3133
+SHA1 (patch-electron_shell_browser_linux_x11__util.cc) = eec1d8806d95c4bc4087fd99bd13732128cb2b2f
+SHA1 (patch-electron_shell_browser_native__window.cc) = c5ee4d04847e825d28d0755ef49b4aa60bc81ee7
+SHA1 (patch-electron_shell_browser_native__window__views.cc) = 826f5abe5633896c6a4aa3efc17b9c738edf1fa4
+SHA1 (patch-electron_shell_browser_native__window__views.h) = 2b559cee09d82ecce28b83f19d8e889cf79aad2e
+SHA1 (patch-electron_shell_browser_osr_osr__host__display__client.cc) = ea2f80a9c11e59448972dcd8848f54efb2c43e75
+SHA1 (patch-electron_shell_browser_osr_osr__host__display__client.h) = 0713ff142dc365c1e44cd75f1fcb824a411298ab
+SHA1 (patch-electron_shell_browser_osr_osr__paint__event.h) = b49eb195a21ed8ac565c98825cf9c0eaa98a2b42
+SHA1 (patch-electron_shell_browser_osr_osr__video__consumer.cc) = c009cec1cfaeb790c042bf583319e75d34a4ed7d
+SHA1 (patch-electron_shell_browser_printing_printing__utils.cc) = 2aa80cbe4fd4deb7ceafe1675f77ba3570138d73
+SHA1 (patch-electron_shell_browser_relauncher__linux.cc) = 85fe7146f9535887fcc8a66b3f07bdae83272673
+SHA1 (patch-electron_shell_browser_ui_inspectable__web__contents.cc) = e3d7f3d080d0a0772b170a9fa0e82cd4e599430a
+SHA1 (patch-electron_shell_browser_ui_inspectable__web__contents__view.cc) = d7cfe0315663b02a262231b1dfad1ec2105a78a8
+SHA1 (patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h) = 3a538ca984fe9f9d8d3d7589b83fc965bb96ade7
+SHA1 (patch-electron_shell_browser_ui_views_electron__views__delegate.cc) = 1f68db858dc31983728feb37355c79923c8c925b
+SHA1 (patch-electron_shell_browser_ui_views_electron__views__delegate.h) = 5bd759663494bb757ef226b3ae04a238e86cc98d
+SHA1 (patch-electron_shell_browser_ui_views_menu__bar.cc) = acb118d8e090d892447a5bf8a8ba1aeecfdfedf9
+SHA1 (patch-electron_shell_browser_ui_views_menu__bar.h) = 5af8fca122c0ef54d1ac5fc1788af31ced50a775
+SHA1 (patch-electron_shell_browser_ui_views_submenu__button.cc) = bb5f170e1c1aa2a4bdae4245ef3d58403d243435
+SHA1 (patch-electron_shell_common_api_electron__api__native__image.cc) = 49c842a1216763aac4a6b942934c1a88548628a2
+SHA1 (patch-electron_shell_common_api_electron__api__native__image.h) = 0fc7a034097f4a51cddeb723d468e21dea9afe14
+SHA1 (patch-electron_shell_common_api_electron__api__shared__texture.cc) = 8b32a90c2405e1a4c9f79519da07da96f4b882b0
+SHA1 (patch-electron_shell_common_api_electron__api__testing.cc) = 0eda1097b74d0efef7af75d8aac534e5cffeb5e2
+SHA1 (patch-electron_shell_common_api_electron__bindings.cc) = 79faa89173de167efdcac28d579381e0f5c8d4b0
+SHA1 (patch-electron_shell_common_electron__command__line.cc) = 4fb5fe3b71951f0f750552cd206eb3f3040cc67e
+SHA1 (patch-electron_shell_common_electron__command__line.h) = 33410e1fd3009a0d927d53b9599ee5a5e39e8c87
+SHA1 (patch-electron_shell_common_electron__paths.cc) = ac76b33e4cbb8f40bd71169b7a31029e674e7b28
+SHA1 (patch-electron_shell_common_electron__paths.h) = 0fc266569b09592e22850b2d2300e83c7bb44427
+SHA1 (patch-electron_shell_common_gin__converters_osr__converter.cc) = 7bf84c7b74e8407f0dce6c14d5a6554da439448d
+SHA1 (patch-electron_shell_common_gin__converters_std__converter.h) = 99feb0d55a0cc2fe887cc94c435a71eab38a89c2
+SHA1 (patch-electron_shell_common_node__bindings.cc) = 7c6ac9166ca3a5460ddc0fd3c569dc4a009ad2a4
+SHA1 (patch-electron_shell_common_node__bindings__linux.cc) = bf05af4dba979a82f015ff0130394a717e85501a
+SHA1 (patch-electron_shell_common_platform__util.h) = 1d07e0efddaee503cef5a5c28e64074d3838ca6f
+SHA1 (patch-electron_shell_common_v8__oom__diagnostics.cc) = 23ab0cd9754dd3d8a884dd996042af60f5066183
+SHA1 (patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc) = 4ea707996216020266013bea049cdfca78652deb
+SHA1 (patch-electron_shell_services_node_node__service.cc) = b1e663c7765c0c462bba60a8c100aa61f726b739
+SHA1 (patch-electron_spec_api-app.spec.ts) = 4425644f85f5eb3cf6580f0c2ea3fd6f31f32a1f
+SHA1 (patch-electron_spec_api-browser-window-ignore-mouse-events.spec.ts) = 7c0424426fa76ac8dd4611f7e2b83330f718e8ae
+SHA1 (patch-electron_spec_api-browser-window.spec.ts) = a76e08404a7ad18715388a879ea04290e0860a1c
+SHA1 (patch-electron_spec_api-clipboard.spec.ts) = ea0361211fc0003220748a8734054ba63e639e09
+SHA1 (patch-electron_spec_api-content-tracing.spec.ts) = 3e0ea07df2990a14fff8bfc8627d8d6a966b026e
+SHA1 (patch-electron_spec_api-crash-reporter.spec.ts) = d2d95ab081d636839c395eb47ca95736f801f003
+SHA1 (patch-electron_spec_api-desktop-capturer.spec.ts) = 8b2a1bde49e56dc807aabd07fc405831983ad06f
+SHA1 (patch-electron_spec_api-dialog.spec.ts) = e19a8fa9df382c1f219daad3f92bc0c1bdcca409
+SHA1 (patch-electron_spec_api-media-handler.spec.ts) = abfaa4a33fe7a6ec5d32129a6a1efd024ea87917
+SHA1 (patch-electron_spec_api-menu.spec.ts) = 8bd5c633780823f35b4248cacc09302dd3efdcd5
+SHA1 (patch-electron_spec_api-native-image.spec.ts) = b90931ca01254d384b962f0ba6ef8bf8f1359b53
+SHA1 (patch-electron_spec_api-net-log.spec.ts) = 35b0841ef7d87bc0639605b158cea3230255c193
+SHA1 (patch-electron_spec_api-net.spec.ts) = 505536999f0f119d376cda3b21b0bd7912c7f9dd
+SHA1 (patch-electron_spec_api-notification-dbus.spec.ts) = b3c5a369d2f4ef97c9d7eabd74856015d25e5bda
+SHA1 (patch-electron_spec_api-power-monitor.spec.ts) = 5de5b00374dd77db8378045f7642e85c5a7e223c
+SHA1 (patch-electron_spec_api-process.spec.ts) = 5afe4ec03ab3d1a2b5abc0d758e8a86cfb2ac767
+SHA1 (patch-electron_spec_api-safe-storage.spec.ts) = d6a4b51c94a359ede1b114ad77c54535f0351af4
+SHA1 (patch-electron_spec_api-screen.spec.ts) = 474e12e53ec0af59d3f89cee4b95bf0464412502
+SHA1 (patch-electron_spec_api-shell.spec.ts) = 43c618bcbce02be8d0e92154497f8e61aae7993e
+SHA1 (patch-electron_spec_api-subframe.spec.ts) = 470b851a9423bbe0c002ef4596c055204c31f7a2
+SHA1 (patch-electron_spec_api-system-preferences.spec.ts) = 058b3e0f2eae6c040b82a51780ceb9adffe84a19
+SHA1 (patch-electron_spec_api-tray.spec.ts) = 26387c2cd66ee8f0366b35b903a0f4fb6b61c264
+SHA1 (patch-electron_spec_api-utility-process.spec.ts) = c215051f6ae8e6a8b4b3723b12547a1dd77a3189
+SHA1 (patch-electron_spec_api-web-contents.spec.ts) = 5a256969dafbc49af979da5a22e408f373e641ae
+SHA1 (patch-electron_spec_asar.spec.ts) = 33fdd0cbff2794dcf581dfea37e96db0179794a0
+SHA1 (patch-electron_spec_chromium.spec.ts) = d66f5fefb562993b2368379bb7259b6d0a3704d0
+SHA1 (patch-electron_spec_crash.spec.ts) = 3df2a7679249334743445a24c79b5ea14e0a07ed
+SHA1 (patch-electron_spec_desktop-name.spec.ts) = 6b3ec340682535f0768291a558902de986170ca1
+SHA1 (patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js) = 0cd8379db336fd23a668ea79265713982bd7a858
+SHA1 (patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js) = ba2c15fdc67dec29bf3629391a7e94d7923e9da6
+SHA1 (patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js) = 8fa05f213dffd0e068daeba40410fa19ebedbe80
+SHA1 (patch-electron_spec_lib_spec-helpers.ts) = 2d55cb64c52661f6206e665883de026aff1a485c
+SHA1 (patch-electron_spec_node.spec.ts) = ead18818c620e7d98bbe2874da69aaf33069ff70
+SHA1 (patch-electron_spec_spellchecker.spec.ts) = 2923da97c996bb5916e62bd50ebd7f3f16a7b22d
+SHA1 (patch-electron_spec_visibility-state.spec.ts) = e7e875892fa72e803633bbefe76e16c668d553e9
+SHA1 (patch-electron_spec_webview.spec.ts) = 182c4d62ab8118f02ec7f354fe5f6319d9c8a069
+SHA1 (patch-net_dns_dns__config__service__posix.cc) = ab284ad4478e23c7701b1f39efda83c7cdbfe357
+SHA1 (patch-rollup_rust_bindings__napi_Cargo.toml) = 6a6367bdded501fc2cce3a2bac675a752dfe868b
+SHA1 (patch-rollup_rust_bindings__napi_src_lib.rs) = 942cef5d4df9bfa6539225711362d3a39fa76875
+SHA1 (patch-third__party_electron__node_common.gypi) = 7f316bfd8bf792748cdf9481989bd5c3d5343428
+SHA1 (patch-third__party_electron__node_configure) = cb0e10ac2bcb392215d5e280f11e69b78cc0c94c
+SHA1 (patch-third__party_electron__node_deps_cares_cares.gyp) = 5c093b524d33c813ca3875d1a56393854f90385e
+SHA1 (patch-third__party_electron__node_deps_cares_config_netbsd_ares__config.h) = e44bc05a63ca04f4140817d852049ae238f46627
+SHA1 (patch-third__party_electron__node_deps_cares_unofficial.gni) = 53ac28c8914bf2b4c3707f942edd5d17970f1da1
+SHA1 (patch-third__party_electron__node_deps_histogram_src_hdr__histogram.c) = 56b86c40ab9efe29bba681ea37137a63afb06ea3
+SHA1 (patch-third__party_electron__node_deps_histogram_unofficial.gni) = 3d90a2357c2ce294bc325bab33be682107573878
+SHA1 (patch-third__party_electron__node_deps_openssl_unofficial.gni) = 1e7b2e371bc1d8a02686fa2254151747b2f88603
+SHA1 (patch-third__party_electron__node_deps_uv_common.gypi) = 0c4fe844c04266bbbe37993bd3f470949dd7bad4
+SHA1 (patch-third__party_electron__node_deps_uv_src_unix_pipe.c) = b5538a6017dbf79786fa206e0d73df1c808d9248
+SHA1 (patch-third__party_electron__node_deps_uv_unofficial.gni) = 5a74a2b6ca0e1e7d25237bf0307f75e3fbb65651
+SHA1 (patch-third__party_electron__node_deps_uvwasi_include_wasi__serdes.h) = 626f663702b3f25151202fb2cfec01d131d3d604
+SHA1 (patch-third__party_electron__node_deps_v8_src_base_platform_memory.h) = 6a7c5a51c543acb8cb13816532e5bd0172774367
+SHA1 (patch-third__party_electron__node_deps_v8_src_base_platform_platform-freebsd.cc) = 3eb3be47fa32f4f37dda4389cb76e8a5f33b4c05
+SHA1 (patch-third__party_electron__node_deps_v8_src_base_platform_platform-openbsd.cc) = bb7f87e6721811d0df55cfb033e06a129af6ab6f
+SHA1 (patch-third__party_electron__node_deps_v8_src_base_platform_platform-posix.cc) = 40929becfa42f1f823919fe1c88259bd0e55a746
+SHA1 (patch-third__party_electron__node_deps_v8_src_base_platform_semaphore.cc) = 5494a4926fa3c83702d73abed8ac4b718a86ddf6
+SHA1 (patch-third__party_electron__node_deps_v8_src_base_strings.h) = 990daf49af336a037ed49539de339c62efa5955d
+SHA1 (patch-third__party_electron__node_deps_v8_src_codegen_arm_cpu-arm.cc) = 890de880afd3175fd40483df43abd21557cb6c46
+SHA1 (patch-third__party_electron__node_deps_v8_src_common_globals.h) = 24d6f31d2a962cfc5d206ccc72985b3b67094b53
+SHA1 (patch-third__party_electron__node_deps_v8_src_compiler_turboshaft_int64-lowering-reducer.h) = 95dfcadf4fd7ffaa3b53d40718889448dfd42334
+SHA1 (patch-third__party_electron__node_deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc) = 1cdddc621c3ba6657c561778106d21831f9ad374
+SHA1 (patch-third__party_electron__node_deps_v8_tools_profiling_run-llprof.sh) = fb6126b09f6ffd5b2ca864db5087291151e21342
+SHA1 (patch-third__party_electron__node_node.gypi) = 48b9fb08de54c099539487a3a204e1d5bfaae3ad
+SHA1 (patch-third__party_electron__node_src_compile__cache.cc) = 66edb227f43a036f03e7f678d779e070ad1e2bf0
+SHA1 (patch-third__party_electron__node_src_crypto_crypto__rsa.cc) = 6228e6b973b1ed60e3add9ad315a75b7257a0ef2
+SHA1 (patch-third__party_electron__node_src_inspector__agent.cc) = a0aa370fee370b5cd2046d4d954ba9f91741d7c4
+SHA1 (patch-third__party_electron__node_src_node__platform.cc) = d10ef15e4c735a67f5bef13b90c5f3b64839a666
+SHA1 (patch-third__party_electron__node_src_node__platform.h) = 9f39227025a81d0c3f63e0f0caa89f9b0a9215e4
+SHA1 (patch-third__party_electron__node_src_node__postmortem__metadata.cc) = 4d2896ccbf757ae4dd0279f90983f179295a857a
+SHA1 (patch-third__party_electron__node_tools_generate__config__gypi.py) = 1533973883acd52954e4b3d93aa8cc0ae6139946
+SHA1 (patch-third__party_electron__node_tools_gyp_pylib_gyp_generator_make.py) = ddf983d781b8a8a2eb34cae525996ed9cebf1148
+SHA1 (patch-third__party_electron__node_tools_gyp_pylib_gyp_xcode__emulation.py) = 5bb1546a3762592cae7f3712b5c21166dc2780ee
+SHA1 (patch-third__party_electron__node_tools_install.py) = 94eba9466429aa1cdef14d277f79a5e1e29475e6
+SHA1 (patch-third__party_electron__node_tools_v8__gypfiles_v8.gyp) = e91a9eedf8bcac332cf9794dd0419a95bf164992
+SHA1 (patch-third__party_electron__node_unofficial.gni) = 38e1cf0cb4dce9672180f4aa9b67a801c9d50c5f
+SHA1 (patch-ui_gfx_font__util.cc) = f73768a16920ff9d923c80e8f9e5bb4e05ec30b2
+SHA1 (patch-ui_gtk_gtk__compat.cc) = abf1883c38b92a5a4d3223e334df01ddab5d29b5
+SHA1 (patch-ui_shell__dialogs_select__file__dialog.h) = 827308f411303a4ad71ae5405687fd66f7094bda
diff --git a/electron44/electron.mk b/electron44/electron.mk
new file mode 100644
index 0000000000..9672fa4ebe
--- /dev/null
+++ b/electron44/electron.mk
@@ -0,0 +1,100 @@
+# $NetBSD$
+#
+# NODE_GYP
+#	Absolute path for node-gyp.
+#
+
+ELECTRON_VER=		44.10.1
+ELECTRON_MAJOR=		${ELECTRON_VER:tu:C/\\.[[:digit:]\.]*//}
+NODE_VERSIONS_ACCEPTED=	24
+ELECTRON=		electron${ELECTRON_MAJOR}
+
+UDEV_REQUIRED=		yes
+
+.if ${DISTNAME} != ${ELECTRON}-${ELECTRON_VER}
+TOOL_DEPENDS+=		${ELECTRON}>=${ELECTRON_VER}:../../wip/${ELECTRON}
+.endif
+
+.for c_arch in x86_64 aarch64
+ONLY_FOR_PLATFORM+=	NetBSD-1[0-9].*-${c_arch}
+ONLY_FOR_PLATFORM+=	Linux-*-${c_arch}
+ONLY_FOR_PLATFORM+=	Darwin-*-${c_arch}
+ONLY_FOR_PLATFORM+=	FreeBSD-*-${c_arch}
+.endfor
+
+ELECTRONBIN=		${PREFIX}/lib/${ELECTRON}/electron
+NODE_GYP=		${PREFIX}/lib/node_modules/npm/bin/node-gyp-bin/node-gyp
+
+FILES_SUBST+=		ELECTRON=${ELECTRON}
+FILES_SUBST+=		ELECTRONBIN=${ELECTRONBIN}
+PLIST_SUBST+=		ELECTRON_MAJOR=${ELECTRON_MAJOR}
+
+PLIST_VARS+=		swiftshader
+.if ${MACHINE_ARCH} == "x86_64"
+PLIST.swiftshader=	yes
+.endif
+
+.include "../../archivers/bzip2/buildlink3.mk"
+.include "../../audio/libopus/buildlink3.mk"
+.include "../../audio/speech-dispatcher/buildlink3.mk"
+.include "../../audio/speex/buildlink3.mk"
+.include "../../devel/dconf/buildlink3.mk"
+.include "../../devel/input-headers/buildlink3.mk"
+.include "../../devel/libatomic/buildlink3.mk"
+.include "../../devel/libepoll-shim/buildlink3.mk"
+.include "../../devel/libusb1/buildlink3.mk"
+.include "../../devel/nspr/buildlink3.mk"
+.include "../../devel/nss/buildlink3.mk"
+.include "../../fonts/fontconfig/buildlink3.mk"
+.include "../../fonts/harfbuzz/buildlink3.mk"
+.include "../../graphics/cairo/buildlink3.mk"
+.include "../../graphics/freetype2/buildlink3.mk"
+.include "../../graphics/hicolor-icon-theme/buildlink3.mk"
+.include "../../graphics/libexif/buildlink3.mk"
+.include "../../graphics/libwebp/buildlink3.mk"
+.include "../../graphics/png/buildlink3.mk"
+.include "../../lang/compiler-rt/buildlink3.mk"
+BUILDLINK_DEPMETHOD.nodejs=	build
+.include "../../lang/nodejs/nodeversion.mk"
+.include "../../lang/python/tool.mk"
+.include "../../lang/rust/rust.mk"
+.include "../../misc/usbids/buildlink3.mk"
+.include "../../mk/jpeg.buildlink3.mk" # libjpeg-turbo
+.include "../../mk/udev.buildlink3.mk"
+.include "../../multimedia/dav1d/buildlink3.mk"
+.include "../../multimedia/libaom/buildlink3.mk"
+.include "../../multimedia/libvpx/buildlink3.mk"
+.include "../../multimedia/openh264/buildlink3.mk"
+.include "../../net/libcares/buildlink3.mk"
+.include "../../print/libcups/buildlink3.mk"
+.include "../../security/libgnome-keyring/buildlink3.mk"
+.include "../../security/libsecret/buildlink3.mk"
+.include "../../security/libgcrypt/buildlink3.mk"
+.include "../../sysutils/dbus/buildlink3.mk"
+.include "../../sysutils/dbus-glib/buildlink3.mk"
+.include "../../sysutils/libnotify/buildlink3.mk"
+.include "../../sysutils/pciutils/buildlink3.mk"
+# Use -lpciutils instead of -lpci for pkgsrc.
+BUILDLINK_TRANSFORM+=	l:pci:pciutils
+.include "../../textproc/expat/buildlink3.mk"
+#.include "../../textproc/icu/buildlink3.mk"
+.include "../../textproc/jsoncpp/buildlink3.mk"
+.include "../../textproc/libxml2/buildlink3.mk"
+.include "../../textproc/libxslt/buildlink3.mk"
+.include "../../www/nghttp2/buildlink3.mk"
+.include "../../x11/gtk3/buildlink3.mk"
+.include "../../x11/xorgproto/buildlink3.mk"
+.include "../../x11/libdrm/buildlink3.mk"
+.include "../../x11/libX11/buildlink3.mk"
+.include "../../x11/libxcb/buildlink3.mk"
+.include "../../x11/libXcomposite/buildlink3.mk"
+.include "../../x11/libXcursor/buildlink3.mk"
+.include "../../x11/libXdamage/buildlink3.mk"
+.include "../../x11/libXext/buildlink3.mk"
+.include "../../x11/libXfixes/buildlink3.mk"
+.include "../../x11/libXi/buildlink3.mk"
+.include "../../x11/libXrandr/buildlink3.mk"
+.include "../../x11/libXrender/buildlink3.mk"
+.include "../../x11/libXScrnSaver/buildlink3.mk"
+.include "../../x11/libXtst/buildlink3.mk"
+.include "../../x11/qt6-qtbase/buildlink3.mk"
diff --git a/electron44/files/apply-electron-patches.sh b/electron44/files/apply-electron-patches.sh
new file mode 100644
index 0000000000..e07069b0c3
--- /dev/null
+++ b/electron44/files/apply-electron-patches.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+PATH=/bin:/usr/bin:/usr/pkg/bin
+BASEDIR=$PWD
+PATCHCONF="${BASEDIR}/electron/patches/config.json"
+
+for _dirs in $(sed -n 's|.*patch_dir": "src\(.*\)", "repo": "src\(.*\)".*|.\1:.\2|p' < ${PATCHCONF}); do
+	_patchdir=$(echo "$_dirs" | cut -d: -f1)
+	_srcdir=$(echo "$_dirs" | cut -d: -f2)
+	cd "$BASEDIR/$_srcdir"
+	while read -r _patch; do
+		git apply --reject --directory="$(git rev-parse --show-prefix)" "${BASEDIR}/${_patchdir}/${_patch}"
+	done < "${BASEDIR}/${_patchdir}/.patches"
+done
diff --git a/electron44/files/gen-electron-node-modules.sh b/electron44/files/gen-electron-node-modules.sh
new file mode 100644
index 0000000000..78ee731654
--- /dev/null
+++ b/electron44/files/gen-electron-node-modules.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+PATH=/bin:/usr/bin:/usr/pkg/bin
+
+WRKSRC=$PWD
+TARGET=$1
+DISTFILES=$2
+
+HOME="${WRKSRC}" XDG_CACHE_HOME="${WRKSRC}/.ecache" \
+YARN_GLOBAL_FOLDER="${WRKSRC}/.ecache/yarn-global" \
+YARN_CACHE_FOLDER="${WRKSRC}/${TARGET}" \
+YARN_ENABLE_GLOBAL_CACHE=false \
+YARN_ENABLE_TELEMETRY=0 \
+YARN_ENABLE_SCRIPTS=false \
+yarn install --immutable --mode=skip-build
+
+mtree -cbnSp "${TARGET}" | mtree -C | sed \
+        -e 's:time=[0-9.]*:time=61171200.000000000:' \
+        -e 's:\([gu]id\)=[0-9]*:\1=0:g' \
+        -e 's:mode=\([0-9]\)7[0-9][0-9]:mode=\1755:' \
+        -e 's:mode=\([0-9]\)6[0-9][0-9]:mode=\1644:' \
+        -e 's:flags=.*:flags=none:' \
+        -e "s:^\.:./${TARGET}:" > "${TARGET}.mtree"
+
+tar -cf - "@${TARGET}.mtree" | gzip -9n > "${DISTFILES}/${TARGET}.tar.gz"
+
+sha512 "${DISTFILES}/${TARGET}.tar.gz"
+stat -f 'Size (%N) = %z bytes' "${DISTFILES}/${TARGET}.tar.gz"
+
diff --git a/electron44/options.mk b/electron44/options.mk
new file mode 100644
index 0000000000..661bd7ef52
--- /dev/null
+++ b/electron44/options.mk
@@ -0,0 +1,62 @@
+# $NetBSD: $
+
+PKG_OPTIONS_VAR=		PKG_OPTIONS.electron
+PKG_OPTIONS_REQUIRED_GROUPS=	audio
+PKG_OPTIONS_GROUP.audio=	alsa pulseaudio sunaudio
+PKG_SUPPORTED_OPTIONS+=		debug wayland
+
+.if ${OPSYS} == "NetBSD"
+PKG_SUGGESTED_OPTIONS+=		sunaudio
+.else
+PKG_SUGGESTED_OPTIONS+=		pulseaudio
+.endif
+
+.include "../../devel/wayland/platform.mk"
+.if ${PLATFORM_SUPPORTS_WAYLAND} == "yes"
+.  if ${OPSYS} == "NetBSD" && ${OPSYS_VERSION} < 110000 && ${X11_TYPE} == "native"
+# Need libdrm >= 2.4.116 for wayland support
+.  else
+PKG_SUGGESTED_OPTIONS+=	wayland
+.  endif
+.endif
+
+.include "../../mk/bsd.options.mk"
+
+.if !empty(PKG_OPTIONS:Msunaudio)
+GN_ARGS+=	use_audioio=true
+.else
+GN_ARGS+=	use_audioio=false
+.endif
+
+.if !empty(PKG_OPTIONS:Malsa)
+GN_ARGS+=	use_alsa=true
+.include "../../audio/alsa-lib/buildlink3.mk"
+.else
+GN_ARGS+=	use_alsa=false
+.endif
+
+.if !empty(PKG_OPTIONS:Mpulseaudio)
+GN_ARGS+=	use_pulseaudio=true
+.include "../../audio/pulseaudio/buildlink3.mk"
+.else
+GN_ARGS+=	use_pulseaudio=false
+.endif
+
+.if !empty(PKG_OPTIONS:Mwayland)
+GN_ARGS+=	use_system_libffi=true
+.include "../../devel/libffi/buildlink3.mk"
+.include "../../devel/wayland/buildlink3.mk"
+.else
+GN_ARGS+=	ozone_platform_wayland=false
+.endif
+
+.if !empty(PKG_OPTIONS:Mdebug)
+GN_FILE=		testing.gn
+GN_ARGS+=		symbol_level=1
+INSTALL_UNSTRIPPED=	yes
+.else
+GN_FILE=		release.gn
+GN_ARGS+=		blink_symbol_level=0
+GN_ARGS+=		symbol_level=0
+GN_VERBOSE=		# empty
+.endif
diff --git a/electron44/patches/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc b/electron44/patches/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc
new file mode 100644
index 0000000000..05f11d57fc
--- /dev/null
+++ b/electron44/patches/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.cc
@@ -0,0 +1,229 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc.orig	2026-11-03 19:08:32.104043454 +0000
++++ chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
+@@ -335,216 +335,10 @@ bool MaybeIsLocalUNCPath(const base::Fil
+ }
+ #endif
+ 
+-// A wrapper around `base::NormalizeFilePath` that returns its result instead of
+-// using an out parameter.
+-base::FilePath NormalizeFilePath(const base::FilePath& path) {
+-  base::FilePath absolute_path = path;
+-  if (!absolute_path.IsAbsolute()) {
+-    absolute_path = base::MakeAbsoluteFilePath(absolute_path);
+-  }
+-
+-  if (absolute_path.empty()) {
+-    return absolute_path;
+-  }
+-
+-  // TODO(crbug.com/368130513O): On Windows, this call will fail if the target
+-  // file path is greater than MAX_PATH. We should decide how to handle this
+-  // scenario.
+-  // If the path is invalid, the `base::NormalizeFilePath` will also return
+-  // false, so we return the empty path.
+-  base::FilePath normalized_path;
+-  if (!base::NormalizeFilePath(absolute_path, &normalized_path)) {
+-    return absolute_path;
+-  }
+-  CHECK_EQ(path.empty(), normalized_path.empty());
+-  return normalized_path;
+-}
+-
+-using BlockType = ChromeFileSystemAccessPermissionContext::BlockType;
+-
+-std::unique_ptr<ChromeFileSystemAccessPermissionContext::BlockPathRules>
+-GenerateBlockPaths(bool should_normalize_file_path) {
+-  using BlockPath = ChromeFileSystemAccessPermissionContext::BlockPath;
+-  static constexpr BlockPath kBlockPaths[] = {
+-      // Don't allow users to share their entire home directory, entire desktop
+-      // or entire documents folder, but do allow sharing anything inside those
+-      // directories not otherwise blocked.
+-      BlockPath::CreateRelative(base::DIR_HOME, BlockType::kDontBlockChildren),
+-      BlockPath::CreateRelative(base::DIR_USER_DESKTOP,
+-                                BlockType::kDontBlockChildren),
+-      BlockPath::CreateRelative(chrome::DIR_USER_DOCUMENTS,
+-                                BlockType::kDontBlockChildren),
+-      // Similar restrictions for the downloads directory.
+-      BlockPath::CreateRelative(chrome::DIR_DEFAULT_DOWNLOADS,
+-                                BlockType::kDontBlockChildren),
+-      BlockPath::CreateRelative(chrome::DIR_DEFAULT_DOWNLOADS_SAFE,
+-                                BlockType::kDontBlockChildren),
+-      // The Chrome installation itself should not be modified by the web.
+-      BlockPath::CreateRelative(base::DIR_EXE, BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_MODULE, BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_ASSETS, BlockType::kBlockAllChildren),
+-      // And neither should the configuration of at least the currently running
+-      // Chrome instance (note that this does not take --user-data-dir command
+-      // line overrides into account).
+-      BlockPath::CreateRelative(chrome::DIR_USER_DATA,
+-                                BlockType::kBlockAllChildren),
+-      // ~/.ssh is pretty sensitive on all platforms, so block access to that.
+-      BlockPath::CreateRelative(base::DIR_HOME, FILE_PATH_LITERAL(".ssh"),
+-                                BlockType::kBlockAllChildren),
+-      // And limit access to ~/.gnupg as well.
+-      BlockPath::CreateRelative(base::DIR_HOME, FILE_PATH_LITERAL(".gnupg"),
+-                                BlockType::kBlockAllChildren),
+-#if BUILDFLAG(IS_WIN)
+-      // Some Windows specific directories to block, basically all apps, the
+-      // operating system itself, as well as configuration data for apps.
+-      BlockPath::CreateRelative(base::DIR_PROGRAM_FILES,
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_PROGRAM_FILESX86,
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_PROGRAM_FILES6432,
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_WINDOWS,
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_ROAMING_APP_DATA,
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_LOCAL_APP_DATA,
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_COMMON_APP_DATA,
+-                                BlockType::kBlockAllChildren),
+-      // Opening a file from an MTP device, such as a smartphone or a camera, is
+-      // implemented by Windows as opening a file in the temporary internet
+-      // files directory. To support that, allow opening files in that
+-      // directory, but not whole directories.
+-      BlockPath::CreateRelative(base::DIR_IE_INTERNET_CACHE,
+-                                BlockType::kBlockNestedDirectories),
+-      // Block */.git/hooks on Windows, see crbug.com/465668234.
+-      BlockPath::CreateSuffix(FILE_PATH_LITERAL(".git/hooks"),
+-                              BlockType::kBlockWrite),
+-#endif
+-#if BUILDFLAG(IS_MAC)
+-      // Similar Mac specific blocks.
+-      BlockPath::CreateRelative(base::DIR_APP_DATA,
+-                                BlockType::kBlockAllChildren),
+-      // Block access to the current bundle directory.
+-      BlockPath::CreateRelative(chrome::DIR_OUTER_BUNDLE,
+-                                BlockType::kBlockAllChildren),
+-      // Block access to the user's Applications directory.
+-      BlockPath::CreateRelative(base::DIR_HOME,
+-                                FILE_PATH_LITERAL("Applications"),
+-                                BlockType::kBlockAllChildren),
+-      // Block access to the root Applications directory.
+-      BlockPath::CreateAbsolute(FILE_PATH_LITERAL("/Applications"),
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateRelative(base::DIR_HOME, FILE_PATH_LITERAL("Library"),
+-                                BlockType::kBlockAllChildren),
+-      // Allow access to other cloud files, such as Google Drive.
+-      BlockPath::CreateRelative(base::DIR_HOME,
+-                                FILE_PATH_LITERAL("Library/CloudStorage"),
+-                                BlockType::kDontBlockChildren),
+-      // Allow the site to interact with data from its corresponding natively
+-      // installed (sandboxed) application. It would be nice to limit a site to
+-      // access only _its_ corresponding natively installed application, but
+-      // unfortunately there's no straightforward way to do that. See
+-      // https://crbug.com/40095723#comment23.
+-      BlockPath::CreateRelative(base::DIR_HOME,
+-                                FILE_PATH_LITERAL("Library/Containers"),
+-                                BlockType::kDontBlockChildren),
+-      // Allow access to iCloud files...
+-      BlockPath::CreateRelative(base::DIR_HOME,
+-                                FILE_PATH_LITERAL("Library/Mobile Documents"),
+-                                BlockType::kDontBlockChildren),
+-      // ... which may also appear at this directory.
+-      BlockPath::CreateRelative(
+-          base::DIR_HOME,
+-          FILE_PATH_LITERAL("Library/Mobile Documents/com~apple~CloudDocs"),
+-          BlockType::kDontBlockChildren),
+-#endif
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+-      // On Linux also block access to devices via /dev.
+-      BlockPath::CreateAbsolute(FILE_PATH_LITERAL("/dev"),
+-                                BlockType::kBlockAllChildren),
+-      // And security sensitive data in /proc and /sys.
+-      BlockPath::CreateAbsolute(FILE_PATH_LITERAL("/proc"),
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateAbsolute(FILE_PATH_LITERAL("/sys"),
+-                                BlockType::kBlockAllChildren),
+-      // And system files in /boot and /etc.
+-      BlockPath::CreateAbsolute(FILE_PATH_LITERAL("/boot"),
+-                                BlockType::kBlockAllChildren),
+-      BlockPath::CreateAbsolute(FILE_PATH_LITERAL("/etc"),
+-                                BlockType::kBlockAllChildren),
+-      // And block all of ~/.config, matching the similar restrictions on mac
+-      // and windows.
+-      BlockPath::CreateRelative(base::DIR_HOME, FILE_PATH_LITERAL(".config"),
+-                                BlockType::kBlockAllChildren),
+-      // Block ~/.dbus as well, just in case, although there probably isn't much
+-      // a website can do with access to that directory and its contents.
+-      BlockPath::CreateRelative(base::DIR_HOME, FILE_PATH_LITERAL(".dbus"),
+-                                BlockType::kBlockAllChildren),
+-      // And block all of ~/.cache, matching the similar restrictions on mac
+-      // and windows.
+-      BlockPath::CreateRelative(base::DIR_CACHE, BlockType::kBlockAllChildren),
+-#endif
+-#if BUILDFLAG(IS_ANDROID)
+-      BlockPath::CreateRelative(base::DIR_ANDROID_APP_DATA,
+-                                BlockType::kBlockAllChildren),
+-#endif
+-      // TODO(crbug.com/40095723): Refine this list, for example add
+-      // XDG_CONFIG_HOME when it is not set ~/.config?
+-  };
+-
+-  // ChromeOS supports multi-user sign-in. base::DIR_HOME only returns the
+-  // profile path for the primary user, the first user to sign in. We want to
+-  // use the `profile_path` instead since that's associated with user that
+-  // initiated this blocklist check.
+-  //
+-  // TODO(crbug.com/375490221): Improve the ChromeOS blocklist logic.
+-  constexpr bool kUseProfilePathForDirHome = BUILDFLAG(IS_CHROMEOS);
+-  // Populate the hard-coded rules.
+-  auto block_path_rules = std::make_unique<
+-      ChromeFileSystemAccessPermissionContext::BlockPathRules>();
+-
+-  for (const auto& blocked_path : kBlockPaths) {
+-    base::FilePath path;
+-    switch (blocked_path.block_path_type) {
+-      case ChromeFileSystemAccessPermissionContext::BlockPathType::kAbsolute: {
+-        CHECK(blocked_path.path);
+-        path = base::FilePath(blocked_path.path);
+-        break;
+-      }
+-      case ChromeFileSystemAccessPermissionContext::BlockPathType::kRelative: {
+-        CHECK(blocked_path.base_path_key);
+-        if (kUseProfilePathForDirHome &&
+-            blocked_path.base_path_key == base::DIR_HOME) {
+-          block_path_rules->profile_based_block_path_rules_.emplace_back(
+-              blocked_path.path, blocked_path.block_type);
+-          continue;
+-        }
+-
+-        if (!base::PathService::Get(blocked_path.base_path_key.value(),
+-                                    &path)) {
+-          continue;
+-        }
+-
+-        if (blocked_path.path) {
+-          path = path.Append(blocked_path.path);
+-        }
+-        break;
+-      }
+-      case ChromeFileSystemAccessPermissionContext::BlockPathType::kSuffix: {
+-        block_path_rules->suffix_block_path_rules_.emplace_back(
+-            blocked_path.path, blocked_path.block_type);
+-        continue;
+-      }
+-    }
+-
+-    block_path_rules->block_path_rules_.emplace_back(
+-        should_normalize_file_path ? NormalizeFilePath(path) : path,
+-        blocked_path.block_type);
+-  }
+-
+-  return block_path_rules;
+-}
++// This patch moves the deleted content from this file over to
++// chrome/browser/file_system_access/chrome_file_system_access_permission_context.h.
++// NOTE IF THERE IS A CONFLICT ABOVE, you will need to copy the changes in the
++// removed block over to chrome_file_system_access_permission_context.h.
+ 
+ // Checks if `path` should be blocked by the `rules`.
+ // The BlockType of the nearest ancestor of a path to check is what
diff --git a/electron44/patches/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.h b/electron44/patches/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.h
new file mode 100644
index 0000000000..43c3587747
--- /dev/null
+++ b/electron44/patches/patch-chrome_browser_file__system__access_chrome__file__system__access__permission__context.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- chrome/browser/file_system_access/chrome_file_system_access_permission_context.h.orig	2026-11-03 19:08:32.222049151 +0000
++++ chrome/browser/file_system_access/chrome_file_system_access_permission_context.h
+@@ -683,7 +683,7 @@ class ChromeFileSystemAccessPermissionCo
+             FILE_PATH_LITERAL("Library/Mobile Documents/com~apple~CloudDocs"),
+             BlockType::kDontBlockChildren),
+   #endif
+-  #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
++  #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD)
+         // On Linux also block access to devices via /dev.
+         BlockPath::CreateAbsolute(FILE_PATH_LITERAL("/dev"),
+                                   BlockType::kBlockAllChildren),
diff --git a/electron44/patches/patch-chrome_browser_process__singleton__posix.cc b/electron44/patches/patch-chrome_browser_process__singleton__posix.cc
new file mode 100644
index 0000000000..1f8eee4920
--- /dev/null
+++ b/electron44/patches/patch-chrome_browser_process__singleton__posix.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- chrome/browser/process_singleton_posix.cc.orig	2026-11-03 19:08:31.429630127 +0000
++++ chrome/browser/process_singleton_posix.cc
+@@ -105,7 +105,7 @@
+ #include "ui/base/l10n/l10n_util.h"
+ #include "ui/base/resource/scoped_startup_resource_bundle.h"
+ 
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
++#if 0
+ #include "chrome/browser/ui/dialogs/process_singleton_dialog_linux.h"
+ #endif
+ 
diff --git a/electron44/patches/patch-components_os__crypt_sync_os__crypt.h b/electron44/patches/patch-components_os__crypt_sync_os__crypt.h
new file mode 100644
index 0000000000..e26f6d46ab
--- /dev/null
+++ b/electron44/patches/patch-components_os__crypt_sync_os__crypt.h
@@ -0,0 +1,118 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- components/os_crypt/sync/os_crypt.h.orig	2026-11-03 19:08:31.157287721 +0000
++++ components/os_crypt/sync/os_crypt.h
+@@ -25,9 +25,9 @@ class KeychainV2;
+ }
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class KeyStorageLinux;
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ 
+ #if BUILDFLAG(IS_WIN)
+ class PrefRegistrySimple;
+@@ -41,10 +41,10 @@ struct Config;
+ // Temporary interface due to OSCrypt refactor. See OSCryptImpl for descriptions
+ // of what each function does.
+ namespace OSCrypt {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(OS_CRYPT)
+ void SetConfig(std::unique_ptr<os_crypt::Config> config);
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ COMPONENT_EXPORT(OS_CRYPT) bool IsEncryptionAvailable();
+ COMPONENT_EXPORT(OS_CRYPT)
+ bool EncryptString16(const std::u16string& plaintext, std::string* ciphertext);
+@@ -88,7 +88,7 @@ COMPONENT_EXPORT(OS_CRYPT) void UseMockK
+ COMPONENT_EXPORT(OS_CRYPT) void SetLegacyEncryptionForTesting(bool legacy);
+ COMPONENT_EXPORT(OS_CRYPT) void ResetStateForTesting();
+ #endif  // BUILDFLAG(IS_WIN)
+-#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS))
++#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !BUILDFLAG(IS_CASTOS))
+ COMPONENT_EXPORT(OS_CRYPT)
+ void UseMockKeyStorageForTesting(
+     base::OnceCallback<std::unique_ptr<KeyStorageLinux>()>
+@@ -96,13 +96,13 @@ void UseMockKeyStorageForTesting(
+ COMPONENT_EXPORT(OS_CRYPT) void ClearCacheForTesting();
+ COMPONENT_EXPORT(OS_CRYPT)
+ void SetEncryptionPasswordForTesting(const std::string& password);
+-#endif  // (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS))
++#endif  // ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !BUILDFLAG(IS_CASTOS))
+ #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE) &&         \
+-        !(BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS)) || \
++        !((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !BUILDFLAG(IS_CASTOS)) || \
+     BUILDFLAG(IS_FUCHSIA)
+ COMPONENT_EXPORT(OS_CRYPT)
+ void SetEncryptionAvailableForTesting(std::optional<bool> available);
+-#endif  // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE) && !(BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE) && !((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD))
+         // && !BUILDFLAG(IS_CASTOS)) || BUILDFLAG(IS_FUCHSIA)
+ }  // namespace OSCrypt
+ 
+@@ -122,12 +122,12 @@ class COMPONENT_EXPORT(OS_CRYPT) OSCrypt
+   // Returns singleton instance of OSCryptImpl.
+   static OSCryptImpl* GetInstance();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Set the configuration of OSCryptImpl.
+   // This method, or SetRawEncryptionKey(), must be called before using
+   // EncryptString() and DecryptString().
+   void SetConfig(std::unique_ptr<os_crypt::Config> config);
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ 
+   // In production code:
+   // - On Linux, returns true iff the real secret key (not hardcoded one) is
+@@ -214,7 +214,7 @@ class COMPONENT_EXPORT(OS_CRYPT) OSCrypt
+   void ResetStateForTesting();
+ #endif
+ 
+-#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS))
++#if ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !BUILDFLAG(IS_CASTOS))
+   // For unit testing purposes, inject methods to be used.
+   // |storage_provider_factory| provides the desired |KeyStorage|
+   // implementation. If the provider returns |nullptr|, a hardcoded password
+@@ -230,7 +230,7 @@ class COMPONENT_EXPORT(OS_CRYPT) OSCrypt
+ 
+   // Sets the password with which the encryption key is derived, e.g. "peanuts".
+   void SetEncryptionPasswordForTesting(const std::string& password);
+-#endif  // (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CASTOS))
++#endif  // ((BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)) && !BUILDFLAG(IS_CASTOS))
+  private:
+ #if BUILDFLAG(IS_APPLE)
+   // Return the keychain to use for accessing the encryption key.
+@@ -241,13 +241,13 @@ class COMPONENT_EXPORT(OS_CRYPT) OSCrypt
+   bool DeriveKey();
+ #endif  // BUILDFLAG(IS_APPLE)
+ 
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+   // This lock is used to make the GetEncryptionKey and
+   // GetRawEncryptionKey methods thread-safe.
+   static base::Lock& GetLock();
+-#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD)
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   static constexpr size_t kDerivedKeyBytes = 16;
+ 
+   crypto::SubtlePassKey MakeCryptoPassKey();
+@@ -276,7 +276,7 @@ class COMPONENT_EXPORT(OS_CRYPT) OSCrypt
+ 
+   base::OnceCallback<std::unique_ptr<KeyStorageLinux>()>
+       storage_provider_factory_for_testing_;
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ 
+ #if BUILDFLAG(IS_WIN)
+   // Use mock key instead of a real encryption key. Used for testing.
diff --git a/electron44/patches/patch-components_os__crypt_sync_os__crypt__unittest.cc b/electron44/patches/patch-components_os__crypt_sync_os__crypt__unittest.cc
new file mode 100644
index 0000000000..d948d852fe
--- /dev/null
+++ b/electron44/patches/patch-components_os__crypt_sync_os__crypt__unittest.cc
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- components/os_crypt/sync/os_crypt_unittest.cc.orig	2026-11-03 19:08:31.157799363 +0000
++++ components/os_crypt/sync/os_crypt_unittest.cc
+@@ -19,7 +19,7 @@
+ #include "components/os_crypt/sync/os_crypt_mocker.h"
+ #include "testing/gtest/include/gtest/gtest.h"
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "components/os_crypt/sync/os_crypt_mocker_linux.h"
+ #endif
+ 
+@@ -163,7 +163,7 @@ TEST_F(OSCryptTest, Metrics) {
+ #if BUILDFLAG(IS_WIN)
+     histograms.ExpectTotalCount("OSCrypt.EncryptionPrefixVersion", 0);
+ #else
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     // Linux defaults to using a `v11` key.
+     const os_crypt::EncryptionPrefixVersion expected =
+         os_crypt::EncryptionPrefixVersion::kVersion11;
+@@ -171,7 +171,7 @@ TEST_F(OSCryptTest, Metrics) {
+     // All other non-Windows platforms use a `v10` key.
+     const os_crypt::EncryptionPrefixVersion expected =
+         os_crypt::EncryptionPrefixVersion::kVersion10;
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     histograms.ExpectUniqueSample("OSCrypt.EncryptionPrefixVersion", expected,
+                                   1u);
+ #endif  // BUILDFLAG(IS_WIN)
diff --git a/electron44/patches/patch-content_browser_child__process__launcher__helper__linux.cc b/electron44/patches/patch-content_browser_child__process__launcher__helper__linux.cc
new file mode 100644
index 0000000000..65e43cb9bf
--- /dev/null
+++ b/electron44/patches/patch-content_browser_child__process__launcher__helper__linux.cc
@@ -0,0 +1,34 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- content/browser/child_process_launcher_helper_linux.cc.orig	2026-11-03 19:08:31.466811501 +0000
++++ content/browser/child_process_launcher_helper_linux.cc
+@@ -73,7 +73,25 @@ bool ChildProcessLauncherHelper::BeforeL
+       options->fds_to_remap.emplace_back(sandbox_fd, GetSandboxFD());
+     }
+ 
++    for (const auto& remapped_fd : file_data_->additional_remapped_fds) {
++      options->fds_to_remap.emplace_back(remapped_fd.second.get(),
++                                         remapped_fd.first);
++    }
++
++#if !BUILDFLAG(IS_BSD)
++    // (For Electron), if we're launching without zygote, that means we're
++    // launching an unsandboxed process (since all sandboxed processes are
++    // forked from the zygote). Relax the allow_new_privs option to permit
++    // launching suid processes from unsandboxed child processes.
++    if (!base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kNoZygote) &&
++        delegate_->GetZygote() == nullptr) {
++      options->allow_new_privs = true;
++    }
++#endif
++
++    options->current_directory = delegate_->GetCurrentDirectory();
+     options->environment = delegate_->GetEnvironment();
++    options->clear_environment = !delegate_->ShouldInheritEnvironment();
+   } else {
+ #if !BUILDFLAG(IS_BSD)
+     DCHECK(GetZygoteForLaunch());
diff --git a/electron44/patches/patch-electron_BUILD.gn b/electron44/patches/patch-electron_BUILD.gn
new file mode 100644
index 0000000000..2606d72e21
--- /dev/null
+++ b/electron44/patches/patch-electron_BUILD.gn
@@ -0,0 +1,155 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/BUILD.gn.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/BUILD.gn
+@@ -635,7 +635,7 @@ source_set("electron_lib") {
+     defines += [ "GDK_DISABLE_DEPRECATION_WARNINGS" ]
+   }
+ 
+-  if (!is_mas_build) {
++  if (!is_mas_build && !is_bsd) {
+     deps += [
+       "//components/crash/core/app",
+       "//components/crash/core/browser",
+@@ -745,6 +745,12 @@ source_set("electron_lib") {
+       cflags_objcc = [ "-fobjc-weak" ]
+     }
+   }
++  if (is_bsd) {
++    sources -= [
++      "shell/common/crash_keys.cc",
++      "shell/common/crash_keys.h",
++    ]
++  }
+   if (is_linux) {
+     libs = [ "xshmfence" ]
+     deps += [
+@@ -1016,6 +1022,29 @@ if (electron_generate_js2c_code_cache) {
+     ]
+   }
+ 
++  if (target_os == "netbsd") {
++    action("run_paxctl_electron_natives_codecache") {
++      deps = [ ":electron_natives_codecache($v8_snapshot_toolchain)" ]
++
++      script = "//v8/tools/run-paxctl.py"
++      stamp = "$target_gen_dir/paxctl_electron_natives_codecache_stamp"
++      outputs = [ stamp ]
++
++      sources = []
++      data = []
++
++      _pax_dir = get_label_info(":electron_natives_codecache($v8_snapshot_toolchain)",
++                                "root_out_dir")
++      args = [
++        rebase_path(stamp, root_build_dir),
++        "/usr/sbin/paxctl",
++        "+m",
++        "./" + rebase_path(_pax_dir + "/electron_natives_codecache",
++                           root_build_dir),
++      ]
++    }
++  }
++
+   foreach(_f, _js2c_cc_flavors) {
+     action("run_electron_natives_codecache_" + _f.name) {
+       deps = [
+@@ -1023,6 +1052,9 @@ if (electron_generate_js2c_code_cache) {
+         "//tools/v8_context_snapshot",
+         "//v8:run_mksnapshot_default",
+       ]
++      if (target_os == "netbsd") {
++        deps += [ ":run_paxctl_electron_natives_codecache" ]
++      }
+       script = "//v8/tools/run.py"
+       _gen_dir =
+           get_label_info(":electron_natives_codecache($v8_snapshot_toolchain)",
+@@ -1049,11 +1081,38 @@ if (electron_generate_js2c_code_cache) {
+   # Browser flavor, built against the embedded Node startup snapshot so its
+   # code-cache read-only checksum matches the runtime browser isolate.
+   if (node_use_node_snapshot) {
++    if (target_os == "netbsd") {
++      action("run_paxctl_electron_snapshot") {
++         deps = [ ":electron_natives_codecache_snapshot($v8_snapshot_toolchain)" ]
++
++         script = "//v8/tools/run-paxctl.py"
++         stamp = "$target_gen_dir/paxctl_node_electronstamp"
++         outputs = [ stamp ]
++
++         sources = []
++         data = []
++
++         node_mksnapshot_dir =
++             get_label_info(":electron_natives_codecache_snapshot($v8_snapshot_toolchain)",
++                            "root_out_dir")
++         args = [
++           rebase_path(stamp, root_build_dir),
++           "/usr/sbin/paxctl",
++           "+m",
++           "./" + rebase_path(node_mksnapshot_dir + "/electron_natives_codecache_snapshot",
++                              root_build_dir),
++        ]
++      }
++    }
++
+     action("run_electron_natives_codecache_browser") {
+       deps = [
+         ":electron_natives_codecache_snapshot($v8_snapshot_toolchain)",
+         "//v8:run_mksnapshot_default",
+       ]
++      if (target_os == "netbsd") {
++        deps += [ ":run_paxctl_electron_snapshot" ]
++      }
+       script = "//v8/tools/run.py"
+       _gen_dir = get_label_info(
+               ":electron_natives_codecache_snapshot($v8_snapshot_toolchain)",
+@@ -1638,7 +1697,6 @@ if (is_mac) {
+     ":electron_app_manifest",
+     ":electron_lib",
+     ":electron_win32_resources",
+-    "//components/crash/core/app",
+     "//content:sandbox_helper_win",
+     "//electron/buildflags",
+     "//third_party/electron_node:libnode",
+@@ -1675,7 +1733,7 @@ if (is_mac) {
+     } else if (is_linux) {
+       sources = [
+         "shell/app/electron_main_linux.cc",
+-        "shell/app/environ_linux.cc",
++        # "shell/app/environ_linux.cc",
+         "shell/app/uv_stdio_fix.cc",
+         "shell/app/uv_stdio_fix.h",
+       ]
+@@ -1703,7 +1761,7 @@ if (is_mac) {
+       public_deps = [ "//tools/v8_context_snapshot" ]
+     }
+ 
+-    if (is_linux) {
++    if (is_linux && !is_bsd) {
+       data_deps += [ "//components/crash/core/app:chrome_crashpad_handler" ]
+     }
+ 
+@@ -1770,7 +1828,7 @@ if (is_mac) {
+         configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
+       }
+ 
+-      if (is_linux) {
++      if (is_linux && !is_bsd) {
+         deps += [ "//sandbox/linux:chrome_sandbox" ]
+       }
+     }
+@@ -1874,7 +1932,9 @@ dist_zip("electron_dist_zip") {
+       ]
+     }
+ 
+-    data_deps += [ "//sandbox/linux:chrome_sandbox" ]
++    if (!is_bsd) {
++      data_deps += [ "//sandbox/linux:chrome_sandbox" ]
++    }
+   }
+   deps = data_deps
+   if (electron_use_resource_allowlist) {
diff --git a/electron44/patches/patch-electron_build_args_all.gn b/electron44/patches/patch-electron_build_args_all.gn
new file mode 100644
index 0000000000..3472ee223f
--- /dev/null
+++ b/electron44/patches/patch-electron_build_args_all.gn
@@ -0,0 +1,19 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/build/args/all.gn.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/build/args/all.gn
+@@ -37,8 +37,8 @@ v8_enable_snapshot_native_code_counters 
+ v8_enable_javascript_promise_hooks = true
+ 
+ enable_cdm_host_verification = false
+-ffmpeg_branding = "Chrome"
+-proprietary_codecs = true
++# ffmpeg_branding = "Chrome"
++# proprietary_codecs = true
+ 
+ enable_printing = true
+ 
diff --git a/electron44/patches/patch-electron_default__app_default__app.ts b/electron44/patches/patch-electron_default__app_default__app.ts
new file mode 100644
index 0000000000..5ef5ec45e4
--- /dev/null
+++ b/electron44/patches/patch-electron_default__app_default__app.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/default_app/default_app.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/default_app/default_app.ts
+@@ -94,7 +94,7 @@ async function createWindow(backgroundCo
+     show: false
+   };
+ 
+-  if (process.platform === 'linux') {
++  if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+     options.icon = url.fileURLToPath(new URL('icon.png', import.meta.url));
+   }
+ 
diff --git a/electron44/patches/patch-electron_filenames.gni b/electron44/patches/patch-electron_filenames.gni
new file mode 100644
index 0000000000..a919f74382
--- /dev/null
+++ b/electron44/patches/patch-electron_filenames.gni
@@ -0,0 +1,19 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/filenames.gni.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/filenames.gni
+@@ -270,8 +270,8 @@ filenames = {
+     "shell/app/command_line_args.h",
+     "shell/app/electron_content_client.cc",
+     "shell/app/electron_content_client.h",
+-    "shell/app/electron_crash_reporter_client.cc",
+-    "shell/app/electron_crash_reporter_client.h",
++    # "shell/app/electron_crash_reporter_client.cc",
++    # "shell/app/electron_crash_reporter_client.h",
+     "shell/app/electron_main_delegate.cc",
+     "shell/app/electron_main_delegate.h",
+     "shell/app/node_main.cc",
diff --git a/electron44/patches/patch-electron_lib_browser_api_app.ts b/electron44/patches/patch-electron_lib_browser_api_app.ts
new file mode 100644
index 0000000000..d5b1b7bd34
--- /dev/null
+++ b/electron44/patches/patch-electron_lib_browser_api_app.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/lib/browser/api/app.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/lib/browser/api/app.ts
+@@ -71,7 +71,7 @@ if (process.platform === 'darwin') {
+   app.dock!.getMenu = () => dockMenu;
+ }
+ 
+-if (process.platform === 'linux') {
++if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+   const patternVmRSS = /^VmRSS:\s*(\d+) kB$/m;
+   const patternVmHWM = /^VmHWM:\s*(\d+) kB$/m;
+ 
diff --git a/electron44/patches/patch-electron_lib_browser_api_dialog.ts b/electron44/patches/patch-electron_lib_browser_api_dialog.ts
new file mode 100644
index 0000000000..9592017783
--- /dev/null
+++ b/electron44/patches/patch-electron_lib_browser_api_dialog.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/lib/browser/api/dialog.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/lib/browser/api/dialog.ts
+@@ -49,7 +49,7 @@ const normalizeAccessKey = (text: string
+   // existing single underscores with a second underscore, replace double
+   // ampersands with a single ampersand, and replace a single ampersand with
+   // a single underscore
+-  if (process.platform === 'linux') {
++  if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+     return text.replaceAll('_', '__').replaceAll(/&(.?)/g, (match, after) => {
+       if (after === '&') return after;
+       return `_${after}`;
diff --git a/electron44/patches/patch-electron_lib_browser_api_menu-item-roles.ts b/electron44/patches/patch-electron_lib_browser_api_menu-item-roles.ts
new file mode 100644
index 0000000000..07875b0f09
--- /dev/null
+++ b/electron44/patches/patch-electron_lib_browser_api_menu-item-roles.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/lib/browser/api/menu-item-roles.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/lib/browser/api/menu-item-roles.ts
+@@ -3,7 +3,7 @@ import type { WebContents, MenuItemConst
+ 
+ const isMac = process.platform === 'darwin';
+ const isWindows = process.platform === 'win32';
+-const isLinux = process.platform === 'linux';
++const isLinux = (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd');
+ 
+ type RoleId =
+   | 'about'
diff --git a/electron44/patches/patch-electron_lib_browser_api_power-monitor.ts b/electron44/patches/patch-electron_lib_browser_api_power-monitor.ts
new file mode 100644
index 0000000000..00291a4684
--- /dev/null
+++ b/electron44/patches/patch-electron_lib_browser_api_power-monitor.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/lib/browser/api/power-monitor.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/lib/browser/api/power-monitor.ts
+@@ -18,7 +18,7 @@ class PowerMonitor extends EventEmitter 
+       pm = createPowerMonitor();
+       pm.emit = this.emit.bind(this);
+ 
+-      if (process.platform === 'linux') {
++      if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+         // On Linux, we inhibit shutdown in order to give the app a chance to
+         // decide whether or not it wants to prevent the shutdown. We don't
+         // inhibit the shutdown event unless there's a listener for it. This
diff --git a/electron44/patches/patch-electron_lib_browser_init.ts b/electron44/patches/patch-electron_lib_browser_init.ts
new file mode 100644
index 0000000000..e1e8875a39
--- /dev/null
+++ b/electron44/patches/patch-electron_lib_browser_init.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/lib/browser/init.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/lib/browser/init.ts
+@@ -132,7 +132,7 @@ if (packageJson.productName != null) {
+   app.name = `${packageJson.name}`.trim();
+ }
+ 
+-if (process.platform === 'linux') {
++if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+   const { defaultDesktopName } =
+     require('@electron/internal/browser/desktop-name') as typeof import('@electron/internal/browser/desktop-name');
+   app.setDesktopName(packageJson.desktopName || defaultDesktopName(app.name));
diff --git a/electron44/patches/patch-electron_lib_renderer_security-warnings.ts b/electron44/patches/patch-electron_lib_renderer_security-warnings.ts
new file mode 100644
index 0000000000..991bd1ca17
--- /dev/null
+++ b/electron44/patches/patch-electron_lib_renderer_security-warnings.ts
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/lib/renderer/security-warnings.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/lib/renderer/security-warnings.ts
+@@ -25,6 +25,7 @@ const shouldLogSecurityWarnings = functi
+       shouldLog = execPath.endsWith('MacOS/Electron') || execPath.includes('Electron.app/Contents/Frameworks/');
+       break;
+     case 'freebsd':
++    case 'netbsd':
+     case 'linux':
+       shouldLog = execPath.endsWith('/electron');
+       break;
diff --git a/electron44/patches/patch-electron_node__modules_@sentry_cli_scripts_install.js b/electron44/patches/patch-electron_node__modules_@sentry_cli_scripts_install.js
new file mode 100644
index 0000000000..582e6d4758
--- /dev/null
+++ b/electron44/patches/patch-electron_node__modules_@sentry_cli_scripts_install.js
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/node_modules/@sentry/cli/scripts/install.js.orig	2026-11-03 19:08:22.352586569 +0000
++++ electron/node_modules/@sentry/cli/scripts/install.js
+@@ -79,6 +79,7 @@ function getDownloadUrl(platform, arch) 
+       return `${releasesUrl}-Windows-${archString}.exe`;
+     case 'linux':
+     case 'freebsd':
++    case 'netbsd':
+       return `${releasesUrl}-Linux-${archString}`;
+     default:
+       return null;
diff --git a/electron44/patches/patch-electron_npm_install.js b/electron44/patches/patch-electron_npm_install.js
new file mode 100644
index 0000000000..219bf30135
--- /dev/null
+++ b/electron44/patches/patch-electron_npm_install.js
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/npm/install.js.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/npm/install.js
+@@ -107,6 +107,7 @@ function getPlatformPath() {
+     case 'darwin':
+       return 'Electron.app/Contents/MacOS/Electron';
+     case 'freebsd':
++    case 'netbsd':
+     case 'openbsd':
+     case 'linux':
+       return 'electron';
diff --git a/electron44/patches/patch-electron_script_lib_config.py b/electron44/patches/patch-electron_script_lib_config.py
new file mode 100644
index 0000000000..f84227fa1a
--- /dev/null
+++ b/electron44/patches/patch-electron_script_lib_config.py
@@ -0,0 +1,20 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/script/lib/config.py.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/script/lib/config.py
+@@ -7,6 +7,11 @@ PLATFORM = {
+   'cygwin': 'win32',
+   'msys': 'win32',
+   'darwin': 'darwin',
++  'freebsd13': 'freebsd',
++  'freebsd14': 'freebsd',
++  'freebsd15': 'freebsd',
++  'freebsd16': 'freebsd',
++  'netbsd': 'netbsd',
+   'linux': 'linux',
+   'linux2': 'linux',
+   'win32': 'win32',
diff --git a/electron44/patches/patch-electron_script_lib_utils.js b/electron44/patches/patch-electron_script_lib_utils.js
new file mode 100644
index 0000000000..60d0ec0ec8
--- /dev/null
+++ b/electron44/patches/patch-electron_script_lib_utils.js
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/script/lib/utils.js.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/script/lib/utils.js
+@@ -20,7 +20,7 @@ function getElectronExec() {
+       return `out/${OUT_DIR}/Electron.app/Contents/MacOS/Electron`;
+     case 'win32':
+       return `out/${OUT_DIR}/electron.exe`;
+-    case 'linux':
++    case 'linux': case 'freebsd': case 'netbsd':
+       return `out/${OUT_DIR}/electron`;
+     default:
+       throw new Error('Unknown platform');
diff --git a/electron44/patches/patch-electron_script_pgo_collect-profile.js b/electron44/patches/patch-electron_script_pgo_collect-profile.js
new file mode 100644
index 0000000000..a4ad7c7d3e
--- /dev/null
+++ b/electron44/patches/patch-electron_script_pgo_collect-profile.js
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/script/pgo/collect-profile.js.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/script/pgo/collect-profile.js
+@@ -75,7 +75,7 @@ function log(...args) {
+ // network workload coverage degrades but collection still succeeds.
+ function installTrustedCA(caCertPath) {
+   try {
+-    if (process.platform === 'linux') {
++    if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+       const nssDb = path.join(os.homedir(), '.pki', 'nssdb');
+       if (!fs.existsSync(nssDb)) {
+         fs.mkdirSync(nssDb, { recursive: true });
diff --git a/electron44/patches/patch-electron_script_spec-runner.js b/electron44/patches/patch-electron_script_spec-runner.js
new file mode 100644
index 0000000000..8cbb98df24
--- /dev/null
+++ b/electron44/patches/patch-electron_script_spec-runner.js
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/script/spec-runner.js.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/script/spec-runner.js
+@@ -584,7 +584,7 @@ function toVitestInvocation(exe, specDir
+   };
+   let command = process.execPath;
+   let commandArgs = vitestArgs;
+-  if (process.platform === 'linux') {
++  if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+     // The mock D-Bus services are started once around the whole run; every
+     // Electron worker inherits the bus addresses from the CLI's environment.
+     commandArgs = [path.resolve(__dirname, 'dbus_mock.py'), command, ...commandArgs];
+@@ -687,7 +687,7 @@ async function installSpecModules(dir) {
+     process.exit(1);
+   }
+ 
+-  if (process.platform === 'linux') {
++  if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+     const { status: rebuildStatus } = childProcess.spawnSync('npm', ['rebuild', 'abstract-socket'], {
+       env,
+       cwd: dir,
+@@ -765,7 +765,7 @@ async function installSpecModules(dir) {
+ // the same GCC that rejects the headers, so nothing on that host can build
+ // the fixtures.
+ function getNativeAddonToolchainEnv() {
+-  if (args.electronVersion || process.platform !== 'linux') {
++  if (args.electronVersion || (process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')) {
+     return {};
+   }
+   const outDir = utils.getOutDir();
diff --git a/electron44/patches/patch-electron_shell_app_electron__crash__reporter__client.cc b/electron44/patches/patch-electron_shell_app_electron__crash__reporter__client.cc
new file mode 100644
index 0000000000..08a9527805
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_app_electron__crash__reporter__client.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/app/electron_crash_reporter_client.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/app/electron_crash_reporter_client.cc
+@@ -91,7 +91,7 @@ ElectronCrashReporterClient::ElectronCra
+ 
+ ElectronCrashReporterClient::~ElectronCrashReporterClient() = default;
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void ElectronCrashReporterClient::SetCrashReporterClientIdFromGUID(
+     const std::string& client_guid) {
+   crash_keys::SetMetricsClientIdFromGUID(client_guid);
+@@ -172,7 +172,7 @@ void ElectronCrashReporterClient::GetPro
+   (*annotations)["ver"] = ELECTRON_VERSION_STRING;
+ }
+ 
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+ bool ElectronCrashReporterClient::ShouldMonitorCrashHandlerExpensively() {
+   return false;
+ }
diff --git a/electron44/patches/patch-electron_shell_app_electron__crash__reporter__client.h b/electron44/patches/patch-electron_shell_app_electron__crash__reporter__client.h
new file mode 100644
index 0000000000..2c4cd9d982
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_app_electron__crash__reporter__client.h
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/app/electron_crash_reporter_client.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/app/electron_crash_reporter_client.h
+@@ -30,7 +30,7 @@ class ElectronCrashReporterClient : publ
+       const std::map<std::string, std::string>& annotations);
+ 
+   // crash_reporter::CrashReporterClient implementation.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   void SetCrashReporterClientIdFromGUID(
+       const std::string& client_guid) override;
+   base::FilePath GetReporterLogFilename() override;
+@@ -64,7 +64,7 @@ class ElectronCrashReporterClient : publ
+   bool ReportingIsEnforcedByPolicy(bool* breakpad_enabled) override;
+ #endif
+ 
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   bool ShouldMonitorCrashHandlerExpensively() override;
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_app_electron__main__delegate.cc b/electron44/patches/patch-electron_shell_app_electron__main__delegate.cc
new file mode 100644
index 0000000000..9f93843c71
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_app_electron__main__delegate.cc
@@ -0,0 +1,71 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/app/electron_main_delegate.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/app/electron_main_delegate.cc
+@@ -67,7 +67,7 @@
+ #include "chrome/child/v8_crashpad_support_win.h"
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/nix/xdg_util.h"
+ #include "ui/linux/display_server_utils.h"
+ #include "v8/include/v8-wasm-trap-handler-posix.h"
+@@ -78,7 +78,7 @@
+ #include "ui/ozone/public/ozone_platform.h"
+ #endif  // BUILDFLAG(IS_OZONE)
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "components/crash/core/app/crash_switches.h"  // nogncheck
+ #include "components/crash/core/app/crashpad.h"        // nogncheck
+ #include "components/crash/core/common/crash_key.h"
+@@ -221,7 +221,7 @@ std::optional<int> ElectronMainDelegate:
+     base::win::PinUser32();
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Check for --no-sandbox parameter when running as root.
+   if (getuid() == 0 && IsSandboxEnabled(command_line))
+     LOG(FATAL) << "Running as root without --"
+@@ -271,7 +271,7 @@ void ElectronMainDelegate::PreSandboxSta
+       /* is_preinit = */ IsBrowserProcess() || IsZygoteProcess());
+ #endif
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   crash_reporter::InitializeCrashKeys();
+ #endif
+ 
+@@ -306,7 +306,7 @@ void ElectronMainDelegate::PreSandboxSta
+   }
+ #endif
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   crash_keys::SetCrashKeysFromCommandLine(*command_line);
+   crash_keys::SetPlatformCrashKey();
+ #endif
+@@ -325,7 +325,7 @@ void ElectronMainDelegate::PreSandboxSta
+ #if BUILDFLAG(IS_OZONE)
+     // Initialize Ozone platform and add required feature flags as per
+     // platform's properties.
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     ui::SetOzonePlatformForLinuxIfNeeded(*command_line);
+ #endif
+     ui::OzonePlatform::PreSandboxStartup();
+@@ -358,7 +358,7 @@ std::optional<int> ElectronMainDelegate:
+ #if BUILDFLAG(IS_MAC)
+   RegisterAtomCrApp();
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Set the global activation token sent as an environment variable.
+   auto env = base::Environment::Create();
+   base::nix::ExtractXdgActivationTokenFromEnv(*env);
diff --git a/electron44/patches/patch-electron_shell_app_node__main.cc b/electron44/patches/patch-electron_shell_app_node__main.cc
new file mode 100644
index 0000000000..67202b1c5a
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_app_node__main.cc
@@ -0,0 +1,43 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/app/node_main.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/app/node_main.cc
+@@ -54,7 +54,7 @@
+ #include "shell/common/mac/codesign_util.h"
+ #endif
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "components/crash/core/app/crashpad.h"  // nogncheck
+ #include "shell/app/electron_crash_reporter_client.h"
+ #include "shell/common/crash_keys.h"
+@@ -106,14 +106,14 @@ bool UnsetHijackableEnvs(base::Environme
+ }
+ #endif
+ 
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ void SetCrashKeyStub(const std::string& key, const std::string& value) {}
+ void ClearCrashKeyStub(const std::string& key) {}
+ #endif
+ 
+ v8::Local<v8::Value> GetParameters(v8::Isolate* isolate) {
+   std::map<std::string, std::string> keys;
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   electron::crash_keys::GetCrashKeys(&keys);
+ #endif
+   return gin::ConvertToV8(isolate, keys);
+@@ -323,7 +323,7 @@ int NodeMain() {
+       // Setup process.crashReporter in child node processes
+       auto reporter = gin_helper::Dictionary::CreateEmpty(isolate);
+       reporter.SetMethod("getParameters", &GetParameters);
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+       reporter.SetMethod("addExtraParameter", &SetCrashKeyStub);
+       reporter.SetMethod("removeExtraParameter", &ClearCrashKeyStub);
+ #else
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__app.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__app.cc
new file mode 100644
index 0000000000..55a58f8cc1
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__app.cc
@@ -0,0 +1,62 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_app.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_app.cc
+@@ -110,7 +110,7 @@
+ #include "ui/base/resource/resource_bundle.h"
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/nix/scoped_xdg_activation_token_injector.h"
+ #include "base/nix/xdg_util.h"
+ #endif
+@@ -438,7 +438,7 @@ bool NotificationCallbackWrapper(
+     base::CommandLine cmd,
+     const base::FilePath& cwd,
+     const std::vector<uint8_t> additional_data) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Set the global activation token sent as a command line switch by another
+   // electron app instance. This also removes the switch after use to prevent
+   // any side effects of leaving it in the command line after this point.
+@@ -618,7 +618,7 @@ void App::OnWillFinishLaunching() {
+ }
+ 
+ void App::OnFinishLaunching(base::DictValue launch_info) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Set the application name for audio streams shown in external
+   // applications. Only affects pulseaudio currently.
+   media::AudioManager::SetGlobalAppName(Browser::Get()->GetName());
+@@ -972,7 +972,7 @@ void App::SetPath(gin_helper::ErrorThrow
+ }
+ 
+ void App::SetDesktopName(const std::string& desktop_name) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   auto env = base::Environment::Create();
+   env->SetVar("CHROME_DESKTOP", desktop_name);
+   // The Linux application name, and so the user agent, comes from this file.
+@@ -1082,7 +1082,7 @@ bool App::RequestSingleInstanceLock(gin:
+       base::BindRepeating(NotificationCallbackWrapper, cb));
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Read the xdg-activation token and set it in the command line for the
+   // duration of the notification in order to ensure this is propagated to an
+   // already running electron app instance if it exists.
+@@ -1480,7 +1480,7 @@ std::vector<gin_helper::Dictionary> App:
+       pid_dict.Set("name", process_metric.second->name);
+     }
+ 
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+     auto memory_info = process_metric.second->GetMemoryInfo();
+ 
+     auto memory_dict = gin_helper::Dictionary::CreateEmpty(isolate);
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__base__window.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__base__window.cc
new file mode 100644
index 0000000000..34a1063d52
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__base__window.cc
@@ -0,0 +1,44 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_base_window.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_base_window.cc
+@@ -52,7 +52,7 @@
+ #include "shell/browser/ui/views/win_frame_view.h"
+ #include "shell/browser/ui/win/taskbar_host.h"
+ #include "ui/base/win/shell.h"
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "shell/browser/ui/views/electron_frame_view_linux.h"
+ #include "ui/gfx/image/image_skia.h"
+ #endif
+@@ -1094,7 +1094,7 @@ void BaseWindow::SetIconImpl(v8::Isolate
+   static_cast<NativeWindowViews*>(window_.get())
+       ->SetIcon(native_image->GetHICON(GetSystemMetrics(SM_CXSMICON)),
+                 native_image->GetHICON(GetSystemMetrics(SM_CXICON)));
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   static_cast<NativeWindowViews*>(window_.get())
+       ->SetIcon(native_image->image().AsImageSkia());
+ #endif
+@@ -1195,7 +1195,7 @@ v8::Local<v8::Value> BaseWindow::GetAcce
+ }
+ #endif
+ 
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void BaseWindow::SetTitleBarOverlay(const gin_helper::Dictionary& options,
+                                     gin::Arguments* args) {
+   static_cast<NativeWindowViews*>(window_.get())
+@@ -1473,7 +1473,7 @@ void BaseWindow::BuildPrototype(v8::Isol
+       .SetMethod("setThumbnailToolTip", &BaseWindow::SetThumbnailToolTip)
+       .SetMethod("setAppDetails", &BaseWindow::SetAppDetails)
+ #endif
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+       .SetMethod("setTitleBarOverlay", &BaseWindow::SetTitleBarOverlay)
+ #endif
+       .SetProperty("id", &BaseWindow::GetID);
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__base__window.h b/electron44/patches/patch-electron_shell_browser_api_electron__api__base__window.h
new file mode 100644
index 0000000000..a43c9867f0
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__base__window.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_base_window.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_base_window.h
+@@ -281,7 +281,7 @@ class BaseWindow : public gin_helper::Tr
+   v8::Local<v8::Value> GetAccentColor() const;
+ #endif
+ 
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   void SetTitleBarOverlay(const gin_helper::Dictionary& options,
+                           gin::Arguments* args);
+ #endif
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__clipboard.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__clipboard.cc
new file mode 100644
index 0000000000..7c3628295a
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__clipboard.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_clipboard.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_clipboard.cc
+@@ -108,7 +108,7 @@ void EnumerateAvailableTypes(ui::Clipboa
+   // clipboard) to discover them before finalizing.
+   TypesCallback add_bookmark = base::BindOnce(
+       [](TypesCallback finalize, std::vector<std::string> types) {
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+         ui::Clipboard::GetForCurrentThread()->ReadURL(
+             /* data_dst = */ std::nullopt,
+             base::BindOnce(
+@@ -440,7 +440,7 @@ void Initialize(v8::Local<v8::Object> ex
+   PopulateClipboardObject(isolate, context, exports,
+                           ui::ClipboardBuffer::kCopyPaste);
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   auto selection = v8::Object::New(isolate);
+   PopulateClipboardObject(isolate, context, selection,
+                           ui::ClipboardBuffer::kSelection);
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
new file mode 100644
index 0000000000..0f9c465854
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__crash__reporter.cc
@@ -0,0 +1,80 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_crash_reporter.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_crash_reporter.cc
+@@ -31,7 +31,7 @@
+ #include "shell/common/process_util.h"
+ #include "shell/common/thread_restrictions.h"
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "components/crash/core/app/crashpad.h"  // nogncheck
+ #include "components/crash/core/browser/crash_upload_list_crashpad.h"  // nogncheck
+ #include "components/crash/core/common/crash_key.h"
+@@ -65,7 +65,7 @@ bool g_crash_reporter_initialized = fals
+ 
+ namespace electron::api::crash_reporter {
+ 
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ namespace {
+ 
+ void NoOp() {}
+@@ -136,7 +136,7 @@ void Start(const std::string& submit_url
+            const std::map<std::string, std::string>& extra,
+            bool is_node_process) {
+   TRACE_EVENT0("electron", "crash_reporter::Start");
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   if (g_crash_reporter_initialized)
+     return;
+   g_crash_reporter_initialized = true;
+@@ -182,7 +182,7 @@ void Start(const std::string& submit_url
+ 
+ namespace {
+ 
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ void GetUploadedReports(
+     v8::Isolate* isolate,
+     base::OnceCallback<void(v8::Local<v8::Value>)> callback) {
+@@ -237,7 +237,7 @@ v8::Local<v8::Value> GetUploadedReports(
+ #endif
+ 
+ void SetUploadToServer(bool upload) {
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   ElectronCrashReporterClient::Get()->SetCollectStatsConsent(upload);
+   // Reads the consent set above back through IsRunningUnattended().
+   crash_reporter::SetUploadConsent(upload);
+@@ -245,7 +245,7 @@ void SetUploadToServer(bool upload) {
+ }
+ 
+ bool GetUploadToServer() {
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+   return false;
+ #else
+   return ElectronCrashReporterClient::Get()->GetCollectStatsConsent();
+@@ -254,7 +254,7 @@ bool GetUploadToServer() {
+ 
+ v8::Local<v8::Value> GetParameters(v8::Isolate* isolate) {
+   std::map<std::string, std::string> keys;
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   electron::crash_keys::GetCrashKeys(&keys);
+ #endif
+   return gin::ConvertToV8(isolate, keys);
+@@ -267,7 +267,7 @@ void Initialize(v8::Local<v8::Object> ex
+   v8::Isolate* const isolate = electron::JavascriptEnvironment::GetIsolate();
+   gin_helper::Dictionary dict(isolate, exports);
+   dict.SetMethod("start", &electron::api::crash_reporter::Start);
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+   dict.SetMethod("addExtraParameter", &electron::api::crash_reporter::NoOp);
+   dict.SetMethod("removeExtraParameter", &electron::api::crash_reporter::NoOp);
+ #else
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
new file mode 100644
index 0000000000..cf82700f9f
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__desktop__capturer.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_desktop_capturer.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_desktop_capturer.cc
+@@ -55,7 +55,7 @@
+ #endif
+ 
+ namespace {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Private function in ui/base/x/x11_display_util.cc
+ base::flat_map<x11::RandR::Output, int> GetMonitors(
+     std::pair<uint32_t, uint32_t> version,
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc
new file mode 100644
index 0000000000..3fb7e607aa
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__power__monitor.cc
@@ -0,0 +1,29 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_power_monitor.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_power_monitor.cc
+@@ -131,6 +131,11 @@ void PowerMonitor::OnSpeedLimitChange(in
+       gin::DataObjectBuilder(isolate).Set("limit", speed_limit).Build());
+ }
+ 
++#if BUILDFLAG(IS_BSD)
++void PowerMonitor::SetListeningForShutdown(bool is_listening) {
++}
++#endif
++
+ #if BUILDFLAG(IS_LINUX)
+ void PowerMonitor::SetListeningForShutdown(bool is_listening) {
+   if (is_listening) {
+@@ -154,7 +159,7 @@ gin::ObjectTemplateBuilder PowerMonitor:
+   auto builder =
+       gin_helper::EventEmitterMixin<PowerMonitor>::GetObjectTemplateBuilder(
+           isolate);
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   builder.SetMethod("setListeningForShutdown",
+                     &PowerMonitor::SetListeningForShutdown);
+ #endif
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h b/electron44/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h
new file mode 100644
index 0000000000..35ef07c650
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__power__monitor.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_power_monitor.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_power_monitor.h
+@@ -56,7 +56,7 @@ class PowerMonitor final : public gin::W
+   PowerMonitor& operator=(const PowerMonitor&) = delete;
+ 
+  private:
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   void SetListeningForShutdown(bool);
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc
new file mode 100644
index 0000000000..01a7736e5f
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__safe__storage.cc
@@ -0,0 +1,44 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_safe_storage.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_safe_storage.cc
+@@ -70,7 +70,7 @@ gin::ObjectTemplateBuilder SafeStorage::
+       .SetMethod("decryptString", &SafeStorage::DecryptString)
+       .SetMethod("encryptStringAsync", &SafeStorage::encryptStringAsync)
+       .SetMethod("decryptStringAsync", &SafeStorage::decryptStringAsync)
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+       .SetMethod("getSelectedStorageBackend",
+                  &SafeStorage::GetSelectedLinuxBackend)
+ #endif
+@@ -147,7 +147,7 @@ const char* SafeStorage::GetTypeName() {
+ bool SafeStorage::IsEncryptionAvailable() {
+   if (!electron::Browser::Get()->is_ready())
+     return false;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   return OSCrypt::IsEncryptionAvailable() ||
+          (use_password_v10_ &&
+           static_cast<BrowserProcessImpl*>(g_browser_process)
+@@ -167,7 +167,7 @@ v8::Local<v8::Promise> SafeStorage::IsAs
+     return handle;
+   }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (use_password_v10_ && static_cast<BrowserProcessImpl*>(g_browser_process)
+                                    ->linux_storage_backend() == "basic_text") {
+     promise.Resolve(true);
+@@ -190,7 +190,7 @@ void SafeStorage::SetUsePasswordV10(bool
+   use_password_v10_ = use;
+ }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string SafeStorage::GetSelectedLinuxBackend() {
+   if (!electron::Browser::Get()->is_ready())
+     return "unknown";
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__safe__storage.h b/electron44/patches/patch-electron_shell_browser_api_electron__api__safe__storage.h
new file mode 100644
index 0000000000..bc2de14b8f
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__safe__storage.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_safe_storage.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_safe_storage.h
+@@ -78,7 +78,7 @@ class SafeStorage final : public gin_hel
+   v8::Local<v8::Promise> decryptStringAsync(v8::Isolate* isolate,
+                                             v8::Local<v8::Value> buffer);
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   std::string GetSelectedLinuxBackend();
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__screen.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__screen.cc
new file mode 100644
index 0000000000..0d4a898bf0
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__screen.cc
@@ -0,0 +1,53 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_screen.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_screen.cc
+@@ -29,7 +29,7 @@
+ #include "ui/display/win/screen_win.h"
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "shell/browser/linux/x11_util.h"
+ #endif
+ 
+@@ -91,7 +91,7 @@ Screen::~Screen() {
+ }
+ 
+ gfx::Point Screen::GetCursorScreenPoint(v8::Isolate* isolate) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (x11_util::IsWayland())
+     return {};
+ #endif
+@@ -165,7 +165,7 @@ void Screen::OnDisplayMetricsChanged(con
+ gfx::PointF Screen::ScreenToDIPPoint(const gfx::PointF& point_px) {
+ #if BUILDFLAG(IS_WIN)
+   return display::win::GetScreenWin()->ScreenToDIPPoint(point_px);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (x11_util::IsX11()) {
+     gfx::Point pt_px = gfx::ToFlooredPoint(point_px);
+     display::Display display = GetDisplayNearestPoint(pt_px);
+@@ -184,7 +184,7 @@ gfx::PointF Screen::ScreenToDIPPoint(con
+ gfx::Point Screen::DIPToScreenPoint(const gfx::Point& point_dip) {
+ #if BUILDFLAG(IS_WIN)
+   return display::win::GetScreenWin()->DIPToScreenPoint(point_dip);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (x11_util::IsX11()) {
+     display::Display display = GetDisplayNearestPoint(point_dip);
+     gfx::Rect bounds_dip = display.bounds();
+@@ -226,7 +226,7 @@ gin::ObjectTemplateBuilder Screen::GetOb
+       .SetMethod("getPrimaryDisplay", &Screen::GetPrimaryDisplay)
+       .SetMethod("getAllDisplays", &Screen::GetAllDisplays)
+       .SetMethod("getDisplayNearestPoint", &Screen::GetDisplayNearestPoint)
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+       .SetMethod("screenToDipPoint", &Screen::ScreenToDIPPoint)
+       .SetMethod("dipToScreenPoint", &Screen::DIPToScreenPoint)
+ #endif
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__system__preferences.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__system__preferences.cc
new file mode 100644
index 0000000000..943a09f20a
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__system__preferences.cc
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_system_preferences.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_system_preferences.cc
+@@ -10,7 +10,7 @@
+ #include "shell/common/gin_helper/handle.h"
+ #include "shell/common/node_includes.h"
+ #include "ui/gfx/animation/animation.h"
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "content/public/browser/browser_task_traits.h"
+ #include "content/public/browser/browser_thread.h"
+ #include "shell/browser/api/electron_api_system_preferences.h"
+@@ -26,7 +26,7 @@ gin::DeprecatedWrapperInfo SystemPrefere
+ SystemPreferences::SystemPreferences() {
+   InitializeWindow();
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ SystemPreferences::SystemPreferences()
+     : ui_theme_(ui::NativeTheme::GetInstanceForNativeUi()) {
+   ui_theme_->AddObserver(this);
+@@ -55,7 +55,7 @@ v8::Local<v8::Value> SystemPreferences::
+   return dict.GetHandle();
+ }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ std::string SystemPreferences::GetAccentColor() {
+   auto const color = ui_theme_->user_color();
+   if (!color.has_value())
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__system__preferences.h b/electron44/patches/patch-electron_shell_browser_api_electron__api__system__preferences.h
new file mode 100644
index 0000000000..72483e0867
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__system__preferences.h
@@ -0,0 +1,44 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_system_preferences.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_system_preferences.h
+@@ -19,7 +19,7 @@
+ #include "shell/browser/browser.h"
+ #include "shell/browser/browser_observer.h"
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/memory/raw_ptr.h"
+ #include "ui/native_theme/native_theme.h"
+ #include "ui/native_theme/native_theme_observer.h"
+@@ -50,7 +50,7 @@ class SystemPreferences final
+ #if BUILDFLAG(IS_WIN)
+     ,
+       public BrowserObserver
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     ,
+       public ui::NativeThemeObserver
+ #endif
+@@ -127,7 +127,7 @@ class SystemPreferences final
+   // are running tests on a Mojave machine
+   v8::Local<v8::Value> GetEffectiveAppearance(v8::Isolate* isolate);
+ 
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // ui::NativeThemeObserver:
+   void OnNativeThemeUpdated(ui::NativeTheme* theme) override;
+ #endif
+@@ -159,7 +159,7 @@ class SystemPreferences final
+   base::CallbackListSubscription hwnd_subscription_;
+   base::CallbackListSubscription accent_color_subscription_;
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   void OnNativeThemeUpdatedOnUI();
+ 
+   raw_ptr<ui::NativeTheme> ui_theme_;
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc b/electron44/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc
new file mode 100644
index 0000000000..679749fc51
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__web__contents.cc
@@ -0,0 +1,83 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_web_contents.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_web_contents.cc
+@@ -195,11 +195,11 @@
+ #include "ui/base/cocoa/defaults_utils.h"
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "ui/linux/linux_ui.h"
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+ #include "ui/aura/client/focus_client.h"
+ #include "ui/aura/window.h"
+ #include "ui/gfx/font_render_params.h"
+@@ -230,7 +230,7 @@
+ #include "content/public/browser/plugin_service.h"
+ #endif
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "chrome/browser/hang_monitor/hang_crash_dump.h"  // nogncheck
+ #endif
+ 
+@@ -665,7 +665,7 @@ std::optional<base::TimeDelta> GetCursor
+       ui::TextInsertionCaretBlinkPeriodFromDefaults());
+   if (system_value)
+     return *system_value;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (auto* native_theme = ui::NativeTheme::GetInstanceForNativeUi())
+     return native_theme->caret_blink_interval();
+ #elif BUILDFLAG(IS_WIN)
+@@ -1097,7 +1097,7 @@ void WebContents::InitWithSessionAndOpti
+   accept_languages.pop_back();
+   prefs->accept_languages = accept_languages;
+ 
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+   // Update font settings.
+   static const gfx::FontRenderParams params(
+       gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(), nullptr));
+@@ -3451,13 +3451,13 @@ void WebContents::ForcefullyCrashRendere
+ 
+   content::RenderProcessHost* rph = rwh->GetProcess();
+   if (rph) {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+     // A generic |CrashDumpHungChildProcess()| is not implemented for Linux.
+     // Instead we send an explicit IPC to crash on the renderer's IO thread.
+     rph->ForceCrash();
+ #else
+     // Try to generate a crash report for the hung process.
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+     CrashDumpHungChildProcess(rph->GetProcess().Handle());
+ #endif
+     rph->Shutdown(content::RESULT_CODE_HUNG);
+@@ -4098,7 +4098,7 @@ void WebContents::CopyImageAt(int x, int
+ void WebContents::Focus() {
+   // Focusing on WebContents does not automatically focus the window on macOS
+   // and Linux, do it manually to match the behavior on Windows.
+-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (owner_window())
+     owner_window()->Focus(true);
+ #endif
+@@ -5108,7 +5108,7 @@ ui::ImageModel WebContents::GetDevToolsW
+ }
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void WebContents::GetDevToolsWindowWMClass(std::string* name,
+                                            std::string* class_name) {
+   *class_name = Browser::Get()->GetName();
diff --git a/electron44/patches/patch-electron_shell_browser_api_electron__api__web__contents.h b/electron44/patches/patch-electron_shell_browser_api_electron__api__web__contents.h
new file mode 100644
index 0000000000..6ab42f4865
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_electron__api__web__contents.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/electron_api_web_contents.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/electron_api_web_contents.h
+@@ -814,7 +814,7 @@ class WebContents final : public Exclusi
+ #if defined(TOOLKIT_VIEWS) && !BUILDFLAG(IS_MAC)
+   ui::ImageModel GetDevToolsWindowIcon() override;
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   void GetDevToolsWindowWMClass(std::string* name,
+                                 std::string* class_name) override;
+ #endif
diff --git a/electron44/patches/patch-electron_shell_browser_api_process__metric.h b/electron44/patches/patch-electron_shell_browser_api_process__metric.h
new file mode 100644
index 0000000000..ff99cc73b5
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_api_process__metric.h
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/api/process_metric.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/api/process_metric.h
+@@ -14,7 +14,7 @@
+ 
+ namespace electron {
+ 
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ struct ProcessMemoryInfo {
+   size_t working_set_size = 0;
+   size_t peak_working_set_size = 0;
+@@ -48,7 +48,7 @@ struct ProcessMetric {
+                 const std::string& name = std::string());
+   ~ProcessMetric();
+ 
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+   ProcessMemoryInfo GetMemoryInfo() const;
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_browser_browser.cc b/electron44/patches/patch-electron_shell_browser_browser.cc
new file mode 100644
index 0000000000..31476221d6
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_browser.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/browser.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/browser.cc
+@@ -105,7 +105,7 @@ bool Browser::IsValidProtocolScheme(cons
+   return true;
+ }
+ 
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void Browser::Focus(gin::Arguments* args) {
+   // Focus on the first visible window.
+   for (auto* const window : WindowList::GetWindows()) {
diff --git a/electron44/patches/patch-electron_shell_browser_browser__linux.cc b/electron44/patches/patch-electron_shell_browser_browser__linux.cc
new file mode 100644
index 0000000000..fd629adec8
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_browser__linux.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/browser_linux.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/browser_linux.cc
+@@ -9,7 +9,7 @@
+ 
+ #include <string_view>
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include <gio/gdesktopappinfo.h>
+ #include <gio/gio.h>
+ #include <gtk/gtk.h>
diff --git a/electron44/patches/patch-electron_shell_browser_browser__process__impl.cc b/electron44/patches/patch-electron_shell_browser_browser__process__impl.cc
new file mode 100644
index 0000000000..6dc6bd8b84
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_browser__process__impl.cc
@@ -0,0 +1,62 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/browser_process_impl.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/browser_process_impl.cc
+@@ -51,7 +51,7 @@
+ #include "chrome/browser/printing/print_job_manager.h"
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "chrome/browser/browser_features.h"
+ #include "components/os_crypt/async/browser/freedesktop_secret_key_provider.h"
+ #include "components/os_crypt/async/browser/secret_portal_key_provider.h"
+@@ -150,7 +150,7 @@ void BrowserProcessImpl::PostEarlyInitia
+   OSCrypt::RegisterLocalPrefs(pref_registry.get());
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   os_crypt_async::SecretPortalKeyProvider::RegisterLocalPrefs(
+       pref_registry.get());
+ #endif
+@@ -407,7 +407,7 @@ electron::ResolveProxyHelper* BrowserPro
+   return resolve_proxy_helper_.get();
+ }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void BrowserProcessImpl::SetLinuxStorageBackend(
+     os_crypt::SelectedLinuxBackend selected_backend) {
+   switch (selected_backend) {
+@@ -430,7 +430,7 @@ void BrowserProcessImpl::SetLinuxStorage
+       NOTREACHED();
+   }
+ }
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ 
+ void BrowserProcessImpl::SetApplicationLocale(const std::string& locale) {
+   locale_ = locale;
+@@ -482,7 +482,7 @@ void BrowserProcessImpl::CreateOSCryptAs
+       std::make_unique<os_crypt_async::DPAPIKeyProvider>(local_state()));
+ #endif  // BUILDFLAG(IS_WIN)
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess();
+   const auto password_store =
+       cmd_line->GetSwitchValueASCII(password_manager::kPasswordStore);
+@@ -510,7 +510,7 @@ void BrowserProcessImpl::CreateOSCryptAs
+       std::make_unique<os_crypt_async::FreedesktopSecretKeyProvider>(
+           password_store, electron::GetApplicationName(), freedesktop_config,
+           nullptr));
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ 
+ #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_MAC)
+   // On other POSIX systems, this is the only key provider. On Linux, it is used
diff --git a/electron44/patches/patch-electron_shell_browser_browser__process__impl.h b/electron44/patches/patch-electron_shell_browser_browser__process__impl.h
new file mode 100644
index 0000000000..d6d5ade3df
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_browser__process__impl.h
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/browser_process_impl.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/browser_process_impl.h
+@@ -22,7 +22,7 @@
+ #include "shell/browser/net/system_network_context_manager.h"
+ #include "ui/base/unowned_user_data/unowned_user_data_host.h"
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "components/os_crypt/sync/key_storage_util_linux.h"
+ #endif
+ 
+@@ -65,7 +65,7 @@ class BrowserProcessImpl : public Browse
+   const std::string& GetSystemLocale() const;
+   electron::ResolveProxyHelper* GetResolveProxyHelper();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   void SetLinuxStorageBackend(os_crypt::SelectedLinuxBackend selected_backend);
+   [[nodiscard]] const std::string& linux_storage_backend() const {
+     return selected_linux_storage_backend_;
+@@ -161,7 +161,7 @@ class BrowserProcessImpl : public Browse
+   std::unique_ptr<PrefService> local_state_;
+   std::string locale_;
+   std::string system_locale_;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   std::string selected_linux_storage_backend_;
+ #endif
+   embedder_support::OriginTrialsSettingsStorage origin_trials_settings_storage_;
diff --git a/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts.cc b/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts.cc
new file mode 100644
index 0000000000..71d60183d0
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts.cc
@@ -0,0 +1,164 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/electron_browser_main_parts.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/electron_browser_main_parts.cc
+@@ -78,7 +78,7 @@
+ #include "ui/wm/core/wm_state.h"
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include <dlfcn.h>
+ 
+ #include "base/environment.h"
+@@ -139,7 +139,7 @@ namespace electron {
+ 
+ namespace {
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // The display server connection or the session bus is gone: exit like
+ // Chrome's SessionEnding(), with an off-thread watchdog that crashes us if
+ // exiting hangs on the dead connection.
+@@ -211,13 +211,17 @@ ElectronBrowserMainParts::ElectronBrowse
+   self_ = this;
+ }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ namespace {
+ 
+ // Resolved via dlsym: a direct reference would bind to Chromium's bundled
+ // FontConfig rather than the system copy GTK and Pango use.
+ void* SystemFontConfigSymbol(const char* name) {
++#if BUILDFLAG(IS_BSD)
++  void* lib = dlopen("libfontconfig.so", RTLD_NOW);
++#else
+   void* lib = dlopen("libfontconfig.so.1", RTLD_NOW);
++#endif
+   return lib ? dlsym(lib, name) : nullptr;
+ }
+ 
+@@ -248,10 +252,10 @@ std::vector<std::optional<std::string>> 
+ }
+ 
+ }  // namespace
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ 
+ ElectronBrowserMainParts::~ElectronBrowserMainParts() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   JoinSystemFontConfigInit();
+ #endif
+ }
+@@ -318,7 +322,7 @@ void ElectronBrowserMainParts::PostEarly
+ 
+   node_bindings_->Initialize(isolate, context);
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Runs during Node.js environment creation and is joined before any app
+   // code can run, so nothing else touches FontConfig or the environment.
+   const auto fontconfig_env = SnapshotFontConfigEnv();
+@@ -354,7 +358,7 @@ void ElectronBrowserMainParts::PostEarly
+   // Wrap the uv loop with global env.
+   node_bindings_->set_uv_env(node_env_.get());
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   JoinSystemFontConfigInit();
+ #endif
+ 
+@@ -364,7 +368,7 @@ void ElectronBrowserMainParts::PostEarly
+   // Wait for app
+   node_bindings_->JoinAppCode();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Reload if the app's main script changed the FontConfig environment.
+   if (fontconfig_env != SnapshotFontConfigEnv()) {
+     if (auto fc_reinit = reinterpret_cast<int (*)()>(
+@@ -429,7 +433,7 @@ int ElectronBrowserMainParts::PreCreateT
+   // happen before the ResourceBundle is loaded
+   if (locale.empty())
+     l10n_util::OverrideLocaleWithCocoaLocale();
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // l10n_util::GetApplicationLocaleInternal uses g_get_language_names(),
+   // which keys off of getenv("LC_ALL").
+   // We must set this env first to make ui::ResourceBundle accept the custom
+@@ -458,7 +462,7 @@ int ElectronBrowserMainParts::PreCreateT
+   ElectronBrowserClient::SetApplicationLocale(app_locale);
+   fake_browser_process_->SetApplicationLocale(app_locale);
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Reset to the original LC_ALL since we should not be changing it.
+   if (!locale.empty()) {
+     if (lc_all)
+@@ -514,7 +518,7 @@ void ElectronBrowserMainParts::PostDestr
+ }
+ 
+ void ElectronBrowserMainParts::ToolkitInitialized() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // GTK3's gtk_init() probes the display for OpenGL and loads the GL driver
+   // into this process; nothing here uses GdkGLContext. GDK_GL is read once at
+   // init and only by GTK3 (GTK4 renders with GL itself and ignores it).
+@@ -564,14 +568,14 @@ void ElectronBrowserMainParts::ToolkitIn
+ #endif
+ }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void ElectronBrowserMainParts::JoinSystemFontConfigInit() {
+   if (system_fontconfig_thread_.is_null())
+     return;
+   base::PlatformThread::Join(system_fontconfig_thread_);
+   system_fontconfig_thread_ = base::PlatformThreadHandle();
+ }
+-#endif  // BUILDFLAG(IS_LINUX)
++#endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ 
+ int ElectronBrowserMainParts::PreMainMessageLoopRun() {
+   // Run user's main script before most things get initialized, so we can have
+@@ -644,19 +648,23 @@ void ElectronBrowserMainParts::WillRunMa
+ }
+ 
+ void ElectronBrowserMainParts::PostCreateMainMessageLoop() {
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_BSD)
+   std::string app_name = electron::Browser::Get()->GetName();
+ #endif
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   ui::OzonePlatform::GetInstance()->PostCreateMainMessageLoop(
+       base::BindOnce(&ExitOnSessionLoss),
+       content::GetUIThreadTaskRunner({content::BrowserTaskType::kUserInput}));
+   dbus_thread_linux::SetDisconnectedCallback(
+       base::BindRepeating(&ExitOnSessionLoss));
+ 
++#if BUILDFLAG(IS_LINUX)
+   if (!bluez::BluezDBusManager::IsInitialized())
+     bluez::DBusBluezManagerWrapperLinux::Initialize();
++#endif
++#endif
+ 
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Set up crypt config. This needs to be done before anything starts the
+   // network service, as the raw encryption key needs to be shared with the
+   // network service for encrypted cookie storage.
+@@ -736,7 +744,7 @@ void ElectronBrowserMainParts::PostMainM
+   fake_browser_process_->PostMainMessageLoopRun();
+   content::DevToolsAgentHost::StopRemoteDebuggingPipeHandler();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   ui::OzonePlatform::GetInstance()->PostMainMessageLoopRun();
+ #endif
+ }
diff --git a/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts.h b/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts.h
new file mode 100644
index 0000000000..d2a3ffc403
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/electron_browser_main_parts.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/electron_browser_main_parts.h
+@@ -144,7 +144,7 @@ class ElectronBrowserMainParts : public 
+   std::unique_ptr<display::Screen> screen_;
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   void JoinSystemFontConfigInit();
+ 
+   base::PlatformThreadHandle system_fontconfig_thread_;
diff --git a/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc b/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
new file mode 100644
index 0000000000..1993c60b7f
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_electron__browser__main__parts__posix.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/electron_browser_main_parts_posix.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/electron_browser_main_parts_posix.cc
+@@ -191,6 +191,9 @@ void ElectronBrowserMainParts::InstallSh
+   g_pipe_pid = getpid();
+   g_shutdown_pipe_read_fd = pipefd[0];
+   g_shutdown_pipe_write_fd = pipefd[1];
++#if defined(OS_BSD)
++  const size_t kShutdownDetectorThreadStackSize = 0;
++#else
+ #if !defined(ADDRESS_SANITIZER)
+   const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 2;
+ #else
+@@ -198,6 +201,7 @@ void ElectronBrowserMainParts::InstallSh
+   // stack size to avoid hitting the guard page.
+   const size_t kShutdownDetectorThreadStackSize = PTHREAD_STACK_MIN * 4;
+ #endif
++#endif
+   ShutdownDetector* detector = new ShutdownDetector(
+       g_shutdown_pipe_read_fd, std::move(shutdown_callback), task_runner);
+ 
diff --git a/electron44/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc b/electron44/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
new file mode 100644
index 0000000000..59fd728491
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_extensions_api_runtime_electron__runtime__api__delegate.cc
@@ -0,0 +1,19 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/extensions/api/runtime/electron_runtime_api_delegate.cc
+@@ -56,6 +56,10 @@ bool ElectronRuntimeAPIDelegate::GetPlat
+     info->os = extensions::api::runtime::PlatformOs::kLinux;
+   } else if (os == "openbsd") {
+     info->os = extensions::api::runtime::PlatformOs::kOpenbsd;
++  } else if (os == "freebsd") {
++    info->os = extensions::api::runtime::PlatformOs::kFreebsd;
++  } else if (os == "netbsd") {
++    info->os = extensions::api::runtime::PlatformOs::kNetbsd;
+   } else {
+     NOTREACHED();
+   }
diff --git a/electron44/patches/patch-electron_shell_browser_feature__list.cc b/electron44/patches/patch-electron_shell_browser_feature__list.cc
new file mode 100644
index 0000000000..fbd34efa06
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_feature__list.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/feature_list.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/feature_list.cc
+@@ -32,7 +32,7 @@
+ #include "pdf/pdf_features.h"
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "printing/printing_features.h"
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_browser_linux_x11__util.cc b/electron44/patches/patch-electron_shell_browser_linux_x11__util.cc
new file mode 100644
index 0000000000..7ed8b9495b
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_linux_x11__util.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/linux/x11_util.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/linux/x11_util.cc
+@@ -10,7 +10,7 @@
+ namespace x11_util {
+ 
+ bool IsX11() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   static const bool is = ui::GetOzonePlatformId() == ui::kPlatformX11;
+   return is;
+ #else
+@@ -19,7 +19,7 @@ bool IsX11() {
+ }
+ 
+ bool IsWayland() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   static const bool is = ui::GetOzonePlatformId() == ui::kPlatformWayland;
+   return is;
+ #else
diff --git a/electron44/patches/patch-electron_shell_browser_native__window.cc b/electron44/patches/patch-electron_shell_browser_native__window.cc
new file mode 100644
index 0000000000..4e30f3e79f
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_native__window.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/native_window.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/native_window.cc
+@@ -42,7 +42,7 @@
+ 
+ #if BUILDFLAG(IS_WIN)
+ #include "shell/browser/ui/views/frameless_view.h"
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "shell/browser/ui/views/electron_frame_view_linux.h"
+ #endif
+ 
+@@ -235,7 +235,7 @@ void NativeWindow::InitFromOptions(const
+   } else if (bool center; options.Get(options::kCenter, &center) && center) {
+     Center();
+   }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (bool val; options.Get(options::kClosable, &val))
+     SetClosable(val);
+ #endif
diff --git a/electron44/patches/patch-electron_shell_browser_native__window__views.cc b/electron44/patches/patch-electron_shell_browser_native__window__views.cc
new file mode 100644
index 0000000000..8532dcadd2
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_native__window__views.cc
@@ -0,0 +1,251 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/native_window_views.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/native_window_views.cc
+@@ -58,7 +58,7 @@
+ #include "ui/views/window/non_client_view.h"
+ #include "ui/wm/core/window_util.h"
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/notimplemented.h"
+ #include "shell/browser/browser.h"
+ #include "shell/browser/linux/launcher_entry.h"
+@@ -298,7 +298,7 @@ NativeWindowViews::NativeWindowViews(con
+   // If a client frame, we need to draw our own shadows.
+   if (transparent() || has_client_frame())
+     params.opacity = InitParams::WindowOpacity::kTranslucent;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Resize handles and shadows on frameless windows need translucent insets.
+   if (!has_frame())
+     params.opacity = InitParams::WindowOpacity::kTranslucent;
+@@ -317,7 +317,7 @@ NativeWindowViews::NativeWindowViews(con
+     params.parent = parent->GetNativeWindow();
+ 
+   params.native_widget = new ElectronDesktopNativeWidgetAura{this, widget()};
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Set the WM_CLASS and XDG App ID to the same value
+   // for best compatibility with both X11 and Wayland.
+   const auto app_id = platform_util::GetXdgAppId();
+@@ -347,7 +347,7 @@ NativeWindowViews::NativeWindowViews(con
+   std::string window_type;
+   options.Get(options::kType, &window_type);
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Set _GTK_THEME_VARIANT to dark if we have "dark-theme" option set.
+   if (options.ValueOrDefault(options::kDarkTheme, false))
+     SetGTKDarkThemeEnabled(true);
+@@ -423,7 +423,7 @@ NativeWindowViews::NativeWindowViews(con
+   ::SetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE, ex_style);
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   options.Get(options::kRoundedCorners, &rounded_corner_);
+ #endif
+ 
+@@ -543,7 +543,7 @@ void NativeWindowViews::SetTitleBarOverl
+     auto* fv = widget()->non_client_view()->frame_view();
+     if (auto* frameless = views::AsViewClass<FramelessView>(fv)) {
+       frameless->InvalidateCaptionButtons();
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     } else if (auto* fvl = views::AsViewClass<views::FrameViewLinux>(fv)) {
+       fvl->InvalidateLayout();
+       fvl->SchedulePaint();
+@@ -553,7 +553,7 @@ void NativeWindowViews::SetTitleBarOverl
+ }
+ 
+ void NativeWindowViews::SetGTKDarkThemeEnabled(bool use_dark_theme) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (x11_util::IsX11()) {
+     const std::string color = use_dark_theme ? "dark" : "light";
+     auto* connection = x11::Connection::Get();
+@@ -621,7 +621,7 @@ void NativeWindowViews::Show() {
+ 
+   NotifyWindowShow();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (global_menu_bar_)
+     global_menu_bar_->OnWindowMapped();
+ 
+@@ -639,7 +639,7 @@ void NativeWindowViews::ShowInactive() {
+ 
+   NotifyWindowShow();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (global_menu_bar_)
+     global_menu_bar_->OnWindowMapped();
+ 
+@@ -658,7 +658,7 @@ void NativeWindowViews::Hide() {
+ 
+   NotifyWindowHide();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (global_menu_bar_)
+     global_menu_bar_->OnWindowUnmapped();
+ #endif
+@@ -689,7 +689,7 @@ bool NativeWindowViews::IsVisible() cons
+ bool NativeWindowViews::IsEnabled() const {
+ #if BUILDFLAG(IS_WIN)
+   return ::IsWindowEnabled(GetAcceleratedWidget());
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   return !enable_event_listening_;
+ #endif
+ }
+@@ -913,7 +913,7 @@ void NativeWindowViews::SetBounds(const 
+   }
+ #endif
+ 
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // On Linux and Windows the minimum and maximum size should be updated with
+   // window size when window is not resizable.
+   if (!CanResize()) {
+@@ -968,7 +968,7 @@ void NativeWindowViews::SetContentSizeCo
+   // of this to determine whether native widget has initialized.
+   if (widget() && widget()->widget_delegate())
+     widget()->OnSizeConstraintsChanged();
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (resizable_)
+     old_size_constraints_ = GetSizeConstraints();
+ #endif
+@@ -1188,7 +1188,7 @@ bool NativeWindowViews::IsClosable() con
+     return false;
+   }
+   return !(info.fState & MFS_DISABLED);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   return true;
+ #endif
+ }
+@@ -1328,7 +1328,7 @@ void NativeWindowViews::SetBackgroundCol
+   InvalidateRect(GetAcceleratedWidget(), nullptr, 1);
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Widget and root view need to be transparent for CSD to draw shadow regions
+   // and custom edges and corners. The web contents view will still be
+   // painted with the true background color, which is cached in state.
+@@ -1351,7 +1351,7 @@ void NativeWindowViews::SetHasShadow(boo
+   // so we no longer call wm::SetShadowElevation and similar to avoid
+   // artifacts. https://github.com/electron/electron/issues/51456.
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   auto* efvl = views::AsViewClass<ElectronFrameViewLinux>(
+       widget()->non_client_view()->frame_view());
+   if (efvl) {
+@@ -1385,7 +1385,7 @@ void NativeWindowViews::SetOpacity(const
+   HWND hwnd = GetAcceleratedWidget();
+   SetLayered();
+   ::SetLayeredWindowAttributes(hwnd, 0, bounded_opacity * 255, LWA_ALPHA);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   widget()->SetOpacity(static_cast<float>(bounded_opacity));
+ #endif
+ }
+@@ -1476,7 +1476,7 @@ bool NativeWindowViews::IsFocusable() co
+ }
+ 
+ void NativeWindowViews::SetMenu(ElectronMenuModel* menu_model) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Remove global menu bar.
+   bool try_global_menu_bar = true;
+   if (global_menu_bar_ && menu_model == nullptr) {
+@@ -1544,7 +1544,7 @@ void NativeWindowViews::SetRootViewMenu(
+ void NativeWindowViews::SetParentWindow(NativeWindow* parent) {
+   NativeWindow::SetParentWindow(parent);
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (x11_util::IsX11()) {
+     auto* connection = x11::Connection::Get();
+     connection->SetProperty(
+@@ -1598,7 +1598,7 @@ gfx::Insets NativeWindowViews::GetRestor
+   if (auto* frameless = views::AsViewClass<FramelessView>(frame_view))
+     return frameless->RestoredFrameBorderInsets();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (auto* fvl = views::AsViewClass<views::FrameViewLinux>(frame_view))
+     return fvl->GetRestoredFrameBorderInsets();
+ #endif
+@@ -1610,7 +1610,7 @@ void NativeWindowViews::SetProgressBar(d
+                                        NativeWindow::ProgressState state) {
+ #if BUILDFLAG(IS_WIN)
+   taskbar_host_.SetProgressBar(GetAcceleratedWidget(), progress, state);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   launcher_entry::SetProgress(progress);
+ #endif
+ }
+@@ -1734,7 +1734,7 @@ content::DesktopMediaID NativeWindowView
+ #if BUILDFLAG(IS_WIN)
+   window_handle =
+       reinterpret_cast<content::DesktopMediaID::Id>(accelerated_widget);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   window_handle = static_cast<uint32_t>(accelerated_widget);
+ #endif
+   aura::WindowTreeHost* const host =
+@@ -1864,7 +1864,7 @@ void NativeWindowViews::SetIcon(HICON wi
+   SendMessage(hwnd, WM_SETICON, ICON_BIG,
+               reinterpret_cast<LPARAM>(app_icon_.get()));
+ }
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ void NativeWindowViews::SetIcon(const gfx::ImageSkia& icon) {
+   auto* tree_host = views::DesktopWindowTreeHostLinux::GetHostForWidget(
+       GetAcceleratedWidget());
+@@ -1985,7 +1985,7 @@ bool NativeWindowViews::CanMaximize() co
+ bool NativeWindowViews::CanMinimize() const {
+ #if BUILDFLAG(IS_WIN)
+   return minimizable_;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   return true;
+ #endif
+ }
+@@ -2052,7 +2052,7 @@ std::unique_ptr<views::FrameView> Native
+ #endif
+ }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ views::FrameViewLinux* NativeWindowViews::GetFrameViewLinux() const {
+   auto* ncv = widget()->non_client_view();
+   if (!ncv)
+@@ -2071,7 +2071,7 @@ void NativeWindowViews::HandleKeyboardEv
+   if (widget_destroyed_)
+     return;
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (event.windows_key_code == ui::VKEY_BROWSER_BACK)
+     NotifyWindowExecuteAppCommand(kBrowserBackward);
+   else if (event.windows_key_code == ui::VKEY_BROWSER_FORWARD)
+@@ -2090,7 +2090,7 @@ void NativeWindowViews::OnMouseEvent(ui:
+   // Alt+Click should not toggle menu bar.
+   root_view_.ResetAltState();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   if (event->changed_button_flags() == ui::EF_BACK_MOUSE_BUTTON)
+     NotifyWindowExecuteAppCommand(kBrowserBackward);
+   else if (event->changed_button_flags() == ui::EF_FORWARD_MOUSE_BUTTON)
diff --git a/electron44/patches/patch-electron_shell_browser_native__window__views.h b/electron44/patches/patch-electron_shell_browser_native__window__views.h
new file mode 100644
index 0000000000..47d6d5101e
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_native__window__views.h
@@ -0,0 +1,62 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/native_window_views.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/native_window_views.h
+@@ -33,7 +33,7 @@ namespace gin {
+ class Arguments;
+ }  // namespace gin
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ namespace views {
+ class FrameViewLinux;
+ }  // namespace views
+@@ -41,7 +41,7 @@ class FrameViewLinux;
+ 
+ namespace electron {
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ class GlobalMenuBarX11;
+ #endif
+ 
+@@ -185,7 +185,7 @@ class NativeWindowViews : public NativeW
+                     LPARAM l_param,
+                     LRESULT* result);
+   void SetIcon(HICON small_icon, HICON app_icon);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   void SetIcon(const gfx::ImageSkia& icon);
+ #endif
+ 
+@@ -208,7 +208,7 @@ class NativeWindowViews : public NativeW
+     return overlay_symbol_color_;
+   }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   views::FrameViewLinux* GetFrameViewLinux() const;
+   [[nodiscard]] bool ignore_mouse_events() const {
+     return ignore_mouse_events_;
+@@ -306,7 +306,7 @@ class NativeWindowViews : public NativeW
+   // events from resizing the window.
+   extensions::SizeConstraints old_size_constraints_;
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   std::unique_ptr<GlobalMenuBarX11> global_menu_bar_;
+ 
+   // Set while the window is disabled; running it re-enables event dispatch.
+@@ -325,7 +325,7 @@ class NativeWindowViews : public NativeW
+   // This value is determined when the window is created.
+   bool rounded_corner_ = true;
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   bool ignore_mouse_events_ = false;
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc b/electron44/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc
new file mode 100644
index 0000000000..f1dcdf6dab
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_osr_osr__host__display__client.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/osr/osr_host_display_client.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/osr/osr_host_display_client.cc
+@@ -102,7 +102,7 @@ void OffScreenHostDisplayClient::CreateL
+   layered_window_updater_->SetActive(active_);
+ }
+ 
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ void OffScreenHostDisplayClient::DidCompleteSwapWithNewSize(
+     const gfx::Size& size) {}
+ #endif
diff --git a/electron44/patches/patch-electron_shell_browser_osr_osr__host__display__client.h b/electron44/patches/patch-electron_shell_browser_osr_osr__host__display__client.h
new file mode 100644
index 0000000000..6f64ada6f2
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_osr_osr__host__display__client.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/osr/osr_host_display_client.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/osr/osr_host_display_client.h
+@@ -74,7 +74,7 @@ class OffScreenHostDisplayClient : publi
+       mojo::PendingReceiver<viz::mojom::LayeredWindowUpdater> receiver)
+       override;
+ 
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+   void DidCompleteSwapWithNewSize(const gfx::Size& size) override;
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_browser_osr_osr__paint__event.h b/electron44/patches/patch-electron_shell_browser_osr_osr__paint__event.h
new file mode 100644
index 0000000000..74448d506a
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_osr_osr__paint__event.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/osr/osr_paint_event.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/osr/osr_paint_event.h
+@@ -99,7 +99,7 @@ struct OffscreenSharedTextureValue {
+   // On Windows it is a HANDLE to the shared D3D11 texture.
+   // On macOS it is a IOSurface* to the shared IOSurface.
+   uintptr_t shared_texture_handle;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   std::vector<OffscreenNativePixmapPlaneInfo> planes;
+   uint64_t modifier;
+   bool supports_zero_copy_webgpu_import;
diff --git a/electron44/patches/patch-electron_shell_browser_osr_osr__video__consumer.cc b/electron44/patches/patch-electron_shell_browser_osr_osr__video__consumer.cc
new file mode 100644
index 0000000000..383c7ad0b6
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_osr_osr__video__consumer.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/osr/osr_video_consumer.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/osr/osr_video_consumer.cc
+@@ -49,7 +49,7 @@ bool IsPlatformSharedTextureHandle(const
+   return handle.type == gfx::DXGI_SHARED_HANDLE;
+ #elif BUILDFLAG(IS_APPLE)
+   return handle.type == gfx::IO_SURFACE_BUFFER;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   return handle.type == gfx::NATIVE_PIXMAP;
+ #else
+   return false;
+@@ -160,7 +160,7 @@ void OffScreenVideoConsumer::OnFrameCapt
+ #elif BUILDFLAG(IS_APPLE)
+     texture.shared_texture_handle =
+         reinterpret_cast<uintptr_t>(gmb_handle.io_surface().get());
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     const auto& native_pixmap = gmb_handle.native_pixmap_handle();
+     texture.modifier = native_pixmap.modifier;
+     texture.supports_zero_copy_webgpu_import =
diff --git a/electron44/patches/patch-electron_shell_browser_printing_printing__utils.cc b/electron44/patches/patch-electron_shell_browser_printing_printing__utils.cc
new file mode 100644
index 0000000000..dcf099949e
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_printing_printing__utils.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/printing/printing_utils.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/printing/printing_utils.cc
+@@ -31,7 +31,7 @@
+ #include <ApplicationServices/ApplicationServices.h>
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include <gtk/gtk.h>
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_browser_relauncher__linux.cc b/electron44/patches/patch-electron_shell_browser_relauncher__linux.cc
new file mode 100644
index 0000000000..5179db0c34
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_relauncher__linux.cc
@@ -0,0 +1,38 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/relauncher_linux.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/relauncher_linux.cc
+@@ -6,8 +6,10 @@
+ 
+ #include <fcntl.h>
+ #include <signal.h>
++#if !defined(__FreeBSD__) && !defined(__NetBSD__)
+ #include <sys/prctl.h>
+ #include <sys/signalfd.h>
++#endif
+ 
+ #include "base/files/scoped_file.h"
+ #include "base/logging.h"
+@@ -28,6 +30,10 @@ void RelauncherSynchronizeWithParent() {
+   base::ScopedFD relauncher_sync_fd(kRelauncherSyncFD);
+   static const auto signum = SIGUSR2;
+ 
++#if defined(__FreeBSD__) || defined(__NetBSD__)
++  PLOG(ERROR) << "signalfd & prctl";
++  fprintf(stderr, "Not Implemented signalfd & prctl in atom/browser/relauncher_linux.cc");
++#else
+   // send signum to current process when parent process ends.
+   if (HANDLE_EINTR(prctl(PR_SET_PDEATHSIG, signum)) != 0) {
+     PLOG(ERROR) << "prctl";
+@@ -51,6 +57,7 @@ void RelauncherSynchronizeWithParent() {
+ 
+   // Wait for the parent to exit
+   GetParentWaiter().Wait();
++#endif
+ }
+ 
+ int LaunchProgram(const StringVector& relauncher_args,
diff --git a/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc b/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc
new file mode 100644
index 0000000000..623ee0eca9
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/ui/inspectable_web_contents.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/ui/inspectable_web_contents.cc
+@@ -621,7 +621,7 @@ void InspectableWebContents::LoadComplet
+           dock_state_ = "right";
+         }
+       }
+-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+       auto* api_web_contents = api::WebContents::From(GetWebContents());
+       if (api_web_contents) {
+         auto* win =
diff --git a/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view.cc b/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view.cc
new file mode 100644
index 0000000000..4947bcaa9b
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/ui/inspectable_web_contents_view.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/ui/inspectable_web_contents_view.cc
+@@ -237,7 +237,7 @@ void InspectableWebContentsView::SetIsDo
+     params.delegate = devtools_window_delegate_;
+     params.bounds = inspectable_web_contents()->dev_tools_bounds();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     params.wm_role_name = "devtools";
+     if (GetDelegate())
+       GetDelegate()->GetDevToolsWindowWMClass(&params.wm_class_name,
diff --git a/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h b/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
new file mode 100644
index 0000000000..276d793460
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_ui_inspectable__web__contents__view__delegate.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/ui/inspectable_web_contents_view_delegate.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/ui/inspectable_web_contents_view_delegate.h
+@@ -24,7 +24,7 @@ class InspectableWebContentsViewDelegate
+   // Returns the icon of devtools window.
+   virtual ui::ImageModel GetDevToolsWindowIcon();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Called when creating devtools window.
+   virtual void GetDevToolsWindowWMClass(std::string* name,
+                                         std::string* class_name) {}
diff --git a/electron44/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc b/electron44/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
new file mode 100644
index 0000000000..e4d56c7f31
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/ui/views/electron_views_delegate.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/ui/views/electron_views_delegate.cc
+@@ -36,7 +36,7 @@ void ViewsDelegate::NotifyMenuItemFocuse
+                                           int item_count,
+                                           bool has_submenu) {}
+ 
+-#if BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#if (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+ gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const {
+   return nullptr;
+ }
diff --git a/electron44/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h b/electron44/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h
new file mode 100644
index 0000000000..aa6f7cc173
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_ui_views_electron__views__delegate.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/ui/views/electron_views_delegate.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/ui/views/electron_views_delegate.h
+@@ -44,7 +44,7 @@ class ViewsDelegate : public views::View
+   HICON GetSmallWindowIcon() const override;
+   int GetAppbarAutohideEdges(HMONITOR monitor,
+                              base::OnceClosure callback) override;
+-#elif BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)
++#elif (BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_CHROMEOS)) || BUILDFLAG(IS_BSD)
+   gfx::ImageSkia* GetDefaultWindowIcon() const override;
+ #endif
+   std::unique_ptr<views::FrameView> CreateDefaultFrameView(
diff --git a/electron44/patches/patch-electron_shell_browser_ui_views_menu__bar.cc b/electron44/patches/patch-electron_shell_browser_ui_views_menu__bar.cc
new file mode 100644
index 0000000000..fbca870f0c
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_ui_views_menu__bar.cc
@@ -0,0 +1,44 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/ui/views/menu_bar.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/ui/views/menu_bar.cc
+@@ -16,7 +16,7 @@
+ #include "ui/views/background.h"
+ #include "ui/views/layout/box_layout.h"
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "shell/browser/ui/gtk_util.h"
+ #include "ui/gtk/gtk_util.h"  // nogncheck
+ #endif
+@@ -218,7 +218,7 @@ void MenuBar::ViewHierarchyChanged(
+ 
+ void MenuBar::RefreshColorCache(const ui::NativeTheme* theme) {
+   if (theme) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     if (gtk_util::IsGtkAvailable()) {
+       background_color_ = gtk::GetBgColor("GtkMenuBar#menubar");
+       enabled_color_ =
+@@ -254,7 +254,7 @@ void MenuBar::RebuildChildren() {
+ }
+ 
+ void MenuBar::UpdateViewColors() {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // set menubar background color
+   SetBackground(views::CreateSolidBackground(background_color_));
+ #endif
+@@ -262,7 +262,7 @@ void MenuBar::UpdateViewColors() {
+   // set child colors
+   if (menu_model_ == nullptr)
+     return;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   const auto& textColor =
+       window_->IsFocused() ? enabled_color_ : disabled_color_;
+   for (views::View* child : GetChildrenInZOrder()) {
diff --git a/electron44/patches/patch-electron_shell_browser_ui_views_menu__bar.h b/electron44/patches/patch-electron_shell_browser_ui_views_menu__bar.h
new file mode 100644
index 0000000000..e1a5e88024
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_ui_views_menu__bar.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/ui/views/menu_bar.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/ui/views/menu_bar.h
+@@ -81,7 +81,7 @@ class MenuBar : public views::Accessible
+   View* FindAccelChild(char16_t key);
+ 
+   SkColor background_color_;
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   SkColor enabled_color_;
+   SkColor disabled_color_;
+ #endif
diff --git a/electron44/patches/patch-electron_shell_browser_ui_views_submenu__button.cc b/electron44/patches/patch-electron_shell_browser_ui_views_submenu__button.cc
new file mode 100644
index 0000000000..88a0d390ec
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_browser_ui_views_submenu__button.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/browser/ui/views/submenu_button.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/browser/ui/views/submenu_button.cc
+@@ -23,7 +23,7 @@ SubmenuButton::SubmenuButton(PressedCall
+                              const SkColor& background_color)
+     : views::MenuButton(std::move(callback), gfx::RemoveAccelerator(title)),
+       background_color_(background_color) {
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Don't use native style border.
+   SetBorder(CreateDefaultBorder());
+ #endif
diff --git a/electron44/patches/patch-electron_shell_common_api_electron__api__native__image.cc b/electron44/patches/patch-electron_shell_common_api_electron__api__native__image.cc
new file mode 100644
index 0000000000..bbd35a0db3
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_api_electron__api__native__image.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/api/electron_api_native_image.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/api/electron_api_native_image.cc
+@@ -676,7 +676,7 @@ void Initialize(v8::Local<v8::Object> ex
+   native_image.SetMethod("createFromNamedImage",
+                          &NativeImage::CreateFromNamedImage);
+   native_image.SetMethod("createMenuSymbol", &NativeImage::CreateMenuSymbol);
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+   native_image.SetMethod("createThumbnailFromPath",
+                          &NativeImage::CreateThumbnailFromPath);
+ #endif
diff --git a/electron44/patches/patch-electron_shell_common_api_electron__api__native__image.h b/electron44/patches/patch-electron_shell_common_api_electron__api__native__image.h
new file mode 100644
index 0000000000..7d2d265d78
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_api_electron__api__native__image.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/api/electron_api_native_image.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/api/electron_api_native_image.h
+@@ -73,7 +73,7 @@ class NativeImage final : public gin::Wr
+   static NativeImage* CreateFromNamedImage(gin::Arguments* args,
+                                            std::string name);
+   static NativeImage* CreateMenuSymbol(gin::Arguments* args, std::string name);
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+   static v8::Local<v8::Promise> CreateThumbnailFromPath(
+       v8::Isolate* isolate,
+       const base::FilePath& path,
diff --git a/electron44/patches/patch-electron_shell_common_api_electron__api__shared__texture.cc b/electron44/patches/patch-electron_shell_common_api_electron__api__shared__texture.cc
new file mode 100644
index 0000000000..db7a27b634
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_api_electron__api__shared__texture.cc
@@ -0,0 +1,44 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/api/electron_api_shared_texture.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/api/electron_api_shared_texture.cc
+@@ -31,7 +31,7 @@
+ #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h"  // nogncheck
+ #include "ui/compositor/compositor.h"
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/posix/eintr_wrapper.h"
+ #include "base/strings/string_number_conversions.h"
+ #endif
+@@ -607,7 +607,7 @@ struct ImportSharedTextureInfo {
+   // On macOS, it is an IOSurfaceRef, this must be a valid IOSurface at the
+   // current process.
+   uintptr_t io_surface = 0;
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // On Linux, to be implemented.
+   std::vector<ImportSharedTextureInfoPlane> planes;
+   uint64_t modifier = gfx::NativePixmapHandle::kNoModifier;
+@@ -677,7 +677,7 @@ struct Converter<ImportSharedTextureInfo
+     GetNativeHandle("ntHandle", &out->nt_handle);
+ #elif BUILDFLAG(IS_APPLE)
+     GetNativeHandle("ioSurface", &out->io_surface);
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     v8::Local<v8::Object> native_pixmap;
+     if (shared_texture.Get("nativePixmap", &native_pixmap)) {
+       gin::Dictionary v8_native_pixmap(isolate, native_pixmap);
+@@ -757,7 +757,7 @@ v8::Local<v8::Value> ImportSharedTexture
+   auto io_surface_scoped = base::apple::ScopedCFTypeRef<IOSurfaceRef>(
+       io_surface, base::scoped_policy::RETAIN);
+   gmb_handle = gfx::GpuMemoryBufferHandle(std::move(io_surface_scoped));
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   gfx::NativePixmapHandle pixmap;
+   pixmap.modifier = shared_texture.modifier;
+   pixmap.supports_zero_copy_webgpu_import =
diff --git a/electron44/patches/patch-electron_shell_common_api_electron__api__testing.cc b/electron44/patches/patch-electron_shell_common_api_electron__api__testing.cc
new file mode 100644
index 0000000000..8e90464ebb
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_api_electron__api__testing.cc
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/api/electron_api_testing.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/api/electron_api_testing.cc
+@@ -36,7 +36,7 @@
+ #include "ui/accessibility/platform/ax_platform.h"
+ #include "v8/include/v8.h"
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include <glib.h>
+ #elif BUILDFLAG(IS_MAC)
+ #include <CoreFoundation/CoreFoundation.h>
+@@ -280,7 +280,7 @@ struct SettleOutsideTask {
+                                                  std::move(self->after_settle));
+   }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   static gboolean OnIdle(gpointer data) {
+     Run(base::WrapUnique(static_cast<SettleOutsideTask*>(data)));
+     return G_SOURCE_REMOVE;
+@@ -310,7 +310,7 @@ v8::Local<v8::Promise> SettlePromiseOuts
+   auto state = std::make_unique<SettleOutsideTask>(SettleOutsideTask{
+       gin_helper::Promise<void>(isolate), std::move(after_settle)});
+   v8::Local<v8::Promise> handle = state->promise.GetHandle();
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   g_idle_add(&SettleOutsideTask::OnIdle, state.release());
+ #elif BUILDFLAG(IS_MAC)
+   CFRunLoopTimerContext context = {0, state.release(), nullptr, nullptr,
diff --git a/electron44/patches/patch-electron_shell_common_api_electron__bindings.cc b/electron44/patches/patch-electron_shell_common_api_electron__bindings.cc
new file mode 100644
index 0000000000..fe779ee24e
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_api_electron__bindings.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/api/electron_bindings.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/api/electron_bindings.cc
+@@ -185,7 +185,7 @@ v8::Local<v8::Value> ElectronBindings::G
+ #endif
+   dict.Set("free", free.InKiB());
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   dict.Set("available", mem_info.available.InKiB());
+ #endif
+ 
+@@ -257,7 +257,7 @@ void ElectronBindings::DidReceiveMemoryD
+     if (target_pid == dump.pid()) {
+       auto dict = gin_helper::Dictionary::CreateEmpty(isolate);
+       const auto& osdump = dump.os_dump();
+-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_BSD)
+       dict.Set("residentSet", osdump.resident_set_kb);
+ #endif
+       dict.Set("private", osdump.private_footprint_kb);
diff --git a/electron44/patches/patch-electron_shell_common_electron__command__line.cc b/electron44/patches/patch-electron_shell_common_electron__command__line.cc
new file mode 100644
index 0000000000..e33fa87c12
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_electron__command__line.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/electron_command_line.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/electron_command_line.cc
+@@ -39,7 +39,7 @@ std::vector<std::string> ElectronCommand
+ #endif
+ }
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // static
+ void ElectronCommandLine::InitializeFromCommandLine() {
+   argv() = base::CommandLine::ForCurrentProcess()->argv();
diff --git a/electron44/patches/patch-electron_shell_common_electron__command__line.h b/electron44/patches/patch-electron_shell_common_electron__command__line.h
new file mode 100644
index 0000000000..26bfd8bf31
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_electron__command__line.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/electron_command_line.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/electron_command_line.h
+@@ -24,7 +24,7 @@ class ElectronCommandLine {
+ 
+   static void Init(int argc, base::CommandLine::CharType const* const* argv);
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // On Linux the command line has to be read from base::CommandLine since
+   // it is using zygote.
+   static void InitializeFromCommandLine();
diff --git a/electron44/patches/patch-electron_shell_common_electron__paths.cc b/electron44/patches/patch-electron_shell_common_electron__paths.cc
new file mode 100644
index 0000000000..889214c235
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_electron__paths.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/electron_paths.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/electron_paths.cc
+@@ -12,7 +12,7 @@
+ #include "shell/common/platform_util.h"
+ #include "shell/common/thread_restrictions.h"
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/nix/xdg_util.h"
+ #endif
+ 
+@@ -62,7 +62,7 @@ bool ElectronPathProvider(int key, base:
+       create_dir = true;
+       break;
+     }
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+     case DIR_APP_DATA: {
+       auto env = base::Environment::Create();
+       cur = base::nix::GetXDGDirectory(
diff --git a/electron44/patches/patch-electron_shell_common_electron__paths.h b/electron44/patches/patch-electron_shell_common_electron__paths.h
new file mode 100644
index 0000000000..7bbc0f461e
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_electron__paths.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/electron_paths.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/electron_paths.h
+@@ -31,7 +31,7 @@ enum {
+   DIR_RECENT,  // Directory where recent files live
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   DIR_APP_DATA,  // Application Data directory under the user profile.
+ #endif
+ 
diff --git a/electron44/patches/patch-electron_shell_common_gin__converters_osr__converter.cc b/electron44/patches/patch-electron_shell_common_gin__converters_osr__converter.cc
new file mode 100644
index 0000000000..de606d0991
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_gin__converters_osr__converter.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/gin_converters/osr_converter.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/gin_converters/osr_converter.cc
+@@ -12,7 +12,7 @@
+ 
+ #include "base/containers/to_vector.h"
+ #include "base/task/single_thread_task_runner.h"
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ #include "base/strings/string_number_conversions.h"
+ #endif
+ #include "shell/common/gin_converters/gfx_converter.h"
+@@ -131,7 +131,7 @@ v8::Local<v8::Value> Converter<electron:
+       electron::Buffer::Copy(
+           isolate, base::byte_span_from_ref(val.shared_texture_handle))
+           .ToLocalChecked());
+-#elif BUILDFLAG(IS_LINUX)
++#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   gin::Dictionary nativePixmap(isolate, v8::Object::New(isolate));
+   auto v8_planes = base::ToVector(val.planes, [isolate](const auto& plane) {
+     gin::Dictionary v8_plane(isolate, v8::Object::New(isolate));
diff --git a/electron44/patches/patch-electron_shell_common_gin__converters_std__converter.h b/electron44/patches/patch-electron_shell_common_gin__converters_std__converter.h
new file mode 100644
index 0000000000..0240767d1e
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_gin__converters_std__converter.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/gin_converters/std_converter.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/gin_converters/std_converter.h
+@@ -57,7 +57,7 @@ struct Converter<std::array<T, N>> {
+   }
+ };
+ 
+-#if !BUILDFLAG(IS_LINUX)
++#if !BUILDFLAG(IS_LINUX) && !BUILDFLAG(IS_BSD)
+ template <>
+ struct Converter<unsigned long> {  // NOLINT(runtime/int)
+   static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
diff --git a/electron44/patches/patch-electron_shell_common_node__bindings.cc b/electron44/patches/patch-electron_shell_common_node__bindings.cc
new file mode 100644
index 0000000000..6d84337f3a
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_node__bindings.cc
@@ -0,0 +1,44 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/node_bindings.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/node_bindings.cc
+@@ -59,7 +59,7 @@
+ #include "third_party/electron_node/src/node_snapshot_builder.h"
+ #include "v8/include/v8-statistics.h"
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "shell/common/crash_keys.h"
+ #include "shell/common/v8_oom_diagnostics.h"
+ #endif
+@@ -178,7 +178,7 @@ bool g_is_initialized = false;
+ void V8FatalErrorCallback(const char* location, const char* message) {
+   LOG(ERROR) << "Fatal error in V8: " << location << " " << message;
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   electron::crash_keys::SetCrashKey("electron.v8-fatal.message", message);
+   electron::crash_keys::SetCrashKey("electron.v8-fatal.location", location);
+ #endif
+@@ -200,7 +200,7 @@ void V8OOMErrorCallback(const char* loca
+     LOG(ERROR) << "OOM detail: " << details.detail;
+   }
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   // TryGetCurrent() instead of GetCurrent() to avoid FATAL if no isolate.
+   v8::Isolate* isolate = v8::Isolate::TryGetCurrent();
+   electron::v8_oom::RecordErrorDetails(isolate, location, details);
+@@ -655,7 +655,7 @@ void NodeBindings::Initialize(v8::Isolat
+   TRACE_EVENT0("electron", "NodeBindings::Initialize");
+   // Open node's error reporting system for browser process.
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Get real command line in renderer process forked by zygote.
+   if (browser_env_ != BrowserEnvironment::kBrowser)
+     ElectronCommandLine::InitializeFromCommandLine();
diff --git a/electron44/patches/patch-electron_shell_common_node__bindings__linux.cc b/electron44/patches/patch-electron_shell_common_node__bindings__linux.cc
new file mode 100644
index 0000000000..47d729b893
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_node__bindings__linux.cc
@@ -0,0 +1,76 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/node_bindings_linux.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/node_bindings_linux.cc
+@@ -4,13 +4,26 @@
+ 
+ #include "shell/common/node_bindings_linux.h"
+ 
++#if !defined(OS_BSD)
+ #include <sys/epoll.h>
++#else
++#include <errno.h>
++#include <sys/select.h>
++#include <sys/sysctl.h>
++#include <sys/time.h>
++#include <sys/types.h>
++#endif
+ 
+ namespace electron {
+ 
+ NodeBindingsLinux::NodeBindingsLinux(BrowserEnvironment browser_env,
+                                      uv_loop_t* loop)
++#if !defined(OS_BSD)
+     : NodeBindings(browser_env, loop), epoll_(epoll_create(1)) {
++#else
++    : NodeBindings(browser_env, loop) {
++#endif
++#if !defined(OS_BSD)
+   auto* const event_loop = uv_loop();
+ 
+   int backend_fd = uv_backend_fd(event_loop);
+@@ -18,11 +31,13 @@ NodeBindingsLinux::NodeBindingsLinux(Bro
+   ev.events = EPOLLIN;
+   ev.data.fd = backend_fd;
+   epoll_ctl(epoll_, EPOLL_CTL_ADD, backend_fd, &ev);
++#endif
+ }
+ 
+ void NodeBindingsLinux::PollEvents() {
+   auto* const event_loop = uv_loop();
+ 
++#if !defined(OS_BSD)
+   int timeout = uv_backend_timeout(event_loop);
+ 
+   // Wait for new libuv events.
+@@ -31,6 +46,26 @@ void NodeBindingsLinux::PollEvents() {
+     struct epoll_event ev;
+     r = epoll_wait(epoll_, &ev, 1, timeout);
+   } while (r == -1 && errno == EINTR);
++#else
++  struct timeval tv;
++  int timeout = uv_backend_timeout(event_loop);
++  if (timeout != -1) {
++    tv.tv_sec = timeout / 1000;
++    tv.tv_usec = (timeout % 1000) * 1000;
++  }
++
++  fd_set readset;
++  int fd = uv_backend_fd(event_loop);
++  FD_ZERO(&readset);
++  FD_SET(fd, &readset);
++
++  // Wait for new libuv events.
++  int r;
++  do {
++    r = select(fd + 1, &readset, nullptr, nullptr,
++               timeout == -1 ? nullptr : &tv);
++   } while (r == -1 && errno == EINTR);
++#endif
+ }
+ 
+ // static
diff --git a/electron44/patches/patch-electron_shell_common_platform__util.h b/electron44/patches/patch-electron_shell_common_platform__util.h
new file mode 100644
index 0000000000..f9c82222f7
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_platform__util.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/platform_util.h.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/platform_util.h
+@@ -60,7 +60,7 @@ bool SetLoginItemEnabled(const std::stri
+                          bool enabled);
+ #endif
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+ // Returns a desktop name (e.g. 'myapp.desktop') if available.
+ // Unlike libgtkui, this does *not* use "chromium-browser.desktop" as a
+ // fallback.
diff --git a/electron44/patches/patch-electron_shell_common_v8__oom__diagnostics.cc b/electron44/patches/patch-electron_shell_common_v8__oom__diagnostics.cc
new file mode 100644
index 0000000000..034cd231b5
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_common_v8__oom__diagnostics.cc
@@ -0,0 +1,25 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/common/v8_oom_diagnostics.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/common/v8_oom_diagnostics.cc
+@@ -15,7 +15,7 @@
+ 
+ namespace electron::v8_oom {
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ 
+ namespace {
+ 
+@@ -140,6 +140,6 @@ bool RecordHeapDiagnostics(v8::Isolate*)
+ void RecordErrorDetails(v8::Isolate*, const char*, const v8::OOMDetails&) {}
+ void RecordJsStack(v8::Isolate*, std::string_view) {}
+ 
+-#endif  // !IS_MAS_BUILD()
++#endif  // !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ 
+ }  // namespace electron::v8_oom
diff --git a/electron44/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc b/electron44/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
new file mode 100644
index 0000000000..fe3140924b
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_renderer_api_electron__api__crash__reporter__renderer.cc
@@ -0,0 +1,42 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/renderer/api/electron_api_crash_reporter_renderer.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/renderer/api/electron_api_crash_reporter_renderer.cc
+@@ -6,7 +6,7 @@
+ #include "shell/common/gin_helper/dictionary.h"
+ #include "shell/common/node_includes.h"
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "shell/common/crash_keys.h"
+ #endif
+ 
+@@ -14,13 +14,13 @@ namespace {
+ 
+ v8::Local<v8::Value> GetParameters(v8::Isolate* isolate) {
+   std::map<std::string, std::string> keys;
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   electron::crash_keys::GetCrashKeys(&keys);
+ #endif
+   return gin::ConvertToV8(isolate, keys);
+ }
+ 
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+ void SetCrashKeyStub(const std::string& key, const std::string& value) {}
+ void ClearCrashKeyStub(const std::string& key) {}
+ #endif
+@@ -31,7 +31,7 @@ void Initialize(v8::Local<v8::Object> ex
+                 void* priv) {
+   v8::Isolate* const isolate = v8::Isolate::GetCurrent();
+   gin_helper::Dictionary dict{isolate, exports};
+-#if IS_MAS_BUILD()
++#if IS_MAS_BUILD() || BUILDFLAG(IS_BSD)
+   dict.SetMethod("addExtraParameter", &SetCrashKeyStub);
+   dict.SetMethod("removeExtraParameter", &ClearCrashKeyStub);
+ #else
diff --git a/electron44/patches/patch-electron_shell_services_node_node__service.cc b/electron44/patches/patch-electron_shell_services_node_node__service.cc
new file mode 100644
index 0000000000..7352ef3fe6
--- /dev/null
+++ b/electron44/patches/patch-electron_shell_services_node_node__service.cc
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/shell/services/node/node_service.cc.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/shell/services/node/node_service.cc
+@@ -26,7 +26,7 @@
+ #include "shell/common/v8_util.h"
+ #include "shell/services/node/parent_port.h"
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+ #include "shell/common/crash_keys.h"
+ #endif
+ 
+@@ -47,7 +47,7 @@ void V8FatalErrorCallback(const char* lo
+     GetRemote()->OnV8FatalError(location, outstream.str());
+   }
+ 
+-#if !IS_MAS_BUILD()
++#if !IS_MAS_BUILD() && !BUILDFLAG(IS_BSD)
+   electron::crash_keys::SetCrashKey("electron.v8-fatal.message", message);
+   electron::crash_keys::SetCrashKey("electron.v8-fatal.location", location);
+ #endif
diff --git a/electron44/patches/patch-electron_spec_api-app.spec.ts b/electron44/patches/patch-electron_spec_api-app.spec.ts
new file mode 100644
index 0000000000..15b0d2b02c
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-app.spec.ts
@@ -0,0 +1,220 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-app.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-app.spec.ts
+@@ -130,7 +130,7 @@ describe('app module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform === 'linux')('app.setDesktopName(name)', () => {
++  ifdescribe(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('app.setDesktopName(name)', () => {
+     it('sets the desktop name to the CHROME_DESKTOP environment variable', () => {
+       const original = process.env.CHROME_DESKTOP;
+       defer(() => {
+@@ -159,11 +159,11 @@ describe('app module', () => {
+   });
+ 
+   describe('app.getPreferredSystemLanguages()', () => {
+-    ifit(process.platform !== 'linux')('should not be empty', () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('should not be empty', () => {
+       expect(app.getPreferredSystemLanguages().length).not.toBe(0);
+     });
+ 
+-    ifit(process.platform === 'linux')('should be empty or contain C entry', () => {
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('should be empty or contain C entry', () => {
+       const languages = app.getPreferredSystemLanguages();
+       if (languages.length) {
+         expect(languages).not.toContain('C');
+@@ -205,7 +205,7 @@ describe('app module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform === 'linux' && fs.existsSync('/usr/bin/dbus-daemon'))(
++  ifdescribe((process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') && fs.existsSync('@PREFIX@/bin/dbus-daemon'))(
+     'when a D-Bus bus goes away',
+     () => {
+       it('exits cleanly instead of crashing', async () => {
+@@ -387,7 +387,7 @@ describe('app module', () => {
+     // A missing display makes toolkit initialisation fail before the main loop
+     // runs; that early return must still tear the JS environment down cleanly.
+     // Skipped under ASan for the same reason as the test above.
+-    ifit(process.platform === 'linux' && !process.env.IS_ASAN)(
++    ifit((process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') && !process.env.IS_ASAN)(
+       'exits with code 1 when no display is available',
+       async () => {
+         const appPath = path.join(fixturesPath, 'api', 'no-display');
+@@ -408,7 +408,7 @@ describe('app module', () => {
+       }
+     );
+ 
+-    ifit(['darwin', 'linux'].includes(process.platform))('exits gracefully', async () => {
++    ifit(['darwin', 'linux', 'freebsd', 'netbsd'].includes(process.platform))('exits gracefully', async () => {
+       const electronPath = process.execPath;
+       const appPath = path.join(fixturesPath, 'api', 'singleton');
+       appProcess = cp.spawn(electronPath, [appPath]);
+@@ -641,7 +641,7 @@ describe('app module', () => {
+   });
+ 
+   // GitHub Actions macOS-13 runners used for x64 seem to have a problem with this test.
+-  ifdescribe(process.platform !== 'linux' && !isMacOSx64)('app.{add|get|clear}RecentDocument(s)', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd' && !isMacOSx64)('app.{add|get|clear}RecentDocument(s)', () => {
+     const tempFiles = [
+       path.join(fixturesPath, 'foo.txt'),
+       path.join(fixturesPath, 'bar.txt'),
+@@ -785,7 +785,7 @@ describe('app module', () => {
+   //   let w = null
+ 
+   //   before(function () {
+-  //     if (process.platform !== 'linux') {
++  //     if (process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd') {
+   //       this.skip()
+   //     }
+   //   })
+@@ -897,7 +897,7 @@ describe('app module', () => {
+   });
+ 
+   describe('app.badgeCount', () => {
+-    const platformIsSupported = process.platform === 'darwin' || process.platform === 'linux';
++    const platformIsSupported = process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd';
+ 
+     const expectedBadgeCount = 42;
+ 
+@@ -930,7 +930,7 @@ describe('app module', () => {
+   });
+ 
+   ifdescribe(
+-    process.platform !== 'linux' && !process.mas && (process.platform !== 'darwin' || process.arch === 'arm64')
++    process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd' && !process.mas && (process.platform !== 'darwin' || process.arch === 'arm64')
+   )('app.get/setLoginItemSettings API', () => {
+     const isMac = process.platform === 'darwin';
+     const isWin = process.platform === 'win32';
+@@ -1296,7 +1296,7 @@ describe('app module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform !== 'linux')('accessibility support functionality', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('accessibility support functionality', () => {
+     // These tests toggle a process-wide AXMode. Turn it back off so the rest of
+     // the suite doesn't run with renderer accessibility enabled.
+     afterEach(() => {
+@@ -1622,7 +1622,7 @@ describe('app module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform !== 'linux')('select-client-certificate event', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('select-client-certificate event', () => {
+     let w: BrowserWindow;
+ 
+     beforeAll(() => {
+@@ -1768,7 +1768,7 @@ describe('app module', () => {
+ 
+   describe('getApplicationNameForProtocol()', () => {
+     // TODO: Linux CI doesn't have registered http & https handlers
+-    ifit(!(process.env.CI && process.platform === 'linux') && !isWayland)(
++    ifit(!(process.env.CI && (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')) && !isWayland)(
+       'returns application names for common protocols',
+       () => {
+         // We can't expect particular app names here, but these protocols should
+@@ -1785,7 +1785,7 @@ describe('app module', () => {
+       expect(app.getApplicationNameForProtocol('bogus-protocol://')).toBe('');
+     });
+ 
+-    ifdescribe(process.platform === 'linux')('on Linux with mocked XDG dirs', () => {
++    ifdescribe(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('on Linux with mocked XDG dirs', () => {
+       const desktopFileId = 'mock-browser.desktop';
+       const mockDisplayName = 'Mock Browser';
+       const mockScheme = 'mockproto';
+@@ -1835,7 +1835,7 @@ describe('app module', () => {
+     let xdgBinDir: string;
+ 
+     beforeAll(() => {
+-      if (process.platform !== 'linux') {
++      if (process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd') {
+         return;
+       }
+ 
+@@ -1852,7 +1852,7 @@ describe('app module', () => {
+     });
+ 
+     afterAll(() => {
+-      if (process.platform === 'linux') {
++      if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+         fs.rmSync(xdgDir, { recursive: true, force: true });
+       }
+     });
+@@ -1864,7 +1864,7 @@ describe('app module', () => {
+     });
+ 
+     it('returns resolved promise with appPath, displayName and icon', async () => {
+-      if (process.platform === 'linux') {
++      if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+         const appInfo = await spawnProtocolInfoWithXdgMock(`${mockScheme}://`, xdgDataHome, xdgConfigHome);
+         expect(appInfo.name).toBe(mockDisplayName);
+         expect(appInfo.path).toBe('/usr/bin/true');
+@@ -1878,7 +1878,7 @@ describe('app module', () => {
+       expect(appInfo.icon).not.toBeUndefined();
+     });
+ 
+-    ifit(process.platform === 'linux')('resolves an executable name via PATH', async () => {
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('resolves an executable name via PATH', async () => {
+       const pathLookupExecutable = 'mock-browser';
+       const pathLookupExecutablePath = path.join(xdgBinDir, pathLookupExecutable);
+       const pathLookupDisplayName = 'Mock Browser PATH';
+@@ -1912,7 +1912,7 @@ describe('app module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform === 'linux')('default protocol client APIs', () => {
++  ifdescribe(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('default protocol client APIs', () => {
+     const protocol = 'electron-test-linux';
+     const desktopFileId = 'electron-test.desktop';
+     const protocolMimeType = `x-scheme-handler/${protocol}`;
+@@ -2029,7 +2029,7 @@ describe('app module', () => {
+   });
+ 
+   // FIXME Get these specs running on Linux CI
+-  ifdescribe(process.platform !== 'linux')('getFileIcon() API', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('getFileIcon() API', () => {
+     const iconPath = path.join(import.meta.dirname, 'fixtures/assets/icon.ico');
+     const sizes = {
+       small: 16,
+@@ -2118,7 +2118,7 @@ describe('app module', () => {
+           expect(entry.memory.privateBytes).toBeGreaterThan(0);
+         }
+ 
+-        if (process.platform !== 'linux') {
++        if (process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd') {
+           expect(entry.sandboxed).toBeTypeOf('boolean');
+         }
+ 
+@@ -2135,7 +2135,7 @@ describe('app module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform === 'linux')('GDK_BACKEND', () => {
++  ifdescribe(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('GDK_BACKEND', () => {
+     const fixture = path.join(fixturesPath, 'apps', 'gdk-backend');
+     // Wait for the app to exit, not just for its output. Otherwise the next
+     // test (or retry) launches the fixture again while this copy is still
+@@ -2238,7 +2238,7 @@ describe('app module', () => {
+         if (isGpuUnavailable(error as Error)) return ctx.skip();
+         throw error;
+       }
+-      if (process.platform === 'linux') {
++      if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+         // For linux and macOS complete info is same as basic info
+         await verifyBasicGPUInfo(completeInfo);
+         const basicInfo = await getGPUInfo('basic');
+@@ -2261,7 +2261,7 @@ describe('app module', () => {
+     });
+   });
+ 
+-  ifdescribe(!(process.platform === 'linux' && process.arch === 'arm64'))('sandbox options', () => {
++  ifdescribe(!((process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') && process.arch === 'arm64'))('sandbox options', () => {
+     let appProcess: cp.ChildProcess = null as any;
+     let server: net.Server = null as any;
+     const socketPath =
diff --git a/electron44/patches/patch-electron_spec_api-browser-window-ignore-mouse-events.spec.ts b/electron44/patches/patch-electron_spec_api-browser-window-ignore-mouse-events.spec.ts
new file mode 100644
index 0000000000..597da0e928
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-browser-window-ignore-mouse-events.spec.ts
@@ -0,0 +1,22 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-browser-window-ignore-mouse-events.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-browser-window-ignore-mouse-events.spec.ts
+@@ -45,11 +45,11 @@ type Page = { webContents: Electron.WebC
+ // Nothing can inject input into a Wayland compositor from a client, so only
+ // X11 is covered on Linux.
+ const hasRealInput =
+-  process.platform === 'win32' || process.platform === 'darwin' || (process.platform === 'linux' && !isWayland);
++  process.platform === 'win32' || process.platform === 'darwin' || ((process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') && !isWayland);
+ // { forward: true } is macOS and Windows only.
+ const canForward = process.platform === 'win32' || process.platform === 'darwin';
+ // Only these can ask the OS which window it hit tests at a point.
+-const canHitTest = process.platform === 'win32' || process.platform === 'linux';
++const canHitTest = process.platform === 'win32' || process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd';
+ 
+ // #target turns orange while hovered. Element.matches(':hover') is not usable
+ // here: it stays false while the (never focused) window is inactive even
diff --git a/electron44/patches/patch-electron_spec_api-browser-window.spec.ts b/electron44/patches/patch-electron_spec_api-browser-window.spec.ts
new file mode 100644
index 0000000000..8b90a98d82
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-browser-window.spec.ts
@@ -0,0 +1,179 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-browser-window.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-browser-window.spec.ts
+@@ -119,7 +119,7 @@ describe('BrowserWindow module', () => {
+       }).not.toThrow();
+     });
+ 
+-    ifit(process.platform === 'linux')('does not crash when setting large window icons', async () => {
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('does not crash when setting large window icons', async () => {
+       const appPath = path.join(fixtures, 'apps', 'xwindow-icon');
+       const appProcess = childProcess.spawn(process.execPath, [appPath]);
+       await once(appProcess, 'exit');
+@@ -446,7 +446,7 @@ describe('BrowserWindow module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform !== 'linux')('BrowserWindow.getContentProtection', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('BrowserWindow.getContentProtection', () => {
+     afterEach(closeAllWindows);
+     it('can set content protection', async () => {
+       const w = new BrowserWindow({ show: false });
+@@ -1455,7 +1455,7 @@ describe('BrowserWindow module', () => {
+ 
+     describe('BrowserWindow.minimize()', () => {
+       // TODO(codebytere): Enable for Linux once maximize/minimize events work in CI.
+-      ifit(process.platform !== 'linux')('should not be visible when the window is minimized', async () => {
++      ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('should not be visible when the window is minimized', async () => {
+         const minimize = once(w, 'minimize');
+         w.minimize();
+         await minimize;
+@@ -1472,7 +1472,7 @@ describe('BrowserWindow module', () => {
+       });
+ 
+       // TODO(dsanders11): Enable for Linux once CI plays nice with these kinds of tests
+-      ifit(process.platform !== 'linux')('should not restore maximized windows', async () => {
++      ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('should not restore maximized windows', async () => {
+         const maximize = once(w, 'maximize');
+         const shown = once(w, 'show');
+         w.maximize();
+@@ -1569,7 +1569,7 @@ describe('BrowserWindow module', () => {
+         }
+       );
+ 
+-      ifit(process.platform !== 'linux')('acquires focus status from the other windows', async () => {
++      ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('acquires focus status from the other windows', async () => {
+         const w1 = new BrowserWindow({ show: false });
+         const w2 = new BrowserWindow({ show: false });
+         const w3 = new BrowserWindow({ show: false });
+@@ -1674,7 +1674,7 @@ describe('BrowserWindow module', () => {
+         expect(w.isFocused()).toBe(false);
+       });
+ 
+-      ifit(process.platform !== 'linux')('transfers focus status to the next window', async () => {
++      ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('transfers focus status to the next window', async () => {
+         const w1 = new BrowserWindow({ show: false });
+         const w2 = new BrowserWindow({ show: false });
+         const w3 = new BrowserWindow({ show: false });
+@@ -2228,7 +2228,7 @@ describe('BrowserWindow module', () => {
+         });
+       });
+ 
+-      ifdescribe(process.platform !== 'linux')('Maximized state', () => {
++      ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('Maximized state', () => {
+         it('checks normal bounds when maximized', async () => {
+           const bounds = w.getBounds();
+           const maximize = once(w, 'maximize');
+@@ -2447,7 +2447,7 @@ describe('BrowserWindow module', () => {
+         });
+       });
+ 
+-      ifdescribe(process.platform !== 'linux')('Minimized state', () => {
++      ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('Minimized state', () => {
+         it('checks normal bounds when minimized', async () => {
+           const bounds = w.getBounds();
+           const minimize = once(w, 'minimize');
+@@ -3809,7 +3809,7 @@ describe('BrowserWindow module', () => {
+       expect(overlayRectPreMax.height).toBe(size);
+ 
+       // 'maximize' event is not emitted on Linux in CI.
+-      if (process.platform !== 'linux' && !w.isMaximized()) {
++      if ((process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd') && !w.isMaximized()) {
+         const maximize = once(w, 'maximize');
+         w.show();
+         w.maximize();
+@@ -3984,7 +3984,7 @@ describe('BrowserWindow module', () => {
+         expect(preMaxHeight).toBe(size);
+ 
+         // 'maximize' event is not emitted on Linux in CI.
+-        if (process.platform !== 'linux' && !w.isMaximized()) {
++        if ((process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd') && !w.isMaximized()) {
+           const maximize = once(w, 'maximize');
+           w.show();
+           w.maximize();
+@@ -5486,7 +5486,7 @@ describe('BrowserWindow module', () => {
+         expect(test.nodeTimers).toBe(true);
+         expect(test.nodeUrl).toBe(true);
+ 
+-        if (process.platform === 'linux' && test.osSandbox) {
++        if ((process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') && test.osSandbox) {
+           expect(test.creationTime, 'creation time').toBeNull();
+           expect(test.systemMemoryInfo, 'system memory info').toBeNull();
+         } else {
+@@ -6004,7 +6004,7 @@ describe('BrowserWindow module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform !== 'linux')('max/minimize events', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('max/minimize events', () => {
+     afterEach(closeAllWindows);
+     it('emits an event when window is maximized', async () => {
+       const w = new BrowserWindow({ show: false });
+@@ -6280,7 +6280,7 @@ describe('BrowserWindow module', () => {
+     // TODO(zcbenz):
+     // This test does not run on Linux CI. See:
+     // https://github.com/electron/electron/issues/28699
+-    ifit(process.platform === 'linux' && !process.env.CI)(
++    ifit((process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') && !process.env.CI)(
+       'should bring a minimized maximized window back to maximized state',
+       async () => {
+         const w = new BrowserWindow({});
+@@ -6298,7 +6298,7 @@ describe('BrowserWindow module', () => {
+       }
+     );
+ 
+-    ifit(process.platform !== 'linux')('should not break fullscreen state', { tags: ['serial'] }, async () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('should not break fullscreen state', { tags: ['serial'] }, async () => {
+       const w = new BrowserWindow({ show: false });
+       w.show();
+ 
+@@ -6321,7 +6321,7 @@ describe('BrowserWindow module', () => {
+   });
+ 
+   // TODO(dsanders11): Enable once maximize event works on Linux again on CI
+-  ifdescribe(process.platform !== 'linux')('BrowserWindow.maximize()', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('BrowserWindow.maximize()', () => {
+     afterEach(closeAllWindows);
+     it('should show the window if it is not currently shown', async () => {
+       const w = new BrowserWindow({ show: false });
+@@ -6358,7 +6358,7 @@ describe('BrowserWindow module', () => {
+ 
+     // TODO(dsanders11): Enable once minimize event works on Linux again.
+     //                   See https://github.com/electron/electron/issues/28699
+-    ifit(process.platform !== 'linux')('should not restore a minimized window', async () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('should not restore a minimized window', async () => {
+       const w = new BrowserWindow();
+       const minimize = once(w, 'minimize');
+       w.minimize();
+@@ -6878,7 +6878,7 @@ describe('BrowserWindow module', () => {
+       });
+ 
+       // On Linux there is no "resizable" property of a window.
+-      ifit(process.platform !== 'linux')('does affect maximizability when disabled and enabled', () => {
++      ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('does affect maximizability when disabled and enabled', () => {
+         const w = new BrowserWindow({ show: false });
+         expect(w.resizable, 'resizable').toBe(true);
+ 
+@@ -7119,7 +7119,7 @@ describe('BrowserWindow module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform !== 'linux')('window states (excluding Linux)', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('window states (excluding Linux)', () => {
+     // Not implemented on Linux.
+     afterEach(closeAllWindows);
+ 
+@@ -8496,7 +8496,7 @@ describe('BrowserWindow module', () => {
+   describe('"transparent" option', { tags: ['serial'] }, () => {
+     afterEach(closeAllWindows);
+ 
+-    ifit(process.platform !== 'linux')(
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')(
+       'correctly returns isMaximized() when the window is maximized then minimized',
+       async () => {
+         const w = new BrowserWindow({
diff --git a/electron44/patches/patch-electron_spec_api-clipboard.spec.ts b/electron44/patches/patch-electron_spec_api-clipboard.spec.ts
new file mode 100644
index 0000000000..02d6280252
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-clipboard.spec.ts
@@ -0,0 +1,53 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-clipboard.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-clipboard.spec.ts
+@@ -149,7 +149,7 @@ describe('clipboard module', { tags: ['s
+     });
+   });
+ 
+-  ifdescribe(process.platform !== 'linux')('reading bookmarks via clipboard.read()', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('reading bookmarks via clipboard.read()', () => {
+     it('returns title and url via the electron application/bookmark MIME type', async () => {
+       await clipboard.write([
+         new ClipboardItem({
+@@ -176,7 +176,7 @@ describe('clipboard module', { tags: ['s
+   });
+ 
+   describe('clipboard.read()', () => {
+-    ifit(process.platform !== 'linux')('does not crash when reading various custom clipboard types', async () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('does not crash when reading various custom clipboard types', async () => {
+       const rawFormat = process.platform === 'darwin' ? 'NSFilenamesPboardType' : 'FileNameW';
+       // Raw platform formats with no standard MIME mapping are surfaced
+       // under the `electron application/osclipboard;format="..."` MIME.
+@@ -235,7 +235,7 @@ describe('clipboard module', { tags: ['s
+       const readImage = nativeImage.createFromBuffer(imageBuffer!);
+       expect(readImage.toDataURL()).toBe(i.toDataURL());
+ 
+-      if (process.platform !== 'linux') {
++      if (process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd') {
+         const readBookmarkValue = await readBookmark();
+         expect(readBookmarkValue).toBeTypeOf('object');
+         if (process.platform !== 'win32') {
+@@ -486,7 +486,7 @@ describe('clipboard module', { tags: ['s
+   // but operates against a *separate* system buffer, so writes to the
+   // selection clipboard must not affect the regular system clipboard and
+   // vice-versa.
+-  ifdescribe(process.platform === 'linux')('clipboard.selection (Linux)', () => {
++  ifdescribe(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('clipboard.selection (Linux)', () => {
+     it('exposes a selection namespace mirroring the top-level surface', () => {
+       expect(clipboard.selection).toBeTypeOf('object');
+       expect(clipboard.selection!.read).toBeTypeOf('function');
+@@ -543,7 +543,7 @@ describe('clipboard module', { tags: ['s
+     });
+   });
+ 
+-  ifit(process.platform !== 'linux')('does not expose clipboard.selection off Linux', () => {
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('does not expose clipboard.selection off Linux', () => {
+     expect(clipboard.selection).toBeUndefined();
+   });
+ });
diff --git a/electron44/patches/patch-electron_spec_api-content-tracing.spec.ts b/electron44/patches/patch-electron_spec_api-content-tracing.spec.ts
new file mode 100644
index 0000000000..f684166fba
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-content-tracing.spec.ts
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-content-tracing.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-content-tracing.spec.ts
+@@ -23,7 +23,7 @@ const isCI = !!process.env.CI;
+ const fixturesPath = path.resolve(import.meta.dirname, 'fixtures');
+ 
+ // FIXME: The tests are skipped on linux arm64
+-ifdescribe(process.arch !== 'arm64' || process.platform !== 'linux')('contentTracing', () => {
++ifdescribe(process.arch !== 'arm64' || (process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd'))('contentTracing', () => {
+   let pendingRecording: Promise<string> | undefined;
+   const record = (
+     options: TraceConfig | TraceCategoriesAndOptions,
+@@ -125,7 +125,7 @@ ifdescribe(process.arch !== 'arm64' || p
+     });
+   });
+ 
+-  ifdescribe(process.platform !== 'linux')('stopRecording', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('stopRecording', () => {
+     // FIXME(samuelmaddock): this test regularly flakes
+     it.skip('does not crash on empty string', async () => {
+       const options = {
diff --git a/electron44/patches/patch-electron_spec_api-crash-reporter.spec.ts b/electron44/patches/patch-electron_spec_api-crash-reporter.spec.ts
new file mode 100644
index 0000000000..0d3bc2345b
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-crash-reporter.spec.ts
@@ -0,0 +1,44 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-crash-reporter.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-crash-reporter.spec.ts
+@@ -182,7 +182,7 @@ ifdescribe(!process.mas && !process.env.
+ 
+     // Ensures that passing in crashpadHandlerPID flag for Linx child processes
+     // does not affect child process args.
+-    ifit(process.platform === 'linux')('ensure linux child process args are not modified', async () => {
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('ensure linux child process args are not modified', async () => {
+       const { port, waitForCrash } = await startServer();
+       let exitCode: number | null = null;
+       const appPath = path.join(import.meta.dirname, 'fixtures', 'apps', 'crash');
+@@ -658,7 +658,7 @@ ifdescribe(!process.mas && !process.env.
+     }
+ 
+     const processList =
+-      process.platform === 'linux'
++      process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd'
+         ? ['main', 'renderer', 'sandboxed-renderer']
+         : ['main', 'renderer', 'sandboxed-renderer', 'node'];
+     for (const crashingProcess of processList) {
+@@ -675,7 +675,7 @@ ifdescribe(!process.mas && !process.env.
+             return app.getPath('crashDumps');
+           });
+           let reportsDir = crashesDir;
+-          if (process.platform === 'darwin' || process.platform === 'linux') {
++          if (process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+             reportsDir = path.join(crashesDir, 'completed');
+           } else if (process.platform === 'win32') {
+             reportsDir = path.join(crashesDir, 'reports');
+@@ -703,7 +703,7 @@ ifdescribe(!process.mas && !process.env.
+           expect(remoteCrashesDir).toBe(crashesDir);
+ 
+           let reportsDir = crashesDir;
+-          if (process.platform === 'darwin' || process.platform === 'linux') {
++          if (process.platform === 'darwin' || process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+             reportsDir = path.join(crashesDir, 'completed');
+           } else if (process.platform === 'win32') {
+             reportsDir = path.join(crashesDir, 'reports');
diff --git a/electron44/patches/patch-electron_spec_api-desktop-capturer.spec.ts b/electron44/patches/patch-electron_spec_api-desktop-capturer.spec.ts
new file mode 100644
index 0000000000..57a5901ed7
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-desktop-capturer.spec.ts
@@ -0,0 +1,80 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-desktop-capturer.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-desktop-capturer.spec.ts
+@@ -9,7 +9,7 @@ import { ifdescribe, ifit } from './lib/
+ import { closeAllWindows } from './lib/window-helpers.ts';
+ 
+ function getSourceTypes(): ('window' | 'screen')[] {
+-  if (process.platform === 'linux') {
++  if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+     return ['screen'];
+   }
+   return ['window', 'screen'];
+@@ -38,7 +38,7 @@ describe('desktopCapturer', { tags: ['se
+   });
+ 
+   // Linux doesn't return any window sources.
+-  ifit(process.platform !== 'linux')('responds to subsequent calls of different options', async () => {
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('responds to subsequent calls of different options', async () => {
+     const promise1 = desktopCapturer.getSources({ types: ['window'] });
+     await promise1;
+ 
+@@ -47,7 +47,7 @@ describe('desktopCapturer', { tags: ['se
+   });
+ 
+   // Linux doesn't return any window sources.
+-  ifit(process.platform !== 'linux')('returns an empty display_id for window sources', async () => {
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('returns an empty display_id for window sources', async () => {
+     const w2 = new BrowserWindow({ width: 200, height: 200 });
+     await w2.loadURL('about:blank');
+ 
+@@ -61,7 +61,7 @@ describe('desktopCapturer', { tags: ['se
+     }
+   });
+ 
+-  ifit(process.platform !== 'linux')('returns display_ids matching the Screen API', async () => {
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('returns display_ids matching the Screen API', async () => {
+     const displays = screen.getAllDisplays();
+     const sources = await desktopCapturer.getSources({ types: ['screen'] });
+     expect(sources).toBeInstanceOf(Array);
+@@ -111,7 +111,7 @@ describe('desktopCapturer', { tags: ['se
+   });
+ 
+   // Linux doesn't return any window sources.
+-  ifit(process.platform !== 'linux')('getMediaSourceId should match DesktopCapturerSource.id', async () => {
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('getMediaSourceId should match DesktopCapturerSource.id', async () => {
+     const w2 = new BrowserWindow({ show: false, width: 100, height: 100, webPreferences: { contextIsolation: false } });
+     const wShown = once(w2, 'show');
+     const wFocused = once(w2, 'focus');
+@@ -136,7 +136,7 @@ describe('desktopCapturer', { tags: ['se
+   });
+ 
+   // Linux doesn't return any window sources.
+-  ifit(process.platform !== 'linux')('getSources should not incorrectly duplicate window_id', async () => {
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('getSources should not incorrectly duplicate window_id', async () => {
+     const w2 = new BrowserWindow({ show: false, width: 100, height: 100, webPreferences: { contextIsolation: false } });
+     const wShown = once(w2, 'show');
+     const wFocused = once(w2, 'focus');
+@@ -184,7 +184,7 @@ describe('desktopCapturer', { tags: ['se
+   });
+ 
+   // Linux doesn't return any window sources.
+-  ifit(process.platform !== 'linux')('moveAbove should move the window at the requested place', async () => {
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('moveAbove should move the window at the requested place', async () => {
+     // DesktopCapturer.getSources() is guaranteed to return in the correct
+     // z-order from foreground to background.
+     const MAX_WIN = 4;
+@@ -272,7 +272,7 @@ describe('desktopCapturer', { tags: ['se
+ 
+   // Linux doesn't return any window sources.
+   // Tests are sequentially dependent.
+-  ifdescribe(process.platform !== 'linux')('fetchWindowIcons', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('fetchWindowIcons', () => {
+     let w: BrowserWindow;
+     let testSource: Electron.DesktopCapturerSource | undefined;
+     let appIcon: Electron.NativeImage | undefined;
diff --git a/electron44/patches/patch-electron_spec_api-dialog.spec.ts b/electron44/patches/patch-electron_spec_api-dialog.spec.ts
new file mode 100644
index 0000000000..46a86d39f2
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-dialog.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-dialog.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-dialog.spec.ts
+@@ -1046,7 +1046,7 @@ describe('dialog module', () => {
+   // FileChooser that script/dbus_mock.py hosts on the fake session bus. The
+   // mock records each request and auto-cancels the dialog.
+   ifdescribe(
+-    process.platform === 'linux' &&
++    (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') &&
+       process.arch !== 'ia32' &&
+       !process.arch.startsWith('arm') &&
+       !!process.env.DBUS_SESSION_BUS_ADDRESS
diff --git a/electron44/patches/patch-electron_spec_api-media-handler.spec.ts b/electron44/patches/patch-electron_spec_api-media-handler.spec.ts
new file mode 100644
index 0000000000..e876a65717
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-media-handler.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-media-handler.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-media-handler.spec.ts
+@@ -64,7 +64,7 @@ describe('setDisplayMediaRequestHandler'
+ 
+   // Process-level loopback audio capture (restrictOwnAudio / loopbackWithoutChrome)
+   // is not supported on Linux audio backends (PulseAudio / PipeWire).
+-  ifit(process.platform !== 'linux')(
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')(
+     'honors the restrictOwnAudio constraint when granted loopback audio',
+     async (ctx) => {
+       if ((await desktopCapturer.getSources({ types: ['screen'] })).length === 0) {
diff --git a/electron44/patches/patch-electron_spec_api-menu.spec.ts b/electron44/patches/patch-electron_spec_api-menu.spec.ts
new file mode 100644
index 0000000000..ffb3ef29a2
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-menu.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-menu.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-menu.spec.ts
+@@ -1007,7 +1007,7 @@ describe('Menu module', () => {
+     // https://github.com/electron/electron/issues/35724
+     // Maximizing window is enough to trigger the bug
+     // FIXME(dsanders11): Test always passes on CI, even pre-fix
+-    ifit(process.platform === 'linux' && !process.env.CI)(
++    ifit((process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') && !process.env.CI)(
+       'does not trigger issue #35724',
+       () =>
+         new Promise<void>((resolve, reject) => {
diff --git a/electron44/patches/patch-electron_spec_api-native-image.spec.ts b/electron44/patches/patch-electron_spec_api-native-image.spec.ts
new file mode 100644
index 0000000000..e3d028871a
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-native-image.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-native-image.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-native-image.spec.ts
+@@ -569,7 +569,7 @@ describe('nativeImage module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform !== 'linux')('createThumbnailFromPath(path, size)', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('createThumbnailFromPath(path, size)', () => {
+     useRemoteContext({ webPreferences: { contextIsolation: false, nodeIntegration: true } });
+ 
+     it('throws when invalid size is passed', async () => {
diff --git a/electron44/patches/patch-electron_spec_api-net-log.spec.ts b/electron44/patches/patch-electron_spec_api-net-log.spec.ts
new file mode 100644
index 0000000000..3871ab6207
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-net-log.spec.ts
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-net-log.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-net-log.spec.ts
+@@ -137,7 +137,7 @@ describe('netLog module', () => {
+     ).toBe(true);
+   });
+ 
+-  ifit(process.platform !== 'linux')(
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')(
+     'should begin and end logging automatically when --log-net-log is passed',
+     async () => {
+       const appProcess = ChildProcess.spawn(process.execPath, [appPath], {
+@@ -152,7 +152,7 @@ describe('netLog module', () => {
+     }
+   );
+ 
+-  ifit(process.platform !== 'linux')(
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')(
+     'should begin and end logging automatically when --log-net-log is passed, and behave correctly when .startLogging() and .stopLogging() is called',
+     async () => {
+       const appProcess = ChildProcess.spawn(process.execPath, [appPath], {
+@@ -170,7 +170,7 @@ describe('netLog module', () => {
+     }
+   );
+ 
+-  ifit(process.platform !== 'linux')(
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')(
+     'should end logging automatically when only .startLogging() is called',
+     async () => {
+       const appProcess = ChildProcess.spawn(process.execPath, [appPath], {
diff --git a/electron44/patches/patch-electron_spec_api-net.spec.ts b/electron44/patches/patch-electron_spec_api-net.spec.ts
new file mode 100644
index 0000000000..0b80515bf6
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-net.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-net.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-net.spec.ts
+@@ -2156,7 +2156,7 @@ describe('net module', () => {
+   // The select-client-certificate event only fires when the platform cert
+   // store yields at least one matching identity, which the test suite cannot
+   // guarantee on Linux (NSS) without app.importCertificate.
+-  ifdescribe(process.platform !== 'linux')('client certificate authentication', () => {
++  ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('client certificate authentication', () => {
+     let server: https.Server;
+     let secureUrl: string;
+     const certPath = path.join(fixturesPath, 'certificates');
diff --git a/electron44/patches/patch-electron_spec_api-notification-dbus.spec.ts b/electron44/patches/patch-electron_spec_api-notification-dbus.spec.ts
new file mode 100644
index 0000000000..37e3a44be4
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-notification-dbus.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-notification-dbus.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-notification-dbus.spec.ts
+@@ -23,7 +23,7 @@ const require = createRequire(import.met
+ 
+ const fixturesPath = path.join(import.meta.dirname, 'fixtures');
+ 
+-const skip = process.platform !== 'linux' || !process.env.DBUS_SESSION_BUS_ADDRESS;
++const skip = (process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd') || !process.env.DBUS_SESSION_BUS_ADDRESS;
+ 
+ ifdescribe(!skip)('Notification module (dbus)', { tags: ['serial'] }, () => {
+   let mock: any, Notification: any, getCalls: any, emitSignal: any, reset: any;
diff --git a/electron44/patches/patch-electron_spec_api-power-monitor.spec.ts b/electron44/patches/patch-electron_spec_api-power-monitor.spec.ts
new file mode 100644
index 0000000000..d2d7933c77
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-power-monitor.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-power-monitor.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-power-monitor.spec.ts
+@@ -21,7 +21,7 @@ const require = createRequire(import.met
+ describe('powerMonitor', { tags: ['serial'] }, () => {
+   let logindMock: any, dbusMockPowerMonitor: any, getCalls: any, emitSignal: any, reset: any;
+ 
+-  ifdescribe(process.platform === 'linux' && process.env.DBUS_SYSTEM_BUS_ADDRESS != null)(
++  ifdescribe((process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') && process.env.DBUS_SYSTEM_BUS_ADDRESS != null)(
+     'when powerMonitor module is loaded with dbus mock',
+     () => {
+       beforeAll(async () => {
diff --git a/electron44/patches/patch-electron_spec_api-process.spec.ts b/electron44/patches/patch-electron_spec_api-process.spec.ts
new file mode 100644
index 0000000000..9a1efee182
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-process.spec.ts
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-process.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-process.spec.ts
+@@ -44,7 +44,7 @@ describe('process module', () => {
+       it('resolves promise successfully with valid data', async () => {
+         const memoryInfo = await invoke(() => process.getProcessMemoryInfo());
+         expect(memoryInfo).toBeTypeOf('object');
+-        if (process.platform === 'linux' || process.platform === 'win32') {
++        if (process.platform === 'linux' || process.platform === 'win32' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+           expect(memoryInfo.residentSet).toBeTypeOf('number');
+           expect(memoryInfo.residentSet).toBeGreaterThan(0);
+         }
+@@ -61,7 +61,7 @@ describe('process module', () => {
+         const systemMemoryInfo = await invoke(() => process.getSystemMemoryInfo());
+         expect(systemMemoryInfo.free).toBeTypeOf('number');
+         expect(systemMemoryInfo.total).toBeTypeOf('number');
+-        if (process.platform === 'linux') {
++        if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+           expect(systemMemoryInfo.available).toBeTypeOf('number');
+           expect(systemMemoryInfo.available).toBeGreaterThan(0);
+         }
+@@ -141,7 +141,7 @@ describe('process module', () => {
+     generateSpecs((fn, ...args) => fn(...args));
+   });
+ 
+-  ifdescribe(process.platform === 'linux')('process.env', () => {
++  ifdescribe(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('process.env', () => {
+     it('can add variables while another thread reads the environment', async () => {
+       const fixture = path.join(import.meta.dirname, 'fixtures', 'api', 'environ-write-race.js');
+       const child = cp.spawn(process.execPath, [fixture], { stdio: ['ignore', 'pipe', 'inherit'] });
diff --git a/electron44/patches/patch-electron_spec_api-safe-storage.spec.ts b/electron44/patches/patch-electron_spec_api-safe-storage.spec.ts
new file mode 100644
index 0000000000..7307897e16
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-safe-storage.spec.ts
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-safe-storage.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-safe-storage.spec.ts
+@@ -11,7 +11,7 @@ import { ifdescribe } from './lib/spec-h
+ 
+ describe('safeStorage module', () => {
+   beforeAll(() => {
+-    if (process.platform === 'linux') {
++    if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+       safeStorage.setUsePlainTextEncryption(true);
+     }
+   });
+@@ -29,7 +29,7 @@ describe('safeStorage module', () => {
+     });
+   });
+ 
+-  ifdescribe(process.platform === 'linux')('SafeStorage.getSelectedStorageBackend()', () => {
++  ifdescribe(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('SafeStorage.getSelectedStorageBackend()', () => {
+     it('should return a valid backend', () => {
+       expect(safeStorage.getSelectedStorageBackend()).toBe('basic_text');
+     });
diff --git a/electron44/patches/patch-electron_spec_api-screen.spec.ts b/electron44/patches/patch-electron_spec_api-screen.spec.ts
new file mode 100644
index 0000000000..e944a672ce
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-screen.spec.ts
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-screen.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-screen.spec.ts
+@@ -97,7 +97,7 @@ describe('screen module', { tags: ['seri
+ 
+       const { size } = display!;
+ 
+-      if (process.platform === 'linux') {
++      if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+         expect(size).toHaveProperty('width', expect.any(Number));
+         expect(size).toHaveProperty('height', expect.any(Number));
+       } else {
+@@ -113,7 +113,7 @@ describe('screen module', { tags: ['seri
+ 
+       const { workAreaSize } = display!;
+ 
+-      if (process.platform === 'linux') {
++      if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+         expect(workAreaSize).toHaveProperty('width', expect.any(Number));
+         expect(workAreaSize).toHaveProperty('height', expect.any(Number));
+       } else {
+@@ -131,7 +131,7 @@ describe('screen module', { tags: ['seri
+       expect(bounds).toHaveProperty('x', expect.any(Number));
+       expect(bounds).toHaveProperty('y', expect.any(Number));
+ 
+-      if (process.platform === 'linux') {
++      if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+         expect(bounds).toHaveProperty('width', expect.any(Number));
+         expect(bounds).toHaveProperty('height', expect.any(Number));
+       } else {
diff --git a/electron44/patches/patch-electron_spec_api-shell.spec.ts b/electron44/patches/patch-electron_spec_api-shell.spec.ts
new file mode 100644
index 0000000000..0215357b1b
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-shell.spec.ts
@@ -0,0 +1,34 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-shell.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-shell.spec.ts
+@@ -47,7 +47,7 @@ describe('shell module', () => {
+ 
+     afterEach(async () => {
+       // reset env vars to prevent side effects
+-      if (process.platform === 'linux') {
++      if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+         process.env.DE = envVars.de;
+         process.env.BROWSER = envVars.browser;
+         process.env.DISPLAY = envVars.display;
+@@ -67,6 +67,16 @@ describe('shell module', () => {
+         process.env.DE = 'generic';
+         process.env.DISPLAY = '';
+         requestReceived = Promise.resolve();
++      } else if (process.platform === 'freebsd') {
++        process.env.BROWSER = '/usr/bin/true';
++        process.env.DE = 'generic';
++        process.env.DISPLAY = '';
++        requestReceived = Promise.resolve();
++      } else if (process.platform === 'netbsd') {
++        process.env.BROWSER = '/usr/bin/true';
++        process.env.DE = 'generic';
++        process.env.DISPLAY = '';
++        requestReceived = Promise.resolve();
+       } else if (process.platform === 'darwin') {
+         // On the Mac CI machines, Safari tries to ask for a password to the
+         // code signing keychain we set up to test code signing (see
diff --git a/electron44/patches/patch-electron_spec_api-subframe.spec.ts b/electron44/patches/patch-electron_spec_api-subframe.spec.ts
new file mode 100644
index 0000000000..2131b6caea
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-subframe.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-subframe.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-subframe.spec.ts
+@@ -254,7 +254,7 @@ describe('subframe with non-standard sch
+ });
+ 
+ // app.getAppMetrics() does not return sandbox information on Linux.
+-ifdescribe(process.platform !== 'linux')('cross-site frame sandboxing', () => {
++ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('cross-site frame sandboxing', () => {
+   let server: http.Server;
+   let crossSiteUrl: string;
+   let serverUrl: string;
diff --git a/electron44/patches/patch-electron_spec_api-system-preferences.spec.ts b/electron44/patches/patch-electron_spec_api-system-preferences.spec.ts
new file mode 100644
index 0000000000..d2f9036d95
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-system-preferences.spec.ts
@@ -0,0 +1,19 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-system-preferences.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-system-preferences.spec.ts
+@@ -5,8 +5,8 @@ import { describe, expect, it } from 'vi
+ import { ifdescribe, ifit } from './lib/spec-helpers.ts';
+ 
+ describe('systemPreferences module', () => {
+-  ifdescribe(['win32', 'linux'].includes(process.platform))('systemPreferences.getAccentColor', () => {
+-    ifit(process.platform === 'linux')('should return a string', () => {
++  ifdescribe(['win32', 'linux', 'freebsd', 'netbsd'].includes(process.platform))('systemPreferences.getAccentColor', () => {
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('should return a string', () => {
+       // Testing this properly (i.e. non-empty string) requires
+       // some tricky D-Bus mock setup.
+       const accentColor = systemPreferences.getAccentColor();
diff --git a/electron44/patches/patch-electron_spec_api-tray.spec.ts b/electron44/patches/patch-electron_spec_api-tray.spec.ts
new file mode 100644
index 0000000000..aea66d8b55
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-tray.spec.ts
@@ -0,0 +1,33 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-tray.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-tray.spec.ts
+@@ -32,13 +32,13 @@ describe('tray module', { tags: ['serial
+       }).toThrow(/Failed to load image from path (.+)/);
+     });
+ 
+-    ifit(process.platform !== 'linux')('throws a descriptive error if an invalid guid is given', () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('throws a descriptive error if an invalid guid is given', () => {
+       expect(() => {
+         tray = new Tray(nativeImage.createEmpty(), 'I am not a guid');
+       }).toThrow('Invalid GUID format');
+     });
+ 
+-    ifit(process.platform !== 'linux')('accepts a valid guid', () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('accepts a valid guid', () => {
+       expect(() => {
+         tray = new Tray(nativeImage.createEmpty(), '0019A433-3526-48BA-A66C-676742C0FEFB');
+       }).not.toThrow();
+@@ -139,7 +139,7 @@ describe('tray module', { tags: ['serial
+       tray.destroy();
+     });
+ 
+-    ifit(process.platform !== 'linux')('returns a bounds object', () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('returns a bounds object', () => {
+       const bounds = tray.getBounds();
+       expect(bounds).toBeTypeOf('object');
+       expect(Object.keys(bounds).sort()).toEqual(['height', 'width', 'x', 'y']);
diff --git a/electron44/patches/patch-electron_spec_api-utility-process.spec.ts b/electron44/patches/patch-electron_spec_api-utility-process.spec.ts
new file mode 100644
index 0000000000..32ac07da6f
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-utility-process.spec.ts
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-utility-process.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-utility-process.spec.ts
+@@ -669,7 +669,7 @@ describe('utilityProcess module', () => 
+       expect(output).toContain(result);
+     });
+ 
+-    ifit(process.platform !== 'linux')('can access exposed main process modules from the utility process', async () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('can access exposed main process modules from the utility process', async () => {
+       const message = 'Message from utility process';
+       const child = utilityProcess.fork(path.join(fixturesPath, 'expose-main-process-module.js'));
+       await once(child, 'spawn');
+@@ -706,7 +706,7 @@ describe('utilityProcess module', () => 
+       await closeWindow(w);
+     });
+ 
+-    ifit(process.platform === 'linux')('allows executing a setuid binary with child_process', async () => {
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('allows executing a setuid binary with child_process', async () => {
+       const child = utilityProcess.fork(path.join(fixturesPath, 'suid.js'));
+       await once(child, 'spawn');
+       const [data] = await once(child, 'message');
diff --git a/electron44/patches/patch-electron_spec_api-web-contents.spec.ts b/electron44/patches/patch-electron_spec_api-web-contents.spec.ts
new file mode 100644
index 0000000000..f58eb7a679
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_api-web-contents.spec.ts
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/api-web-contents.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/api-web-contents.spec.ts
+@@ -1647,7 +1647,7 @@ describe('webContents module', () => {
+     // back to OpenFolder() which does a blocking DirectoryExists() on the UI
+     // thread (pre-existing behavior). Workspace-gating is covered by the test
+     // above.
+-    ifit(process.platform !== 'linux')(
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')(
+       'reveals paths under a registered workspace folder without executing them',
+       // Opens a real Finder/Explorer window, which takes focus and stays open.
+       { tags: ['serial'] },
+@@ -1673,7 +1673,7 @@ describe('webContents module', () => {
+   // xdg-desktop-portal FileChooser that script/dbus_mock.py hosts on the fake
+   // session bus.
+   ifdescribe(
+-    process.platform === 'linux' &&
++    (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') &&
+       process.arch !== 'ia32' &&
+       !process.arch.startsWith('arm') &&
+       !!process.env.DBUS_SESSION_BUS_ADDRESS
+@@ -5411,7 +5411,7 @@ describe('webContents module', () => {
+     });
+ 
+     // TODO(codebytere): OOPIF printing is disabled on Linux at the moment due to crashes.
+-    ifit(process.platform !== 'linux')('can print cross-origin iframes', async () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('can print cross-origin iframes', async () => {
+       server = http.createServer((_, res) => {
+         res.writeHead(200);
+         res.end(`
diff --git a/electron44/patches/patch-electron_spec_asar.spec.ts b/electron44/patches/patch-electron_spec_asar.spec.ts
new file mode 100644
index 0000000000..cad314b7bd
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_asar.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/asar.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/asar.spec.ts
+@@ -749,7 +749,7 @@ describe('asar package', () => {
+         expect(code).toBe(0);
+       });
+ 
+-      ifit(process.platform === 'linux')(
++      ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')(
+         'starts an app from an archive under a non-ASCII directory with LC_ALL=C',
+         async () => {
+           const app = j(tmp, unicodeDir, 'main-app.asar');
diff --git a/electron44/patches/patch-electron_spec_chromium.spec.ts b/electron44/patches/patch-electron_spec_chromium.spec.ts
new file mode 100644
index 0000000000..a8206875b9
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_chromium.spec.ts
@@ -0,0 +1,52 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/chromium.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/chromium.spec.ts
+@@ -612,15 +612,15 @@ describe('command line switches', () => 
+       testLocale('asdfkl', `${currentLocale}|${currentSystemLocale}|${currentPreferredLanguages}`));
+ 
+     const lcAll = String(process.env.LC_ALL);
+-    ifit(process.platform === 'linux')('current process has a valid LC_ALL env', async () => {
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('current process has a valid LC_ALL env', async () => {
+       // The LC_ALL env should not be set to DOM locale string.
+       expect(lcAll).not.toBe(app.getLocale());
+     });
+-    ifit(process.platform === 'linux')('should not change LC_ALL', async () => testLocale('fr', lcAll, true));
+-    ifit(process.platform === 'linux')('should not change LC_ALL when setting invalid locale', async () =>
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('should not change LC_ALL', async () => testLocale('fr', lcAll, true));
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('should not change LC_ALL when setting invalid locale', async () =>
+       testLocale('asdfkl', lcAll, true)
+     );
+-    ifit(process.platform === 'linux')('should not change LC_ALL when --lang is not set', async () =>
++    ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('should not change LC_ALL when --lang is not set', async () =>
+       testLocale('', lcAll, true)
+     );
+   });
+@@ -4425,12 +4425,12 @@ describe('font fallback', () => {
+       expect(fonts[0].familyName).toBe('Arial');
+     } else if (process.platform === 'darwin') {
+       expect(fonts[0].familyName).toBe('Helvetica');
+-    } else if (process.platform === 'linux') {
++    } else if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+       expect(fonts[0].familyName).toBe('DejaVu Sans');
+     } // I think this depends on the distro? We don't specify a default.
+   });
+ 
+-  ifit(process.platform !== 'linux')('should fall back to Japanese font for sans-serif Japanese script', async () => {
++  ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('should fall back to Japanese font for sans-serif Japanese script', async () => {
+     const html = `
+     <html lang="ja-JP">
+       <head>
+@@ -5148,7 +5148,7 @@ describe('paste execCommand', { tags: ['
+   });
+ });
+ 
+-ifdescribe(process.platform !== 'linux')('navigator.setAppBadge/clearAppBadge', () => {
++ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('navigator.setAppBadge/clearAppBadge', () => {
+   let w: BrowserWindow;
+ 
+   const expectedBadgeCount = 42;
diff --git a/electron44/patches/patch-electron_spec_crash.spec.ts b/electron44/patches/patch-electron_spec_crash.spec.ts
new file mode 100644
index 0000000000..ef5438ec0b
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_crash.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/crash.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/crash.spec.ts
+@@ -47,7 +47,7 @@ const shouldRunCase = (crashCase: string
+   switch (crashCase) {
+     // TODO(jkleinsc) fix this test on Linux on arm64
+     case 'js-execute-iframe': {
+-      return process.platform !== 'linux' || process.arch !== 'arm64';
++      return (process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd') || process.arch !== 'arm64';
+     }
+     default: {
+       return true;
diff --git a/electron44/patches/patch-electron_spec_desktop-name.spec.ts b/electron44/patches/patch-electron_spec_desktop-name.spec.ts
new file mode 100644
index 0000000000..d3ec2b39e0
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_desktop-name.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/desktop-name.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/desktop-name.spec.ts
+@@ -10,7 +10,7 @@ const { defaultDesktopName }: typeof imp
+   '../lib/browser/desktop-name.ts'
+ );
+ 
+-ifdescribe(process.platform === 'linux')('defaultDesktopName', () => {
++ifdescribe(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('defaultDesktopName', () => {
+   it("derives an appropriate .desktop name from the app's human readable name", () => {
+     const fallback = `${path.basename(process.execPath)}.desktop`;
+     const cases: Array<[string | undefined, string]> = [
diff --git a/electron44/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js b/electron44/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
new file mode 100644
index 0000000000..e01ad54cd7
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_fixtures_api_safe-storage_decrypt-app_main.js
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/fixtures/api/safe-storage/decrypt-app/main.js.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/fixtures/api/safe-storage/decrypt-app/main.js
+@@ -7,7 +7,7 @@ const pathToEncryptedString = path.resol
+ const readFile = fs.readFile;
+ 
+ app.whenReady().then(async () => {
+-  if (process.platform === 'linux') {
++  if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+     safeStorage.setUsePlainTextEncryption(true);
+   }
+   const encryptedString = await readFile(pathToEncryptedString);
diff --git a/electron44/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js b/electron44/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
new file mode 100644
index 0000000000..4cfdd80859
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_fixtures_api_safe-storage_encrypt-app_main.js
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/fixtures/api/safe-storage/encrypt-app/main.js.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/fixtures/api/safe-storage/encrypt-app/main.js
+@@ -7,7 +7,7 @@ const pathToEncryptedString = path.resol
+ const writeFile = fs.writeFile;
+ 
+ app.whenReady().then(async () => {
+-  if (process.platform === 'linux') {
++  if (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') {
+     safeStorage.setUsePlainTextEncryption(true);
+   }
+   const encrypted = safeStorage.encryptString('plaintext');
diff --git a/electron44/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js b/electron44/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
new file mode 100644
index 0000000000..dd88b5d5e1
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_fixtures_native-addon_uv-dlopen_index.js
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/fixtures/native-addon/uv-dlopen/index.js.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/fixtures/native-addon/uv-dlopen/index.js
+@@ -4,7 +4,7 @@ const testLoadLibrary = require('./build
+ 
+ const lib = (() => {
+   switch (process.platform) {
+-    case 'linux':
++    case 'linux': case 'freebsd': case 'netbsd':
+       return path.resolve(__dirname, 'build/Release/foo.so');
+     case 'darwin':
+       return path.resolve(__dirname, 'build/Release/foo.dylib');
diff --git a/electron44/patches/patch-electron_spec_lib_spec-helpers.ts b/electron44/patches/patch-electron_spec_lib_spec-helpers.ts
new file mode 100644
index 0000000000..1fcc4b6723
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_lib_spec-helpers.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/lib/spec-helpers.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/lib/spec-helpers.ts
+@@ -19,7 +19,7 @@ export const ifit = (condition: boolean)
+ export const ifdescribe = (condition: boolean) => (condition ? describe : describe.skip);
+ 
+ export const isWayland =
+-  process.platform === 'linux' &&
++  (process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd') &&
+   (process.env.XDG_SESSION_TYPE === 'wayland' ||
+     !!process.env.WAYLAND_DISPLAY ||
+     process.argv.includes('--ozone-platform=wayland'));
diff --git a/electron44/patches/patch-electron_spec_node.spec.ts b/electron44/patches/patch-electron_spec_node.spec.ts
new file mode 100644
index 0000000000..970e868f17
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_node.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/node.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/node.spec.ts
+@@ -240,7 +240,7 @@ describe('node feature', () => {
+     });
+ 
+     describe('child_process.exec', () => {
+-      ifit(process.platform === 'linux')('allows executing a setuid binary from non-sandboxed renderer', async () => {
++      ifit(process.platform === 'linux' || process.platform === 'freebsd' || process.platform === 'netbsd')('allows executing a setuid binary from non-sandboxed renderer', async () => {
+         // Chrome uses prctl(2) to set the NO_NEW_PRIVILEGES flag on Linux (see
+         // https://github.com/torvalds/linux/blob/40fde647cc/Documentation/userspace-api/no_new_privs.rst).
+         // We disable this for unsandboxed processes, which the renderer tests
diff --git a/electron44/patches/patch-electron_spec_spellchecker.spec.ts b/electron44/patches/patch-electron_spec_spellchecker.spec.ts
new file mode 100644
index 0000000000..9b859a8aad
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_spellchecker.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/spellchecker.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/spellchecker.spec.ts
+@@ -126,7 +126,7 @@ ifdescribe(features.isBuiltinSpellChecke
+       }, timeout);
+ 
+       // Context menu test can not run on Windows or Linux (https://github.com/electron/electron/pull/48657 broke linux).
+-      const shouldRun = process.platform !== 'win32' && process.platform !== 'linux';
++      const shouldRun = process.platform !== 'win32' && process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd';
+ 
+       ifit(shouldRun)('should detect correctly spelled words as correct', async () => {
+         await w.webContents.executeJavaScript('document.body.querySelector("textarea").value = "typography"');
diff --git a/electron44/patches/patch-electron_spec_visibility-state.spec.ts b/electron44/patches/patch-electron_spec_visibility-state.spec.ts
new file mode 100644
index 0000000000..2ff6d3ba8a
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_visibility-state.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/visibility-state.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/visibility-state.spec.ts
+@@ -19,7 +19,7 @@ import { closeAllWindows } from './lib/w
+ 
+ // visibilityState specs pass on linux with a real window manager but on CI
+ // the environment does not let these specs pass
+-ifdescribe(process.platform !== 'linux')('document.visibilityState', () => {
++ifdescribe(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('document.visibilityState', () => {
+   let w: BaseWindow & { webContents: WebContents };
+ 
+   beforeAll(() => {
diff --git a/electron44/patches/patch-electron_spec_webview.spec.ts b/electron44/patches/patch-electron_spec_webview.spec.ts
new file mode 100644
index 0000000000..b67efa1a13
--- /dev/null
+++ b/electron44/patches/patch-electron_spec_webview.spec.ts
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- electron/spec/webview.spec.ts.orig	2026-10-30 06:33:33.000000000 +0000
++++ electron/spec/webview.spec.ts
+@@ -626,7 +626,7 @@ describe('<webview> tag', () => {
+     });
+ 
+     // FIXME(zcbenz): Fullscreen events do not work on Linux.
+-    ifit(process.platform !== 'linux')('exiting fullscreen should unfullscreen window', async () => {
++    ifit(process.platform !== 'linux' && process.platform !== 'freebsd' && process.platform !== 'netbsd')('exiting fullscreen should unfullscreen window', async () => {
+       const [w, webview] = await loadWebViewWindow();
+       const enterFullScreen = once(w, 'enter-full-screen');
+       await webview.executeJavaScript('document.getElementById("div").requestFullscreen()', true);
diff --git a/electron44/patches/patch-net_dns_dns__config__service__posix.cc b/electron44/patches/patch-net_dns_dns__config__service__posix.cc
new file mode 100644
index 0000000000..e41d2d0624
--- /dev/null
+++ b/electron44/patches/patch-net_dns_dns__config__service__posix.cc
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- net/dns/dns_config_service_posix.cc.orig	2026-11-03 19:08:31.172664055 +0000
++++ net/dns/dns_config_service_posix.cc
+@@ -146,6 +146,7 @@ class DnsConfigServicePosix::Watcher : p
+ #endif
+ 
+     bool success = true;
++#if !IS_MAS_BUILD()
+     if (!config_watcher_.Watch(base::BindRepeating(&Watcher::OnConfigChanged,
+                                                    base::Unretained(this)))) {
+       LOG(ERROR) << "DNS config watch failed to start.";
diff --git a/electron44/patches/patch-rollup_rust_bindings__napi_Cargo.toml b/electron44/patches/patch-rollup_rust_bindings__napi_Cargo.toml
new file mode 100644
index 0000000000..8e5d95cf7d
--- /dev/null
+++ b/electron44/patches/patch-rollup_rust_bindings__napi_Cargo.toml
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- rollup/rust/bindings_napi/Cargo.toml.orig	2026-05-14 17:17:51.000000000 +0000
++++ rollup/rust/bindings_napi/Cargo.toml
+@@ -15,7 +15,7 @@ napi-derive = "3.5.5"
+ parse_ast = { path = "../parse_ast" }
+ xxhash = { path = "../xxhash" }
+ 
+-[target.'cfg(not(any(target_os = "linux", target_os = "freebsd")))'.dependencies]
++[target.'cfg(not(any(target_os = "linux", target_os = "freebsd", target_os = "openbsd", target_os = "netbsd")))'.dependencies]
+ mimalloc-safe = { version = "0.1.58" }
+ 
+ # Readable version of the target specifier
+@@ -33,7 +33,7 @@ mimalloc-safe = { version = "0.1.58" }
+ # 		)
+ # 	)
+ # )
+-[target.'cfg(any(all(target_os = "linux", not(target_arch = "loongarch64"), not(all(target_arch = "riscv64", target_env = "musl")), not(target_env = "ohos")), all(target_os = "freebsd", not(target_arch = "aarch64"))))'.dependencies]
++[target.'cfg(any(all(target_os = "linux", not(target_arch = "loongarch64"), not(all(target_arch = "riscv64", target_env = "musl")), not(target_env = "ohos")), all(target_os = "openbsd", not(target_arch = "aarch64")), all(target_os = "freebsd", not(target_arch = "aarch64")), all(target_os = "netbsd", not(target_arch = "aarch64"))))'.dependencies]
+ mimalloc-safe = { version = "0.1.58", features = ["local_dynamic_tls"] }
+ 
+ # Disable architecture specific optimizations on aarch64 platforms
diff --git a/electron44/patches/patch-rollup_rust_bindings__napi_src_lib.rs b/electron44/patches/patch-rollup_rust_bindings__napi_src_lib.rs
new file mode 100644
index 0000000000..764e3dcb07
--- /dev/null
+++ b/electron44/patches/patch-rollup_rust_bindings__napi_src_lib.rs
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- rollup/rust/bindings_napi/src/lib.rs.orig	2026-05-14 17:17:51.000000000 +0000
++++ rollup/rust/bindings_napi/src/lib.rs
+@@ -8,6 +8,8 @@ use std::mem;
+   not(all(target_os = "linux", target_arch = "riscv64", target_env = "musl")),
+   not(all(target_os = "linux", target_env = "ohos")),
+   not(all(target_os = "freebsd", target_arch = "aarch64")),
++  not(all(target_os = "openbsd", target_arch = "aarch64")),
++  not(all(target_os = "netbsd", target_arch = "aarch64")),
+   not(debug_assertions)
+ ))]
+ #[global_allocator]
diff --git a/electron44/patches/patch-third__party_electron__node_common.gypi b/electron44/patches/patch-third__party_electron__node_common.gypi
new file mode 100644
index 0000000000..c0a97e542e
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_common.gypi
@@ -0,0 +1,22 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/common.gypi.orig	2026-11-03 19:08:32.723649989 +0000
++++ third_party/electron_node/common.gypi
+@@ -605,11 +605,11 @@
+           'NOMINMAX',
+         ],
+       }],
+-      [ 'OS in "linux freebsd openbsd solaris aix os400 openharmony"', {
++      [ 'OS in "linux freebsd netbsd openbsd solaris aix os400 openharmony"', {
+         'cflags': [ '-pthread' ],
+         'ldflags': [ '-pthread' ],
+       }],
+-      [ 'OS in "linux freebsd openbsd solaris android aix os400 cloudabi openharmony"', {
++      [ 'OS in "linux freebsd netbsd openbsd solaris android aix os400 cloudabi openharmony"', {
+         'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', ],
+         'cflags_cc': [
+           '-fno-rtti',
diff --git a/electron44/patches/patch-third__party_electron__node_configure b/electron44/patches/patch-third__party_electron__node_configure
new file mode 100644
index 0000000000..5a61dc4122
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_configure
@@ -0,0 +1,25 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/configure.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/configure
+@@ -4,6 +4,7 @@
+ # Note that the mix of single and double quotes is intentional,
+ # as is the fact that the ] goes on a new line.
+ _=[ 'exec' '/bin/sh' '-c' '''
++command -v python3.15 >/dev/null && exec python3.15 "$0" "$@"
+ command -v python3.14 >/dev/null && exec python3.14 "$0" "$@"
+ command -v python3.13 >/dev/null && exec python3.13 "$0" "$@"
+ command -v python3.12 >/dev/null && exec python3.12 "$0" "$@"
+@@ -23,7 +24,7 @@ except ImportError:
+   from distutils.spawn import find_executable as which
+ 
+ print('Node.js configure: Found Python {}.{}.{}...'.format(*sys.version_info))
+-acceptable_pythons = ((3, 14), (3, 13), (3, 12), (3, 11), (3, 10), (3, 9))
++acceptable_pythons = ((3, 15), (3, 14), (3, 13), (3, 12), (3, 11), (3, 10), (3, 9))
+ if sys.version_info[:2] in acceptable_pythons:
+   import configure
+ else:
diff --git a/electron44/patches/patch-third__party_electron__node_deps_cares_cares.gyp b/electron44/patches/patch-third__party_electron__node_deps_cares_cares.gyp
new file mode 100644
index 0000000000..755c0eb060
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_cares_cares.gyp
@@ -0,0 +1,19 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/cares/cares.gyp.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/cares/cares.gyp
+@@ -231,6 +231,10 @@
+           'include_dirs': [ 'config/freebsd' ],
+           'sources': [ 'config/freebsd/ares_config.h' ]
+         }],
++        [ 'OS=="netbsd"', {
++          'include_dirs': [ 'config/netbsd' ],
++          'sources': [ 'config/netbsd/ares_config.h' ]
++        }],
+         [ 'OS=="openbsd"', {
+           'include_dirs': [ 'config/openbsd' ],
+           'sources': [ 'config/openbsd/ares_config.h' ]
diff --git a/electron44/patches/patch-third__party_electron__node_deps_cares_config_netbsd_ares__config.h b/electron44/patches/patch-third__party_electron__node_deps_cares_config_netbsd_ares__config.h
new file mode 100644
index 0000000000..95aa7ad565
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_cares_config_netbsd_ares__config.h
@@ -0,0 +1,24 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/cares/config/netbsd/ares_config.h.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/cares/config/netbsd/ares_config.h
+@@ -119,7 +119,7 @@
+ /* #undef HAVE_GETRANDOM */
+ 
+ /* Define to 1 if you have `getservbyport_r` */
+-#define HAVE_GETSERVBYPORT_R 1
++/*#define HAVE_GETSERVBYPORT_R 1*/
+ 
+ /* Define to 1 if you have `gettimeofday` */
+ #define HAVE_GETTIMEOFDAY 1
+@@ -580,4 +580,4 @@
+ /* #undef __MINGW_USE_VC2005_COMPAT */
+ 
+ /* Define as 'unsigned int' if <stddef.h> doesn't define. */
+-/* #undef size_t */
+\ No newline at end of file
++/* #undef size_t */
diff --git a/electron44/patches/patch-third__party_electron__node_deps_cares_unofficial.gni b/electron44/patches/patch-third__party_electron__node_deps_cares_unofficial.gni
new file mode 100644
index 0000000000..b30545c80f
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_cares_unofficial.gni
@@ -0,0 +1,44 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/cares/unofficial.gni.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/cares/unofficial.gni
+@@ -56,10 +56,14 @@ template("cares_gn_build") {
+       ]
+       if (is_win) {
+         include_dirs += [ "config/win32" ]
+-      } else if (is_linux) {
++      } else if (is_linux && !is_bsd) {
+         include_dirs += [ "config/linux" ]
+       } else if (is_mac) {
+         include_dirs += [ "config/darwin" ]
++      } else if (is_freebsd) {
++        include_dirs += [ "config/freebsd" ]
++      } else if (is_netbsd) {
++        include_dirs += [ "config/netbsd" ]
+       }
+ 
+       if (is_win) {
+@@ -70,12 +74,18 @@ template("cares_gn_build") {
+       }
+ 
+       sources = gypi_values.cares_sources_common
+-      if (is_linux) {
++      if (is_linux && !is_bsd) {
+         sources += [ "config/linux/ares_config.h" ]
+       }
+       if (is_mac) {
+         sources += gypi_values.cares_sources_mac
+       }
++      if (is_freebsd) {
++        sources += [ "config/freebsd/ares_config.h" ]
++      }
++      if (is_netbsd) {
++        sources += [ "config/netbsd/ares_config.h" ]
++      }
+ 
+       if (is_clang) {
+         if (is_win) {
diff --git a/electron44/patches/patch-third__party_electron__node_deps_histogram_src_hdr__histogram.c b/electron44/patches/patch-third__party_electron__node_deps_histogram_src_hdr__histogram.c
new file mode 100644
index 0000000000..993355573c
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_histogram_src_hdr__histogram.c
@@ -0,0 +1,21 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/histogram/src/hdr_histogram.c.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/histogram/src/hdr_histogram.c
+@@ -36,8 +36,10 @@
+ 
+ /* Runtime-dispatched AVX2 path: keep the rest of this TU at the project's
+    baseline ISA so the shipped binary does not silently require AVX2. */
+-#if (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)) \
+-    && (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) && !defined(_MSC_VER)
++/* NetBSD + clang: hdr_histogram.c:(.text+0x43): undefined reference to `__cpu_model' */
++#if (defined(__x86_64__) || defined(_M_X64) || defined(_M_IX86)) \
++     && (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) && !defined(_MSC_VER) \
++     && !defined(__NetBSD__)
+ #  define HDR_HAS_AVX2_DISPATCH 1
+ #  include <immintrin.h>
+ #endif
diff --git a/electron44/patches/patch-third__party_electron__node_deps_histogram_unofficial.gni b/electron44/patches/patch-third__party_electron__node_deps_histogram_unofficial.gni
new file mode 100644
index 0000000000..88e04f0323
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_histogram_unofficial.gni
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/histogram/unofficial.gni.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/histogram/unofficial.gni
+@@ -37,7 +37,7 @@ template("histogram_gn_build") {
+           "-Wno-unused-function",
+         ]
+       }
+-      if (is_linux) {
++      if (is_linux && !is_bsd) {
+         libs = [ "atomic" ]
+       }
+     }
diff --git a/electron44/patches/patch-third__party_electron__node_deps_openssl_unofficial.gni b/electron44/patches/patch-third__party_electron__node_deps_openssl_unofficial.gni
new file mode 100644
index 0000000000..7ef10e6f2b
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_openssl_unofficial.gni
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/openssl/unofficial.gni.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/openssl/unofficial.gni
+@@ -71,7 +71,7 @@ template("openssl_gn_build") {
+     }
+     if (is_win) {
+       libs = [ "crypt32.lib" ]
+-    } else if (is_linux) {
++    } else if (is_linux && !is_bsd) {
+       libs = [ "atomic" ]
+     }
+ 
diff --git a/electron44/patches/patch-third__party_electron__node_deps_uv_common.gypi b/electron44/patches/patch-third__party_electron__node_deps_uv_common.gypi
new file mode 100644
index 0000000000..7622dc6aa9
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_uv_common.gypi
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/uv/common.gypi.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/uv/common.gypi
+@@ -135,7 +135,7 @@
+           }]
+         ]
+       }],
+-      ['OS in "freebsd dragonflybsd linux openbsd solaris android aix os400"', {
++      ['OS in "freebsd dragonflybsd linux netbsd openbsd solaris android aix os400"', {
+         'cflags': [ '-Wall' ],
+         'cflags_cc': [ '-fno-rtti', '-fno-exceptions' ],
+         'target_conditions': [
diff --git a/electron44/patches/patch-third__party_electron__node_deps_uv_src_unix_pipe.c b/electron44/patches/patch-third__party_electron__node_deps_uv_src_unix_pipe.c
new file mode 100644
index 0000000000..ca574b0e6a
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_uv_src_unix_pipe.c
@@ -0,0 +1,24 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/uv/src/unix/pipe.c.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/uv/src/unix/pipe.c
+@@ -208,9 +208,13 @@ int uv_pipe_open(uv_pipe_t* handle, uv_f
+   if (mode == -1)
+     return UV__ERR(errno); /* according to docs, must be EBADF */
+ 
++  /* If ioctl(FIONBIO) reports ENOTTY, try fcntl(F_GETFL) + fcntl(F_SETFL).
++   * Workaround for e.g. kqueue fds not supporting ioctls.
++   */
+   err = uv__nonblock(fd, 1);
+-  if (err)
+-    return err;
++  if (err == UV_ENOTTY)
++    if (uv__nonblock == uv__nonblock_ioctl)
++      err = uv__nonblock_fcntl(fd, 1);
+ 
+ #if defined(__APPLE__)
+   err = uv__stream_try_select((uv_stream_t*) handle, &fd);
diff --git a/electron44/patches/patch-third__party_electron__node_deps_uv_unofficial.gni b/electron44/patches/patch-third__party_electron__node_deps_uv_unofficial.gni
new file mode 100644
index 0000000000..b5c24e0c53
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_uv_unofficial.gni
@@ -0,0 +1,60 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/uv/unofficial.gni.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/uv/unofficial.gni
+@@ -39,7 +39,7 @@ template("uv_gn_build") {
+           "_FILE_OFFSET_BITS=64",
+         ]
+       }
+-      if (is_linux) {
++      if (is_linux && !is_bsd) {
+         defines += [
+           "_POSIX_C_SOURCE=200112",
+           "_GNU_SOURCE",
+@@ -108,6 +108,9 @@ template("uv_gn_build") {
+           "rt",
+         ]
+       }
++      if (is_netbsd) {
++        libs += [ "kvm" ]
++      }
+ 
+       sources = gypi_values.uv_sources_common
+       if (is_win) {
+@@ -117,13 +120,31 @@ template("uv_gn_build") {
+         sources += gypi_values.uv_sources_posix +
+                    [ "src/unix/proctitle.c" ]
+       }
+-      if (is_linux) {
++      if (is_linux && !is_bsd) {
+         sources += gypi_values.uv_sources_linux
+       }
+       if (is_apple) {
+         sources += gypi_values.uv_sources_apple +
+                    gypi_values.uv_sources_bsd_common
+       }
++      if (is_freebsd) {
++        sources += gypi_values.uv_sources_bsd_common + [
++                  "src/unix/freebsd.c",
++                  "src/unix/random-getrandom.c",
++                  "src/unix/posix-hrtime.c",
++                  "src/unix/bsd-proctitle.c",
++                ]
++        sources -= [ "src/unix/proctitle.c" ]
++      }
++     if (is_netbsd) {
++        sources += gypi_values.uv_sources_bsd_common + [
++                  "src/unix/netbsd.c",
++                  "src/unix/random-getrandom.c",
++                  "src/unix/posix-hrtime.c",
++                  "src/unix/bsd-proctitle.c",
++        ]
++        sources -= [ "src/unix/proctitle.c" ]
++      }
+     }
+   }
+ }
diff --git a/electron44/patches/patch-third__party_electron__node_deps_uvwasi_include_wasi__serdes.h b/electron44/patches/patch-third__party_electron__node_deps_uvwasi_include_wasi__serdes.h
new file mode 100644
index 0000000000..acf43941f5
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_uvwasi_include_wasi__serdes.h
@@ -0,0 +1,22 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/uvwasi/include/wasi_serdes.h.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/uvwasi/include/wasi_serdes.h
+@@ -3,6 +3,13 @@
+ 
+ #include "wasi_types.h"
+ 
++#ifdef __NetBSD__
++#undef uint8_t
++#undef uint16_t
++#undef uint32_t
++#undef uint64_t
++#endif
++
+ /* Basic uint{8,16,32,64}_t read/write functions. */
+ 
+ #define BASIC_TYPE(name, type)                                                \
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_memory.h b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_memory.h
new file mode 100644
index 0000000000..1d511c8950
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_memory.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/base/platform/memory.h.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/base/platform/memory.h
+@@ -27,7 +27,7 @@
+ #include <malloc.h>
+ #endif
+ 
+-#if (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS && !V8_OS_ZOS && !V8_OS_OPENBSD) || V8_OS_WIN
++#if (V8_OS_POSIX && !V8_OS_AIX && !V8_OS_SOLARIS && !V8_OS_ZOS && !V8_OS_OPENBSD && !V8_OS_NETBSD) || V8_OS_WIN
+ #define V8_HAS_MALLOC_USABLE_SIZE 1
+ #endif
+ 
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-freebsd.cc b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-freebsd.cc
new file mode 100644
index 0000000000..630f327086
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-freebsd.cc
@@ -0,0 +1,35 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/base/platform/platform-freebsd.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/base/platform/platform-freebsd.cc
+@@ -48,7 +48,7 @@ static unsigned StringToLong(char* buffe
+ }
+ 
+ std::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() {
+-  std::vector<SharedLibraryAddress> result;
++  std::vector<SharedLibraryAddress> address_result;
+   int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_VMMAP, getpid()};
+   size_t miblen = sizeof(mib) / sizeof(mib[0]);
+   size_t buffer_size;
+@@ -81,7 +81,7 @@ std::vector<OS::SharedLibraryAddress> OS
+           } else {
+             lib_name = std::string(path);
+           }
+-          result.push_back(SharedLibraryAddress(
++          address_result.push_back(SharedLibraryAddress(
+               lib_name, reinterpret_cast<uintptr_t>(map->kve_start),
+               reinterpret_cast<uintptr_t>(map->kve_end)));
+         }
+@@ -90,7 +90,7 @@ std::vector<OS::SharedLibraryAddress> OS
+       }
+     }
+   }
+-  return result;
++  return address_result;
+ }
+ 
+ void OS::SignalCodeMovingGC() {}
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-openbsd.cc b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-openbsd.cc
new file mode 100644
index 0000000000..18738384e2
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-openbsd.cc
@@ -0,0 +1,57 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/base/platform/platform-openbsd.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/base/platform/platform-openbsd.cc
+@@ -34,6 +34,48 @@
+ namespace v8 {
+ namespace base {
+ 
++#ifdef __arm__
++
++bool OS::ArmUsingHardFloat() {
++  // GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
++  // the Floating Point ABI used (PCS stands for Procedure Call Standard).
++  // We use these as well as a couple of other defines to statically determine
++  // what FP ABI used.
++  // GCC versions 4.4 and below don't support hard-fp.
++  // GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
++  // __ARM_PCS_VFP.
++
++#define GCC_VERSION (__GNUC__ * 10000                                          \
++                     + __GNUC_MINOR__ * 100                                    \
++                     + __GNUC_PATCHLEVEL__)
++#if GCC_VERSION >= 40600
++#if defined(__ARM_PCS_VFP)
++  return true;
++#else
++  return false;
++#endif
++
++#elif GCC_VERSION < 40500
++  return false;
++
++#else
++#if defined(__ARM_PCS_VFP)
++  return true;
++#elif defined(__ARM_PCS) || defined(__SOFTFP__) || defined(__SOFTFP) || \
++      !defined(__VFP_FP__)
++  return false;
++#else
++#error "Your version of GCC does not report the FP ABI compiled for."          \
++       "Please report it on this issue"                                        \
++       "http://code.google.com/p/v8/issues/detail?id=2140";
++
++#endif
++#endif
++#undef GCC_VERSION
++}
++
++#endif  // def __arm__
++
+ TimezoneCache* OS::CreateTimezoneCache() {
+   return new PosixDefaultTimezoneCache();
+ }
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-posix.cc b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-posix.cc
new file mode 100644
index 0000000000..8aed27a295
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_platform-posix.cc
@@ -0,0 +1,66 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/base/platform/platform-posix.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/base/platform/platform-posix.cc
+@@ -423,6 +423,10 @@ void* OS::GetRandomMmapAddr() {
+ #endif
+ #endif
+ #endif
++
++#if V8_OS_NETBSD
++  raw_addr = 0;
++#endif
+   return reinterpret_cast<void*>(raw_addr);
+ }
+ 
+@@ -588,14 +592,11 @@ bool OS::DiscardSystemPages(void* addres
+     // MADV_FREE_REUSABLE sometimes fails, so fall back to MADV_DONTNEED.
+     ret = madvise(address, size, MADV_DONTNEED);
+   }
+-#elif defined(_AIX) || defined(V8_OS_SOLARIS)
+-  int ret = madvise(reinterpret_cast<caddr_t>(address), size, MADV_FREE);
++#elif defined(POSIX_MADV_DONTNEED)
++  int ret = posix_madvise(address, size, POSIX_MADV_DONTNEED);
+   if (ret != 0 && errno == ENOSYS) {
+     return true;  // madvise is not available on all systems.
+   }
+-  if (ret != 0 && errno == EINVAL) {
+-    ret = madvise(reinterpret_cast<caddr_t>(address), size, MADV_DONTNEED);
+-  }
+ #else
+   int ret = madvise(address, size, MADV_DONTNEED);
+ #endif
+@@ -863,6 +864,8 @@ int OS::GetCurrentThreadIdInternal() {
+   return static_cast<int>(syscall(__NR_gettid));
+ #elif V8_OS_ANDROID
+   return static_cast<int>(gettid());
++#elif V8_OS_NETBSD || V8_OS_FREEBSD
++  return static_cast<int>(reinterpret_cast<intptr_t>(pthread_self()));
+ #elif V8_OS_AIX
+   return static_cast<int>(thread_self());
+ #elif V8_OS_FUCHSIA
+@@ -1168,7 +1171,11 @@ Thread::Thread(const Options& options)
+       stack_size_(options.stack_size()),
+       priority_(options.priority()),
+       start_semaphore_(nullptr) {
++#if V8_OS_NETBSD
++  const int min_stack_size = sysconf(_SC_THREAD_STACK_MIN);
++#else
+   const int min_stack_size = static_cast<int>(PTHREAD_STACK_MIN);
++#endif
+   if (stack_size_ > 0) stack_size_ = std::max(stack_size_, min_stack_size);
+   set_name(options.name());
+ }
+@@ -1183,7 +1190,7 @@ static void SetThreadName(const char* na
+   pthread_set_name_np(pthread_self(), name);
+ #elif V8_OS_NETBSD
+   static_assert(Thread::kMaxThreadNameLength <= PTHREAD_MAX_NAMELEN_NP);
+-  pthread_setname_np(pthread_self(), "%s", name);
++  pthread_setname_np(pthread_self(), "%s", (void *)name);
+ #elif V8_OS_DARWIN
+   // pthread_setname_np is only available in 10.6 or later, so test
+   // for it at runtime.
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_semaphore.cc b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_semaphore.cc
new file mode 100644
index 0000000000..787355d241
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_platform_semaphore.cc
@@ -0,0 +1,19 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/base/platform/semaphore.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/base/platform/semaphore.cc
+@@ -12,6 +12,10 @@
+ 
+ #include <errno.h>
+ 
++#if V8_OS_NETBSD
++#include <sys/param.h>	// for __NetBSD_Version__
++#endif
++
+ #include "src/base/logging.h"
+ #include "src/base/platform/elapsed-timer.h"
+ #include "src/base/platform/time.h"
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_strings.h b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_strings.h
new file mode 100644
index 0000000000..0abe000d97
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_base_strings.h
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/base/strings.h.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/base/strings.h
+@@ -8,6 +8,7 @@
+ #include "src/base/base-export.h"
+ #include "src/base/macros.h"
+ #include "src/base/vector.h"
++#include <stdarg.h>
+ 
+ namespace v8 {
+ namespace base {
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_codegen_arm_cpu-arm.cc b/electron44/patches/patch-third__party_electron__node_deps_v8_src_codegen_arm_cpu-arm.cc
new file mode 100644
index 0000000000..c37205a6f0
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_codegen_arm_cpu-arm.cc
@@ -0,0 +1,28 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/codegen/arm/cpu-arm.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/codegen/arm/cpu-arm.cc
+@@ -21,6 +21,10 @@
+ 
+ #include "src/codegen/cpu-features.h"
+ 
++#if V8_OS_NETBSD
++#include <machine/sysarch.h>
++#endif
++
+ namespace v8 {
+ namespace internal {
+ 
+@@ -34,6 +38,8 @@ V8_NOINLINE void CpuFeatures::FlushICach
+   struct arm_sync_icache_args args = {
+       .addr = reinterpret_cast<uintptr_t>(start), .len = size};
+   sysarch(ARM_SYNC_ICACHE, reinterpret_cast<void*>(&args));
++#elif V8_OS_NETBSD
++  arm_sync_icache(reinterpret_cast<uintptr_t>(start), size);
+ #else
+   register uint32_t beg asm("r0") = reinterpret_cast<uint32_t>(start);
+   register uint32_t end asm("r1") = beg + size;
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_common_globals.h b/electron44/patches/patch-third__party_electron__node_deps_v8_src_common_globals.h
new file mode 100644
index 0000000000..541c92fd9c
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_common_globals.h
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/common/globals.h.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/common/globals.h
+@@ -7,6 +7,7 @@
+ 
+ #include <stddef.h>
+ #include <stdint.h>
++#include <stdarg.h>
+ 
+ #include <limits>
+ #include <ostream>
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_src_compiler_turboshaft_int64-lowering-reducer.h b/electron44/patches/patch-third__party_electron__node_deps_v8_src_compiler_turboshaft_int64-lowering-reducer.h
new file mode 100644
index 0000000000..9b56de4bde
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_src_compiler_turboshaft_int64-lowering-reducer.h
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/src/compiler/turboshaft/int64-lowering-reducer.h.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/src/compiler/turboshaft/int64-lowering-reducer.h
+@@ -637,7 +637,7 @@ class Int64LoweringReducer : public Next
+       result = __ Word32CountLeadingZeros(high);
+     }
+ 
+-    return __ Tuple<Word32, Word32>(result, __ Word32Constant(0));
++    return __ template Tuple<Word32, Word32>(result, __ Word32Constant(0));
+   }
+ 
+   V<Word32Pair> LowerCtz(V<Word32Pair> input) {
+@@ -650,7 +650,7 @@ class Int64LoweringReducer : public Next
+       result = __ Word32CountTrailingZeros(low);
+     }
+ 
+-    return __ Tuple<Word32, Word32>(result, __ Word32Constant(0));
++    return __ template Tuple<Word32, Word32>(result, __ Word32Constant(0));
+   }
+ 
+   V<Word32Pair> LowerPopCount(V<Word32Pair> input) {
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc b/electron44/patches/patch-third__party_electron__node_deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc
new file mode 100644
index 0000000000..03a4e5d741
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_third__party_abseil-cpp_absl_debugging_internal_elf__mem__image.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc
+@@ -377,7 +377,7 @@ void ElfMemImage::SymbolIterator::Update
+   const ElfW(Versym) *version_symbol = image->GetVersym(index_);
+   ABSL_RAW_CHECK(symbol && version_symbol, "");
+   const char *const symbol_name = image->GetDynstr(symbol->st_name);
+-#if defined(__NetBSD__)
++#if defined(__NetBSD__) && ((_SYS_EXEC_ELF_H_ + 0) < 2)
+   const int version_index = version_symbol->vs_vers & VERSYM_VERSION;
+ #else
+   const ElfW(Versym) version_index = version_symbol[0] & VERSYM_VERSION;
diff --git a/electron44/patches/patch-third__party_electron__node_deps_v8_tools_profiling_run-llprof.sh b/electron44/patches/patch-third__party_electron__node_deps_v8_tools_profiling_run-llprof.sh
new file mode 100644
index 0000000000..cef75d6f82
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_deps_v8_tools_profiling_run-llprof.sh
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/deps/v8/tools/profiling/run-llprof.sh.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/deps/v8/tools/profiling/run-llprof.sh
+@@ -46,7 +46,7 @@ framework, then calls the low level tick
+ EOF
+ }
+ 
+-if [ $# -eq 0 ] || [ "$1" == "-h" ]  || [ "$1" == "--help" ] ; then
++if [ $# -eq 0 ] || [ "$1" = "-h" ]  || [ "$1" = "--help" ] ; then
+   usage
+   exit 1
+ fi
diff --git a/electron44/patches/patch-third__party_electron__node_node.gypi b/electron44/patches/patch-third__party_electron__node_node.gypi
new file mode 100644
index 0000000000..a2e0980aa9
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_node.gypi
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/node.gypi.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/node.gypi
+@@ -306,6 +306,7 @@
+     [ 'OS=="solaris"', {
+       'libraries': [
+         '-lkstat',
++        '-lsocket',
+         '-lumem',
+       ],
+       'defines!': [
diff --git a/electron44/patches/patch-third__party_electron__node_src_compile__cache.cc b/electron44/patches/patch-third__party_electron__node_src_compile__cache.cc
new file mode 100644
index 0000000000..03ef4a5682
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_src_compile__cache.cc
@@ -0,0 +1,58 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/src/compile_cache.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/src/compile_cache.cc
+@@ -1,5 +1,6 @@
+ #include "compile_cache.h"
+ #include <string>
++#include <unistd.h>
+ #include "debug_utils-inl.h"
+ #include "env-inl.h"
+ #include "node_file.h"
+@@ -44,16 +45,23 @@ uint32_t GetHash(const char* data, size_
+   return crc32(crc, reinterpret_cast<const Bytef*>(data), size);
+ }
+ 
+-std::string GetCacheVersionTag() {
++std::string GetCacheVersionTag(EnableOption option) {
++  std::string tag = std::string(NODE_VERSION) + '-' + std::string(NODE_ARCH) +
++                    '-' + Uint32ToHex(ScriptCompiler::CachedDataVersionTag());
++#ifdef NODE_IMPLEMENTS_POSIX_CREDENTIALS
+   // On platforms where uids are available, use different folders for
+   // different users to avoid cache miss due to permission incompatibility.
+   // On platforms where uids are not available, bare with the cache miss.
+   // This should be fine on Windows, as there local directories tend to be
+   // user-specific.
+-  std::string tag = std::string(NODE_VERSION) + '-' + std::string(NODE_ARCH) +
+-                    '-' + Uint32ToHex(ScriptCompiler::CachedDataVersionTag());
+-#ifdef NODE_IMPLEMENTS_POSIX_CREDENTIALS
+-  tag += '-' + std::to_string(getuid());
++  // A portable cache is meant to be reused wherever the same layout is
++  // found, including by other users (e.g. a cache generated at build time
++  // and shipped read-only with an application), so it is not split by uid:
++  // a user who cannot write to it still reads it, and a failed write is
++  // only a cache miss.
++  if (option != EnableOption::PORTABLE) {
++    tag += '-' + std::to_string(getuid());
++  }
+ #endif
+   return tag;
+ }
+@@ -538,11 +546,12 @@ CompileCacheHandler::CompileCacheHandler
+ // Directory structure:
+ // - Compile cache directory (from NODE_COMPILE_CACHE)
+ //   - $NODE_VERSION-$ARCH-$CACHE_DATA_VERSION_TAG-$UID
++//     ($UID is omitted for a portable cache)
+ //     - $FILENAME_AND_MODULE_TYPE_HASH.cache: a hash of filename + module type
+ CompileCacheEnableResult CompileCacheHandler::Enable(Environment* env,
+                                                      const std::string& dir,
+                                                      EnableOption option) {
+-  std::string cache_tag = GetCacheVersionTag();
++  std::string cache_tag = GetCacheVersionTag(option);
+   std::string absolute_cache_dir_base = PathResolve(env, {dir});
+   std::string cache_dir_with_tag =
+       absolute_cache_dir_base + kPathSeparator + cache_tag;
diff --git a/electron44/patches/patch-third__party_electron__node_src_crypto_crypto__rsa.cc b/electron44/patches/patch-third__party_electron__node_src_crypto_crypto__rsa.cc
new file mode 100644
index 0000000000..61d6eb8b92
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_src_crypto_crypto__rsa.cc
@@ -0,0 +1,39 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/src/crypto/crypto_rsa.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/src/crypto/crypto_rsa.cc
+@@ -12,6 +12,30 @@
+ #include <openssl/bn.h>
+ #include <openssl/rsa.h>
+ 
++#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER <0x1010105fL
++struct rsa_st {
++  int pad;
++  int32_t version;
++  void *meth;
++  void *engine;
++  void *n;
++  void *e;
++  void *d;
++  void *p;
++  void *q;
++  void *dmp1;
++  void *dmq1;
++  void *iqmp;
++  void *prime_infos;
++  RSA_PSS_PARAMS *pss;
++};
++
++static const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *r)
++{
++  return r->pss;
++}
++#endif
++
+ namespace node {
+ 
+ using ncrypto::BignumPointer;
diff --git a/electron44/patches/patch-third__party_electron__node_src_inspector__agent.cc b/electron44/patches/patch-third__party_electron__node_src_inspector__agent.cc
new file mode 100644
index 0000000000..b1a89a9113
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_src_inspector__agent.cc
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/src/inspector_agent.cc.orig	2026-11-03 19:08:32.733686944 +0000
++++ third_party/electron_node/src/inspector_agent.cc
+@@ -104,7 +104,7 @@ static int StartWatchdogThread() {
+   CHECK_EQ(0, uv_sem_init(&start_io_thread_semaphore, 0));
+   pthread_attr_t attr;
+   CHECK_EQ(0, pthread_attr_init(&attr));
+-#if defined(PTHREAD_STACK_MIN) && !defined(__FreeBSD__)
++#if defined(PTHREAD_STACK_MIN) && !defined(__FreeBSD__) && !defined(__NetBSD__)
+   // PTHREAD_STACK_MIN is 2 KiB with musl libc, which is too small to safely
+   // receive signals. PTHREAD_STACK_MIN + MINSIGSTKSZ is 8 KiB on arm64, which
+   // is the musl architecture with the biggest MINSIGSTKSZ so let's use that
diff --git a/electron44/patches/patch-third__party_electron__node_src_node__platform.cc b/electron44/patches/patch-third__party_electron__node_src_node__platform.cc
new file mode 100644
index 0000000000..f6ea25822c
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_src_node__platform.cc
@@ -0,0 +1,47 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/src/node_platform.cc.orig	2026-11-03 19:08:32.733807077 +0000
++++ third_party/electron_node/src/node_platform.cc
+@@ -548,6 +548,12 @@ void NodePlatform::AddIsolateFinishedCal
+ void NodePlatform::Shutdown() {
+   if (has_shut_down_) return;
+   has_shut_down_ = true;
++
++  // V8 background tasks may be parked waiting for foreground GC work before
++  // they can return from the worker thread task.
++  while (FlushForegroundTasksForAllIsolates()) {
++  }
++
+   worker_thread_task_runner_->Shutdown();
+ 
+   {
+@@ -739,6 +745,25 @@ bool NodePlatform::FlushForegroundTasks(
+   return per_isolate->FlushForegroundTasksInternal();
+ }
+ 
++bool NodePlatform::FlushForegroundTasksForAllIsolates() {
++  std::vector<std::shared_ptr<PerIsolatePlatformData>> per_isolates;
++  {
++    Mutex::ScopedLock lock(per_isolate_mutex_);
++    per_isolates.reserve(per_isolate_.size());
++    for (const auto& entry : per_isolate_) {
++      if (entry.second.second) {
++        per_isolates.push_back(entry.second.second);
++      }
++    }
++  }
++
++  bool did_work = false;
++  for (const auto& per_isolate : per_isolates) {
++    did_work |= per_isolate->FlushForegroundTasksInternal();
++  }
++  return did_work;
++}
++
+ std::unique_ptr<v8::JobHandle> NodePlatform::CreateJobImpl(
+     v8::TaskPriority priority,
+     std::unique_ptr<v8::JobTask> job_task,
diff --git a/electron44/patches/patch-third__party_electron__node_src_node__platform.h b/electron44/patches/patch-third__party_electron__node_src_node__platform.h
new file mode 100644
index 0000000000..ac08f3bcfc
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_src_node__platform.h
@@ -0,0 +1,16 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/src/node_platform.h.orig	2026-11-03 19:08:32.733845371 +0000
++++ third_party/electron_node/src/node_platform.h
+@@ -266,6 +266,7 @@ class NodePlatform : public MultiIsolate
+  private:
+   IsolatePlatformDelegate* ForIsolate(v8::Isolate* isolate);
+   std::shared_ptr<PerIsolatePlatformData> ForNodeIsolate(v8::Isolate* isolate);
++  bool FlushForegroundTasksForAllIsolates();
+ 
+   Mutex per_isolate_mutex_;
+   using DelegatePair = std::pair<IsolatePlatformDelegate*,
diff --git a/electron44/patches/patch-third__party_electron__node_src_node__postmortem__metadata.cc b/electron44/patches/patch-third__party_electron__node_src_node__postmortem__metadata.cc
new file mode 100644
index 0000000000..7f577d9a4f
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_src_node__postmortem__metadata.cc
@@ -0,0 +1,19 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/src/node_postmortem_metadata.cc.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/src/node_postmortem_metadata.cc
+@@ -13,6 +13,10 @@
+ #define NODEDBG_OFFSET(Class, Member, Type) \
+     NODEDBG_SYMBOL(offset_ ## Class ## __ ## Member ## __ ## Type)
+ 
++// Some systems provide macros for the types as well, which get expanded
++// by the nested macros here.
++#undef uintptr_t
++
+ // These are the constants describing Node internal structures. Every constant
+ // should use the format described above.  These constants are declared as
+ // global integers so that they'll be present in the generated node binary. They
diff --git a/electron44/patches/patch-third__party_electron__node_tools_generate__config__gypi.py b/electron44/patches/patch-third__party_electron__node_tools_generate__config__gypi.py
new file mode 100644
index 0000000000..b696cc69db
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_tools_generate__config__gypi.py
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/tools/generate_config_gypi.py.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/tools/generate_config_gypi.py
+@@ -19,7 +19,7 @@ import getnapibuildversion
+ 
+ # Regex used for parsing results of "gn args".
+ GN_RE = re.compile(r'(\w+)\s+=\s+(.*?)$', re.MULTILINE)
+-GN = 'gn.bat' if sys.platform == 'win32' else 'gn'
++GN = 'gn.bat' if sys.platform == 'win32' else '@WRKSRC@/out/Release/gn'
+ 
+ def bool_to_number(v):
+   return 1 if v else 0
diff --git a/electron44/patches/patch-third__party_electron__node_tools_gyp_pylib_gyp_generator_make.py b/electron44/patches/patch-third__party_electron__node_tools_gyp_pylib_gyp_generator_make.py
new file mode 100644
index 0000000000..4b115eab00
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_tools_gyp_pylib_gyp_generator_make.py
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/tools/gyp/pylib/gyp/generator/make.py.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/tools/gyp/pylib/gyp/generator/make.py
+@@ -208,7 +208,7 @@ cmd_solink_module = $(LINK.$(TOOLSET)) -
+ 
+ LINK_COMMANDS_MAC = """\
+ quiet_cmd_alink = LIBTOOL-STATIC $@
+-cmd_alink = rm -f $@ && %(python)s gyp-mac-tool filter-libtool libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %%.o,$^)
++cmd_alink = rm -f $@ && %(python)s gyp-mac-tool filter-libtool /usr/bin/libtool $(GYP_LIBTOOLFLAGS) -static -o $@ $(filter %%.o,$^)
+ 
+ quiet_cmd_link = LINK($(TOOLSET)) $@
+ cmd_link = $(LINK.$(TOOLSET)) $(GYP_LDFLAGS) $(LDFLAGS.$(TOOLSET)) -o "$@" $(LD_INPUTS) $(LIBS)
+@@ -2562,7 +2562,7 @@ def GenerateOutput(target_list, target_d
+                 "flock_index": 2,
+             }
+         )
+-    elif flavor == "freebsd":
++    elif flavor == "freebsd" or flavor == 'dragonflybsd' or flavor == 'netbsd':
+         # Note: OpenBSD has sysutils/flock. lockf seems to be FreeBSD specific.
+         header_params.update({"flock": "lockf"})
+     elif flavor == "openbsd":
diff --git a/electron44/patches/patch-third__party_electron__node_tools_gyp_pylib_gyp_xcode__emulation.py b/electron44/patches/patch-third__party_electron__node_tools_gyp_pylib_gyp_xcode__emulation.py
new file mode 100644
index 0000000000..765f09f160
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_tools_gyp_pylib_gyp_xcode__emulation.py
@@ -0,0 +1,26 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/tools/gyp/pylib/gyp/xcode_emulation.py.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/tools/gyp/pylib/gyp/xcode_emulation.py
+@@ -605,7 +605,7 @@ class XcodeSettings:
+ 
+         self._Appendf(cflags, "GCC_OPTIMIZATION_LEVEL", "-O%s", default="s")
+ 
+-        if self._Test("GCC_GENERATE_DEBUGGING_SYMBOLS", "YES", default="YES"):
++        if self._Test("GCC_GENERATE_DEBUGGING_SYMBOLS", "YES", default="NO"):
+             dbg_format = self._Settings().get("DEBUG_INFORMATION_FORMAT", "dwarf")
+             if dbg_format == "dwarf":
+                 cflags.append("-gdwarf-2")
+@@ -1097,7 +1097,7 @@ class XcodeSettings:
+         # For static libraries, no dSYMs are created.
+         result = []
+         if (
+-            self._Test("GCC_GENERATE_DEBUGGING_SYMBOLS", "YES", default="YES")
++            self._Test("GCC_GENERATE_DEBUGGING_SYMBOLS", "YES", default="NO")
+             and self._Test(
+                 "DEBUG_INFORMATION_FORMAT", "dwarf-with-dsym", default="dwarf"
+             )
diff --git a/electron44/patches/patch-third__party_electron__node_tools_install.py b/electron44/patches/patch-third__party_electron__node_tools_install.py
new file mode 100644
index 0000000000..832fa952ad
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_tools_install.py
@@ -0,0 +1,20 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/tools/install.py.orig	2026-10-20 17:54:51.000000000 +0000
++++ third_party/electron_node/tools/install.py
+@@ -198,10 +198,7 @@ def files(options, action):
+   action(options, [os.path.join(options.v8_dir, 'tools/gdbinit')], 'share/doc/node/')
+   action(options, [os.path.join(options.v8_dir, 'tools/lldb_commands.py')], 'share/doc/node/')
+ 
+-  if 'openbsd' in sys.platform:
+-    action(options, ['doc/node.1'], 'man/man1/')
+-  else:
+-    action(options, ['doc/node.1'], 'share/man/man1/')
++  action(options, ['doc/node.1'], os.environ.get('PKGMANDIR') + '/man1/')
+ 
+   if 'true' == options.variables.get('node_install_npm'):
+     npm_files(options, action)
diff --git a/electron44/patches/patch-third__party_electron__node_tools_v8__gypfiles_v8.gyp b/electron44/patches/patch-third__party_electron__node_tools_v8__gypfiles_v8.gyp
new file mode 100644
index 0000000000..d01ef5593d
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_tools_v8__gypfiles_v8.gyp
@@ -0,0 +1,21 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/tools/v8_gypfiles/v8.gyp.orig	2026-11-03 19:08:32.723835018 +0000
++++ third_party/electron_node/tools/v8_gypfiles/v8.gyp
+@@ -1365,6 +1365,12 @@
+         }],
+         # Platforms that don't have Compare-And-Swap (CAS) support need to link atomic library
+         # to implement atomic memory access.
++        # NetBSD/arm also needs -larm.
++        ['OS=="netbsd" and v8_current_cpu in ["arm"]', {
++          'link_settings': {
++            'libraries': ['-larm', ],
++          },
++        }],
+         # Clang needs it for some atomic operations (https://clang.llvm.org/docs/Toolchain.html#atomics-library).
+         ['(OS=="linux" and clang==1) or (v8_current_cpu in ["mips64", "mips64el", "arm", "riscv64", "loong64"])', {
+           'link_settings': {
diff --git a/electron44/patches/patch-third__party_electron__node_unofficial.gni b/electron44/patches/patch-third__party_electron__node_unofficial.gni
new file mode 100644
index 0000000000..2d4a943957
--- /dev/null
+++ b/electron44/patches/patch-third__party_electron__node_unofficial.gni
@@ -0,0 +1,49 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- third_party/electron_node/unofficial.gni.orig	2026-11-03 19:08:32.758161603 +0000
++++ third_party/electron_node/unofficial.gni
+@@ -385,6 +385,30 @@ template("node_gn_build") {
+     # so the browser js2c code-cache tool (v8_snapshot_toolchain) is keyed to
+     # the exact snapshot the framework ships (two runs need not be identical).
+     if (current_toolchain == default_toolchain) {
++      if (target_os == "netbsd") {
++        action("run_paxctl_node_mksnapshot") {
++          deps = [ ":node_mksnapshot($v8_snapshot_toolchain)" ]
++
++          script = "$node_v8_path/tools/run-paxctl.py"
++          stamp = "$target_gen_dir/paxctl_node_mksnapshot_stamp"
++          outputs = [ stamp ]
++
++          sources = []
++          data = []
++
++          node_mksnapshot_dir =
++              get_label_info(":node_mksnapshot($v8_snapshot_toolchain)",
++                             "root_out_dir")
++          args = [
++            rebase_path(stamp, root_build_dir),
++            "/usr/sbin/paxctl",
++            "+m",
++            "./" + rebase_path(node_mksnapshot_dir + "/node_mksnapshot",
++                               root_build_dir),
++          ]
++        }
++      }
++
+       action("run_node_mksnapshot") {
+         deps = [
+           ":node_mksnapshot($v8_snapshot_toolchain)",
+@@ -392,6 +416,9 @@ template("node_gn_build") {
+           # The V8 startup snapshot node_mksnapshot extends.
+           "$node_v8_path:run_mksnapshot_default",
+         ]
++        if (target_os == "netbsd") {
++          deps += [ ":run_paxctl_node_mksnapshot" ]
++        }
+         script = "$node_v8_path/tools/run.py"
+         sources = []
+         data = []
diff --git a/electron44/patches/patch-ui_gfx_font__util.cc b/electron44/patches/patch-ui_gfx_font__util.cc
new file mode 100644
index 0000000000..b14841730c
--- /dev/null
+++ b/electron44/patches/patch-ui_gfx_font__util.cc
@@ -0,0 +1,22 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- ui/gfx/font_util.cc.orig	2026-11-03 19:08:32.008831835 +0000
++++ ui/gfx/font_util.cc
+@@ -26,8 +26,11 @@ void InitializeFonts() {
+   // the long delay the user would have seen on first rendering.
+ 
+ #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_BSD)
+-  // Early initialize FontConfig.
+-  InitializeGlobalFontConfigAsync();
++  // Ensures the config is created on this thread. It's generally safe to send
++  // concurrent match requests to fontconfig, but it's unsafe to send match
++  // requests concurrently to fontconfig initialization.
++  FcConfig* config = GetGlobalFontConfig();
++  DCHECK(config);
+ #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
+ 
+ #if BUILDFLAG(IS_WIN)
diff --git a/electron44/patches/patch-ui_gtk_gtk__compat.cc b/electron44/patches/patch-ui_gtk_gtk__compat.cc
new file mode 100644
index 0000000000..322d4d2a89
--- /dev/null
+++ b/electron44/patches/patch-ui_gtk_gtk__compat.cc
@@ -0,0 +1,24 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- ui/gtk/gtk_compat.cc.orig	2026-11-03 19:08:31.439794690 +0000
++++ ui/gtk/gtk_compat.cc
+@@ -82,15 +82,6 @@ void* GetLibGio() {
+   return libgio;
+ }
+ 
+-void* GetLibGdkPixbuf() {
+-#if BUILDFLAG(IS_BSD)
+-  static void* libgdk_pixbuf = DlOpen("libgdk_pixbuf-2.0.so");
+-#else
+-  static void* libgdk_pixbuf = DlOpen("libgdk_pixbuf-2.0.so.0");
+-#endif
+-  return libgdk_pixbuf;
+-}
+-
+ void* GetLibGdk3() {
+ #if BUILDFLAG(IS_BSD)
+   static void* libgdk3 = DlOpen("libgdk-3.so");
diff --git a/electron44/patches/patch-ui_shell__dialogs_select__file__dialog.h b/electron44/patches/patch-ui_shell__dialogs_select__file__dialog.h
new file mode 100644
index 0000000000..af84284364
--- /dev/null
+++ b/electron44/patches/patch-ui_shell__dialogs_select__file__dialog.h
@@ -0,0 +1,17 @@
+$NetBSD$
+
+* Part of patchset to build electron on NetBSD
+* Based on OpenBSD's chromium patches, 
+  FreeBSD's electron patches, and pkgsrc's nodejs patches
+
+--- ui/shell_dialogs/select_file_dialog.h.orig	2026-11-03 19:08:31.541269131 +0000
++++ ui/shell_dialogs/select_file_dialog.h
+@@ -224,7 +224,7 @@ class SHELL_DIALOGS_EXPORT SelectFileDia
+                   const GURL* caller = nullptr);
+   bool HasMultipleFileTypeChoices();
+ 
+-#if BUILDFLAG(IS_LINUX)
++#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_BSD)
+   // Set the label used for the file select button.
+   virtual void SetButtonLabel(const std::string& label) = 0;
+ 


Home | Main Index | Thread Index | Old Index