Add Windows FMAs (letter F): 5 apps (#49218)

**Related issue:** N/A — part of the Windows Fleet-maintained apps
catalog expansion (letter F batch; follows #48872, #48881, #48950,
#48969, #49086, #49186).

Adds eight new Windows Fleet-maintained apps:

| App | winget package | Installer | Notes |
|-----|----------------|-----------|-------|
| Foxit PDF Editor | `Foxit.PhantomPDF` | WiX bootstrapper EXE, machine,
x64 | Covers both "Foxit PDF Editor" and "…Pro" from the inventory (one
package). Runs an updater service → process-stopping uninstall. ARP key
lives in the WOW6432Node hive. |
| Foxit PDF Reader | `Foxit.FoxitReader` | WiX bootstrapper EXE,
machine, x64 | Distinct DisplayName from the Editor (verified via
msiinfo). Updater service → process-stopping uninstall. |
| FreeCAD | `FreeCAD.FreeCAD` | NSIS (MultiUser), machine, x64 |
`/AllUsers /S`; versioned ARP name ("FreeCAD 1.1.1") → `FreeCAD%` fuzzy.
|
| FastPictureViewer Professional |
`AxelRietschin.FastPictureViewer.Professional` | MSI, machine, x64 |
Versioned ARP name → fuzzy. Unversioned URL → `ignore_hash`. Declares
VCRedist deps (near-ubiquitous; noted). |
| FastStone Capture | `FastStone.Capture` | NSIS, machine, x86 | `/S`;
versioned ARP name → fuzzy. Paid trialware, but silent
install/detect/uninstall are clean. |
| FastStone Image Viewer | `FastStone.Viewer` | NSIS, machine, x86 |
`/S`; versioned ARP name → fuzzy. |
| FlexWhere for Desktop | `Dutchview.Flexwhere` | MSI, machine, x64 |
Auto-start tray app → process-stopping uninstall (stop process, then
msiexec /x via UpgradeCode). |
| Fortify | `PeculiarVentures.Fortify` | WiX MSI, machine, x64 (en-US) |
Smart-card/cert bridge; auto-start tray → process-stopping uninstall.
Per-arch+locale ProductCode, so `installer_locale: en-US`. |

Considered but **not** added (recorded in the workstream tracker):
- **FactSet Workstation** (`FactSet.FactSetWorkstation`): MSI defaults
to per-user (ALLUSERS=2 + MSIINSTALLPERUSER=1) with no machine-scope
override, AND a `SpawnFDSWorkstation` custom action launches the app at
install (headless-hang risk in a SYSTEM session). Niche licensed
terminal.
- **Filius** (`StefanFreischlad.Filius`): winget manifest is de-DE only
(no en-US locale); the ingester hard-codes the en-US locale fetch (same
limitation that deferred Araxis Merge).
- **FlashFXP** (`OpenSight.FlashFXP`): abandoned (frozen at 2017), the
vendor site returns HTTP 500, only a 16×16 icon is available, and its
InstallAware uninstall needs a fragile cached-setup `/s` injection.
- **Front** (`FrontApp.Front`): per-user-only electron-builder installer
(`Front-user-*.exe` → `%LocalAppData%`, HKCU); no machine/all-users
artifact in winget.
- **Autodesk Fusion** (`Autodesk.Fusion`): the winget "installer" is
`Fusion Client Downloader.exe`, a per-user streaming/web bootstrapper
that downloads at runtime, hangs headless, and needs interactive
Autodesk sign-in.

Identities verified per app (msiinfo Property tables; NSIS header
decompilation; winget AppsAndFeaturesEntries; uninstall-database
corroboration). Apps that run a service or auto-start tray (both Foxit
products, FlexWhere, Fortify) get process-stopping uninstalls up front
to avoid the MSI-rollback failure class. SHAs verified against manifests
for pinned URLs; `ignore_hash` only for FastPictureViewer's
actively-maintained latest-pointer URL. Icons via
`tools/software/icons/generate-icons.sh` (all ≥256px except
FastPictureViewer/Fortify at 256/180).

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [ ] QA'd all new/changed functionality manually (relying on the FMA CI
validator for Windows install/uninstall validation)
This commit is contained in:
Allen Houchins
2026-07-13 15:07:06 -05:00
committed by GitHub
parent 4374d4d03f
commit 7ba5d4cfcc
30 changed files with 673 additions and 0 deletions
@@ -0,0 +1,11 @@
{
"name": "FlexWhere for Desktop",
"slug": "flexwhere/windows",
"package_identifier": "Dutchview.Flexwhere",
"unique_identifier": "Flexwhere for Desktop",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/flexwhere_uninstall.ps1",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,12 @@
{
"name": "Fortify",
"slug": "fortify/windows",
"package_identifier": "PeculiarVentures.Fortify",
"unique_identifier": "Fortify",
"installer_arch": "x64",
"installer_type": "msi",
"installer_scope": "machine",
"installer_locale": "en-US",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/fortify_uninstall.ps1",
"default_categories": ["Security"]
}
@@ -0,0 +1,12 @@
{
"name": "Foxit PDF Editor",
"slug": "foxit-pdf-editor/windows",
"package_identifier": "Foxit.PhantomPDF",
"unique_identifier": "Foxit PDF Editor",
"installer_arch": "x64",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-editor_uninstall.ps1",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,12 @@
{
"name": "Foxit PDF Reader",
"slug": "foxit-pdf-reader/windows",
"package_identifier": "Foxit.FoxitReader",
"unique_identifier": "Foxit PDF Reader",
"installer_arch": "x64",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/foxit-pdf-reader_uninstall.ps1",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,13 @@
{
"name": "FreeCAD",
"slug": "freecad/windows",
"package_identifier": "FreeCAD.FreeCAD",
"unique_identifier": "FreeCAD",
"fuzzy_match_name": "FreeCAD%",
"installer_arch": "x64",
"installer_type": "exe",
"installer_scope": "machine",
"install_script_path": "ee/maintained-apps/inputs/winget/scripts/freecad_install.ps1",
"uninstall_script_path": "ee/maintained-apps/inputs/winget/scripts/freecad_uninstall.ps1",
"default_categories": ["Productivity"]
}
@@ -0,0 +1,53 @@
# Uninstalls Flexwhere for Desktop.
#
# Flexwhere for Desktop auto-starts a tray process (no Windows service), which can hold files
# and make msiexec roll back the uninstall. Stop anything running from the
# install dir (plus known process names) FIRST, then resolve the ProductCode(s)
# via the stable UpgradeCode and msiexec /x each.
$upgradeCode = '{5916547D-CBFA-451B-AF68-D475E2DA9022}'
$softwareName = 'Flexwhere for Desktop'
$successCodes = @(0, 3010, 1641)
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
try {
# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.
$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |
Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
if ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {
$loc = $entry.InstallLocation.TrimEnd('\')
Get-Process | Where-Object { $_.Path -and $_.Path -like "$loc\*" } |
ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }
}
foreach ($p in @("Flexwhere for Desktop")) {
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
}
Start-Sleep -Seconds 3
# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.
$inst = New-Object -ComObject "WindowsInstaller.Installer"
$productCodes = @($inst.RelatedProducts($upgradeCode))
if ($productCodes.Count -eq 0) {
Write-Host "No products found for upgrade code $upgradeCode"
Exit 1
}
foreach ($productCode in $productCodes) {
Write-Host "Uninstalling product code: $productCode"
$process = Start-Process msiexec.exe `
-ArgumentList "/x $productCode /quiet /norestart" `
-NoNewWindow -PassThru -Wait
Write-Host "Uninstall exit code: $($process.ExitCode)"
if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }
}
Exit 0
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,53 @@
# Uninstalls Fortify.
#
# Fortify auto-starts a tray process (no Windows service), which can hold files
# and make msiexec roll back the uninstall. Stop anything running from the
# install dir (plus known process names) FIRST, then resolve the ProductCode(s)
# via the stable UpgradeCode and msiexec /x each.
$upgradeCode = '{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}'
$softwareName = 'Fortify'
$successCodes = @(0, 3010, 1641)
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
try {
# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.
$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |
Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
if ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {
$loc = $entry.InstallLocation.TrimEnd('\')
Get-Process | Where-Object { $_.Path -and $_.Path -like "$loc\*" } |
ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }
}
foreach ($p in @("Fortify")) {
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
}
Start-Sleep -Seconds 3
# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.
$inst = New-Object -ComObject "WindowsInstaller.Installer"
$productCodes = @($inst.RelatedProducts($upgradeCode))
if ($productCodes.Count -eq 0) {
Write-Host "No products found for upgrade code $upgradeCode"
Exit 1
}
foreach ($productCode in $productCodes) {
Write-Host "Uninstalling product code: $productCode"
$process = Start-Process msiexec.exe `
-ArgumentList "/x $productCode /quiet /norestart" `
-NoNewWindow -PassThru -Wait
Write-Host "Uninstall exit code: $($process.ExitCode)"
if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }
}
Exit 0
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,34 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# Foxit PDF Editor ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart
# performs a silent per-machine install.
$exeFilePath = "${env:INSTALLER_PATH}"
try {
if (-not (Test-Path $exeFilePath)) {
Write-Host "Error: Installer file not found at: $exeFilePath"
Exit 1
}
$processOptions = @{
FilePath = "$exeFilePath"
ArgumentList = "/quiet"
PassThru = $true
Wait = $true
NoNewWindow = $true
}
$process = Start-Process @processOptions
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,64 @@
# Uninstalls Foxit PDF Editor.
#
# Foxit PDF Editor is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater
# service; its visible ARP entry is the inner MSI (its UninstallString uses
# "MsiExec.exe /I{ProductCode}", the maintenance/repair form). We stop the
# Foxit services/processes first so files aren't locked, then resolve the
# ProductCode GUID and run a clean "msiexec /x {ProductCode} /qn /norestart"
# (never reuse the /I from the registry string). The ARP entry lives in the
# WOW6432Node (32-bit) hive even on x64.
$softwareName = "Foxit PDF Editor"
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
$successCodes = @(0, 3010, 1641)
$exitCode = $null
try {
foreach ($svc in @("FoxitPhantomPDFUpdateService")) {
Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
}
foreach ($p in @("FoxitPDFEditor", "FoxitPhantomPDF", "FoxitUpdater")) {
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
}
Start-Sleep -Seconds 3
[array]$uninstallKeys = Get-ChildItem `
-Path @($machineKey, $machineKey32on64) `
-ErrorAction SilentlyContinue |
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
if (-not $selected) {
Write-Host "Uninstall entry not found for '$softwareName'."
Exit 1
}
# ProductCode: prefer the ARP key name (it is the MSI ProductCode), else pull
# the first GUID out of the UninstallString. Never carry over its /I switch.
$productCode = $selected.PSChildName
if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
$raw = $selected.UninstallString
if ($raw -match '(\{[0-9A-Fa-f-]+\})') { $productCode = $matches[1] }
}
if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
Write-Host "Could not determine ProductCode for '$softwareName'."
Exit 1
}
Write-Host "Uninstalling product code: $productCode"
$process = Start-Process msiexec.exe `
-ArgumentList "/x $productCode /qn /norestart" `
-NoNewWindow -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Uninstall exit code: $exitCode"
} catch {
Write-Host "Error: $_"
Exit 1
}
if ($successCodes -contains $exitCode) { Exit 0 }
Exit $exitCode
@@ -0,0 +1,34 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# Foxit PDF Reader ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart
# performs a silent per-machine install.
$exeFilePath = "${env:INSTALLER_PATH}"
try {
if (-not (Test-Path $exeFilePath)) {
Write-Host "Error: Installer file not found at: $exeFilePath"
Exit 1
}
$processOptions = @{
FilePath = "$exeFilePath"
ArgumentList = "/quiet"
PassThru = $true
Wait = $true
NoNewWindow = $true
}
$process = Start-Process @processOptions
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,64 @@
# Uninstalls Foxit PDF Reader.
#
# Foxit PDF Reader is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater
# service; its visible ARP entry is the inner MSI (its UninstallString uses
# "MsiExec.exe /I{ProductCode}", the maintenance/repair form). We stop the
# Foxit services/processes first so files aren't locked, then resolve the
# ProductCode GUID and run a clean "msiexec /x {ProductCode} /qn /norestart"
# (never reuse the /I from the registry string). The ARP entry lives in the
# WOW6432Node (32-bit) hive even on x64.
$softwareName = "Foxit PDF Reader"
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
$successCodes = @(0, 3010, 1641)
$exitCode = $null
try {
foreach ($svc in @("FoxitPDFReaderUpdateService")) {
Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue
}
foreach ($p in @("FoxitPDFReader", "FoxitReader", "FoxitUpdater")) {
Stop-Process -Name $p -Force -ErrorAction SilentlyContinue
}
Start-Sleep -Seconds 3
[array]$uninstallKeys = Get-ChildItem `
-Path @($machineKey, $machineKey32on64) `
-ErrorAction SilentlyContinue |
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
if (-not $selected) {
Write-Host "Uninstall entry not found for '$softwareName'."
Exit 1
}
# ProductCode: prefer the ARP key name (it is the MSI ProductCode), else pull
# the first GUID out of the UninstallString. Never carry over its /I switch.
$productCode = $selected.PSChildName
if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
$raw = $selected.UninstallString
if ($raw -match '(\{[0-9A-Fa-f-]+\})') { $productCode = $matches[1] }
}
if ($productCode -notmatch '^\{[0-9A-Fa-f-]+\}$') {
Write-Host "Could not determine ProductCode for '$softwareName'."
Exit 1
}
Write-Host "Uninstalling product code: $productCode"
$process = Start-Process msiexec.exe `
-ArgumentList "/x $productCode /qn /norestart" `
-NoNewWindow -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Uninstall exit code: $exitCode"
} catch {
Write-Host "Error: $_"
Exit 1
}
if ($successCodes -contains $exitCode) { Exit 0 }
Exit $exitCode
@@ -0,0 +1,27 @@
# Learn more about .exe install scripts:
# http://fleetdm.com/learn-more-about/exe-install-scripts
#
# FreeCAD ships as a MultiUser NSIS installer. /S runs it silently and
# /AllUsers forces the machine-wide install (HKLM + C:\Program Files).
$exeFilePath = "${env:INSTALLER_PATH}"
try {
$processOptions = @{
FilePath = "$exeFilePath"
ArgumentList = "/AllUsers /S"
PassThru = $true
Wait = $true
}
$process = Start-Process @processOptions
$exitCode = $process.ExitCode
Write-Host "Install exit code: $exitCode"
Exit $exitCode
} catch {
Write-Host "Error: $_"
Exit 1
}
@@ -0,0 +1,57 @@
# Uninstalls FreeCAD.
#
# FreeCAD (MultiUser NSIS) registers a versioned DisplayName ("FreeCAD 1.1.1")
# under HKLM when installed with /AllUsers, so match on the "FreeCAD" prefix.
# Its QuietUninstallString runs "Uninstall-FreeCAD.exe" /S (real silent, no
# service to block removal).
$softwareNameLike = "FreeCAD*"
$publisherLike = "FreeCAD*"
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
$exitCode = $null
try {
[array]$uninstallKeys = Get-ChildItem `
-Path @($machineKey, $machineKey32on64) `
-ErrorAction SilentlyContinue |
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
$selected = $uninstallKeys |
Where-Object { $_.DisplayName -like $softwareNameLike -and $_.Publisher -like $publisherLike } |
Select-Object -First 1
if (-not $selected -or -not $selected.UninstallString) {
Write-Host "Uninstall entry not found for $softwareNameLike"
Exit 1
}
$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }
# Parse exe + args (quoted / unquoted / bare).
if ($raw -match '^\s*"([^"]+)"\s*(.*)$') {
$exe = $matches[1]; $exeArgs = $matches[2].Trim()
} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') {
$exe = $matches[1]; $exeArgs = $matches[2].Trim()
} else {
$exe = $raw; $exeArgs = ""
}
# NSIS uninstallers require /S for a silent uninstall.
if ($exeArgs -notmatch '(?i)(^|\s)/S(\s|$)') { $exeArgs = "$exeArgs /S".Trim() }
Write-Host "Uninstall command: $exe"
Write-Host "Uninstall args: $exeArgs"
$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait
$exitCode = $process.ExitCode
Write-Host "Uninstall exit code: $exitCode"
} catch {
Write-Host "Error: $_"
Exit 1
}
if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
Exit $exitCode
+35
View File
@@ -3312,6 +3312,13 @@
"unique_identifier": "net.flexoptix.flexoptix.app",
"description": "FLEXOPTIX App is a connect to your FLEXBOX without cables and configure transceivers."
},
{
"name": "FlexWhere for Desktop",
"slug": "flexwhere/windows",
"platform": "windows",
"unique_identifier": "Flexwhere for Desktop",
"description": "FlexWhere for Desktop shows real-time workplace and colleague availability from FlexWhere."
},
{
"name": "Fluid",
"slug": "fluid/darwin",
@@ -3382,6 +3389,27 @@
"unique_identifier": "com.binarynights.ForkLift-4",
"description": "ForkLift is a finder replacement and FTP, SFTP, WebDAV and Amazon s3 client."
},
{
"name": "Fortify",
"slug": "fortify/windows",
"platform": "windows",
"unique_identifier": "Fortify",
"description": "Fortify enables cross-browser use of local certificates and smart cards."
},
{
"name": "Foxit PDF Editor",
"slug": "foxit-pdf-editor/windows",
"platform": "windows",
"unique_identifier": "Foxit PDF Editor",
"description": "Foxit PDF Editor is a desktop application for creating and editing PDF documents."
},
{
"name": "Foxit PDF Reader",
"slug": "foxit-pdf-reader/windows",
"platform": "windows",
"unique_identifier": "Foxit PDF Reader",
"description": "Foxit PDF Reader is a desktop application for viewing and annotating PDF documents."
},
{
"name": "Framer",
"slug": "framer/darwin",
@@ -3410,6 +3438,13 @@
"unique_identifier": "org.freedownloadmanager.fdm6",
"description": "Free Download Manager is a download accelerator and organizer."
},
{
"name": "FreeCAD",
"slug": "freecad/windows",
"platform": "windows",
"unique_identifier": "FreeCAD",
"description": "FreeCAD is a general-purpose, open-source parametric 3D CAD modeler."
},
{
"name": "FreeFileSync",
"slug": "freefilesync/darwin",
@@ -0,0 +1,23 @@
{
"versions": [
{
"version": "3.5",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Flexwhere for Desktop' AND publisher = 'Dutchview';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Flexwhere for Desktop' AND publisher = 'Dutchview' AND version_compare(version, '3.5') < 0);"
},
"installer_url": "https://s3.eu-central-1.amazonaws.com/releases.flexwhere.net/Flexwhere+for+Desktop+3.5.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "a679a246",
"sha256": "50786b5d742a5f90ede3790e8a47153eaf3137cf1c6b3dc9e786ba3363d0ef70",
"default_categories": [
"Productivity"
],
"upgrade_code": "{5916547D-CBFA-451B-AF68-D475E2DA9022}"
}
],
"refs": {
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"a679a246": "# Uninstalls Flexwhere for Desktop.\n#\n# Flexwhere for Desktop auto-starts a tray process (no Windows service), which can hold files\n# and make msiexec roll back the uninstall. Stop anything running from the\n# install dir (plus known process names) FIRST, then resolve the ProductCode(s)\n# via the stable UpgradeCode and msiexec /x each.\n\n$upgradeCode = '{5916547D-CBFA-451B-AF68-D475E2DA9022}'\n$softwareName = 'Flexwhere for Desktop'\n$successCodes = @(0, 3010, 1641)\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\ntry {\n\n# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.\n$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |\n Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {\n $loc = $entry.InstallLocation.TrimEnd('\\')\n Get-Process | Where-Object { $_.Path -and $_.Path -like \"$loc\\*\" } |\n ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }\n}\nforeach ($p in @(\"Flexwhere for Desktop\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$productCodes = @($inst.RelatedProducts($upgradeCode))\nif ($productCodes.Count -eq 0) {\n Write-Host \"No products found for upgrade code $upgradeCode\"\n Exit 1\n}\n\nforeach ($productCode in $productCodes) {\n Write-Host \"Uninstalling product code: $productCode\"\n $process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /quiet /norestart\" `\n -NoNewWindow -PassThru -Wait\n Write-Host \"Uninstall exit code: $($process.ExitCode)\"\n if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }\n}\n\nExit 0\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,23 @@
{
"versions": [
{
"version": "2.1.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Fortify' AND publisher = 'Peculiar Ventures';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Fortify' AND publisher = 'Peculiar Ventures' AND version_compare(version, '2.1.0') < 0);"
},
"installer_url": "https://github.com/PeculiarVentures/fortify-releases/releases/download/v2.1.0/Fortify_2.1.0_x64_en-US.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "132b8cb2",
"sha256": "57daec289ba8298d591427014e8ef3339d019907a207282ba61393fd271df04d",
"default_categories": [
"Security"
],
"upgrade_code": "{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}"
}
],
"refs": {
"132b8cb2": "# Uninstalls Fortify.\n#\n# Fortify auto-starts a tray process (no Windows service), which can hold files\n# and make msiexec roll back the uninstall. Stop anything running from the\n# install dir (plus known process names) FIRST, then resolve the ProductCode(s)\n# via the stable UpgradeCode and msiexec /x each.\n\n$upgradeCode = '{AB87B5E7-17F6-5394-8A15-9EE6AA6B06B8}'\n$softwareName = 'Fortify'\n$successCodes = @(0, 3010, 1641)\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\ntry {\n\n# Stop the app's processes so the MSI uninstall isn't rolled back by locked files.\n$entry = Get-ChildItem -Path @($machineKey, $machineKey32on64) -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue } |\n Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif ($entry -and $entry.InstallLocation -and (Test-Path -LiteralPath $entry.InstallLocation)) {\n $loc = $entry.InstallLocation.TrimEnd('\\')\n Get-Process | Where-Object { $_.Path -and $_.Path -like \"$loc\\*\" } |\n ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }\n}\nforeach ($p in @(\"Fortify\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n# Resolve ProductCode(s) from the stable UpgradeCode and uninstall each.\n$inst = New-Object -ComObject \"WindowsInstaller.Installer\"\n$productCodes = @($inst.RelatedProducts($upgradeCode))\nif ($productCodes.Count -eq 0) {\n Write-Host \"No products found for upgrade code $upgradeCode\"\n Exit 1\n}\n\nforeach ($productCode in $productCodes) {\n Write-Host \"Uninstalling product code: $productCode\"\n $process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /quiet /norestart\" `\n -NoNewWindow -PassThru -Wait\n Write-Host \"Uninstall exit code: $($process.ExitCode)\"\n if ($successCodes -notcontains $process.ExitCode) { Exit $process.ExitCode }\n}\n\nExit 0\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"8959087b": "$logFile = \"${env:TEMP}/fleet-install-software.log\"\n\ntry {\n\n$installProcess = Start-Process msiexec.exe `\n -ArgumentList \"/quiet /norestart /lv ${logFile} /i `\"${env:INSTALLER_PATH}`\"\" `\n -PassThru -Verb RunAs -Wait\n\nGet-Content $logFile -Tail 500\n\nExit $installProcess.ExitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "14.0.5.33580",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Foxit PDF Editor' AND publisher = 'Foxit Software Inc.' AND version_compare(version, '14.0.5.33580') < 0);"
},
"installer_url": "https://cdn01.foxitsoftware.com/product/phantomPDF/desktop/win/14.0.5/FoxitPDFEditor1405_L10N_Setup_x64.exe",
"install_script_ref": "a6208245",
"uninstall_script_ref": "5d55608a",
"sha256": "764aa7ca2679c568539ada4dfa4b1f7de91f9c006fdb8fb98489dea0bce354f7",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"5d55608a": "# Uninstalls Foxit PDF Editor.\n#\n# Foxit PDF Editor is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater\n# service; its visible ARP entry is the inner MSI (its UninstallString uses\n# \"MsiExec.exe /I{ProductCode}\", the maintenance/repair form). We stop the\n# Foxit services/processes first so files aren't locked, then resolve the\n# ProductCode GUID and run a clean \"msiexec /x {ProductCode} /qn /norestart\"\n# (never reuse the /I from the registry string). The ARP entry lives in the\n# WOW6432Node (32-bit) hive even on x64.\n\n$softwareName = \"Foxit PDF Editor\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$successCodes = @(0, 3010, 1641)\n$exitCode = $null\n\ntry {\n\nforeach ($svc in @(\"FoxitPhantomPDFUpdateService\")) {\n Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue\n}\nforeach ($p in @(\"FoxitPDFEditor\", \"FoxitPhantomPDF\", \"FoxitUpdater\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif (-not $selected) {\n Write-Host \"Uninstall entry not found for '$softwareName'.\"\n Exit 1\n}\n\n# ProductCode: prefer the ARP key name (it is the MSI ProductCode), else pull\n# the first GUID out of the UninstallString. Never carry over its /I switch.\n$productCode = $selected.PSChildName\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n $raw = $selected.UninstallString\n if ($raw -match '(\\{[0-9A-Fa-f-]+\\})') { $productCode = $matches[1] }\n}\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n Write-Host \"Could not determine ProductCode for '$softwareName'.\"\n Exit 1\n}\n\nWrite-Host \"Uninstalling product code: $productCode\"\n$process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /qn /norestart\" `\n -NoNewWindow -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($successCodes -contains $exitCode) { Exit 0 }\nExit $exitCode\n",
"a6208245": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Foxit PDF Editor ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart\n# performs a silent per-machine install.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "2026.1.2.36540",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Foxit PDF Reader' AND publisher = 'Foxit Software Inc.';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Foxit PDF Reader' AND publisher = 'Foxit Software Inc.' AND version_compare(version, '2026.1.2.36540') < 0);"
},
"installer_url": "https://cdn01.foxitsoftware.com/product/reader/desktop/win/2026.1.2/FoxitPDFReader202612_L10N_Setup_x64.exe",
"install_script_ref": "4ce619b8",
"uninstall_script_ref": "8dbc0197",
"sha256": "74bb18acd4970f2596d63a05a83421e256d272c37c12216de69984e3244c6485",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"4ce619b8": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# Foxit PDF Reader ships as a Foxit WiX MultiLangBootstrapper EXE. /quiet /norestart\n# performs a silent per-machine install.\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"8dbc0197": "# Uninstalls Foxit PDF Reader.\n#\n# Foxit PDF Reader is a Foxit WiX MultiLangBootstrapper install that runs an auto-updater\n# service; its visible ARP entry is the inner MSI (its UninstallString uses\n# \"MsiExec.exe /I{ProductCode}\", the maintenance/repair form). We stop the\n# Foxit services/processes first so files aren't locked, then resolve the\n# ProductCode GUID and run a clean \"msiexec /x {ProductCode} /qn /norestart\"\n# (never reuse the /I from the registry string). The ARP entry lives in the\n# WOW6432Node (32-bit) hive even on x64.\n\n$softwareName = \"Foxit PDF Reader\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$successCodes = @(0, 3010, 1641)\n$exitCode = $null\n\ntry {\n\nforeach ($svc in @(\"FoxitPDFReaderUpdateService\")) {\n Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue\n}\nforeach ($p in @(\"FoxitPDFReader\", \"FoxitReader\", \"FoxitUpdater\")) {\n Stop-Process -Name $p -Force -ErrorAction SilentlyContinue\n}\nStart-Sleep -Seconds 3\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1\nif (-not $selected) {\n Write-Host \"Uninstall entry not found for '$softwareName'.\"\n Exit 1\n}\n\n# ProductCode: prefer the ARP key name (it is the MSI ProductCode), else pull\n# the first GUID out of the UninstallString. Never carry over its /I switch.\n$productCode = $selected.PSChildName\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n $raw = $selected.UninstallString\n if ($raw -match '(\\{[0-9A-Fa-f-]+\\})') { $productCode = $matches[1] }\n}\nif ($productCode -notmatch '^\\{[0-9A-Fa-f-]+\\}$') {\n Write-Host \"Could not determine ProductCode for '$softwareName'.\"\n Exit 1\n}\n\nWrite-Host \"Uninstalling product code: $productCode\"\n$process = Start-Process msiexec.exe `\n -ArgumentList \"/x $productCode /qn /norestart\" `\n -NoNewWindow -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($successCodes -contains $exitCode) { Exit 0 }\nExit $exitCode\n"
}
}
@@ -0,0 +1,22 @@
{
"versions": [
{
"version": "1.1.1",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'FreeCAD%' AND publisher = 'FreeCAD Team';",
"patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'FreeCAD%' AND publisher = 'FreeCAD Team' AND version_compare(version, '1.1.1') < 0);"
},
"installer_url": "https://github.com/FreeCAD/FreeCAD/releases/download/1.1.1/FreeCAD_1.1.1-Windows-x86_64-py311-installer.exe",
"install_script_ref": "1cf2c1f5",
"uninstall_script_ref": "6baebf4c",
"sha256": "3e4caf58cc1d82e4e8d726572f741ae664b6e91a77c4d3cb59102d9b8bd51feb",
"default_categories": [
"Productivity"
]
}
],
"refs": {
"1cf2c1f5": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# FreeCAD ships as a MultiUser NSIS installer. /S runs it silently and\n# /AllUsers forces the machine-wide install (HKLM + C:\\Program Files).\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/AllUsers /S\"\n PassThru = $true\n Wait = $true\n}\n\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\nWrite-Host \"Install exit code: $exitCode\"\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n",
"6baebf4c": "# Uninstalls FreeCAD.\n#\n# FreeCAD (MultiUser NSIS) registers a versioned DisplayName (\"FreeCAD 1.1.1\")\n# under HKLM when installed with /AllUsers, so match on the \"FreeCAD\" prefix.\n# Its QuietUninstallString runs \"Uninstall-FreeCAD.exe\" /S (real silent, no\n# service to block removal).\n\n$softwareNameLike = \"FreeCAD*\"\n$publisherLike = \"FreeCAD*\"\n\n$machineKey = 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n$machineKey32on64 = 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'\n\n$exitCode = $null\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path @($machineKey, $machineKey32on64) `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $uninstallKeys |\n Where-Object { $_.DisplayName -like $softwareNameLike -and $_.Publisher -like $publisherLike } |\n Select-Object -First 1\nif (-not $selected -or -not $selected.UninstallString) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 1\n}\n\n$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }\n\n# Parse exe + args (quoted / unquoted / bare).\nif ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n} else {\n $exe = $raw; $exeArgs = \"\"\n}\n\n# NSIS uninstallers require /S for a silent uninstall.\nif ($exeArgs -notmatch '(?i)(^|\\s)/S(\\s|$)') { $exeArgs = \"$exeArgs /S\".Trim() }\n\nWrite-Host \"Uninstall command: $exe\"\nWrite-Host \"Uninstall args: $exeArgs\"\n$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n\nif ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n"
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,14 @@
import * as React from "react";
import type { SVGProps } from "react";
const Freecad = (props: SVGProps<SVGSVGElement>) => (
<svg xmlns="http://www.w3.org/2000/svg" width={32} height={32} {...props}>
<image
width={32}
height={32}
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAgKADAAQAAAABAAAAgAAAAABIjgR3AAANIElEQVR4Ae1deWwU1xl/s7PjXdvF+ADiE6hStXETEmiCAsRQwpUCqar80yZERaqqSmkDrfpPS2igTpxSKY2a0AOaSJjWEBBX1BwUlboqhymEiLRASSGliloSjMHG59p7zU6/b9bjrq/1ztudN4e+QWZ3Z975+/3e9755780bxuggBAgBQoAQIAQIAUKAECAECAFCgBAgBAgBQoAQIAQIAUKAECAECAFCgBAgBAgBQoAQIAQIAa8hIDm5QgdrZ6+aWVC4mTFJ0VjCyUUdVTZV09j0KVNYRWnxqGsZnfD5GNO0q9Lepq9lFJ4zkJ8znuXRDs6avapaKdgd8Mklqobky5bnmZsMNOCNserSyay8rAS0C0QyOGH2QAGo8UKz0cyGd6QA9tfOXg3k7wrKckk4oQ7WiQNEs2jkILwG7JeXTGZ3TCnFFgx/Rvk5EtdYjCOWqSiOE8DB2gdWVefn6eTHEu4y+0j+HUB+9dQpzNF9a4pE0D455tBbfn7ebmz5biQfW36Ni8hH4h0jACR/en7S7LuN/MSg2XdTyzdavSO6APT2q4l8gxOhn7YL4NA9s1dX5bm45Re7z+ynKsxWAaDZdzP5FS5z+FKJN77bJoD9tfevnpEf2BVwocPn5j7fIN74tEUASbMf0G/1oi671UuSXwzefplrbvUMssf6FC4A/VZvsM93I/kVJcVwn+8N8lEQQgVwCPt88PbR7LuTfHT4ysZqSK49J0wASH51QUFTQHLfIA+afWz5XiNfmAXQyceWj+TrEzsuaTA4lA//kt6+t1q+wYDlFuDAXfc9Cma/idvbl2wcVYesy+E+P6sRPpwQ4jogXiJu+RSo5QKoKSh8oVCf1TM5sQPASX4/++y2V5gC4+t2HCi9PEVhki5CDiI7Oxn7yYuMxeMwLWxCyFB3DdyzNyrnwVTiHhiul0yClzlalgtAliQ/Lo7gOgC0YE01U6ZN5Ypue6RAwHwRdPIZ2zl9GdtZsRDiW0c+Fk7EZBAn+0nsNDWL+fRkEvb9b7bsg+Q31ixnv6t6mPkF+EuWWwD70HdZzoPk76hZxpqqFw+Sb5nlHwJHhAUYyoy+jIOAQT6Y/abqh5kMLV/iWUY2TvLpTpMA0qEj4pph9pF8MPsiycfqkQBEkDxeHjr5GtsB5GOfL5p8EsB4xIg4P9Tyl0PLX2wL+SQAEUSPlYdBPjh8yZYPYx6C+vyRxaG7gJGIWP4bB3kYa7TR7KdWkXyAVDQs/558aMQp5GN1yQJYTrqRAZKPDt8KW/t8ozTGJwnAQMLSz8GWDyN8djp8Y1WRuoCxUMnpucE+H4d3BQ/yZFINsgCZoMQdJtnyd2DLdyD5WC3PCyCqgs+d1XQUN/vwcC9M5uIIX/lCzvt8M3PIfOX0tADC8QR7em8r6xpQmc/EdDwflKNjodPXUV4H5Ju/z8c1CJqW6Budam7PeFoAgDtrD6nsNvzh4/aiD9QctmGz2pN8sBAIIsbCfU1Wl9nTAkDwsOXLQL4dFoCHPJ8/ACvBor1quLthWeTe37TwJGIijucFYAILe4NCi/cpARYPdV8Y6O1Yd7ah7uRxASWywTAKqJXLspBkbIdg8kNdjT3XTi9D8kVVgSyAKKTHycenBMHkR9rCXa0bT9cvaBwnmGWnSQCWQZs+YQk2j5L8eSw+0HsiEe1bD+RfSB/DmqskAGtwTZsqmnxNjcXive0/v/KXnzW0Hd0VShvBwoskAAvBHSvpJPnqtWjfzXWnNs1/a6wwIs+REygSbRwUSCQi0Y5PHEE+Vt3zFgAHg/Q/TqKRs1wdOMCTiEVvJK4c+lOu0sw2Hc8LoCDgYzgfwDMQhFMIA9Hcrs0HEcQf2T85cjqHwspGBJ4WQFDxsdfWVLIEMMmDd09YZd96/bouglxaAsZ+DJzVZ8NbzuJ6WgBI+qfAAvAfOImT20PTVHn3qu8qkGoktynzpZYNOnw5uigWWo6cHrAfEnQB5aVzHluc03SzSIwEkAV4ZqPC9C4KIFg4dcav528+sdRsfCvCkwCsQDVNmhqsEvHJeXcGS6oO1235ewObuTiYJrjll0gAlkM8OoOEGoPpfjkQKJr27KJ1r76zqOFc7ehQYs6QAMTgPCoX7A4SsTBTgpOWypNKmx96ruXJUYEEnCABCAA5XRYoAvALKvMmV+1a9NLl7bO+vQ1eMyLuIAGIw3rcnNAvgENSgkVPlXx6cfO8TScfHDdwji+QAHIMKHdyMF6tdwkFxV/IL6s+vOD5U/O50zIRkQRgAiwRQVEEspJfpgSLvyMiPxKACJRN5qHhi7LkvCKT0biCkwC4YLM2EjiFLNLXfszaXJKpkwBEoGwiDyQ/PtAdivbe/LOJaNxBSQBpoOOZQk6TXEaXUAAwBXHx/Ze+8kFGEbIM5OnZQJzL6YbHwnBBCM+B08GcUXmy0+PoFiDSj0vF9HtD7oQyjOhpAYRjCfbUnuusq181tVVvKnaROEwJ53pOODWDlO8SPL8WD4cG1FD4jymnLf3qaQEgcuGYxgbgj9eciyIfy5o0/9GLZ/76jLAl4p4XABJo/CHITj4knwIOYOthduyYEPOPWJAT6BBF4IMi8UhfLD4QPSqySI61AOh84Zs6FMWxRZyAJwlMeubtS84rYGro9vG+3299f4KEc3rZkejixgqVpcWsqqw0p5UVlZhOPChYi8dugvMxwSvg4RExSVOjve3HNFl59tKlA1FR5cR8HCeAJPklrGqKS8kHU56Ix8LxcN+G0NW/7Smfs7AnPaHJZedHflBryyJRRwnA7eTj4nPJD45cb1t9y6YHt+rE70xPv91XHSMAnfwyaPmG2ecdvbERUR887Rvr73y788KRl20shqmsM/dSTCVrLvAo8s1Fd0Ro7PfV2EBvpPPGhksH6oX249kAYLsAhsy+0fKzqY2dcfF5f+ZrfTfQctnOYpjN21YBDJHvUodvGNi4oicRK53TXlM+7LzDf9gmAE+RDyTjIg45UFhWWPXAFx3O+bDi2SKAoT7fCy0/BU4YzZNkn/LllFOO/ypcAEMt3+19/hjUwrYvuO/Pw3PWN7rmTZdCBTBEvsdavqEFDR7+lJXAtEnVc/GVn644hAnAq2Z/OMsw/iv7fWok4ppuQIgA8DHrytRBnuGoeeqXFo8ypbBo+V1rt7jiffOWCyDZ8rOY2JH536AOHplwcWE3APv9VpTeuaROeOYcGVo+FDxjahmbVgoTO7wvQr5xA/bS4JgngftyTYUt13O+y8NEKMMSMn+eT/YHvwQh35wotN3XLV/tpj2x9h8w33k3jJLw1ZVrTRYMysC43LYZK9nB8nnMJ3heQfL5cfvXj279++i9l7Y9bfme/3zAJmNZbgH0V2VxkThYLbPk4WPXMCy7bfojbF/5gvSvYIdy4To8JAw/0UrBVu36oE42oEJCMDGoFUVudedDOo4WgPhOMjtkJ4gNLR/Jh5a/r2qhTv54b+TEmTtcLw6E/yvac/NXsf6uteHO1hfAibuJGzjzHxI81VUAD3pGmq/eHe3gT0dMTOstgJh6QC7/N/v7Kh9ifhiaHY98SVZwa/azaiL2XPuZvSevvPVir1FM2K1jT0KNb/UXFC2HFT2gkcy7LsOaRLrb3oTNwL7P6uszj2wUQPCnRyzASPLRAwAzPMaBJKmx/taujz94/NTGOX9IJR+Dn9h0/z87m3c8loiEGmBf16huKcZIZ+QpfNkDzAf0w2NdP+w4d/CrJ3/0+daRYZz423on8PGvX4QX9tzD7QROiFoq+XVpWz4mJeflM1h/13hiw6xvTpT0vM0tK4PFFS9DnM+BU6d3GaPigB+Br3lRo6Hzkc5r3zvdsOT4qDAOPuFyC2COfHxAQI2FtVi49+1MODnzfN2R0NWzy6G72D/kKKZExJ2/waJo0Z72nbc/bF7hNvKxKi72AUySD5XFtfcJNfpJX9tHGbfS97Y9cQ2irqnbcv6UEixs8AUKi5JbvflxHf8tEMczpzbN3YFguvFwqQUwTz6Sg/25Ghk4fnH7k50myVJbNt73i4Fb/12h9vcchhGmK2BJ3oi0fbjUzeQjBi60ACnkV6T39oeRDN4OkMaikd53hp038ePMT5e8C8Ef/czK9YGrR37JMTxpIjNBQV1mATSGN3f6fT6SD7do43n7I/GDjRnR/LfGr/+neeQ1s7+9Qj7W2z0CwEEboHs7DvKYJF+vKJj/BJj/c6+taTdLuJfDu6QLgJYPHjwv+fjABg7xgid/xMtk8tTNBRYg1ezDfb4Js28Agmv2Yfu1jo7L7wl98tbI38mf1lsAiSnZvLlZg7771Zmr2AEw+3kaegDmNYvef7Svffel334D5pbpSEXAegEw6TyMAoa4RgKhte+Bcf3Xp85lCnjw6AWMPcCbWqXU7/iwBryEu7/rsNb98SupV+g7IUAIEAKEACFACBAChAAhQAgQAoQAIUAIEAKEACFACBAChAAhQAgQAoQAIUAIEAKEACFACBACXkXgf+1Jhhqu1uCFAAAAAElFTkSuQmCC"
/>
</svg>
);
export default Freecad;
@@ -385,6 +385,7 @@ import Firefox from "./Firefox";
import Fission from "./Fission";
import FleetDesktop from "./FleetDesktop";
import Flexoptix from "./Flexoptix";
import Flexwhere from "./Flexwhere";
import Fluid from "./Fluid";
import FluxApp from "./FluxApp";
import FocusriteControl2 from "./FocusriteControl2";
@@ -394,14 +395,18 @@ import Fontlab from "./Fontlab";
import Forecast from "./Forecast";
import Fork from "./Fork";
import Forklift from "./Forklift";
import Fortify from "./Fortify";
import FourKSlideshowMaker from "./FourKSlideshowMaker";
import FourKStogram from "./FourKStogram";
import FourKVideoDownloader from "./FourKVideoDownloader";
import FourKVideoDownloaderPlus from "./FourKVideoDownloaderPlus";
import FourKVideoToMp3 from "./FourKVideoToMp3";
import FourKYoutubeToMp3 from "./FourKYoutubeToMp3";
import FoxitPdfEditor from "./FoxitPdfEditor";
import FoxitPdfReader from "./FoxitPdfReader";
import Framer from "./Framer";
import Franz from "./Franz";
import Freecad from "./Freecad";
import FreeDownloadManager from "./FreeDownloadManager";
import Freefilesync from "./Freefilesync";
import Front from "./Front";
@@ -1492,6 +1497,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
fission: Fission,
"fleet desktop": FleetDesktop,
"flexoptix app": Flexoptix,
flexwhere: Flexwhere,
fluid: Fluid,
"focusrite control 2": FocusriteControl2,
folx: Folx,
@@ -1500,9 +1506,13 @@ export const SOFTWARE_NAME_TO_ICON_MAP = {
forecast: Forecast,
fork: Fork,
forklift: Forklift,
fortify: Fortify,
"foxit pdf editor": FoxitPdfEditor,
"foxit pdf reader": FoxitPdfReader,
framer: Framer,
franz: Franz,
"free download manager": FreeDownloadManager,
freecad: Freecad,
freefilesync: Freefilesync,
front: Front,
fsmonitor: Fsmonitor,
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB