Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nudge 2.0 Official Release Merge #592

Merged
merged 141 commits into from
Jul 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
f3232ca
v.1.2.0
erikng Mar 25, 2024
c4dd6b2
bump to macos12 and fix marketing version
erikng Mar 25, 2024
1520f7b
add remote image support to companyLogo/screenShot
erikng Mar 26, 2024
f38ae97
tweak screenshot zoom again
erikng Mar 26, 2024
c86a76f
move to web assets
erikng Mar 26, 2024
0cfd064
mark macOS 12 and higher for now
erikng Mar 26, 2024
62178c2
allow window to be movable by admin (allowMovableWindow)
erikng Mar 27, 2024
9d6838c
first real attempt at getting gdmf data
erikng Mar 27, 2024
f83eab8
return board-id for gdmf comparison
erikng Mar 27, 2024
ce83f3c
get rid of some compiler warnings
erikng Mar 27, 2024
9a3e8a4
support for apple silicon vs intel hardware for gdmf
erikng Mar 28, 2024
16426c2
refactor gdmf and hardmodel
erikng Mar 29, 2024
6324510
strip newlines in modelID
erikng Mar 29, 2024
9fa46e2
Remove optional logging in serviceTargetProperty
erikng Mar 29, 2024
05e052e
Add a temporary comparison loop of the macOS Assets from gdmf
erikng Mar 29, 2024
17853d2
initial query of sofa v1 api
erikng May 14, 2024
b09d493
remove need for custom decoding strategy for sofa
erikng May 14, 2024
2deab45
new version of sofa has SupportedDevices enabled
erikng May 15, 2024
0f31977
new utilizeSOFAFeed preference - defaults to false
erikng May 15, 2024
b20dd44
start implementing unsupported ui
erikng May 15, 2024
a8f382a
change the other text ternaries
erikng May 15, 2024
bc956ca
sort the keys
erikng May 17, 2024
2afb778
finish sorting
erikng May 17, 2024
cd53504
flesh out device supported logic
erikng May 17, 2024
098d361
add sofa logging events
erikng May 17, 2024
335b1bf
add unsupportedURL and informationButtonTextUnsupported
erikng May 17, 2024
fc0ce05
start testing for actively exploited cve info
erikng May 17, 2024
0fb6528
TODOs so I don't forget
erikng May 17, 2024
027450e
more todo notes
erikng May 17, 2024
ad4247b
handle new sofa values for "Latest"
erikng May 17, 2024
d290f0e
first attempt at implementing "latest" with ui
erikng May 17, 2024
c12fb99
add activelyExploitedInstallationSLA and standardInstallationSLA
erikng May 17, 2024
0764e29
add actively exploited UI
erikng May 17, 2024
90974f4
more todo
erikng May 17, 2024
51184f7
markdown provided unsupported device
erikng May 17, 2024
0d54d7c
add overlay
erikng May 17, 2024
a010370
move to xcode 15.4
erikng May 21, 2024
a3e984d
add logic for sofa caching
erikng May 21, 2024
93757a8
2.0.0 release and more notes
erikng May 21, 2024
67936c4
macos13 to macos14 for new xcode
erikng May 21, 2024
0c6535f
dont try -large
erikng May 21, 2024
5f4b899
fix changelog
erikng May 21, 2024
bc7ec7e
remove forced unsupported
erikng May 21, 2024
c5c1dd4
add another todo
erikng May 21, 2024
45928ce
remove unneccessary key for testing latest
erikng May 22, 2024
9468590
add support for "latest-supported"
erikng May 22, 2024
3b36418
add logic to test bundle profile
erikng May 22, 2024
1ba078f
finish all the wrapping around local plist
erikng May 22, 2024
4b33f1d
fix key typo for utilizeSOFAFeed on mdm profiles
erikng May 22, 2024
d7f041a
simplify the sofa logic and add latest-* supported
erikng May 23, 2024
5fbd517
fix bug when matching requiredMinimumOSVersion with OS version values
erikng May 23, 2024
1e0fa3d
test the skip macOS versions no CVE logic
erikng May 23, 2024
863477a
add showActivelyExploitedCVEs
erikng May 23, 2024
8a49079
active exploit cve test to red when true
erikng May 24, 2024
8185036
add user-agent in sofa request
erikng May 24, 2024
31dd94b
move to globals.bundleid for all bundleid calls
erikng May 24, 2024
ead34ff
add customSOFAFeedURL
erikng May 24, 2024
c5bf7cc
add etag logic even though it doesn't work in syncronous calls
erikng May 24, 2024
8a35535
move to modified date not creation date
erikng May 24, 2024
2a32c12
break the loop after one query
erikng May 24, 2024
b536468
move sofa logic to a function so it can be called after other logc
erikng May 24, 2024
34cd108
fix probable issue with xcode tests failing
erikng May 24, 2024
585712f
move todos
erikng May 24, 2024
0ba119a
add logic for sofaPeriodLaunchDelay
erikng May 24, 2024
34fd886
Update changelog
erikng May 24, 2024
eb0088e
-disable-randomDelay
erikng May 24, 2024
c1aaec2
activate nudge if blocked application is terminated
erikng May 24, 2024
4f3d713
Update CHANGELOG.md
erikng May 24, 2024
b3bce47
add all of the localizations for english
erikng May 28, 2024
0ce73f5
google translate as much as I can with what's left
erikng May 28, 2024
e28f201
explicitly log OS versioning errors
erikng May 28, 2024
92c67f8
add custom icon in the application termination notification
erikng May 30, 2024
febf073
fix issue with fallbackLanguage logic
erikng May 30, 2024
83356a2
update changelog
erikng May 30, 2024
5091266
move timerCycle logic to seconds remaining vs hours
erikng May 31, 2024
d77b540
update changelog for issue 568
erikng May 31, 2024
8258ebe
optionally show required install date on left side UI
erikng May 31, 2024
4b1f4dd
change key name to allow artificial nudge event delays
erikng May 31, 2024
0add065
fix bug in launch delay logic
erikng Jun 4, 2024
9138fb8
add showDaysRemainingToUpdate rename showRequiredInstallationDate to …
erikng Jun 6, 2024
bfbbe7f
update changelog
erikng Jun 6, 2024
3bafde2
add some sequoia info
erikng Jun 13, 2024
6fa91df
add honorFocusModes key and logic
erikng Jun 17, 2024
fe28eda
disable honorFocusModes for now
erikng Jun 17, 2024
856db92
try a different but less reliable method
erikng Jun 17, 2024
8707bd5
fix local and utc time
erikng Jun 17, 2024
b8d81e2
update changelog
erikng Jun 17, 2024
840e781
fix non gregorian requiredInstallationDate
erikng Jun 17, 2024
175549c
update changelog for non gregorian calendars
erikng Jun 17, 2024
b473b1f
move to multiple hardware checks
erikng Jun 26, 2024
3cf7b62
utilizeSOFAFeed is not opt-out
erikng Jun 26, 2024
b27875e
changelog utilizeSOFAFeed per opt-out
erikng Jun 26, 2024
98e177a
fix typos
erikng Jun 26, 2024
bb6dee9
add honorCycleTimersOnExit support
erikng Jun 26, 2024
75870f1
fix some localization issues
erikng Jun 26, 2024
d0f0021
add additional support for not exiting when you can't fetch the upgrade
erikng Jul 1, 2024
54ee10e
update changelog
erikng Jul 1, 2024
921a087
return gestalt information
erikng Jul 1, 2024
45362ae
add logic for acceptableUpdatePreparingUsage
erikng Jul 2, 2024
fcf7b18
add another issue
erikng Jul 2, 2024
d904dff
fix ui issue with requiredinstalldate under hour and no quit button set
erikng Jul 2, 2024
6e8c7fe
add optional features to jamf json
erikng Jul 2, 2024
4ff5ebf
add expiremental feature to changelog
erikng Jul 2, 2024
044e2a0
osVersionRequirements jamf json
erikng Jul 2, 2024
fbd39fe
sort keys
erikng Jul 2, 2024
20c5a49
userExperience jamf json
erikng Jul 2, 2024
9a3da3c
sort more keys
erikng Jul 2, 2024
d7fe24f
userInterface keys jamf json
erikng Jul 2, 2024
0fb6fbe
attempt to check for MDM profile changes
erikng Jul 2, 2024
539ff5f
fix typo
erikng Jul 2, 2024
2ec3b71
handle sofa feed failing when there is no internet
erikng Jul 10, 2024
e32887f
add more logic for when json is 0bytes and fails to decode
erikng Jul 10, 2024
2197848
bump to test sofa feed on 14.5
erikng Jul 10, 2024
94749b5
add manual tester 14.4.1
erikng Jul 10, 2024
03a3240
create escape hatch for replacing device logic
erikng Jul 10, 2024
64b3a7e
add a false to remember where the test is
erikng Jul 10, 2024
81594c8
add another potential update assertion for macOS 15
erikng Jul 10, 2024
16f4090
grab full path of the process and compare to relative path
erikng Jul 10, 2024
93ce34a
add major and minor SLAs for sofa
erikng Jul 10, 2024
29ce1c6
add changelog into the project so I can modify within xcode
erikng Jul 11, 2024
ba31645
nudgeEventLaunchDelay is now nudgeMajorUpgradeEventLaunchDelay and nu…
erikng Jul 11, 2024
9871cd2
add compression to potentially reduce SOFA bw
erikng Jul 11, 2024
5f7e24c
Update CHANGELOG.md
erikng Jul 12, 2024
3bf57e6
Update CHANGELOG.md
erikng Jul 12, 2024
43e62e0
add breaking change notes
erikng Jul 15, 2024
6101b30
add another note about sofa feed
erikng Jul 15, 2024
11b6adf
retry when json is malformed
erikng Jul 15, 2024
fee2676
preparing adds - move to globs and capture username of process now
erikng Jul 15, 2024
0fd3b7e
acceptableUpdatePreparingUsage is now opt-out
erikng Jul 15, 2024
6ebb592
moved to gzipped data feed by default
erikng Jul 15, 2024
a6f4acc
add safety if we cannot save sofa json
erikng Jul 16, 2024
f938ea1
move logic for etag later in the processing path
erikng Jul 16, 2024
b8a73e2
add gzip decompression logic
erikng Jul 16, 2024
ac94ef8
add v1 to api call
erikng Jul 16, 2024
d1dcb15
move 0byte check to reduce erroneous log errors
erikng Jul 16, 2024
a6f0177
customfeedurl to test json to use both sofa feeds
erikng Jul 16, 2024
325e9f7
gzip deflate is not needed and add timeout logic
erikng Jul 16, 2024
b8255f7
bump release date 07-19
erikng Jul 16, 2024
bb0fa25
remove bad log event when using latest* values
erikng Jul 16, 2024
bb0f9e0
get rid of all prints and log properly
erikng Jul 16, 2024
2cba176
Update CHANGELOG.md
erikng Jul 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build_nudge_pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:

jobs:
build:
runs-on: macos-13
runs-on: macos-14
if: contains(github.event.pull_request.labels.*.name, 'safe to test')

steps:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build_nudge_prerelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ on:

jobs:
build:
runs-on: macos-13
runs-on: macos-14

steps:
- name: Checkout nudge repo
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build_nudge_prerelease_manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on: [workflow_dispatch]

jobs:
build:
runs-on: macos-13
runs-on: macos-14

steps:
- name: Checkout nudge repo
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build_nudge_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ on:

jobs:
build:
runs-on: macos-13
runs-on: macos-14

steps:
- name: Checkout nudge repo
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build_nudge_release_manual.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on: [workflow_dispatch]

jobs:
build:
runs-on: macos-13
runs-on: macos-14

steps:
- name: Checkout nudge repo
Expand Down
96 changes: 95 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,100 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.0.0] - 2024-07-18
Requires macOS 12.0 and higher.

### Breaking Changes
- **macOS 11 is now unsupported**
- Please use Nudge 1.x releases for macOS 11
- Due to implementing markdown support, many of the elements within Nudge may no longer be in **bold** if you customize them.
- To work around this please add `**` elements to these customizations
- For example: The `mainContentNote` value of `Important Notes` would become `**Important Notes**`
- The SOFA feed is **opt-out**, which included the new `Unsupported UI`. If you do not want the Unsupported UI features, you will need to actively opt-out of these options.

### Changed
- Now built on Swift 5.10, Xcode 15.4 and macOS 14
- New Xcode Scheme `-bundle-mode-profile` to test profile logic
- `-bundle-mode` has been renamed to `-bundle-mode-json`
- You can now pass two formats of **strings** to `requiredInstallationDate`
- `2025-01-01T00:00:00Z` for UTC
- `2025-01-01T00:00:00` for local time
- If you are using a MDM profile and passing the original `Date` key, you must change to utilizing `String` as Apple requires ISO8601 formatted dates
- You can now pass the strings `latest`, `latest-supported` and `latest-minor` in the `requiredMinimumOSVersion` key
- `latest`: always force latest release and if the machine can't this version, show the new "unsupported device" user interface
- `latest-supported`: always get the latest version sofa shows that is supported by this device
- `latest-minor`: stay in the current major release and get the latest minor updates available
- This requires utilizing the SOFA feed features to properly work, which is opt-out by default
- Nudge will then utilize two date integers to automatically calculate the `requiredInstallationDate`
- `activelyExploitedCVEsMajorUpgradeSLA` under the `osVersionRequirement` key will default to 14 days
- `activelyExploitedCVEsMinorUpdateSLA` under the `osVersionRequirement` key will default to 14 days
- `nonActivelyExploitedCVEsMajorUpgradeSLA` under the `osVersionRequirement` key will default to 21 days
- `nonActivelyExploitedCVEsMinorUpdateSLA` under the `osVersionRequirement` key will default to 21 days
- `standardMajorUpgradeSLA` under the `osVersionRequirement` key will default to 28 days
- `standardMinorUpdateSLA` under the `osVersionRequirement` key will default to 28 days
- These dates are calculated against the `ReleaseDate` key in the SOFA feed, which is UTC formatted. Local timezones will **not be supported** with the automatic sofa feed unless you use a custom feed and change this value yourself, following ISO-8601 date formats
- To artificially delay the SOFA nudge events, see the details below for `nudgeMajorUpgradeEventLaunchDelay` and `nudgeMinorUpdateEventLaunchDelay`
- If you'd like to not have nudge events for releases without any known CVEs, please configure the `disableNudgeForStandardInstalls` key under `optionalFeatures` to true
- You can now disable the `Days Remaining To Update:` item on the left side of the UI.
- Configure the `showDaysRemainingToUpdate` key under `userInterface` to false

### Fixed
- `screenshotDisplay` view had a bug that may result in the screenshot being partially cut off or zoomable
- `fallbackLanguage` would return the wrong language even when specified in the configuration
- Fixes [582](https://github.com/macadmins/nudge/issues/582)
- The timer controller logic was utilizing hours remaining vs seconds, which resulted in the `elapsedRefreshCycle` being used at the final hour of the nudge event vs the `imminentRefreshCycle`. This has been corrected to calculate the seconds remaining.
- Fixes [568](https://github.com/macadmins/nudge/issues/568)
- More descriptive logs when loading json/mdm profile keys
- Refactor portions of the `softwareupdate` logic to reduce potential errors
- Fixed errors when moving to Swift 5.10
- Fixed wrong `requiredInstallationDate` calculations when using [Non-Gregorian calendars](https://github.com/macadmins/nudge/issues/509)
- Fixed UI logic when requiredInstallationDate is under an hour and `allowLaterDeferralButton` is set to false
- Issue [475](https://github.com/macadmins/nudge/issues/475)

### Added
- To artificially change the `requredInstallationDate` thereby giving your users a default grace period for all Nudge events updates, please configure the `nudgeMajorUpgradeEventLaunchDelay` and `nudgeMinorUpdateEventLaunchDelay` keys under `userExperience` in amount of days.
- A local image path can now be specified for the notification event when Nudge terminates and application
- Please configure the `applicationTerminatedNotificationImagePath` key under `userInterface`
- Due to limitations within Apple's API, a local path is only supported at this time
- An admin can now alter the text when Nudge terminates and application
- Please configure the `applicationTerminatedTitleText` and `applicationTerminatedBodyText` keys under the `updateElements` key in `UserInterface`
- Remote URLs can now be used on `iconDarkPath`, `iconLightPath`, `screenShotDarkPath` and `screenShotLightPath`
- Please note that these files will be downloaded each time Nudge is ran and there is currently not a way to cache these objects.
- If these files fail to download, a default company logo will be shown.
- Actively Exploited CVEs in the left sidebar
- To disable this item, please configure the `showActivelyExploitedCVEs` key under `userInterface` to false
- An admin can now allow users to move the Nudge window with `userExperience` key `allowMovableWindow`
- To ease testing, you can now pass `-disable-randomDelay` as an argument to ignore the `randomDelay` key if it is set by a JSON or mobileconfig
- Basic SwiftUI support for Markdown text options
- Utilizing Apple's markdown features, you can now utilize, bold, italic, underline, subscript and url links directly into any of the text fields
- [SOFA](https://github.com/macadmins/sofa) feed support
- Set the `utilizeSOFAFeed` key `false` under `optionalFeatures` to disable this feature
- Nudge will by default check the feed every 24 hours and save a cache file under `~/Library/Application Support/com.github.macadmins.Nudge/sofa-macos_data_feed.json`
- In order to change this, please configure the `refreshSOFAFeedTime` key under `optionalFeatures` in seconds
- If you are utilizing a custom sofa feed, please configure the `customSOFAFeedURL` key under `optionalFeatures`
- "Unsupported device" UI in standard mode that utilizes the SOFA feed
- Set the `attemptToCheckForSupportedDevice` key `false` under `optionalFeatures` to disable this feature
- There are new keys to set all of text fields: `actionButtonTextUnsupported`, `mainContentHeaderUnsupported`, `mainContentNoteUnsupported`, `mainContentSubHeaderUnsupported`, `mainContentTextUnsupported`, `subHeaderUnsupported` under the `updateElements` key in `UserInterface`
- `unsupportedURL` and `unsupportedURLs` can change the information button itself, but it will remain in the `osVersionRequirement` key with `unsupportedURLs` and `unsupportedURLs`.
- An icon will appear as an overlay on top of the company image to further emphasize the device is no longer supported
- An admin can now show the `requiredInstallationDate` as a item on the left side of nudge.
- To enable this, please configure the `showRequiredDate` key under `userInterface` to true
- You can also expirement with the format of this date through the key `requiredInstallationDisplayFormat` under `userInterface`
- Be aware that the format you desire may not look good on the UI.
- Nudge can now honor the current cycle timers when user's press the `Quit` button.
- Set the `honorCycleTimersOnExit` key to `true` under `optionalFeatures` to enable this feature
- [Issue 548](https://github.com/macadmins/nudge/issues/548)
- When the device is running macOS 12.3 or higher, Nudge uses the delta logic for macOS Upgrades
- [Issue 417](https://github.com/macadmins/nudge/issues/417)
- Nudge can now bypass activations and re-activations when a macOS update is `Downloading`, `Preparing` or `Staged` for installation.
- To disable this, please configure the `acceptableUpdatePreparingUsage` key under `optionalFeatures` to false
- Issue [555](https://github.com/macadmins/nudge/issues/555) and [571](https://github.com/macadmins/nudge/issues/571)
- Nudge can now attempt to honor DoNotDisturb/Focus times
- To enable this, please configure the `honorFocusModes` key in `optionalFeatures` to true
- This is an **expiremental feature** and may not work due to significant changes that Apple has designed for detecting these events.
- Nudge now attempts to reload the preferences if the MDM profile is updated
- Issue [370](https://github.com/macadmins/nudge/issues/370)

## [1.1.16] - 2024-03-13
This will be the **final Nudge release** for macOS 11 and potentially other versions of macOS.

Expand Down Expand Up @@ -197,7 +291,7 @@ Almost all of these changes were sent by others. Thank you for continuing to sup
- `attemptToBlockApplicationLaunches`
- When enabled, Nudge will attempt to block application launches after the required installation date. This key must be used in conjunction with `blockedApplicationBundleIDs`.
- `blockedApplicationBundleIDs`
- The application Bundle ID which Nudge disallows from lauching after the required installation date. You can specify one or more Bundle ID.
- The application Bundle ID which Nudge disallows from launching after the required installation date. You can specify one or more Bundle ID.
- `terminateApplicationsOnLaunch`
- When enabled, Nudge will terminate the applications listed in blockedApplicationBundleIDs upon initial launch.

Expand Down
33 changes: 23 additions & 10 deletions Example Assets/com.github.macadmins.Nudge.tester.json

Large diffs are not rendered by default.

121 changes: 121 additions & 0 deletions Example Assets/com.github.macadmins.Nudge.tester.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>optionalFeatures</key>
<dict>
<key>acceptableAssertionApplicationNames</key>
<array>
<string>zoom.us</string>
<string>Meeting Center</string>
<string>Google Chrome</string>
<string>Safari</string>
</array>
<key>acceptableAssertionUsage</key>
<true/>
<key>acceptableCameraUsage</key>
<true/>
<key>acceptableScreenSharingUsage</key>
<true/>
<key>attemptToBlockApplicationLaunches</key>
<true/>
<key>blockedApplicationBundleIDs</key>
<array>
<string>com.microsoft.VSCode</string>
<string>us.zoom.xos</string>
</array>
<key>terminateApplicationsOnLaunch</key>
<false/>
<key>utilizeSOFAFeed</key>
<true/>
</dict>
<key>osVersionRequirements</key>
<array>
<dict>
<key>aboutUpdateURL</key>
<string>https://apple.com</string>
<key>requiredMinimumOSVersion</key>
<string>latest-supported</string>
<key>unsupportedURL</key>
<string>https://google.com</string>
</dict>
</array>
<key>userExperience</key>
<dict>
<key>elapsedRefreshCycle</key>
<integer>10</integer>
<key>initialRefreshCycle</key>
<integer>10</integer>
<key>loadLaunchAgent</key>
<false/>
<key>nudgeRefreshCycle</key>
<integer>5</integer>
<key>randomDelay</key>
<false/>
</dict>
<key>userInterface</key>
<dict>
<key>iconDarkPath</key>
<string>https://github.com/macadmins/nudge/blob/main/assets/NudgeIconInverted.png?raw=true</string>
<key>iconLightPath</key>
<string>https://github.com/macadmins/nudge/blob/main/assets/NudgeIcon.png?raw=true</string>
<key>screenShotDarkPath</key>
<string>https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_dark_1_icon.png?raw=true</string>
<key>screenShotLightPath</key>
<string>https://github.com/macadmins/nudge/blob/main/assets/standard_mode/demo_light_1_icon.png?raw=true</string>
<key>simpleMode</key>
<false/>
<key>updateElements</key>
<array>
<dict>
<key>_language</key>
<string>en</string>
<key>actionButtonText</key>
<string>actionButtonText</string>
<key>customDeferralButtonText</key>
<string>customDeferralButtonText</string>
<key>customDeferralDropdownText</key>
<string>customDeferralDropdownText</string>
<key>informationButtonText</key>
<string>informationButtonText</string>
<key>actionButtonTextUnsupported</key>
<string>actionButtonTextUnsupported</string>
<key>mainContentHeader</key>
<string>mainContentHeader</string>
<key>mainContentHeaderUnsupported1</key>
<string>mainContentHeaderUnsupported</string>
<key>mainContentNote</key>
<string>mainContentNote</string>
<key>mainContentNoteUnsupported1</key>
<string>mainContentNoteUnsupported</string>
<key>mainContentSubHeader</key>
<string>mainContentSubHeader</string>
<key>mainContentSubHeaderUnsupported1</key>
<string>mainContentSubHeaderUnsupported</string>
<key>mainContentText</key>
<string>mainContentText</string>
<key>mainContentTextUnsupported1</key>
<string>mainContentTextUnsupported</string>
<key>mainHeader</key>
<string>mainHeader</string>
<key>mainHeaderUnsupported1</key>
<string>mainHeaderUnsupported</string>
<key>oneDayDeferralButtonText</key>
<string>oneDayDeferralButtonText</string>
<key>oneHourDeferralButtonText</key>
<string>oneHourDeferralButtonText</string>
<key>primaryQuitButtonText</key>
<string>primaryQuitButtonText</string>
<key>screenShotAltText</key>
<string>Click to zoom into screenshot</string>
<key>secondaryQuitButtonText</key>
<string>secondaryQuitButtonText</string>
<key>subHeader</key>
<string>subHeader</string>
<key>subHeaderUnsupported1</key>
<string>subHeaderUnsupported</string>
</dict>
</array>
</dict>
</dict>
</plist>
Loading