From 23fe288fe962c9b3b71bd332ef9f771c0cbbda07 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Fri, 15 Oct 2021 17:23:40 -0500 Subject: [PATCH] Remove Multiplatform targets --- .../FixAccountCredentialView.swift | 167 -- .../Add Account Models/AddAccountSignUp.swift | 68 - .../AddFeedWranglerViewModel.swift | 70 - .../AddFeedbinViewModel.swift | 68 - .../AddFeedlyViewModel.swift | 67 - .../AddNewsBlurViewModel.swift | 71 - .../AddReaderAPIViewModel.swift | 122 -- .../AddCloudKitAccountView.swift | 134 -- .../AddFeedWranglerAccountView.swift | 216 --- .../AddFeedbinAccountView.swift | 214 --- .../AddFeedlyAccountView.swift | 149 -- .../AddLocalAccountView.swift | 140 -- .../AddNewsBlurAccountView.swift | 212 --- .../AddReaderAPIAccountView.swift | 247 --- Multiplatform/Shared/Add/AddFolderModel.swift | 51 - Multiplatform/Shared/Add/AddFolderView.swift | 125 -- .../Shared/Add/AddWebFeedModel.swift | 144 -- Multiplatform/Shared/Add/AddWebFeedView.swift | 209 --- Multiplatform/Shared/AppAssets.swift | 362 ---- Multiplatform/Shared/AppDefaults.swift | 359 ---- .../Shared/Article/ArticleContainerView.swift | 19 - .../Article/ArticleExtractorButtonState.swift | 16 - .../Article/ArticleIconSchemeHandler.swift | 60 - .../Article/ArticleToolbarModifier.swift | 120 -- .../Shared/Article/PreloadedWebView.swift | 132 -- .../Shared/Article/WebViewProvider.swift | 103 -- .../Article/WrapperScriptMessageHandler.swift | 25 - Multiplatform/Shared/Article/blank.html | 11 - .../Shared/Article/main_multiplatform.js | 498 ----- Multiplatform/Shared/Article/page.html | 21 - .../AccentColor.colorset/Contents.json | 38 - .../AppIcon.appiconset/Contents.json | 176 -- .../Icon-MacOS-128x128@1x.png.png | Bin 16978 -> 0 bytes .../Icon-MacOS-128x128@2x.png.png | Bin 53049 -> 0 bytes .../Icon-MacOS-16x16@1x.png.png | Bin 857 -> 0 bytes .../Icon-MacOS-16x16@2x.png.png | Bin 3456 -> 0 bytes .../Icon-MacOS-256x256@1x.png.png | Bin 53049 -> 0 bytes .../Icon-MacOS-256x256@2x.png.png | Bin 187013 -> 0 bytes .../Icon-MacOS-32x32@1x.png.png | Bin 3451 -> 0 bytes .../Icon-MacOS-32x32@2x.png.png | Bin 5981 -> 0 bytes .../Icon-MacOS-512x512@1x.png.png | Bin 187013 -> 0 bytes .../Icon-MacOS-512x512@2x.png.png | Bin 690577 -> 0 bytes .../AppIcon.appiconset/icon-1024.png | Bin 705697 -> 0 bytes .../AppIcon.appiconset/icon-120.png | Bin 11137 -> 0 bytes .../AppIcon.appiconset/icon-121.png | Bin 11137 -> 0 bytes .../AppIcon.appiconset/icon-152.png | Bin 16440 -> 0 bytes .../AppIcon.appiconset/icon-167.png | Bin 19272 -> 0 bytes .../AppIcon.appiconset/icon-180.png | Bin 21820 -> 0 bytes .../AppIcon.appiconset/icon-20.png | Bin 15258 -> 0 bytes .../AppIcon.appiconset/icon-29.png | Bin 1469 -> 0 bytes .../AppIcon.appiconset/icon-40.png | Bin 2316 -> 0 bytes .../AppIcon.appiconset/icon-41.png | Bin 2316 -> 0 bytes .../AppIcon.appiconset/icon-42.png | Bin 2316 -> 0 bytes .../AppIcon.appiconset/icon-58.png | Bin 3886 -> 0 bytes .../AppIcon.appiconset/icon-59.png | Bin 3886 -> 0 bytes .../AppIcon.appiconset/icon-60.png | Bin 4061 -> 0 bytes .../AppIcon.appiconset/icon-76.png | Bin 5693 -> 0 bytes .../AppIcon.appiconset/icon-80.png | Bin 6115 -> 0 bytes .../AppIcon.appiconset/icon-81.png | Bin 6115 -> 0 bytes .../AppIcon.appiconset/icon-87.png | Bin 6931 -> 0 bytes .../ArticleExtractorError.pdf | Bin 4308 -> 0 bytes .../Contents.json | 15 - .../Contents.json | 12 - .../doc.plaintext.on.svg | 218 --- .../Shared/Assets.xcassets/Contents.json | 6 - .../Contents.json | 15 - .../MarsEditOfficial.pdf | Bin 6339 -> 0 bytes .../Contents.json | 15 - .../micro-dot-blog.pdf | Bin 4190 -> 0 bytes .../Contents.json | 25 - .../reddit-dark.pdf | Bin 4583 -> 0 bytes .../reddit-light.pdf | Bin 4830 -> 0 bytes .../Contents.json | 15 - .../twitter.pdf | Bin 4237 -> 0 bytes .../Contents.json | 12 - .../faviconTemplateImage.pdf | Bin 5858 -> 0 bytes .../Contents.json | 38 - .../MarkAllAsRead.symbolset/Contents.json | 12 - .../MarkAllAsRead.symbolset/markAllAsRead.svg | 147 -- .../MarkAllAsReadPNG.imageset/Contents.json | 24 - .../mark-all-as-read.png | Bin 1194 -> 0 bytes .../Contents.json | 68 - .../Contents.json | 20 - .../StarColor.colorset/Contents.json | 20 - .../Contents.json | 38 - .../accountBazQux.imageset/Contents.json | 16 - .../accountBazQux.imageset/bazqux-any.pdf | Bin 39038 -> 0 bytes .../accountCloudKit.imageset/Contents.json | 25 - .../accountCloudKit.imageset/icloud-any.pdf | Bin 6041 -> 0 bytes .../accountCloudKit.imageset/icloud-dark.pdf | Bin 6041 -> 0 bytes .../Contents.json | 59 - .../feedwranger-any-slice.png | Bin 30348 -> 0 bytes .../feedwranger-any-slice@2x.png | Bin 78415 -> 0 bytes .../feedwranger-any-slice@3x.png | Bin 156727 -> 0 bytes .../feedwranger-dark-slice.png | Bin 30446 -> 0 bytes .../feedwranger-dark-slice@2x.png | Bin 78556 -> 0 bytes .../feedwranger-dark-slice@3x.png | Bin 156734 -> 0 bytes .../accountFeedbin.imageset/Contents.json | 16 - .../accountFeedbin.imageset/feedbin.pdf | Bin 9278 -> 0 bytes .../accountFeedly.imageset/Contents.json | 25 - .../feedly-logo-any.pdf | Bin 6005 -> 0 bytes .../feedly-logo-dark.pdf | Bin 6007 -> 0 bytes .../accountFreshRSS.imageset/Contents.json | 15 - .../accountFreshRSS.imageset/FreshRSS.pdf | Bin 3974 -> 0 bytes .../accountInoreader.imageset/Contents.json | 26 - .../inoreader_logo-any.pdf | Bin 5774 -> 0 bytes .../inoreader_logo-dark.pdf | Bin 5772 -> 0 bytes .../accountLocal.imageset/Contents.json | 25 - .../localAccountDark-1.pdf | Bin 4123 -> 0 bytes .../localAccountLight.pdf | Bin 4117 -> 0 bytes .../accountLocalMac.imageset/Contents.json | 25 - .../localAccountDark-1.pdf | Bin 4123 -> 0 bytes .../localAccountLight.pdf | Bin 4117 -> 0 bytes .../accountLocalPad.imageset/Contents.json | 26 - .../ipad-any-slice.pdf | Bin 5143 -> 0 bytes .../ipad-dark-slice.pdf | Bin 5143 -> 0 bytes .../accountLocalPhone.imageset/Contents.json | 26 - .../iphone-any-slice.pdf | Bin 5175 -> 0 bytes .../iphone-dark-slice.pdf | Bin 5181 -> 0 bytes .../accountNewsBlur.imageset/Contents.json | 15 - .../accountNewsBlur.imageset/Newsblur-any.pdf | Bin 9541 -> 0 bytes .../Contents.json | 26 - .../oldreader-icon-any.pdf | Bin 7074 -> 0 bytes .../oldreader-icon-dark.pdf | Bin 7083 -> 0 bytes .../Shared/CombineExt/DemandBuffer.swift | 151 -- .../Shared/CombineExt/ReplaySubject.swift | 121 -- .../Shared/CombineExt/ShareReplay.swift | 24 - Multiplatform/Shared/CombineExt/Sink.swift | 101 -- .../Shared/CombineExt/WIthLatestFrom.swift | 238 --- Multiplatform/Shared/ErrorHandler.swift | 21 - .../Images/ArticleIconImageLoader.swift | 52 - .../Shared/Images/FeedIconImageLoader.swift | 47 - .../Shared/Images/IconImageView.swift | 60 - .../Shared/Inspector/InspectorModel.swift | 119 -- .../Inspector/InspectorPlatformModifier.swift | 43 - .../Shared/Inspector/InspectorView.swift | 259 --- Multiplatform/Shared/MainApp.swift | 135 -- .../Shared/Previews/PreviewArticles.swift | 58 - .../Shared/RefreshProgressModel.swift | 86 - Multiplatform/Shared/SceneModel.swift | 215 --- .../Shared/SceneNavigationModel.swift | 21 - .../Shared/SceneNavigationView.swift | 219 --- .../Shared/Sidebar/SidebarContainerView.swift | 40 - .../Shared/Sidebar/SidebarContextMenu.swift | 184 -- .../Sidebar/SidebarExpandedContainers.swift | 50 - .../Shared/Sidebar/SidebarItem.swift | 98 - .../Shared/Sidebar/SidebarItemView.swift | 64 - .../Sidebar/SidebarListStyleModifier.swift | 33 - .../Shared/Sidebar/SidebarModel.swift | 357 ---- .../Shared/Sidebar/SidebarToolbarModel.swift | 25 - .../Sidebar/SidebarToolbarModifier.swift | 105 -- .../Shared/Sidebar/SidebarView.swift | 237 --- .../Shared/Sidebar/UnreadCountView.swift | 31 - .../SwiftUI Extensions/HiddenModifier.swift | 21 - .../SwiftUI Extensions/Image-Extensions.swift | 23 - .../PreferredColorSchemeModifier.swift | 27 - .../Timeline/TimelineContainerView.swift | 49 - .../Shared/Timeline/TimelineContextMenu.swift | 109 -- .../Shared/Timeline/TimelineItem.swift | 98 - .../Timeline/TimelineItemStatusView.swift | 52 - .../Shared/Timeline/TimelineItemView.swift | 76 - .../Shared/Timeline/TimelineItems.swift | 32 - .../Shared/Timeline/TimelineModel.swift | 635 ------- .../Timeline/TimelineSortOrderView.swift | 64 - .../Shared/Timeline/TimelineTextSizer.swift | 197 -- .../Timeline/TimelineToolbarModifier.swift | 66 - .../Shared/Timeline/TimelineView.swift | 134 -- Multiplatform/iOS/AppDelegate.swift | 418 ----- .../iOS/Article/ActivityViewController.swift | 33 - .../Article/ArticleActivityItemSource.swift | 33 - Multiplatform/iOS/Article/ArticleView.swift | 26 - .../iOS/Article/ArticleViewController.swift | 163 -- .../iOS/Article/FindInArticleActivity.swift | 40 - Multiplatform/iOS/Article/IconView.swift | 127 -- .../iOS/Article/ImageScrollView.swift | 361 ---- .../iOS/Article/ImageTransition.swift | 110 -- .../iOS/Article/ImageViewController.swift | 92 - .../iOS/Article/OpenInSafariActivity.swift | 49 - .../iOS/Article/TitleActivityItemSource.swift | 41 - .../iOS/Article/WebViewController.swift | 765 -------- Multiplatform/iOS/AttributedStringView.swift | 45 - Multiplatform/iOS/Info.plist | 89 - Multiplatform/iOS/SafariView.swift | 63 - Multiplatform/iOS/Settings/About/About.rtf | 12 - Multiplatform/iOS/Settings/About/Credits.rtf | 20 - .../iOS/Settings/About/Dedication.rtf | 9 - .../Settings/About/SettingsAboutModel.swift | 31 - .../Settings/About/SettingsAboutView.swift | 41 - Multiplatform/iOS/Settings/About/Thanks.rtf | 11 - .../Accounts/AccountCredentialsError.swift | 37 - .../Accounts/AccountHeaderImageView.swift | 37 - .../Accounts/SettingsAccountLabelView.swift | 49 - .../Accounts/SettingsAddAccountModel.swift | 46 - .../Accounts/SettingsAddAccountView.swift | 55 - .../SettingsCloudKitAccountView.swift | 49 - .../SettingsCredentialsAccountModel.swift | 281 --- .../SettingsCredentialsAccountView.swift | 97 - .../Accounts/SettingsDetailAccountModel.swift | 55 - .../Accounts/SettingsDetailAccountView.swift | 94 - .../Accounts/SettingsLocalAccountView.swift | 55 - .../Settings/ColorPaletteContainerView.swift | 60 - .../iOS/Settings/FeedsSettingsModel.swift | 109 -- .../iOS/Settings/SettingsModel.swift | 95 - Multiplatform/iOS/Settings/SettingsView.swift | 244 --- .../iOS/Settings/TimelineLayoutView.swift | 84 - Multiplatform/iOS/iOS-dev.entitlements | 14 - Multiplatform/iOS/iOS.entitlements | 24 - Multiplatform/macOS/AppDelegate.swift | 285 --- Multiplatform/macOS/Article/ArticleView.swift | 25 - Multiplatform/macOS/Article/IconView.swift | 134 -- .../Article/SharingServiceDelegate.swift | 32 - .../SharingServicePickerDelegate.swift | 55 - .../macOS/Article/SharingServiceView.swift | 56 - .../macOS/Article/WebStatusBarView.swift | 101 -- .../macOS/Article/WebViewController.swift | 373 ---- Multiplatform/macOS/Browser.swift | 65 - Multiplatform/macOS/Info.plist | 57 - Multiplatform/macOS/MacSearchField.swift | 49 - .../Preferences/MacPreferencePanes.swift | 28 - .../AccountsPreferencesModel.swift | 103 -- .../AccountsPreferencesView.swift | 127 -- .../Add Account/AddAccountView.swift | 274 --- .../ConfiguredAccountRow.swift | 29 - .../Edit Account/AccountDetailView.swift | 83 - .../EditAccountCredentialsModel.swift | 284 --- .../EditAccountCredentialsView.swift | 94 - .../Accounts/AccountUpdateErrors.swift | 39 - .../Advanced/AdvancedPreferencesModel.swift | 32 - .../Advanced/AdvancedPreferencesView.swift | 46 - .../General/GeneralPreferencesModel.swift | 129 -- .../General/GeneralPreferencesView.swift | 54 - .../Viewing/LayoutPreferencesView.swift | 99 - Multiplatform/macOS/macOS-dev.entitlements | 18 - Multiplatform/macOS/macOS.entitlements | 28 - NetNewsWire.xcodeproj/project.pbxproj | 1616 ----------------- .../xcschemes/Multiplatform iOS.xcscheme | 96 - .../xcschemes/Multiplatform macOS.xcscheme | 96 - ...sWire_multiplatform_iOSapp_target.xcconfig | 48 - ...ire_multiplatform_macOSapp_target.xcconfig | 46 - 239 files changed, 18881 deletions(-) delete mode 100644 Multiplatform/Shared/Account Management/FixAccountCredentialView.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Models/AddAccountSignUp.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Models/AddFeedWranglerViewModel.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Models/AddFeedbinViewModel.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Models/AddFeedlyViewModel.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Models/AddNewsBlurViewModel.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Models/AddReaderAPIViewModel.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Sheets/AddCloudKitAccountView.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Sheets/AddFeedWranglerAccountView.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Sheets/AddFeedbinAccountView.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Sheets/AddFeedlyAccountView.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Sheets/AddLocalAccountView.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Sheets/AddNewsBlurAccountView.swift delete mode 100644 Multiplatform/Shared/Add/Add Account Sheets/AddReaderAPIAccountView.swift delete mode 100644 Multiplatform/Shared/Add/AddFolderModel.swift delete mode 100644 Multiplatform/Shared/Add/AddFolderView.swift delete mode 100644 Multiplatform/Shared/Add/AddWebFeedModel.swift delete mode 100644 Multiplatform/Shared/Add/AddWebFeedView.swift delete mode 100644 Multiplatform/Shared/AppAssets.swift delete mode 100644 Multiplatform/Shared/AppDefaults.swift delete mode 100644 Multiplatform/Shared/Article/ArticleContainerView.swift delete mode 100644 Multiplatform/Shared/Article/ArticleExtractorButtonState.swift delete mode 100644 Multiplatform/Shared/Article/ArticleIconSchemeHandler.swift delete mode 100644 Multiplatform/Shared/Article/ArticleToolbarModifier.swift delete mode 100644 Multiplatform/Shared/Article/PreloadedWebView.swift delete mode 100644 Multiplatform/Shared/Article/WebViewProvider.swift delete mode 100644 Multiplatform/Shared/Article/WrapperScriptMessageHandler.swift delete mode 100644 Multiplatform/Shared/Article/blank.html delete mode 100644 Multiplatform/Shared/Article/main_multiplatform.js delete mode 100644 Multiplatform/Shared/Article/page.html delete mode 100644 Multiplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-128x128@1x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-128x128@2x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-16x16@1x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-16x16@2x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-256x256@1x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-256x256@2x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-32x32@1x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-32x32@2x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-512x512@1x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-512x512@2x.png.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-1024.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-120.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-121.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-152.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-167.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-180.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-20.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-29.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-40.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-41.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-42.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-58.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-59.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-60.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-76.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-80.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-81.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/icon-87.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/ArticleExtractorError.imageset/ArticleExtractorError.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/ArticleExtractorError.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/ArticleExtractorOn.symbolset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/ArticleExtractorOn.symbolset/doc.plaintext.on.svg delete mode 100644 Multiplatform/Shared/Assets.xcassets/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointMarsEdit.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointMarsEdit.imageset/MarsEditOfficial.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointMicroblog.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointMicroblog.imageset/micro-dot-blog.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointReddit.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointReddit.imageset/reddit-dark.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointReddit.imageset/reddit-light.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointTwitter.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/ExtensionPointTwitter.imageset/twitter.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/FaviconTemplateImage.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/FaviconTemplateImage.imageset/faviconTemplateImage.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/IconBackgroundColor.colorset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/MarkAllAsRead.symbolset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/MarkAllAsRead.symbolset/markAllAsRead.svg delete mode 100644 Multiplatform/Shared/Assets.xcassets/MarkAllAsReadPNG.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/MarkAllAsReadPNG.imageset/mark-all-as-read.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/SidebarUnreadCountBackground.colorset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/SidebarUnreadCountForeground.colorset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/StarColor.colorset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/WebStatusBarBackground.colorset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountBazQux.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountBazQux.imageset/bazqux-any.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/icloud-any.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountCloudKit.imageset/icloud-dark.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/feedwranger-any-slice.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/feedwranger-any-slice@2x.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/feedwranger-any-slice@3x.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/feedwranger-dark-slice.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/feedwranger-dark-slice@2x.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedWrangler.imageset/feedwranger-dark-slice@3x.png delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedbin.imageset/feedbin.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedly.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedly.imageset/feedly-logo-any.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFeedly.imageset/feedly-logo-dark.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountFreshRSS.imageset/FreshRSS.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountInoreader.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountInoreader.imageset/inoreader_logo-any.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountInoreader.imageset/inoreader_logo-dark.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocal.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocal.imageset/localAccountDark-1.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocal.imageset/localAccountLight.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalMac.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalMac.imageset/localAccountDark-1.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalMac.imageset/localAccountLight.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPad.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPad.imageset/ipad-any-slice.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPad.imageset/ipad-dark-slice.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/iphone-any-slice.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountLocalPhone.imageset/iphone-dark-slice.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountNewsBlur.imageset/Newsblur-any.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountTheOldReader.imageset/Contents.json delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountTheOldReader.imageset/oldreader-icon-any.pdf delete mode 100644 Multiplatform/Shared/Assets.xcassets/accountTheOldReader.imageset/oldreader-icon-dark.pdf delete mode 100644 Multiplatform/Shared/CombineExt/DemandBuffer.swift delete mode 100644 Multiplatform/Shared/CombineExt/ReplaySubject.swift delete mode 100644 Multiplatform/Shared/CombineExt/ShareReplay.swift delete mode 100644 Multiplatform/Shared/CombineExt/Sink.swift delete mode 100644 Multiplatform/Shared/CombineExt/WIthLatestFrom.swift delete mode 100644 Multiplatform/Shared/ErrorHandler.swift delete mode 100644 Multiplatform/Shared/Images/ArticleIconImageLoader.swift delete mode 100644 Multiplatform/Shared/Images/FeedIconImageLoader.swift delete mode 100644 Multiplatform/Shared/Images/IconImageView.swift delete mode 100644 Multiplatform/Shared/Inspector/InspectorModel.swift delete mode 100644 Multiplatform/Shared/Inspector/InspectorPlatformModifier.swift delete mode 100644 Multiplatform/Shared/Inspector/InspectorView.swift delete mode 100644 Multiplatform/Shared/MainApp.swift delete mode 100644 Multiplatform/Shared/Previews/PreviewArticles.swift delete mode 100644 Multiplatform/Shared/RefreshProgressModel.swift delete mode 100644 Multiplatform/Shared/SceneModel.swift delete mode 100644 Multiplatform/Shared/SceneNavigationModel.swift delete mode 100644 Multiplatform/Shared/SceneNavigationView.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarContainerView.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarContextMenu.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarExpandedContainers.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarItem.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarItemView.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarListStyleModifier.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarModel.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarToolbarModel.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarToolbarModifier.swift delete mode 100644 Multiplatform/Shared/Sidebar/SidebarView.swift delete mode 100644 Multiplatform/Shared/Sidebar/UnreadCountView.swift delete mode 100644 Multiplatform/Shared/SwiftUI Extensions/HiddenModifier.swift delete mode 100644 Multiplatform/Shared/SwiftUI Extensions/Image-Extensions.swift delete mode 100644 Multiplatform/Shared/SwiftUI Extensions/PreferredColorSchemeModifier.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineContainerView.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineContextMenu.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineItem.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineItemStatusView.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineItemView.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineItems.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineModel.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineSortOrderView.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineTextSizer.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineToolbarModifier.swift delete mode 100644 Multiplatform/Shared/Timeline/TimelineView.swift delete mode 100644 Multiplatform/iOS/AppDelegate.swift delete mode 100644 Multiplatform/iOS/Article/ActivityViewController.swift delete mode 100644 Multiplatform/iOS/Article/ArticleActivityItemSource.swift delete mode 100644 Multiplatform/iOS/Article/ArticleView.swift delete mode 100644 Multiplatform/iOS/Article/ArticleViewController.swift delete mode 100644 Multiplatform/iOS/Article/FindInArticleActivity.swift delete mode 100644 Multiplatform/iOS/Article/IconView.swift delete mode 100644 Multiplatform/iOS/Article/ImageScrollView.swift delete mode 100644 Multiplatform/iOS/Article/ImageTransition.swift delete mode 100644 Multiplatform/iOS/Article/ImageViewController.swift delete mode 100644 Multiplatform/iOS/Article/OpenInSafariActivity.swift delete mode 100644 Multiplatform/iOS/Article/TitleActivityItemSource.swift delete mode 100644 Multiplatform/iOS/Article/WebViewController.swift delete mode 100644 Multiplatform/iOS/AttributedStringView.swift delete mode 100644 Multiplatform/iOS/Info.plist delete mode 100644 Multiplatform/iOS/SafariView.swift delete mode 100644 Multiplatform/iOS/Settings/About/About.rtf delete mode 100644 Multiplatform/iOS/Settings/About/Credits.rtf delete mode 100644 Multiplatform/iOS/Settings/About/Dedication.rtf delete mode 100644 Multiplatform/iOS/Settings/About/SettingsAboutModel.swift delete mode 100644 Multiplatform/iOS/Settings/About/SettingsAboutView.swift delete mode 100644 Multiplatform/iOS/Settings/About/Thanks.rtf delete mode 100644 Multiplatform/iOS/Settings/Accounts/AccountCredentialsError.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/AccountHeaderImageView.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsAccountLabelView.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsAddAccountModel.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsAddAccountView.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsCloudKitAccountView.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountModel.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsCredentialsAccountView.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsDetailAccountModel.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsDetailAccountView.swift delete mode 100644 Multiplatform/iOS/Settings/Accounts/SettingsLocalAccountView.swift delete mode 100644 Multiplatform/iOS/Settings/ColorPaletteContainerView.swift delete mode 100644 Multiplatform/iOS/Settings/FeedsSettingsModel.swift delete mode 100644 Multiplatform/iOS/Settings/SettingsModel.swift delete mode 100644 Multiplatform/iOS/Settings/SettingsView.swift delete mode 100644 Multiplatform/iOS/Settings/TimelineLayoutView.swift delete mode 100644 Multiplatform/iOS/iOS-dev.entitlements delete mode 100644 Multiplatform/iOS/iOS.entitlements delete mode 100644 Multiplatform/macOS/AppDelegate.swift delete mode 100644 Multiplatform/macOS/Article/ArticleView.swift delete mode 100644 Multiplatform/macOS/Article/IconView.swift delete mode 100644 Multiplatform/macOS/Article/SharingServiceDelegate.swift delete mode 100644 Multiplatform/macOS/Article/SharingServicePickerDelegate.swift delete mode 100644 Multiplatform/macOS/Article/SharingServiceView.swift delete mode 100644 Multiplatform/macOS/Article/WebStatusBarView.swift delete mode 100644 Multiplatform/macOS/Article/WebViewController.swift delete mode 100644 Multiplatform/macOS/Browser.swift delete mode 100644 Multiplatform/macOS/Info.plist delete mode 100644 Multiplatform/macOS/MacSearchField.swift delete mode 100644 Multiplatform/macOS/Preferences/MacPreferencePanes.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/AccountsPreferencesModel.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/AccountsPreferencesView.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Add Account/AddAccountView.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/ConfiguredAccountRow.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Edit Account/AccountDetailView.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Edit Account/EditAccountCredentialsModel.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Accounts/Account Preferences/Edit Account/EditAccountCredentialsView.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Accounts/AccountUpdateErrors.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Advanced/AdvancedPreferencesModel.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Advanced/AdvancedPreferencesView.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/General/GeneralPreferencesModel.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/General/GeneralPreferencesView.swift delete mode 100644 Multiplatform/macOS/Preferences/Preference Panes/Viewing/LayoutPreferencesView.swift delete mode 100644 Multiplatform/macOS/macOS-dev.entitlements delete mode 100644 Multiplatform/macOS/macOS.entitlements delete mode 100644 NetNewsWire.xcodeproj/xcshareddata/xcschemes/Multiplatform iOS.xcscheme delete mode 100644 NetNewsWire.xcodeproj/xcshareddata/xcschemes/Multiplatform macOS.xcscheme delete mode 100644 xcconfig/NetNewsWire_multiplatform_iOSapp_target.xcconfig delete mode 100644 xcconfig/NetNewsWire_multiplatform_macOSapp_target.xcconfig diff --git a/Multiplatform/Shared/Account Management/FixAccountCredentialView.swift b/Multiplatform/Shared/Account Management/FixAccountCredentialView.swift deleted file mode 100644 index ecb585d70..000000000 --- a/Multiplatform/Shared/Account Management/FixAccountCredentialView.swift +++ /dev/null @@ -1,167 +0,0 @@ -// -// FixAccountCredentialView.swift -// NetNewsWire -// -// Created by Stuart Breckenridge on 24/7/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account - -struct FixAccountCredentialView: View { - - let accountSyncError: AccountSyncError - @Environment(\.presentationMode) var presentationMode - @StateObject private var editModel = EditAccountCredentialsModel() - - - var body: some View { - #if os(macOS) - MacForm - .onAppear { - editModel.retrieveCredentials(accountSyncError.account) - } - .onChange(of: editModel.accountCredentialsWereUpdated) { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - } - .alert(isPresented: $editModel.showError) { - Alert(title: Text("Error Adding Account"), - message: Text(editModel.error.description), - dismissButton: .default(Text("Dismiss"), - action: { - editModel.error = .none - })) - } - .frame(idealWidth: 300, idealHeight: 200, alignment: .top) - .padding() - #else - iOSForm - .onAppear { - editModel.retrieveCredentials(accountSyncError.account) - } - .onChange(of: editModel.accountCredentialsWereUpdated) { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - } - .alert(isPresented: $editModel.showError) { - Alert(title: Text("Error Adding Account"), - message: Text(editModel.error.description), - dismissButton: .default(Text("Dismiss"), - action: { - editModel.error = .none - })) - } - #endif - - - } - - var MacForm: some View { - Form { - header - HStack(alignment: .center) { - VStack(alignment: .trailing, spacing: 12) { - Text("Username: ") - Text("Password: ") - if accountSyncError.account.type == .freshRSS { - Text("API URL: ") - } - }.frame(width: 75) - - VStack(alignment: .leading, spacing: 12) { - accountFields - } - } - .textFieldStyle(RoundedBorderTextFieldStyle()) - - Spacer() - HStack{ - if editModel.accountIsUpdatingCredentials { - ProgressView("Updating") - } - Spacer() - cancelButton - updateButton - } - }.frame(height: 220) - } - - #if os(iOS) - var iOSForm: some View { - - NavigationView { - List { - Section(header: header, content: { - accountFields - }) - } - .listStyle(InsetGroupedListStyle()) - .navigationBarItems( - leading: - cancelButton - , trailing: - HStack { - if editModel.accountIsUpdatingCredentials { - ProgressView() - .frame(width: 20 , height: 20) - .padding(.horizontal, 4) - } - updateButton - } - - ) - } - } - #endif - - var header: some View { - HStack { - Spacer() - VStack { - Image(rsImage: accountSyncError.account.smallIcon!.image) - .resizable() - .frame(width: 30, height: 30) - Text(accountSyncError.account.nameForDisplay) - Text(accountSyncError.error.localizedDescription) - .multilineTextAlignment(.center) - .lineLimit(3) - .padding(.top, 4) - } - Spacer() - }.padding() - } - - @ViewBuilder - var accountFields: some View { - TextField("Username", text: $editModel.userName) - SecureField("Password", text: $editModel.password) - if accountSyncError.account.type == .freshRSS { - TextField("API URL", text: $editModel.apiUrl) - } - } - - @ViewBuilder - var updateButton: some View { - if accountSyncError.account.type != .freshRSS { - Button("Update", action: { - editModel.updateAccountCredentials(accountSyncError.account) - }).disabled(editModel.userName.count == 0 || editModel.password.count == 0) - } else { - Button("Update", action: { - editModel.updateAccountCredentials(accountSyncError.account) - }).disabled(editModel.userName.count == 0 || editModel.password.count == 0 || editModel.apiUrl.count == 0) - } - } - - var cancelButton: some View { - Button("Cancel", action: { - presentationMode.wrappedValue.dismiss() - }) - } - -} - diff --git a/Multiplatform/Shared/Add/Add Account Models/AddAccountSignUp.swift b/Multiplatform/Shared/Add/Add Account Models/AddAccountSignUp.swift deleted file mode 100644 index d2c11d5cd..000000000 --- a/Multiplatform/Shared/Add/Add Account Models/AddAccountSignUp.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// AddAccountSignUp.swift -// NetNewsWire -// -// Created by Stuart Breckenridge on 06/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation -import Account -#if os(iOS) -import UIKit -#endif - - -/// Helper functions common to most account services. -protocol AddAccountSignUp { - func presentSignUpOption(_ accountType: AccountType) -} - - -extension AddAccountSignUp { - func presentSignUpOption(_ accountType: AccountType) { - #if os(macOS) - switch accountType { - case .bazQux: - NSWorkspace.shared.open(URL(string: "https://bazqux.com")!) - case .feedbin: - NSWorkspace.shared.open(URL(string: "https://feedbin.com/signup")!) - case .feedly: - NSWorkspace.shared.open(URL(string: "https://feedly.com")!) - case .feedWrangler: - NSWorkspace.shared.open(URL(string: "https://feedwrangler.net/users/new")!) - case .freshRSS: - NSWorkspace.shared.open(URL(string: "https://freshrss.org")!) - case .inoreader: - NSWorkspace.shared.open(URL(string: "https://www.inoreader.com")!) - case .newsBlur: - NSWorkspace.shared.open(URL(string: "https://newsblur.com")!) - case .theOldReader: - NSWorkspace.shared.open(URL(string: "https://theoldreader.com")!) - default: - return - } - #else - switch accountType { - case .bazQux: - UIApplication.shared.open(URL(string: "https://bazqux.com")!, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : false], completionHandler: nil) - case .feedbin: - UIApplication.shared.open(URL(string: "https://feedbin.com/signup")!, options: [:], completionHandler: nil) - case .feedly: - UIApplication.shared.open(URL(string: "https://feedly.com")!, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : false], completionHandler: nil) - case .feedWrangler: - UIApplication.shared.open(URL(string: "https://feedwrangler.net/users/new")!, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : false], completionHandler: nil) - case .freshRSS: - UIApplication.shared.open(URL(string: "https://freshrss.org")!, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : false], completionHandler: nil) - case .inoreader: - UIApplication.shared.open(URL(string: "https://www.inoreader.com")!, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : false], completionHandler: nil) - case .newsBlur: - UIApplication.shared.open(URL(string: "https://newsblur.com")!, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : false], completionHandler: nil) - case .theOldReader: - UIApplication.shared.open(URL(string: "https://theoldreader.com")!, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : false], completionHandler: nil) - default: - return - } - #endif - } -} diff --git a/Multiplatform/Shared/Add/Add Account Models/AddFeedWranglerViewModel.swift b/Multiplatform/Shared/Add/Add Account Models/AddFeedWranglerViewModel.swift deleted file mode 100644 index f05ac68d1..000000000 --- a/Multiplatform/Shared/Add/Add Account Models/AddFeedWranglerViewModel.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// AddFeedWranglerViewModel.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 05/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -class AddFeedWranglerViewModel: ObservableObject, AddAccountSignUp { - @Published var isAuthenticating: Bool = false - @Published var accountUpdateError: AccountUpdateErrors = .none - @Published var showError: Bool = false - @Published var username: String = "" - @Published var password: String = "" - @Published var canDismiss: Bool = false - @Published var showPassword: Bool = false - - func authenticateFeedWrangler() { - - isAuthenticating = true - let credentials = Credentials(type: .feedWranglerBasic, username: username, secret: password) - - Account.validateCredentials(type: .feedWrangler, credentials: credentials) { result in - - - self.isAuthenticating = false - - switch result { - case .success(let validatedCredentials): - - guard let validatedCredentials = validatedCredentials else { - self.accountUpdateError = .invalidUsernamePassword - self.showError = true - return - } - - let account = AccountManager.shared.createAccount(type: .feedWrangler) - - do { - try account.removeCredentials(type: .feedWranglerBasic) - try account.removeCredentials(type: .feedWranglerToken) - try account.storeCredentials(credentials) - try account.storeCredentials(validatedCredentials) - self.canDismiss = true - account.refreshAll(completion: { result in - switch result { - case .success: - break - case .failure(let error): - self.accountUpdateError = .other(error: error) - self.showError = true - } - }) - } catch { - self.accountUpdateError = .keyChainError - self.showError = true - } - case .failure: - self.accountUpdateError = .networkError - self.showError = true - } - } - } -} diff --git a/Multiplatform/Shared/Add/Add Account Models/AddFeedbinViewModel.swift b/Multiplatform/Shared/Add/Add Account Models/AddFeedbinViewModel.swift deleted file mode 100644 index a043fec28..000000000 --- a/Multiplatform/Shared/Add/Add Account Models/AddFeedbinViewModel.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// AddFeedbinViewModel.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 05/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -class AddFeedbinViewModel: ObservableObject, AddAccountSignUp { - @Published var isAuthenticating: Bool = false - @Published var accountUpdateError: AccountUpdateErrors = .none - @Published var showError: Bool = false - @Published var username: String = "" - @Published var password: String = "" - @Published var canDismiss: Bool = false - @Published var showPassword: Bool = false - - func authenticateFeedbin() { - isAuthenticating = true - let credentials = Credentials(type: .basic, username: username, secret: password) - - Account.validateCredentials(type: .feedbin, credentials: credentials) { result in - self.isAuthenticating = false - - switch result { - case .success(let validatedCredentials): - - guard let validatedCredentials = validatedCredentials else { - self.accountUpdateError = .invalidUsernamePassword - self.showError = true - return - } - - let account = AccountManager.shared.createAccount(type: .feedbin) - - do { - try account.removeCredentials(type: .basic) - try account.storeCredentials(validatedCredentials) - self.isAuthenticating = false - self.canDismiss = true - account.refreshAll(completion: { result in - switch result { - case .success: - break - case .failure(let error): - self.accountUpdateError = .other(error: error) - self.showError = true - } - }) - - } catch { - self.accountUpdateError = .keyChainError - self.showError = true - } - - case .failure: - self.accountUpdateError = .networkError - self.showError = true - } - } - } -} diff --git a/Multiplatform/Shared/Add/Add Account Models/AddFeedlyViewModel.swift b/Multiplatform/Shared/Add/Add Account Models/AddFeedlyViewModel.swift deleted file mode 100644 index 7312b2f61..000000000 --- a/Multiplatform/Shared/Add/Add Account Models/AddFeedlyViewModel.swift +++ /dev/null @@ -1,67 +0,0 @@ -// -// AddFeedlyViewModel.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 05/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -class AddFeedlyViewModel: ObservableObject, OAuthAccountAuthorizationOperationDelegate, AddAccountSignUp { - @Published var isAuthenticating: Bool = false - @Published var accountUpdateError: AccountUpdateErrors = .none - @Published var showError: Bool = false - @Published var username: String = "" - @Published var password: String = "" - - func authenticateFeedly() { - isAuthenticating = true - let addAccount = OAuthAccountAuthorizationOperation(accountType: .feedly) - addAccount.delegate = self - #if os(macOS) - addAccount.presentationAnchor = NSApplication.shared.windows.last - #else - addAccount.presentationAnchor = UIApplication.shared.windows.last - #endif - MainThreadOperationQueue.shared.add(addAccount) - } - - func oauthAccountAuthorizationOperation(_ operation: OAuthAccountAuthorizationOperation, didCreate account: Account) { - - isAuthenticating = false - - // macOS only: `ASWebAuthenticationSession` leaves the browser in the foreground. - // Ensure the app is in the foreground so the user can see their Feedly account load. - #if os(macOS) - NSApplication.shared.activate(ignoringOtherApps: true) - #endif - - account.refreshAll { [weak self] result in - switch result { - case .success: - break - case .failure(let error): - self?.accountUpdateError = .other(error: error) - self?.showError = true - } - } - } - - func oauthAccountAuthorizationOperation(_ operation: OAuthAccountAuthorizationOperation, didFailWith error: Error) { - isAuthenticating = false - - // macOS only: `ASWebAuthenticationSession` leaves the browser in the foreground. - // Ensure the app is in the foreground so the user can see the error. - #if os(macOS) - NSApplication.shared.activate(ignoringOtherApps: true) - #endif - - accountUpdateError = .other(error: error) - showError = true - } -} diff --git a/Multiplatform/Shared/Add/Add Account Models/AddNewsBlurViewModel.swift b/Multiplatform/Shared/Add/Add Account Models/AddNewsBlurViewModel.swift deleted file mode 100644 index 96f58b78f..000000000 --- a/Multiplatform/Shared/Add/Add Account Models/AddNewsBlurViewModel.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// AddNewsBlurViewModel.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 05/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -class AddNewsBlurViewModel: ObservableObject, AddAccountSignUp { - @Published var isAuthenticating: Bool = false - @Published var accountUpdateError: AccountUpdateErrors = .none - @Published var showError: Bool = false - @Published var username: String = "" - @Published var password: String = "" - @Published var canDismiss: Bool = false - @Published var showPassword: Bool = false - - func authenticateNewsBlur() { - isAuthenticating = true - let credentials = Credentials(type: .newsBlurBasic, username: username, secret: password) - - Account.validateCredentials(type: .newsBlur, credentials: credentials) { result in - - self.isAuthenticating = false - - switch result { - case .success(let validatedCredentials): - - guard let validatedCredentials = validatedCredentials else { - self.accountUpdateError = .invalidUsernamePassword - self.showError = true - return - } - - let account = AccountManager.shared.createAccount(type: .newsBlur) - - do { - try account.removeCredentials(type: .newsBlurBasic) - try account.removeCredentials(type: .newsBlurSessionId) - try account.storeCredentials(credentials) - try account.storeCredentials(validatedCredentials) - self.canDismiss = true - account.refreshAll(completion: { result in - switch result { - case .success: - break - case .failure(let error): - self.accountUpdateError = .other(error: error) - self.showError = true - } - }) - - } catch { - self.accountUpdateError = .keyChainError - self.showError = true - } - - case .failure: - self.accountUpdateError = .networkError - self.showError = true - } - } - } - -} diff --git a/Multiplatform/Shared/Add/Add Account Models/AddReaderAPIViewModel.swift b/Multiplatform/Shared/Add/Add Account Models/AddReaderAPIViewModel.swift deleted file mode 100644 index c6e67897f..000000000 --- a/Multiplatform/Shared/Add/Add Account Models/AddReaderAPIViewModel.swift +++ /dev/null @@ -1,122 +0,0 @@ -// -// AddReaderAPIViewModel.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 05/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -class AddReaderAPIViewModel: ObservableObject, AddAccountSignUp { - @Published var isAuthenticating: Bool = false - @Published var accountUpdateError: AccountUpdateErrors = .none - @Published var showError: Bool = false - @Published var username: String = "" - @Published var password: String = "" - @Published var apiUrl: String = "" - @Published var canDismiss: Bool = false - @Published var showPassword: Bool = false - - func authenticateReaderAccount(_ accountType: AccountType) { - isAuthenticating = true - - let credentials = Credentials(type: .readerBasic, username: username, secret: password) - - if accountType == .freshRSS { - Account.validateCredentials(type: accountType, credentials: credentials, endpoint: URL(string: apiUrl)!) { result in - - self.isAuthenticating = false - - switch result { - case .success(let validatedCredentials): - - guard let validatedCredentials = validatedCredentials else { - self.accountUpdateError = .invalidUsernamePassword - self.showError = true - return - } - - let account = AccountManager.shared.createAccount(type: .freshRSS) - - do { - try account.removeCredentials(type: .readerBasic) - try account.removeCredentials(type: .readerAPIKey) - try account.storeCredentials(credentials) - try account.storeCredentials(validatedCredentials) - self.canDismiss = true - account.refreshAll(completion: { result in - switch result { - case .success: - break - case .failure(let error): - self.accountUpdateError = .other(error: error) - self.showError = true - } - }) - - } catch { - self.accountUpdateError = .keyChainError - self.showError = true - } - - case .failure: - self.accountUpdateError = .networkError - self.showError = true - } - } - } - - else { - - Account.validateCredentials(type: accountType, credentials: credentials) { result in - - self.isAuthenticating = false - - switch result { - case .success(let validatedCredentials): - - guard let validatedCredentials = validatedCredentials else { - self.accountUpdateError = .invalidUsernamePassword - self.showError = true - return - } - - let account = AccountManager.shared.createAccount(type: .freshRSS) - - do { - try account.removeCredentials(type: .readerBasic) - try account.removeCredentials(type: .readerAPIKey) - try account.storeCredentials(credentials) - try account.storeCredentials(validatedCredentials) - self.canDismiss = true - account.refreshAll(completion: { result in - switch result { - case .success: - break - case .failure(let error): - self.accountUpdateError = .other(error: error) - self.showError = true - } - }) - - } catch { - self.accountUpdateError = .keyChainError - self.showError = true - } - - case .failure: - self.accountUpdateError = .networkError - self.showError = true - } - } - - } - - } - -} diff --git a/Multiplatform/Shared/Add/Add Account Sheets/AddCloudKitAccountView.swift b/Multiplatform/Shared/Add/Add Account Sheets/AddCloudKitAccountView.swift deleted file mode 100644 index b7ee03318..000000000 --- a/Multiplatform/Shared/Add/Add Account Sheets/AddCloudKitAccountView.swift +++ /dev/null @@ -1,134 +0,0 @@ -// -// AddCloudKitAccountView.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 03/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account - -struct AddCloudKitAccountView: View { - - @Environment (\.presentationMode) var presentationMode - - var body: some View { - - #if os(macOS) - macBody - #else - NavigationView { - iosBody - } - #endif - - } - - #if os(iOS) - var iosBody: some View { - List { - Section(header: formHeader, footer: formFooter, content: { - Button(action: { - _ = AccountManager.shared.createAccount(type: .cloudKit) - presentationMode.wrappedValue.dismiss() - }, label: { - HStack { - Spacer() - Text("Add Account") - Spacer() - } - }).disabled(AccountManager.shared.activeAccounts.filter({ $0.type == .cloudKit }).count > 0) - }) - }.navigationBarItems(leading: - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - }) - ) - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(Text(AccountType.cloudKit.localizedAccountName())) - .listStyle(InsetGroupedListStyle()) - } - #endif - - #if os(macOS) - var macBody: some View { - VStack { - HStack(spacing: 16) { - VStack(alignment: .leading) { - AccountType.cloudKit.image() - .resizable() - .frame(width: 50, height: 50) - Spacer() - } - VStack(alignment: .leading, spacing: 8) { - Text("Sign in to your iCloud account.") - .font(.headline) - - Text("This account syncs across your Mac and iOS devices using your iCloud account.") - .foregroundColor(.secondary) - .font(.callout) - .lineLimit(2) - .padding(.top, 4) - - Spacer() - HStack(spacing: 8) { - Spacer() - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - .frame(width: 60) - }).keyboardShortcut(.cancelAction) - - Button(action: { - _ = AccountManager.shared.createAccount(type: .cloudKit) - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Create") - .frame(width: 60) - }) - .keyboardShortcut(.defaultAction) - .disabled(AccountManager.shared.activeAccounts.filter({ $0.type == .cloudKit }).count > 0) - } - } - } - } - .padding() - .frame(minWidth: 400, maxWidth: 400, maxHeight: 150) - } - #endif - - var formHeader: some View { - HStack { - Spacer() - VStack(alignment: .center) { - AccountType.cloudKit.image() - .resizable() - .frame(width: 50, height: 50) - } - Spacer() - }.padding(.vertical) - } - - var formFooter: some View { - HStack { - Spacer() - VStack(spacing: 8) { - Text("This account syncs across your Mac and iOS devices using your iCloud account.").foregroundColor(.secondary) - } - .multilineTextAlignment(.center) - .font(.caption) - Spacer() - - }.padding(.vertical) - } -} - -struct AddCloudKitAccountView_Previews: PreviewProvider { - static var previews: some View { - AddCloudKitAccountView() - } -} diff --git a/Multiplatform/Shared/Add/Add Account Sheets/AddFeedWranglerAccountView.swift b/Multiplatform/Shared/Add/Add Account Sheets/AddFeedWranglerAccountView.swift deleted file mode 100644 index 5fe5d27c7..000000000 --- a/Multiplatform/Shared/Add/Add Account Sheets/AddFeedWranglerAccountView.swift +++ /dev/null @@ -1,216 +0,0 @@ -// -// AddFeedWranglerAccountView.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 03/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - - -struct AddFeedWranglerAccountView: View { - - @Environment (\.presentationMode) var presentationMode - @StateObject private var model = AddFeedWranglerViewModel() - - var body: some View { - #if os(macOS) - macBody - #else - NavigationView { - iosBody - } - #endif - } - - - #if os(iOS) - var iosBody: some View { - List { - Section(header: formHeader, content: { - TextField("Email", text: $model.username) - if model.showPassword == false { - ZStack { - HStack { - SecureField("Password", text: $model.password) - Spacer() - Image(systemName: "eye.fill") - .foregroundColor(.accentColor) - .onTapGesture { - model.showPassword = true - } - } - } - } - else { - ZStack { - HStack { - TextField("Password", text: $model.password) - Spacer() - Image(systemName: "eye.slash.fill") - .foregroundColor(.accentColor) - .onTapGesture { - model.showPassword = false - } - } - } - } - - }) - - Section(footer: formFooter, content: { - Button(action: { - model.authenticateFeedWrangler() - }, label: { - HStack { - Spacer() - Text("Add Account") - Spacer() - } - }).disabled(model.username.isEmpty || model.password.isEmpty) - }) - - } - .navigationBarItems(leading: - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - })) - .listStyle(InsetGroupedListStyle()) - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(Text("Feed Wrangler")) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel(Text("Dismiss"))) - }) - .onReceive(model.$canDismiss, perform: { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - }) - } - #endif - - #if os(macOS) - var macBody: some View { - VStack { - HStack(spacing: 16) { - VStack(alignment: .leading) { - AccountType.feedWrangler.image() - .resizable() - .frame(width: 50, height: 50) - Spacer() - } - VStack(alignment: .leading, spacing: 8) { - Text("Sign in to your Feed Wrangler account.") - .font(.headline) - HStack { - Text("Don’t have a Feed Wrangler account?") - .font(.callout) - Button(action: { - model.presentSignUpOption(.feedWrangler) - }, label: { - Text("Sign up here.").font(.callout) - }).buttonStyle(LinkButtonStyle()) - } - - HStack { - VStack(alignment: .trailing, spacing: 14) { - Text("Email") - Text("Password") - } - VStack(spacing: 8) { - TextField("me@email.com", text: $model.username) - SecureField("•••••••••••", text: $model.password) - } - } - - Text("Your username and password will be encrypted and stored in Keychain.") - .foregroundColor(.secondary) - .font(.callout) - .lineLimit(2) - .padding(.top, 4) - - Spacer() - HStack(spacing: 8) { - Spacer() - ProgressView() - .scaleEffect(CGSize(width: 0.5, height: 0.5)) - .hidden(!model.isAuthenticating) - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - .frame(width: 60) - }).keyboardShortcut(.cancelAction) - - Button(action: { - model.authenticateFeedWrangler() - }, label: { - Text("Sign In") - .frame(width: 60) - }) - .keyboardShortcut(.defaultAction) - .disabled(model.username.isEmpty || model.password.isEmpty) - } - } - } - } - .padding() - .frame(minWidth: 400, maxWidth: 400, minHeight: 230, maxHeight: 260) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel()) - }) - .onReceive(model.$canDismiss, perform: { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - }) - } - #endif - - var formHeader: some View { - HStack { - Spacer() - VStack(alignment: .center) { - AccountType.feedWrangler.image() - .resizable() - .frame(width: 50, height: 50) - } - Spacer() - }.padding(.vertical) - } - - var formFooter: some View { - HStack { - Spacer() - VStack(spacing: 8) { - Text("Sign in to your Feed Wrangler account and sync your feeds across your devices. Your username and password and password will be encrypted and stored in Keychain.").foregroundColor(.secondary) - Text("Don’t have a Feed Wrangler account?").foregroundColor(.secondary) - Button(action: { - model.presentSignUpOption(.feedWrangler) - }, label: { - Text("Sign Up Here").foregroundColor(.blue).multilineTextAlignment(.center) - }) - ProgressView().hidden(!model.isAuthenticating) - } - .multilineTextAlignment(.center) - .font(.caption2) - Spacer() - - }.padding(.vertical) - } - -} - -struct AddFeedWranglerAccountView_Previews: PreviewProvider { - static var previews: some View { - AddFeedWranglerAccountView() - } -} diff --git a/Multiplatform/Shared/Add/Add Account Sheets/AddFeedbinAccountView.swift b/Multiplatform/Shared/Add/Add Account Sheets/AddFeedbinAccountView.swift deleted file mode 100644 index dd33b6434..000000000 --- a/Multiplatform/Shared/Add/Add Account Sheets/AddFeedbinAccountView.swift +++ /dev/null @@ -1,214 +0,0 @@ -// -// AddFeedbinAccountView.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 02/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -struct AddFeedbinAccountView: View { - - @Environment (\.presentationMode) var presentationMode - @StateObject private var model = AddFeedbinViewModel() - - var body: some View { - #if os(macOS) - macBody - #else - NavigationView { - iosBody - } - #endif - } - - #if os(iOS) - var iosBody: some View { - List { - Section(header: formHeader, content: { - TextField("Email", text: $model.username) - if model.showPassword == false { - ZStack { - HStack { - SecureField("Password", text: $model.password) - Spacer() - Image(systemName: "eye.fill") - .foregroundColor(.accentColor) - .onTapGesture { - model.showPassword = true - } - } - } - } - else { - ZStack { - HStack { - TextField("Password", text: $model.password) - Spacer() - Image(systemName: "eye.slash.fill") - .foregroundColor(.accentColor) - .onTapGesture { - model.showPassword = false - } - } - } - } - - }) - - Section(footer: formFooter, content: { - Button(action: { - model.authenticateFeedbin() - }, label: { - HStack { - Spacer() - Text("Add Account") - Spacer() - } - }).disabled(model.username.isEmpty || model.password.isEmpty) - }) - - } - .navigationBarItems(leading: - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - })) - .listStyle(InsetGroupedListStyle()) - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(Text("Feedbin")) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel(Text("Dismiss"))) - }) - .onReceive(model.$canDismiss, perform: { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - }) - } - #endif - - #if os(macOS) - var macBody: some View { - VStack { - HStack(spacing: 16) { - VStack(alignment: .leading) { - AccountType.feedbin.image() - .frame(width: 50, height: 50) - Spacer() - } - VStack(alignment: .leading, spacing: 8) { - Text("Sign in to your Feedbin account.") - .font(.headline) - HStack { - Text("Don’t have a Feedbin account?") - .font(.callout) - Button(action: { - model.presentSignUpOption(.feedbin) - }, label: { - Text("Sign up here.").font(.callout) - }).buttonStyle(LinkButtonStyle()) - } - - HStack { - VStack(alignment: .trailing, spacing: 14) { - Text("Email") - Text("Password") - } - VStack(spacing: 8) { - TextField("me@email.com", text: $model.username) - SecureField("•••••••••••", text: $model.password) - } - } - - Text("Your username and password will be encrypted and stored in Keychain.") - .foregroundColor(.secondary) - .font(.callout) - .lineLimit(2) - .padding(.top, 4) - - Spacer() - HStack(spacing: 8) { - Spacer() - ProgressView() - .scaleEffect(CGSize(width: 0.5, height: 0.5)) - .hidden(!model.isAuthenticating) - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - .frame(width: 60) - }).keyboardShortcut(.cancelAction) - - Button(action: { - model.authenticateFeedbin() - }, label: { - Text("Sign In") - .frame(width: 60) - }) - .keyboardShortcut(.defaultAction) - .disabled(model.username.isEmpty || model.password.isEmpty) - } - } - } - } - .padding() - .frame(minWidth: 400, maxWidth: 400, minHeight: 230, maxHeight: 260) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel()) - }) - .onReceive(model.$canDismiss, perform: { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - }) - } - #endif - - var formHeader: some View { - HStack { - Spacer() - VStack(alignment: .center) { - AccountType.feedbin.image() - .resizable() - .frame(width: 50, height: 50) - } - Spacer() - }.padding(.vertical) - } - - var formFooter: some View { - HStack { - Spacer() - VStack(spacing: 8) { - Text("Sign in to your Feedbin account and sync your feeds across your devices. Your username and password and password will be encrypted and stored in Keychain.").foregroundColor(.secondary) - Text("Don’t have a Feedbin account?").foregroundColor(.secondary) - Button(action: { - model.presentSignUpOption(.feedbin) - }, label: { - Text("Sign Up Here").foregroundColor(.blue).multilineTextAlignment(.center) - }) - ProgressView().hidden(!model.isAuthenticating) - } - .multilineTextAlignment(.center) - .font(.caption2) - Spacer() - - }.padding(.vertical) - } - - -} - -struct AddFeedbinAccountView_Previews: PreviewProvider { - static var previews: some View { - AddFeedbinAccountView() - } -} diff --git a/Multiplatform/Shared/Add/Add Account Sheets/AddFeedlyAccountView.swift b/Multiplatform/Shared/Add/Add Account Sheets/AddFeedlyAccountView.swift deleted file mode 100644 index 32f14553a..000000000 --- a/Multiplatform/Shared/Add/Add Account Sheets/AddFeedlyAccountView.swift +++ /dev/null @@ -1,149 +0,0 @@ -// -// AddFeedlyAccountView.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 05/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -struct AddFeedlyAccountView: View { - - @Environment (\.presentationMode) var presentationMode - @StateObject private var model = AddFeedlyViewModel() - - var body: some View { - #if os(macOS) - macBody - #else - NavigationView { - iosBody - } - #endif - } - - - #if os(iOS) - var iosBody: some View { - List { - Section(header: formHeader, footer: formFooter, content: { - Button(action: { - model.authenticateFeedly() - }, label: { - HStack { - Spacer() - Text("Add Account") - Spacer() - } - }) - }) - }.navigationBarItems(leading: - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - }) - ) - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(Text(AccountType.feedly.localizedAccountName())) - .listStyle(InsetGroupedListStyle()) - - } - #endif - - #if os(macOS) - var macBody: some View { - VStack { - HStack(spacing: 16) { - VStack(alignment: .leading) { - AccountType.feedly.image() - .resizable() - .frame(width: 50, height: 50) - Spacer() - } - VStack(alignment: .leading, spacing: 8) { - Text("Sign in to your Feedly account.") - .font(.headline) - HStack { - Text("Don’t have a Feedly account?") - .font(.callout) - Button(action: { - model.presentSignUpOption(.feedly) - }, label: { - Text("Sign up here.").font(.callout) - }).buttonStyle(LinkButtonStyle()) - } - - Spacer() - HStack(spacing: 8) { - Spacer() - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - .frame(width: 60) - }).keyboardShortcut(.cancelAction) - - Button(action: { - model.authenticateFeedly() - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Sign In") - .frame(width: 60) - }) - .keyboardShortcut(.defaultAction) - .disabled(AccountManager.shared.activeAccounts.filter({ $0.type == .cloudKit }).count > 0) - } - } - } - } - .padding() - .frame(minWidth: 400, maxWidth: 400, maxHeight: 150) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel()) - }) - } - #endif - - var formHeader: some View { - HStack { - Spacer() - VStack(alignment: .center) { - AccountType.feedly.image() - .resizable() - .frame(width: 50, height: 50) - } - Spacer() - }.padding(.vertical) - } - - var formFooter: some View { - HStack { - Spacer() - VStack(spacing: 8) { - Text("Sign in to your Feedly account and sync your feeds across your devices. Your username and password will be encrypted and stored in Keychain.\n\nDon’t have an Feedly account?").foregroundColor(.secondary) - Button(action: { - model.presentSignUpOption(.feedly) - }, label: { - Text("Sign Up Here").foregroundColor(.blue).multilineTextAlignment(.center) - }) - } - .multilineTextAlignment(.center) - .font(.caption) - Spacer() - - }.padding(.vertical) - } - -} - -struct AddFeedlyAccountView_Previews: PreviewProvider { - static var previews: some View { - AddFeedlyAccountView() - } -} diff --git a/Multiplatform/Shared/Add/Add Account Sheets/AddLocalAccountView.swift b/Multiplatform/Shared/Add/Add Account Sheets/AddLocalAccountView.swift deleted file mode 100644 index e24923273..000000000 --- a/Multiplatform/Shared/Add/Add Account Sheets/AddLocalAccountView.swift +++ /dev/null @@ -1,140 +0,0 @@ -// -// AddLocalAccountView.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 02/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore - -struct AddLocalAccountView: View { - - @State private var newAccountName: String = "" - @Environment (\.presentationMode) var presentationMode - - var body: some View { - #if os(macOS) - macBody - #else - NavigationView { - iosBody - } - #endif - } - - #if os(iOS) - var iosBody: some View { - List { - Section(header: formHeader, content: { - TextField("Account Name", text: $newAccountName) - }) - - Section(footer: formFooter, content: { - Button(action: { - let newAccount = AccountManager.shared.createAccount(type: .onMyMac) - newAccount.name = newAccountName - presentationMode.wrappedValue.dismiss() - }, label: { - HStack { - Spacer() - Text("Add Account") - Spacer() - } - }) - }) - }.navigationBarItems(leading: - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - }) - ) - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(Text(AccountType.onMyMac.localizedAccountName())) - .listStyle(InsetGroupedListStyle()) - } - #endif - - #if os(macOS) - var macBody: some View { - VStack { - HStack(spacing: 16) { - VStack(alignment: .leading) { - AccountType.onMyMac.image() - .resizable() - .frame(width: 50, height: 50) - Spacer() - } - VStack(alignment: .leading, spacing: 8) { - Text("Create a local account on your Mac.") - .font(.headline) - Text("Local accounts store their data on your Mac. They do not sync across your devices.") - .font(.callout) - .foregroundColor(.secondary) - HStack { - Text("Name: ") - TextField("Account Name", text: $newAccountName) - }.padding(.top, 8) - Spacer() - HStack(spacing: 8) { - Spacer() - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - .frame(width: 60) - }).keyboardShortcut(.cancelAction) - - Button(action: { - let newAccount = AccountManager.shared.createAccount(type: .onMyMac) - newAccount.name = newAccountName - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Create") - .frame(width: 60) - }).keyboardShortcut(.defaultAction) - } - } - } - } - .padding() - .frame(minWidth: 400, maxWidth: 400, minHeight: 230, maxHeight: 260) - .textFieldStyle(RoundedBorderTextFieldStyle()) - } - #endif - - var formHeader: some View { - HStack { - Spacer() - VStack(alignment: .center) { - AccountType.onMyMac.image() - .resizable() - .frame(width: 50, height: 50) - } - Spacer() - }.padding(.vertical) - } - - var formFooter: some View { - HStack { - Spacer() - VStack(spacing: 8) { - Text("Local accounts do not sync your feeds across devices.").foregroundColor(.secondary) - } - .multilineTextAlignment(.center) - .font(.caption) - Spacer() - - }.padding(.vertical) - } - -} - -struct AddLocalAccount_Previews: PreviewProvider { - static var previews: some View { - AddLocalAccountView() - } -} diff --git a/Multiplatform/Shared/Add/Add Account Sheets/AddNewsBlurAccountView.swift b/Multiplatform/Shared/Add/Add Account Sheets/AddNewsBlurAccountView.swift deleted file mode 100644 index 8f6c35b1c..000000000 --- a/Multiplatform/Shared/Add/Add Account Sheets/AddNewsBlurAccountView.swift +++ /dev/null @@ -1,212 +0,0 @@ -// -// AddNewsBlurAccountView.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 03/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -struct AddNewsBlurAccountView: View { - - @Environment (\.presentationMode) var presentationMode - @StateObject private var model = AddNewsBlurViewModel() - - var body: some View { - #if os(macOS) - macBody - #else - NavigationView { - iosBody - } - #endif - } - - #if os(iOS) - var iosBody: some View { - List { - Section(header: formHeader, content: { - TextField("Email", text: $model.username) - if model.showPassword == false { - ZStack { - HStack { - SecureField("Password", text: $model.password) - Spacer() - Image(systemName: "eye.fill") - .foregroundColor(.accentColor) - .onTapGesture { - model.showPassword = true - } - } - } - } - else { - ZStack { - HStack { - TextField("Password", text: $model.password) - Spacer() - Image(systemName: "eye.slash.fill") - .foregroundColor(.accentColor) - .onTapGesture { - model.showPassword = false - } - } - } - } - - }) - - Section(footer: formFooter, content: { - Button(action: { - model.authenticateNewsBlur() - }, label: { - HStack { - Spacer() - Text("Add Account") - Spacer() - } - }).disabled(model.username.isEmpty || model.password.isEmpty) - }) - - } - .navigationBarItems(leading: - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - })) - .listStyle(InsetGroupedListStyle()) - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(Text("NewsBlur")) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel(Text("Dismiss"))) - }) - .onReceive(model.$canDismiss, perform: { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - }) - } - #endif - - #if os(macOS) - var macBody: some View { - VStack { - HStack(spacing: 16) { - VStack(alignment: .leading) { - AccountType.newsBlur.image() - .frame(width: 50, height: 50) - Spacer() - } - VStack(alignment: .leading, spacing: 8) { - Text("Sign in to your NewsBlur account.") - .font(.headline) - HStack { - Text("Don’t have a NewsBlur account?") - .font(.callout) - Button(action: { - model.presentSignUpOption(.newsBlur) - }, label: { - Text("Sign up here.").font(.callout) - }).buttonStyle(LinkButtonStyle()) - } - - HStack { - VStack(alignment: .trailing, spacing: 14) { - Text("Email") - Text("Password") - } - VStack(spacing: 8) { - TextField("me@email.com", text: $model.username) - SecureField("•••••••••••", text: $model.password) - } - } - - Text("Your username and password will be encrypted and stored in Keychain.") - .foregroundColor(.secondary) - .font(.callout) - .lineLimit(2) - .padding(.top, 4) - - Spacer() - HStack(spacing: 8) { - Spacer() - ProgressView() - .scaleEffect(CGSize(width: 0.5, height: 0.5)) - .hidden(!model.isAuthenticating) - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - .frame(width: 60) - }).keyboardShortcut(.cancelAction) - - Button(action: { - model.authenticateNewsBlur() - }, label: { - Text("Sign In") - .frame(width: 60) - }) - .keyboardShortcut(.defaultAction) - .disabled(model.username.isEmpty || model.password.isEmpty) - } - } - } - } - .padding() - .frame(minWidth: 400, maxWidth: 400, minHeight: 230, maxHeight: 260) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel()) - }) - .onReceive(model.$canDismiss, perform: { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - }) - } - #endif - - var formHeader: some View { - HStack { - Spacer() - VStack(alignment: .center) { - AccountType.newsBlur.image() - .resizable() - .frame(width: 50, height: 50) - } - Spacer() - }.padding(.vertical) - } - - var formFooter: some View { - HStack { - Spacer() - VStack(spacing: 8) { - Text("Sign in to your NewsBlur account and sync your feeds across your devices. Your username and password and password will be encrypted and stored in Keychain.").foregroundColor(.secondary) - Text("Don’t have a NewsBlur account?").foregroundColor(.secondary) - Button(action: { - model.presentSignUpOption(.newsBlur) - }, label: { - Text("Sign Up Here").foregroundColor(.blue).multilineTextAlignment(.center) - }) - ProgressView().hidden(!model.isAuthenticating) - } - .multilineTextAlignment(.center) - .font(.caption2) - Spacer() - - }.padding(.vertical) - } -} - -struct AddNewsBlurAccountView_Previews: PreviewProvider { - static var previews: some View { - AddNewsBlurAccountView() - } -} diff --git a/Multiplatform/Shared/Add/Add Account Sheets/AddReaderAPIAccountView.swift b/Multiplatform/Shared/Add/Add Account Sheets/AddReaderAPIAccountView.swift deleted file mode 100644 index 0d2f70c75..000000000 --- a/Multiplatform/Shared/Add/Add Account Sheets/AddReaderAPIAccountView.swift +++ /dev/null @@ -1,247 +0,0 @@ -// -// AddReaderAPIAccountView.swift -// Multiplatform macOS -// -// Created by Stuart Breckenridge on 03/12/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore -import RSWeb -import Secrets - -struct AddReaderAPIAccountView: View { - - @Environment (\.presentationMode) var presentationMode - @StateObject private var model = AddReaderAPIViewModel() - public var accountType: AccountType - - var body: some View { - #if os(macOS) - macBody - #else - NavigationView { - iosBody - } - #endif - } - - #if os(iOS) - var iosBody: some View { - List { - Section(header: formHeader, content: { - TextField("Email", text: $model.username) - if model.showPassword == false { - ZStack { - HStack { - SecureField("Password", text: $model.password) - Spacer() - Image(systemName: "eye.fill") - .foregroundColor(.accentColor) - .onTapGesture { - model.showPassword = true - } - } - } - } - else { - ZStack { - HStack { - TextField("Password", text: $model.password) - Spacer() - Image(systemName: "eye.slash.fill") - .foregroundColor(.accentColor) - .onTapGesture { - model.showPassword = false - } - } - } - } - if accountType == .freshRSS { - TextField("API URL", text: $model.apiUrl) - } - - }) - - Section(footer: formFooter, content: { - Button(action: { - model.authenticateReaderAccount(accountType) - }, label: { - HStack { - Spacer() - Text("Add Account") - Spacer() - } - }).disabled(createDisabled()) - }) - - } - .navigationBarItems(leading: - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - })) - .listStyle(InsetGroupedListStyle()) - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(Text(accountType.localizedAccountName())) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel(Text("Dismiss"))) - }) - .onReceive(model.$canDismiss, perform: { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - }) - } - #endif - - #if os(macOS) - var macBody: some View { - VStack { - HStack(spacing: 16) { - VStack(alignment: .leading) { - accountType.image() - .resizable() - .frame(width: 50, height: 50) - Spacer() - } - VStack(alignment: .leading, spacing: 8) { - Text("Sign in to your \(accountType.localizedAccountName()) account.") - .font(.headline) - HStack { - if accountType == .freshRSS { - Text("Don’t have a \(accountType.localizedAccountName()) instance?") - .font(.callout) - } else { - Text("Don’t have an \(accountType.localizedAccountName()) account?") - .font(.callout) - } - Button(action: { - model.presentSignUpOption(accountType) - }, label: { - Text(accountType == .freshRSS ? "Find out more." : "Sign up here.").font(.callout) - }).buttonStyle(LinkButtonStyle()) - } - - HStack { - VStack(alignment: .trailing, spacing: 14) { - Text("Email") - Text("Password") - if accountType == .freshRSS { - Text("API URL") - } - } - VStack(spacing: 8) { - TextField("me@email.com", text: $model.username) - SecureField("•••••••••••", text: $model.password) - if accountType == .freshRSS { - TextField("https://myfreshrss.rocks", text: $model.apiUrl) - } - } - } - - Text("Your username and password will be encrypted and stored in Keychain.") - .foregroundColor(.secondary) - .font(.callout) - .lineLimit(2) - .padding(.top, 4) - - Spacer() - HStack(spacing: 8) { - Spacer() - ProgressView() - .scaleEffect(CGSize(width: 0.5, height: 0.5)) - .hidden(!model.isAuthenticating) - Button(action: { - presentationMode.wrappedValue.dismiss() - }, label: { - Text("Cancel") - .frame(width: 60) - }).keyboardShortcut(.cancelAction) - - Button(action: { - model.authenticateReaderAccount(accountType) - }, label: { - Text("Sign In") - .frame(width: 60) - }) - .keyboardShortcut(.defaultAction) - .disabled(createDisabled()) - } - } - } - } - .padding() - .frame(width: 400, height: height()) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .alert(isPresented: $model.showError, content: { - Alert(title: Text("Sign In Error"), message: Text(model.accountUpdateError.description), dismissButton: .cancel()) - }) - .onReceive(model.$canDismiss, perform: { value in - if value == true { - presentationMode.wrappedValue.dismiss() - } - }) - } - #endif - - - - - func createDisabled() -> Bool { - if accountType == .freshRSS { - return model.username.isEmpty || model.password.isEmpty || !model.apiUrl.mayBeURL - } - return model.username.isEmpty || model.password.isEmpty - } - - func height() -> CGFloat { - if accountType == .freshRSS { - return 260 - } - return 230 - } - - var formHeader: some View { - HStack { - Spacer() - VStack(alignment: .center) { - accountType.image() - .resizable() - .frame(width: 50, height: 50) - } - Spacer() - }.padding(.vertical) - } - - var formFooter: some View { - HStack { - Spacer() - VStack(spacing: 8) { - Text("Sign in to your \(accountType.localizedAccountName()) account and sync your feeds across your devices. Your username and password and password will be encrypted and stored in Keychain.").foregroundColor(.secondary) - Text("Don’t have a \(accountType.localizedAccountName()) instance?").foregroundColor(.secondary) - Button(action: { - model.presentSignUpOption(accountType) - }, label: { - Text("Sign Up Here").foregroundColor(.blue).multilineTextAlignment(.center) - }) - ProgressView().hidden(!model.isAuthenticating) - } - .multilineTextAlignment(.center) - .font(.caption2) - Spacer() - - }.padding(.vertical) - } - -} - -struct AddReaderAPIAccountView_Previews: PreviewProvider { - static var previews: some View { - AddReaderAPIAccountView(accountType: .freshRSS) - //AddReaderAPIAccountView(accountType: .inoreader) - } -} diff --git a/Multiplatform/Shared/Add/AddFolderModel.swift b/Multiplatform/Shared/Add/AddFolderModel.swift deleted file mode 100644 index 57da82f7e..000000000 --- a/Multiplatform/Shared/Add/AddFolderModel.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// AddFolderModel.swift -// NetNewsWire -// -// Created by Alex Faber on 04/07/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation -import Account -import RSCore -import SwiftUI - - -class AddFolderModel: ObservableObject { - - @Published var shouldDismiss: Bool = false - @Published var folderName: String = "" - @Published var selectedAccountIndex: Int = 0 - @Published var accounts: [Account] = [] - - @Published var showError: Bool = false - @Published var showProgressIndicator: Bool = false - - init() { - for account in - AccountManager.shared.sortedActiveAccounts{ - accounts.append(account) - } - } - - func addFolder() { - let account = accounts[selectedAccountIndex] - - showProgressIndicator = true - - account.addFolder(folderName){ result in - self.showProgressIndicator = false - - switch result { - case .success(_): - self.shouldDismiss = true - - case .failure(let error): - print("Error") - print(error) - } - - } - } -} diff --git a/Multiplatform/Shared/Add/AddFolderView.swift b/Multiplatform/Shared/Add/AddFolderView.swift deleted file mode 100644 index 1167096c5..000000000 --- a/Multiplatform/Shared/Add/AddFolderView.swift +++ /dev/null @@ -1,125 +0,0 @@ -// -// AddFolderView.swift -// NetNewsWire -// -// Created by Alex Faber on 04/07/2020. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore - -struct AddFolderView: View { - - @ObservedObject private var viewModel = AddFolderModel() - @Binding var isPresented: Bool - - var body: some View { - #if os(iOS) - iosForm - .onReceive(viewModel.$shouldDismiss, perform: { - dismiss in - if dismiss == true { - isPresented = false - } - }) - #else - macForm - .onReceive(viewModel.$shouldDismiss, perform: { dismiss in - if dismiss == true { - isPresented = false - } - }) - #endif - } - #if os(iOS) - var iosForm: some View { - NavigationView { - Form { - Section { - TextField("Name", text: $viewModel.folderName) - } - Section { - accountPicker - } - } - .navigationTitle("Add Folder") - .navigationBarTitleDisplayMode(.inline) - .navigationBarItems( - leading:Button("Cancel", action: { - isPresented = false - } - ) - .help("Cancel Adding Folder"), - trailing:Button("Add", action: { - viewModel.addFolder() - } - ) - .disabled(viewModel.folderName.isEmpty) - .help("Save Adding Folder") - ) - - } - } - #endif - - #if os(macOS) - var macForm: some View { - Form { - HStack { - Spacer() - Image(rsImage: AppAssets.faviconTemplateImage) - .resizable() - .renderingMode(.template) - .frame(width: 30, height: 30) - Text("Add a Folder") - .font(.title) - Spacer() - } - - LazyVGrid(columns: [GridItem(.fixed(75), spacing: 10, alignment: .trailing),GridItem(.fixed(400), spacing: 0, alignment: .leading) ], alignment: .leading, spacing: 10, pinnedViews: [], content:{ - Text("Name:").bold() - TextField("Name", text: $viewModel.folderName) - .textFieldStyle(RoundedBorderTextFieldStyle()) - .help("The name of the folder you want to create") - Text("Account:").bold() - accountPicker - .help("Pick the account you want to create a folder in.") - }) - buttonStack - } - .frame(maxWidth: 485) - .padding(12) - } - #endif - - var accountPicker: some View { - Picker("Account:", selection: $viewModel.selectedAccountIndex, content: { - ForEach(0.. AccountAndFolderSpecifier? { - if let account = container as? Account { - return AccountAndFolderSpecifier(account: account, folder: nil) - } - if let folder = container as? Folder, let account = folder.account { - return AccountAndFolderSpecifier(account: account, folder: folder) - } - return nil - } - - func addWebFeed() { - if let account = accountAndFolderFromContainer(containers[selectedFolderIndex])?.account { - - showProgressIndicator = true - - let normalizedURLString = providedURL.normalizedURL - - guard !normalizedURLString.isEmpty, let url = URL(string: normalizedURLString) else { - showProgressIndicator = false - return - } - - let container = containers[selectedFolderIndex] - - if account.hasWebFeed(withURL: normalizedURLString) { - addFeedError = .alreadySubscribed - showProgressIndicator = false - return - } - - account.createWebFeed(url: url.absoluteString, name: providedName, container: container, validateFeed: true, completion: { [weak self] result in - self?.showProgressIndicator = false - switch result { - case .success(let feed): - NotificationCenter.default.post(name: .UserDidAddFeed, object: self, userInfo: [UserInfoKey.webFeed: feed]) - self?.shouldDismiss = true - case .failure(let error): - switch error { - case AccountError.createErrorAlreadySubscribed: - self?.addFeedError = .alreadySubscribed - return - case AccountError.createErrorNotFound: - self?.addFeedError = .noFeeds - return - default: - print("Error") - } - } - }) - } - } - - func smallIconImage(for container: Container) -> RSImage? { - if let smallIconProvider = container as? SmallIconProvider { - return smallIconProvider.smallIcon?.image - } - return nil - } - -} diff --git a/Multiplatform/Shared/Add/AddWebFeedView.swift b/Multiplatform/Shared/Add/AddWebFeedView.swift deleted file mode 100644 index e898312e0..000000000 --- a/Multiplatform/Shared/Add/AddWebFeedView.swift +++ /dev/null @@ -1,209 +0,0 @@ -// -// AddWebFeedView.swift -// NetNewsWire -// -// Created by Stuart Breckenridge on 3/7/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Account -import RSCore - - -struct AddWebFeedView: View { - - @StateObject private var viewModel = AddWebFeedModel() - @Binding var isPresented: Bool - - var body: some View { - #if os(iOS) - iosForm - .onAppear { - viewModel.pasteUrlFromPasteboard() - } - .onReceive(viewModel.$shouldDismiss, perform: { dismiss in - if dismiss == true { - isPresented = false - } - }) - #else - macForm - .onAppear { - viewModel.pasteUrlFromPasteboard() - }.alert(isPresented: $viewModel.showError) { - Alert(title: Text("Oops"), - message: Text(viewModel.addFeedError!.localizedDescription), - dismissButton: Alert.Button.cancel({ - viewModel.addFeedError = AddWebFeedError.none - })) - } - .onChange(of: viewModel.shouldDismiss, perform: { dismiss in - if dismiss == true { - isPresented = false - } - }) - #endif - } - - #if os(macOS) - var macForm: some View { - Form { - HStack { - Spacer() - Image(rsImage: AppAssets.faviconTemplateImage) - .resizable() - .renderingMode(.template) - .frame(width: 30, height: 30) - Text("Add a Web Feed") - .font(.title) - Spacer() - }.padding() - - LazyVGrid(columns: [GridItem(.fixed(75), spacing: 10, alignment: .trailing),GridItem(.fixed(400), spacing: 0, alignment: .leading) ], alignment: .leading, spacing: 10, pinnedViews: [], content:{ - Text("URL:").bold() - urlTextField - .textFieldStyle(RoundedBorderTextFieldStyle()) - .help("The URL of the feed you want to add.") - Text("Name:").bold() - providedNameTextField - .textFieldStyle(RoundedBorderTextFieldStyle()) - .help("The name of the feed. (Optional.)") - Text("Folder:").bold() - folderPicker - .help("Pick the folder you want to add the feed to.") - }) - buttonStack - } - .frame(maxWidth: 485) - .padding(12) - } - #endif - - #if os(iOS) - var iosForm: some View { - NavigationView { - List { - urlTextField - providedNameTextField - folderPicker - } - .listStyle(InsetGroupedListStyle()) - .navigationBarTitle("Add Web Feed") - .navigationBarTitleDisplayMode(.inline) - .navigationBarItems(leading: - Button("Cancel", action: { - isPresented = false - }) - .help("Cancel Add Feed") - , trailing: - HStack(spacing: 12) { - if viewModel.showProgressIndicator == true { - ProgressView() - } - Button("Add", action: { - viewModel.addWebFeed() - }) - .disabled(!viewModel.providedURL.mayBeURL) - .help("Add Feed") - } - ) - } - } - #endif - - @ViewBuilder var urlTextField: some View { - #if os(iOS) - TextField("URL", text: $viewModel.providedURL) - .disableAutocorrection(true) - .autocapitalization(UITextAutocapitalizationType.none) - #else - TextField("URL", text: $viewModel.providedURL) - .disableAutocorrection(true) - #endif - } - - var providedNameTextField: some View { - TextField("Title (Optional)", text: $viewModel.providedName) - } - - @ViewBuilder var folderPicker: some View { - #if os(iOS) - Picker("Folder", selection: $viewModel.selectedFolderIndex, content: { - ForEach(0.. RSImage? { - switch accountType { - case .onMyMac: - #if os(macOS) - return AppAssets.accountLocalMacImage - #endif - #if os(iOS) - if UIDevice.current.userInterfaceIdiom == .pad { - return AppAssets.accountLocalPadImage - } else { - return AppAssets.accountLocalPhoneImage - } - #endif - case .bazQux: - return AppAssets.accountBazQux - case .cloudKit: - return AppAssets.accountCloudKitImage - case .feedbin: - return AppAssets.accountFeedbinImage - case .feedly: - return AppAssets.accountFeedlyImage - case .feedWrangler: - return AppAssets.accountFeedWranglerImage - case .freshRSS: - return AppAssets.accountFreshRSSImage - case .newsBlur: - return AppAssets.accountNewsBlurImage - case .inoreader: - return AppAssets.accountInoreader - case .theOldReader: - return AppAssets.accountTheOldReader - - } - } - -} diff --git a/Multiplatform/Shared/AppDefaults.swift b/Multiplatform/Shared/AppDefaults.swift deleted file mode 100644 index 51261efaa..000000000 --- a/Multiplatform/Shared/AppDefaults.swift +++ /dev/null @@ -1,359 +0,0 @@ -// -// AppDefaults.swift -// NetNewsWire -// -// Created by Stuart Breckenridge on 1/7/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation -import SwiftUI - -enum UserInterfaceColorPalette: Int, CustomStringConvertible, CaseIterable { - case automatic = 0 - case light = 1 - case dark = 2 - - var description: String { - switch self { - case .automatic: - return NSLocalizedString("Automatic", comment: "Automatic") - case .light: - return NSLocalizedString("Light", comment: "Light") - case .dark: - return NSLocalizedString("Dark", comment: "Dark") - } - } -} - -final class AppDefaults: ObservableObject { - - static let defaultThemeName = "Default" - - #if os(macOS) - static let store: UserDefaults = UserDefaults.standard - #endif - - #if os(iOS) - static let store: UserDefaults = { - let appIdentifierPrefix = Bundle.main.object(forInfoDictionaryKey: "AppIdentifierPrefix") as! String - let suiteName = "\(appIdentifierPrefix)group.\(Bundle.main.bundleIdentifier!)" - return UserDefaults.init(suiteName: suiteName)! - }() - #endif - - public static let shared = AppDefaults() - private init() {} - - struct Key { - - // Shared Defaults - static let refreshInterval = "refreshInterval" - static let hideDockUnreadCount = "JustinMillerHideDockUnreadCount" - static let activeExtensionPointIDs = "activeExtensionPointIDs" - static let lastImageCacheFlushDate = "lastImageCacheFlushDate" - static let firstRunDate = "firstRunDate" - static let lastRefresh = "lastRefresh" - static let addWebFeedAccountID = "addWebFeedAccountID" - static let addWebFeedFolderName = "addWebFeedFolderName" - static let addFolderAccountID = "addFolderAccountID" - - static let userInterfaceColorPalette = "userInterfaceColorPalette" - static let timelineSortDirection = "timelineSortDirection" - static let timelineGroupByFeed = "timelineGroupByFeed" - static let timelineIconDimensions = "timelineIconDimensions" - static let timelineNumberOfLines = "timelineNumberOfLines" - static let currentThemeName = "currentThemeName" - - // Sidebar Defaults - static let sidebarConfirmDelete = "sidebarConfirmDelete" - - // iOS Defaults - static let refreshClearsReadArticles = "refreshClearsReadArticles" - static let articleFullscreenAvailable = "articleFullscreenAvailable" - static let articleFullscreenEnabled = "articleFullscreenEnabled" - static let confirmMarkAllAsRead = "confirmMarkAllAsRead" - - // macOS Defaults - static let articleTextSize = "articleTextSize" - static let openInBrowserInBackground = "openInBrowserInBackground" - static let defaultBrowserID = "defaultBrowserID" - static let subscribeToFeedsInDefaultBrowser = "subscribeToFeedsInDefaultBrowser" - static let checkForUpdatesAutomatically = "checkForUpdatesAutomatically" - static let downloadTestBuilds = "downloadTestBuild" - static let sendCrashLogs = "sendCrashLogs" - - // Hidden macOS Defaults - static let showDebugMenu = "ShowDebugMenu" - static let timelineShowsSeparators = "CorreiaSeparators" - static let showTitleOnMainWindow = "KafasisTitleMode" - - #if !MAC_APP_STORE - static let webInspectorEnabled = "WebInspectorEnabled" - static let webInspectorStartsAttached = "__WebInspectorPageGroupLevel1__.WebKit2InspectorStartsAttached" - #endif - - } - - // MARK: Development Builds - let isDeveloperBuild: Bool = { - if let dev = Bundle.main.object(forInfoDictionaryKey: "DeveloperEntitlements") as? String, dev == "-dev" { - return true - } - return false - }() - - // MARK: First Run Details - var firstRunDate: Date? { - set { - AppDefaults.store.setValue(newValue, forKey: Key.firstRunDate) - objectWillChange.send() - } - get { - AppDefaults.store.object(forKey: Key.firstRunDate) as? Date - } - } - - // MARK: Refresh Interval - @AppStorage(wrappedValue: 4, Key.refreshInterval, store: store) var interval: Int { - didSet { - objectWillChange.send() - } - } - - var refreshInterval: RefreshInterval { - RefreshInterval(rawValue: interval) ?? RefreshInterval.everyHour - } - - // MARK: Dock Badge - @AppStorage(wrappedValue: false, Key.hideDockUnreadCount, store: store) var hideDockUnreadCount { - didSet { - objectWillChange.send() - } - } - - // MARK: Color Palette - var userInterfaceColorPalette: UserInterfaceColorPalette { - get { - if let palette = UserInterfaceColorPalette(rawValue: AppDefaults.store.integer(forKey: Key.userInterfaceColorPalette)) { - return palette - } - return .automatic - } - set { - AppDefaults.store.set(newValue.rawValue, forKey: Key.userInterfaceColorPalette) - #if os(macOS) - self.objectWillChange.send() - #else - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: { - self.objectWillChange.send() - }) - #endif - } - } - - static var userInterfaceColorScheme: ColorScheme? { - switch AppDefaults.shared.userInterfaceColorPalette { - case .light: - return ColorScheme.light - case .dark: - return ColorScheme.dark - default: - return nil - } - } - - // MARK: Feeds & Folders - @AppStorage(Key.addWebFeedAccountID, store: store) var addWebFeedAccountID: String? - - @AppStorage(Key.addWebFeedFolderName, store: store) var addWebFeedFolderName: String? - - @AppStorage(Key.addFolderAccountID, store: store) var addFolderAccountID: String? - - @AppStorage(wrappedValue: false, Key.confirmMarkAllAsRead, store: store) var confirmMarkAllAsRead: Bool - - // MARK: Extension Points - var activeExtensionPointIDs: [[AnyHashable : AnyHashable]]? { - get { - return AppDefaults.store.object(forKey: Key.activeExtensionPointIDs) as? [[AnyHashable : AnyHashable]] - } - set { - UserDefaults.standard.set(newValue, forKey: Key.activeExtensionPointIDs) - objectWillChange.send() - } - } - - // MARK: Image Cache - var lastImageCacheFlushDate: Date? { - set { - AppDefaults.store.setValue(newValue, forKey: Key.lastImageCacheFlushDate) - objectWillChange.send() - } - get { - AppDefaults.store.object(forKey: Key.lastImageCacheFlushDate) as? Date - } - } - - // MARK: Timeline - @AppStorage(wrappedValue: false, Key.timelineGroupByFeed, store: store) var timelineGroupByFeed: Bool { - didSet { - objectWillChange.send() - } - } - - @AppStorage(wrappedValue: 2.0, Key.timelineNumberOfLines, store: store) var timelineNumberOfLines: Double { - didSet { - objectWillChange.send() - } - } - - @AppStorage(wrappedValue: 40.0, Key.timelineIconDimensions, store: store) var timelineIconDimensions: Double { - didSet { - objectWillChange.send() - } - } - - /// Set to `true` to sort oldest to newest, `false` for newest to oldest. Default is `false`. - @AppStorage(wrappedValue: false, Key.timelineSortDirection, store: store) var timelineSortDirection: Bool { - didSet { - objectWillChange.send() - } - } - - // MARK: Sidebar - @AppStorage(wrappedValue: true, Key.sidebarConfirmDelete, store: store) var sidebarConfirmDelete: Bool { - didSet { - objectWillChange.send() - } - } - - - // MARK: Refresh - @AppStorage(wrappedValue: false, Key.refreshClearsReadArticles, store: store) var refreshClearsReadArticles: Bool - - // MARK: Articles - @AppStorage(wrappedValue: false, Key.articleFullscreenAvailable, store: store) var articleFullscreenAvailable: Bool - - @AppStorage(wrappedValue: false, Key.articleFullscreenEnabled, store: store) var articleFullscreenEnabled: Bool - - @AppStorage(wrappedValue: 3, Key.articleTextSize, store: store) var articleTextSizeTag: Int { - didSet { - objectWillChange.send() - } - } - - var articleTextSize: ArticleTextSize { - ArticleTextSize(rawValue: articleTextSizeTag) ?? ArticleTextSize.large - } - - @AppStorage(Key.currentThemeName, store: store) var currentThemeName: String? - - // MARK: Refresh - var lastRefresh: Date? { - set { - AppDefaults.store.setValue(newValue, forKey: Key.lastRefresh) - objectWillChange.send() - } - get { - AppDefaults.store.object(forKey: Key.lastRefresh) as? Date - } - } - - // MARK: Window State - @AppStorage(wrappedValue: false, Key.openInBrowserInBackground, store: store) var openInBrowserInBackground: Bool { - didSet { - objectWillChange.send() - } - } - - @AppStorage(Key.defaultBrowserID, store: store) var defaultBrowserID: String? { - didSet { - objectWillChange.send() - } - } - - @AppStorage(wrappedValue: false, Key.subscribeToFeedsInDefaultBrowser, store: store) var subscribeToFeedsInDefaultBrowser: Bool { - didSet { - objectWillChange.send() - } - } - - @AppStorage(Key.showTitleOnMainWindow, store: store) var showTitleOnMainWindow: Bool? { - didSet { - objectWillChange.send() - } - } - - @AppStorage(wrappedValue: false, Key.showDebugMenu, store: store) var showDebugMenu: Bool { - didSet { - objectWillChange.send() - } - } - - @AppStorage(wrappedValue: false, Key.timelineShowsSeparators, store: store) var timelineShowsSeparators: Bool { - didSet { - objectWillChange.send() - } - } - - #if !MAC_APP_STORE - @AppStorage(wrappedValue: false, Key.webInspectorEnabled, store: store) var webInspectorEnabled: Bool { - didSet { - objectWillChange.send() - } - } - - @AppStorage(wrappedValue: false, Key.webInspectorStartsAttached, store: store) var webInspectorStartsAttached: Bool { - didSet { - objectWillChange.send() - } - } - #endif - - @AppStorage(wrappedValue: true, Key.checkForUpdatesAutomatically, store: store) var checkForUpdatesAutomatically: Bool { - didSet { - objectWillChange.send() - } - } - - @AppStorage(wrappedValue: false, Key.downloadTestBuilds, store: store) var downloadTestBuilds: Bool { - didSet { - objectWillChange.send() - } - } - - @AppStorage(wrappedValue: true, Key.sendCrashLogs, store: store) var sendCrashLogs: Bool { - didSet { - objectWillChange.send() - } - } - - static func registerDefaults() { - let defaults: [String : Any] = [Key.userInterfaceColorPalette: UserInterfaceColorPalette.automatic.rawValue, - Key.timelineGroupByFeed: false, - Key.refreshClearsReadArticles: false, - Key.timelineNumberOfLines: 2, - Key.timelineIconDimensions: 40, - Key.timelineSortDirection: ComparisonResult.orderedDescending.rawValue, - Key.articleFullscreenAvailable: false, - Key.articleFullscreenEnabled: false, - Key.confirmMarkAllAsRead: true, - "NSScrollViewShouldScrollUnderTitlebar": false, - Key.refreshInterval: RefreshInterval.everyHour.rawValue, - Key.currentThemeName: Self.defaultThemeName] - AppDefaults.store.register(defaults: defaults) - } - -} - -extension AppDefaults { - - func isFirstRun() -> Bool { - if let _ = AppDefaults.store.object(forKey: Key.firstRunDate) as? Date { - return false - } - firstRunDate = Date() - return true - } - -} diff --git a/Multiplatform/Shared/Article/ArticleContainerView.swift b/Multiplatform/Shared/Article/ArticleContainerView.swift deleted file mode 100644 index 07fa53b72..000000000 --- a/Multiplatform/Shared/Article/ArticleContainerView.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// ArticleContainerView.swift -// NetNewsWire -// -// Created by Maurice Parker on 7/2/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI -import Articles - -struct ArticleContainerView: View { - - var body: some View { - ArticleView() - .modifier(ArticleToolbarModifier()) - } - -} diff --git a/Multiplatform/Shared/Article/ArticleExtractorButtonState.swift b/Multiplatform/Shared/Article/ArticleExtractorButtonState.swift deleted file mode 100644 index 6c9f6d04a..000000000 --- a/Multiplatform/Shared/Article/ArticleExtractorButtonState.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// ArticleExtractorButtonState.swift -// Multiplatform iOS -// -// Created by Maurice Parker on 7/6/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation - -enum ArticleExtractorButtonState { - case error - case animated - case on - case off -} diff --git a/Multiplatform/Shared/Article/ArticleIconSchemeHandler.swift b/Multiplatform/Shared/Article/ArticleIconSchemeHandler.swift deleted file mode 100644 index 4e18cccb7..000000000 --- a/Multiplatform/Shared/Article/ArticleIconSchemeHandler.swift +++ /dev/null @@ -1,60 +0,0 @@ -// -// ArticleIconSchemeHandler.swift -// Multiplatform iOS -// -// Created by Maurice Parker on 7/6/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation -import WebKit -import Articles - -class ArticleIconSchemeHandler: NSObject, WKURLSchemeHandler { - - weak var sceneModel: SceneModel? - - init(sceneModel: SceneModel) { - self.sceneModel = sceneModel - } - - func webView(_ webView: WKWebView, start urlSchemeTask: WKURLSchemeTask) { - - guard let url = urlSchemeTask.request.url, let sceneModel = sceneModel else { - urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist)) - return - } - - guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { - return - } - let articleID = components.path - guard let iconImage = sceneModel.articleFor(articleID)?.iconImage() else { - urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist)) - return - } - - let iconView = IconView(frame: CGRect(x: 0, y: 0, width: 48, height: 48)) - iconView.iconImage = iconImage - let renderedImage = iconView.asImage() - - guard let data = renderedImage.dataRepresentation() else { - urlSchemeTask.didFailWithError(URLError(.fileDoesNotExist)) - return - } - - let headerFields = ["Cache-Control": "no-cache"] - if let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: headerFields) { - urlSchemeTask.didReceive(response) - urlSchemeTask.didReceive(data) - urlSchemeTask.didFinish() - } - - } - - func webView(_ webView: WKWebView, stop urlSchemeTask: WKURLSchemeTask) { - urlSchemeTask.didFailWithError(URLError(.unknown)) - } - -} - diff --git a/Multiplatform/Shared/Article/ArticleToolbarModifier.swift b/Multiplatform/Shared/Article/ArticleToolbarModifier.swift deleted file mode 100644 index 380cba519..000000000 --- a/Multiplatform/Shared/Article/ArticleToolbarModifier.swift +++ /dev/null @@ -1,120 +0,0 @@ -// -// ArticleToolbarModifier.swift -// NetNewsWire -// -// Created by Maurice Parker on 7/5/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import SwiftUI - -struct ArticleToolbarModifier: ViewModifier { - - @EnvironmentObject private var sceneModel: SceneModel - @State private var showActivityView = false - - func body(content: Content) -> some View { - content - .toolbar { - #if os(iOS) - - ToolbarItem(placement: .primaryAction) { - HStack(spacing: 20) { - Button { - } label: { - AppAssets.prevArticleImage - .font(.title3) - } - .help("Previouse Unread") - Button { - } label: { - AppAssets.nextArticleImage.font(.title3) - } - .help("Next Unread") - } - } - - ToolbarItem(placement: .bottomBar) { - Button { - sceneModel.toggleReadStatusForSelectedArticles() - } label: { - if sceneModel.readButtonState == true { - AppAssets.readClosedImage - } else { - AppAssets.readOpenImage - } - } - .disabled(sceneModel.readButtonState == nil) - .help(sceneModel.readButtonState ?? false ? "Mark as Unread" : "Mark as Read") - } - - ToolbarItem(placement: .bottomBar) { - Spacer() - } - - ToolbarItem(placement: .bottomBar) { - Button { - sceneModel.toggleStarredStatusForSelectedArticles() - } label: { - if sceneModel.starButtonState ?? false { - AppAssets.starClosedImage - } else { - AppAssets.starOpenImage - } - } - .disabled(sceneModel.starButtonState == nil) - .help(sceneModel.starButtonState ?? false ? "Mark as Unstarred" : "Mark as Starred") - } - - ToolbarItem(placement: .bottomBar) { - Spacer() - } - - ToolbarItem(placement: .bottomBar) { - Button { - sceneModel.goToNextUnread() - } label: { - AppAssets.nextUnreadArticleImage.font(.title3) - } - .disabled(sceneModel.nextUnreadButtonState == nil) - .help("Next Unread") - } - - ToolbarItem(placement: .bottomBar) { - Spacer() - } - - ToolbarItem(placement: .bottomBar) { - Button { - } label: { - AppAssets.articleExtractorOff - .font(.title3) - } - .disabled(sceneModel.extractorButtonState == nil) - .help("Reader View") - } - - ToolbarItem(placement: .bottomBar) { - Spacer() - } - - ToolbarItem(placement: .bottomBar) { - Button { - showActivityView.toggle() - } label: { - AppAssets.shareImage.font(.title3) - } - .disabled(sceneModel.shareButtonState == nil) - .help("Share") - .sheet(isPresented: $showActivityView) { - if let article = sceneModel.selectedArticles.first, let url = article.preferredURL { - ActivityViewController(title: article.title, url: url) - } - } - } - - #endif - } - } - -} diff --git a/Multiplatform/Shared/Article/PreloadedWebView.swift b/Multiplatform/Shared/Article/PreloadedWebView.swift deleted file mode 100644 index 2baca9e73..000000000 --- a/Multiplatform/Shared/Article/PreloadedWebView.swift +++ /dev/null @@ -1,132 +0,0 @@ -// -// PreloadedWebView.swift -// Multiplatform iOS -// -// Created by Maurice Parker on 7/6/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation -import WebKit -import RSWeb - -class PreloadedWebView: WKWebView { - - private var isReady: Bool = false - private var readyCompletion: (() -> Void)? - - init(articleIconSchemeHandler: ArticleIconSchemeHandler) { - let preferences = WKPreferences() - preferences.javaScriptCanOpenWindowsAutomatically = false - - let configuration = WKWebViewConfiguration() - configuration.preferences = preferences - configuration.setValue(true, forKey: "allowUniversalAccessFromFileURLs") - #if os(iOS) - configuration.allowsInlineMediaPlayback = true - #endif - configuration.mediaTypesRequiringUserActionForPlayback = .audio - configuration.setURLSchemeHandler(articleIconSchemeHandler, forURLScheme: ArticleRenderer.imageIconScheme) - - super.init(frame: .zero, configuration: configuration) - - if let userAgent = UserAgent.fromInfoPlist() { - customUserAgent = userAgent - } - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - } - - func preload() { - navigationDelegate = self - loadFileURL(ArticleRenderer.blank.url, allowingReadAccessTo: ArticleRenderer.blank.baseURL) - } - - func ready(completion: @escaping () -> Void) { - if isReady { - completeRequest(completion: completion) - } else { - readyCompletion = completion - } - } - - #if os(macOS) - override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) { - // There’s no API for affecting a WKWebView’s contextual menu. - // (WebView had API for this.) - // - // This a minor hack. It hides unwanted menu items. - // The menu item identifiers are not documented anywhere; - // they could change, and this code would need updating. - for menuItem in menu.items { - if shouldHideMenuItem(menuItem) { - menuItem.isHidden = true - } - } - - super.willOpenMenu(menu, with: event) - } - #endif -} - -// MARK: WKScriptMessageHandler - -extension PreloadedWebView: WKNavigationDelegate { - - func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { - isReady = true - if let completion = readyCompletion { - completeRequest(completion: completion) - readyCompletion = nil - } - } - -} - -// MARK: Private - -private extension PreloadedWebView { - - func completeRequest(completion: @escaping () -> Void) { - isReady = false - navigationDelegate = nil - completion() - } - -} - -#if os(macOS) -private extension NSUserInterfaceItemIdentifier { - - static let DetailMenuItemIdentifierReload = NSUserInterfaceItemIdentifier(rawValue: "WKMenuItemIdentifierReload") - static let DetailMenuItemIdentifierOpenLink = NSUserInterfaceItemIdentifier(rawValue: "WKMenuItemIdentifierOpenLink") -} - -private extension PreloadedWebView { - - static let menuItemIdentifiersToHide: [NSUserInterfaceItemIdentifier] = [.DetailMenuItemIdentifierReload, .DetailMenuItemIdentifierOpenLink] - static let menuItemIdentifierMatchStrings = ["newwindow", "download"] - - func shouldHideMenuItem(_ menuItem: NSMenuItem) -> Bool { - - guard let identifier = menuItem.identifier else { - return false - } - - if PreloadedWebView.menuItemIdentifiersToHide.contains(identifier) { - return true - } - - let lowerIdentifier = identifier.rawValue.lowercased() - for matchString in PreloadedWebView.menuItemIdentifierMatchStrings { - if lowerIdentifier.contains(matchString) { - return true - } - } - - return false - } -} -#endif diff --git a/Multiplatform/Shared/Article/WebViewProvider.swift b/Multiplatform/Shared/Article/WebViewProvider.swift deleted file mode 100644 index 64d834c0c..000000000 --- a/Multiplatform/Shared/Article/WebViewProvider.swift +++ /dev/null @@ -1,103 +0,0 @@ -// -// WebViewProvider.swift -// Multiplatform iOS -// -// Created by Maurice Parker on 7/6/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation -import RSCore -import WebKit - -/// WKWebView has an awful behavior of a flash to white on first load when in dark mode. -/// Keep a queue of WebViews where we've already done a trivial load so that by the time we need them in the UI, they're past the flash-to-shite part of their lifecycle. -class WebViewProvider: NSObject { - - private let articleIconSchemeHandler: ArticleIconSchemeHandler - private let operationQueue = MainThreadOperationQueue() - private var queue = NSMutableArray() - - init(articleIconSchemeHandler: ArticleIconSchemeHandler) { - self.articleIconSchemeHandler = articleIconSchemeHandler - super.init() - replenishQueueIfNeeded() - } - - func replenishQueueIfNeeded() { - operationQueue.add(WebViewProviderReplenishQueueOperation(queue: queue, articleIconSchemeHandler: articleIconSchemeHandler)) - } - - func dequeueWebView(completion: @escaping (PreloadedWebView) -> ()) { - operationQueue.add(WebViewProviderDequeueOperation(queue: queue, articleIconSchemeHandler: articleIconSchemeHandler, completion: completion)) - operationQueue.add(WebViewProviderReplenishQueueOperation(queue: queue, articleIconSchemeHandler: articleIconSchemeHandler)) - } - -} - -class WebViewProviderReplenishQueueOperation: MainThreadOperation { - - // MainThreadOperation - public var isCanceled = false - public var id: Int? - public weak var operationDelegate: MainThreadOperationDelegate? - public var name: String? = "WebViewProviderReplenishQueueOperation" - public var completionBlock: MainThreadOperation.MainThreadOperationCompletionBlock? - - private let minimumQueueDepth = 3 - - private var queue: NSMutableArray - private var articleIconSchemeHandler: ArticleIconSchemeHandler - - init(queue: NSMutableArray, articleIconSchemeHandler: ArticleIconSchemeHandler) { - self.queue = queue - self.articleIconSchemeHandler = articleIconSchemeHandler - } - - func run() { - while queue.count < minimumQueueDepth { - let webView = PreloadedWebView(articleIconSchemeHandler: articleIconSchemeHandler) - webView.preload() - queue.insert(webView, at: 0) - } - self.operationDelegate?.operationDidComplete(self) - } - -} - -class WebViewProviderDequeueOperation: MainThreadOperation { - - // MainThreadOperation - public var isCanceled = false - public var id: Int? - public weak var operationDelegate: MainThreadOperationDelegate? - public var name: String? = "WebViewProviderFlushQueueOperation" - public var completionBlock: MainThreadOperation.MainThreadOperationCompletionBlock? - - private var queue: NSMutableArray - private var articleIconSchemeHandler: ArticleIconSchemeHandler - private var completion: (PreloadedWebView) -> () - - init(queue: NSMutableArray, articleIconSchemeHandler: ArticleIconSchemeHandler, completion: @escaping (PreloadedWebView) -> ()) { - self.queue = queue - self.articleIconSchemeHandler = articleIconSchemeHandler - self.completion = completion - } - - func run() { - if let webView = queue.lastObject as? PreloadedWebView { - self.completion(webView) - self.queue.remove(webView) - self.operationDelegate?.operationDidComplete(self) - return - } - - assertionFailure("Creating PreloadedWebView in \(#function); queue has run dry.") - - let webView = PreloadedWebView(articleIconSchemeHandler: articleIconSchemeHandler) - webView.preload() - self.completion(webView) - self.operationDelegate?.operationDidComplete(self) - } - -} diff --git a/Multiplatform/Shared/Article/WrapperScriptMessageHandler.swift b/Multiplatform/Shared/Article/WrapperScriptMessageHandler.swift deleted file mode 100644 index e3a58e19d..000000000 --- a/Multiplatform/Shared/Article/WrapperScriptMessageHandler.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// WrapperScriptMessageHandler.swift -// Multiplatform iOS -// -// Created by Maurice Parker on 7/6/20. -// Copyright © 2020 Ranchero Software. All rights reserved. -// - -import Foundation -import WebKit - -class WrapperScriptMessageHandler: NSObject, WKScriptMessageHandler { - - // We need to wrap a message handler to prevent a circlular reference - private weak var handler: WKScriptMessageHandler? - - init(_ handler: WKScriptMessageHandler) { - self.handler = handler - } - - func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { - handler?.userContentController(userContentController, didReceive: message) - } - -} diff --git a/Multiplatform/Shared/Article/blank.html b/Multiplatform/Shared/Article/blank.html deleted file mode 100644 index 6e02cf3a6..000000000 --- a/Multiplatform/Shared/Article/blank.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - diff --git a/Multiplatform/Shared/Article/main_multiplatform.js b/Multiplatform/Shared/Article/main_multiplatform.js deleted file mode 100644 index e1f0f2d0a..000000000 --- a/Multiplatform/Shared/Article/main_multiplatform.js +++ /dev/null @@ -1,498 +0,0 @@ -var activeImageViewer = null; - -class ImageViewer { - constructor(img) { - this.img = img; - this.loadingInterval = null; - this.activityIndicator = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjAiIHdpZHRoPSI2NHB4IiBoZWlnaHQ9IjY0cHgiIHZpZXdCb3g9IjAgMCAxMjggMTI4IiB4bWw6c3BhY2U9InByZXNlcnZlIj48Zz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiMwMDAwMDAiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiNjY2NjY2MiIHRyYW5zZm9ybT0icm90YXRlKDMwIDY0IDY0KSIvPjxwYXRoIGQ9Ik01OS42IDBoOHY0MGgtOFYweiIgZmlsbD0iI2NjY2NjYyIgdHJhbnNmb3JtPSJyb3RhdGUoNjAgNjQgNjQpIi8+PHBhdGggZD0iTTU5LjYgMGg4djQwaC04VjB6IiBmaWxsPSIjY2NjY2NjIiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NCA2NCkiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiNjY2NjY2MiIHRyYW5zZm9ybT0icm90YXRlKDEyMCA2NCA2NCkiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiNiMmIyYjIiIHRyYW5zZm9ybT0icm90YXRlKDE1MCA2NCA2NCkiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiM5OTk5OTkiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA2NCA2NCkiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiM3ZjdmN2YiIHRyYW5zZm9ybT0icm90YXRlKDIxMCA2NCA2NCkiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiM2NjY2NjYiIHRyYW5zZm9ybT0icm90YXRlKDI0MCA2NCA2NCkiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiM0YzRjNGMiIHRyYW5zZm9ybT0icm90YXRlKDI3MCA2NCA2NCkiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiMzMzMzMzMiIHRyYW5zZm9ybT0icm90YXRlKDMwMCA2NCA2NCkiLz48cGF0aCBkPSJNNTkuNiAwaDh2NDBoLThWMHoiIGZpbGw9IiMxOTE5MTkiIHRyYW5zZm9ybT0icm90YXRlKDMzMCA2NCA2NCkiLz48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InJvdGF0ZSIgdmFsdWVzPSIwIDY0IDY0OzMwIDY0IDY0OzYwIDY0IDY0OzkwIDY0IDY0OzEyMCA2NCA2NDsxNTAgNjQgNjQ7MTgwIDY0IDY0OzIxMCA2NCA2NDsyNDAgNjQgNjQ7MjcwIDY0IDY0OzMwMCA2NCA2NDszMzAgNjQgNjQiIGNhbGNNb2RlPSJkaXNjcmV0ZSIgZHVyPSIxMDgwbXMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9nPjwvc3ZnPg=="; - } - - isLoaded() { - return this.img.classList.contains("nnwLoaded"); - } - - clicked() { - this.showLoadingIndicator(); - if (this.isLoaded()) { - this.showViewer(); - } else { - var callback = () => { - if (this.isLoaded()) { - clearInterval(this.loadingInterval); - this.showViewer(); - } - } - this.loadingInterval = setInterval(callback, 100); - } - } - cancel() { - clearInterval(this.loadingInterval); - this.hideLoadingIndicator(); - } - - showViewer() { - this.hideLoadingIndicator(); - - var canvas = document.createElement("canvas"); - var pixelRatio = window.devicePixelRatio; - do { - canvas.width = this.img.naturalWidth * pixelRatio; - canvas.height = this.img.naturalHeight * pixelRatio; - pixelRatio--; - } while (pixelRatio > 0 && canvas.width * canvas.height > 16777216) - canvas.getContext("2d").drawImage(this.img, 0, 0, canvas.width, canvas.height); - - const rect = this.img.getBoundingClientRect(); - const message = { - x: rect.x, - y: rect.y, - width: rect.width, - height: rect.height, - imageTitle: this.img.title, - imageURL: canvas.toDataURL(), - }; - - var jsonMessage = JSON.stringify(message); - window.webkit.messageHandlers.imageWasClicked.postMessage(jsonMessage); - } - - hideImage() { - this.img.style.opacity = 0; - } - - showImage() { - this.img.style.opacity = 1 - } - - showLoadingIndicator() { - var wrapper = document.createElement("div"); - wrapper.classList.add("activityIndicatorWrap"); - this.img.parentNode.insertBefore(wrapper, this.img); - wrapper.appendChild(this.img); - - var activityIndicatorImg = document.createElement("img"); - activityIndicatorImg.classList.add("activityIndicator"); - activityIndicatorImg.style.opacity = 0; - activityIndicatorImg.src = this.activityIndicator; - wrapper.appendChild(activityIndicatorImg); - - activityIndicatorImg.style.opacity = 1; - } - - hideLoadingIndicator() { - var wrapper = this.img.parentNode; - if (wrapper.classList.contains("activityIndicatorWrap")) { - var wrapperParent = wrapper.parentNode; - wrapperParent.insertBefore(this.img, wrapper); - wrapperParent.removeChild(wrapper); - } - } - - static init() { - cancelImageLoad(); - - // keep track of when an image has finished downloading for ImageViewer - document.querySelectorAll("img").forEach(element => { - element.onload = function() { - this.classList.add("nnwLoaded"); - } - }); - - // Add the click listener for images - window.onclick = function(event) { - if (event.target.matches("img") && !event.target.classList.contains("nnw-nozoom")) { - if (activeImageViewer && activeImageViewer.img === event.target) { - cancelImageLoad(); - } else { - cancelImageLoad(); - activeImageViewer = new ImageViewer(event.target); - activeImageViewer.clicked(); - } - } - } - } -} - -function cancelImageLoad() { - if (activeImageViewer) { - activeImageViewer.cancel(); - activeImageViewer = null; - } -} - -function hideClickedImage() { - if (activeImageViewer) { - activeImageViewer.hideImage(); - } -} - -// Used to animate the transition from a fullscreen image -function showClickedImage() { - if (activeImageViewer) { - activeImageViewer.showImage(); - } - window.webkit.messageHandlers.imageWasShown.postMessage(""); -} - -function showFeedInspectorSetup() { - document.getElementById("nnwImageIcon").onclick = function(event) { - window.webkit.messageHandlers.showFeedInspector.postMessage(""); - } -} - -function linkHover() { - window.onmouseover = function(event) { - var closestAnchor = event.target.closest('a') - if (closestAnchor) { - window.webkit.messageHandlers.mouseDidEnter.postMessage(closestAnchor.href); - } - } - window.onmouseout = function(event) { - var closestAnchor = event.target.closest('a') - if (closestAnchor) { - window.webkit.messageHandlers.mouseDidExit.postMessage(closestAnchor.href); - } - } -} - - -function postRenderProcessing() { - ImageViewer.init(); - showFeedInspectorSetup(); - linkHover(); -} - - -function makeHighlightRect({left, top, width, height}, offsetTop=0, offsetLeft=0) { - const overlay = document.createElement('a'); - - Object.assign(overlay.style, { - position: 'absolute', - left: `${Math.floor(left + offsetLeft)}px`, - top: `${Math.floor(top + offsetTop)}px`, - width: `${Math.ceil(width)}px`, - height: `${Math.ceil(height)}px`, - backgroundColor: 'rgba(200, 220, 10, 0.4)', - pointerEvents: 'none' - }); - - return overlay; -} - -function clearHighlightRects() { - let container = document.getElementById('nnw:highlightContainer') - if (container) container.remove(); -} - -function highlightRects(rects, clearOldRects=true, makeHighlightRect=makeHighlightRect) { - const article = document.querySelector('article'); - let container = document.getElementById('nnw:highlightContainer'); - - article.style.position = 'relative'; - - if (container && clearOldRects) - container.remove(); - - container = document.createElement('div'); - container.id = 'nnw:highlightContainer'; - article.appendChild(container); - - const {top, left} = article.getBoundingClientRect(); - return Array.from(rects, rect => - container.appendChild(makeHighlightRect(rect, -top, -left)) - ); -} - -FinderResult = class { - constructor(result) { - Object.assign(this, result); - } - - range() { - const range = document.createRange(); - range.setStart(this.node, this.offset); - range.setEnd(this.node, this.offsetEnd); - return range; - } - - bounds() { - return this.range().getBoundingClientRect(); - } - - rects() { - return this.range().getClientRects(); - } - - highlight({clearOldRects=true, fn=makeHighlightRect} = {}) { - highlightRects(this.rects(), clearOldRects, fn); - } - - scrollTo() { - scrollToRect(this.bounds(), this.node); - } - - toJSON() { - return { - rects: Array.from(this.rects()), - bounds: this.bounds(), - index: this.index, - matchGroups: this.match - }; - } - - toJSONString() { - return JSON.stringify(this.toJSON()); - } -} - -Finder = class { - constructor(pattern, options) { - if (!pattern.global) { - pattern = new RegExp(pattern, 'g'); - } - - this.pattern = pattern; - this.lastResult = null; - this._nodeMatches = []; - this.options = { - rootSelector: '.articleBody', - startNode: null, - startOffset: null, - } - - this.resultIndex = -1 - - Object.assign(this.options, options); - - this.walker = document.createTreeWalker(this.root, NodeFilter.SHOW_TEXT); - } - - get root() { - return document.querySelector(this.options.rootSelector) - } - - get count() { - const node = this.walker.currentNode; - const index = this.resultIndex; - this.reset(); - - let result, count = 0; - while ((result = this.next())) ++count; - - this.resultIndex = index; - this.walker.currentNode = node; - - return count; - } - - reset() { - this.walker.currentNode = this.options.startNode || this.root; - this.resultIndex = -1; - } - - [Symbol.iterator]() { - return this; - } - - next({wrap = false} = {}) { - const { startNode } = this.options; - const { pattern, walker } = this; - - let { node, matchIndex = -1 } = this.lastResult || { node: startNode }; - - while (true) { - if (!node) - node = walker.nextNode(); - - if (!node) { - if (!wrap || this.resultIndex < 0) break; - - this.reset(); - - continue; - } - - let nextIndex = matchIndex + 1; - let matches = this._nodeMatches; - - if (!matches.length) { - matches = Array.from(node.textContent.matchAll(pattern)); - nextIndex = 0; - } - - if (matches[nextIndex]) { - this._nodeMatches = matches; - const m = matches[nextIndex]; - - this.lastResult = new FinderResult({ - node, - offset: m.index, - offsetEnd: m.index + m[0].length, - text: m[0], - match: m, - matchIndex: nextIndex, - index: ++this.resultIndex, - }); - - return { value: this.lastResult, done: false }; - } - - this._nodeMatches = []; - node = null; - } - - return { value: undefined, done: true }; - } - - /// TODO Call when the search text changes - retry() { - if (this.lastResult) { - this.lastResult.offsetEnd = this.lastResult.offset; - } - - } - - toJSON() { - const results = Array.from(this); - } -} - -function scrollParent(node) { - let elt = node.nodeType === Node.ELEMENT_NODE ? node : node.parentElement; - - while (elt) { - if (elt.scrollHeight > elt.clientHeight) - return elt; - elt = elt.parentElement; - } -} - -function scrollToRect({top, height}, node, pad=20, padBottom=60) { - const scrollToTop = top - pad; - - let scrollBy = scrollToTop; - - if (scrollToTop >= 0) { - const visible = window.visualViewport; - const scrollToBottom = top + height + padBottom - visible.height; - // The top of the rect is already in the viewport - if (scrollToBottom <= 0 || scrollToTop === 0) - // Don't need to scroll up--or can't - return; - - scrollBy = Math.min(scrollToBottom, scrollBy); - } - - scrollParent(node).scrollBy({ top: scrollBy }); -} - -function withEncodedArg(fn) { - return function(encodedData, ...rest) { - const data = encodedData && JSON.parse(atob(encodedData)); - return fn(data, ...rest); - } -} - -function escapeRegex(s) { - return s.replace(/[.?*+^$\\()[\]{}]/g, '\\$&'); -} - -class FindState { - constructor(options) { - let { text, caseSensitive, regex } = options; - - if (!regex) - text = escapeRegex(text); - - const finder = new Finder(new RegExp(text, caseSensitive ? 'g' : 'ig')); - this.results = Array.from(finder); - this.index = -1; - this.options = options; - } - - get selected() { - return this.index > -1 ? this.results[this.index] : null; - } - - toJSON() { - return { - index: this.index > -1 ? this.index : null, - results: this.results, - count: this.results.length - }; - } - - selectNext(step=1) { - const index = this.index + step; - const result = this.results[index]; - if (result) { - this.index = index; - result.highlight(); - result.scrollTo(); - } - return result; - } - - selectPrevious() { - return this.selectNext(-1); - } -} - -CurrentFindState = null; - -const ExcludeKeys = new Set(['top', 'right', 'bottom', 'left']); -updateFind = withEncodedArg(options => { - // TODO Start at the current result position - // TODO Introduce slight delay, cap the number of results, and report results asynchronously - - let newFindState; - if (!options || !options.text) { - clearHighlightRects(); - return - } - - try { - newFindState = new FindState(options); - } catch (err) { - clearHighlightRects(); - throw err; - } - - if (newFindState.results.length) { - let selected = CurrentFindState && CurrentFindState.selected; - let selectIndex = 0; - if (selected) { - let {node: currentNode, offset: currentOffset} = selected; - selectIndex = newFindState.results.findIndex(r => { - if (r.node === currentNode) { - return r.offset >= currentOffset; - } - - let relation = currentNode.compareDocumentPosition(r.node); - return Boolean(relation & Node.DOCUMENT_POSITION_FOLLOWING); - }); - } - - newFindState.selectNext(selectIndex+1); - } else { - clearHighlightRects(); - } - - CurrentFindState = newFindState; - return btoa(JSON.stringify(CurrentFindState, (k, v) => (ExcludeKeys.has(k) ? undefined : v))); -}); - -selectNextResult = withEncodedArg(options => { - if (CurrentFindState) - CurrentFindState.selectNext(); -}); - -selectPreviousResult = withEncodedArg(options => { - if (CurrentFindState) - CurrentFindState.selectPrevious(); -}); - -function endFind() { - clearHighlightRects() - CurrentFindState = null; -} diff --git a/Multiplatform/Shared/Article/page.html b/Multiplatform/Shared/Article/page.html deleted file mode 100644 index 9d38c005e..000000000 --- a/Multiplatform/Shared/Article/page.html +++ /dev/null @@ -1,21 +0,0 @@ - - - [[title]] - - - - - - - - - - [[body]] - - diff --git a/Multiplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json b/Multiplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index 4f1440c52..000000000 --- a/Multiplatform/Shared/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.933", - "green" : "0.416", - "red" : "0.031" - } - }, - "idiom" : "universal" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0.957", - "green" : "0.620", - "red" : "0.369" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json b/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 8ba7ca9ea..000000000 --- a/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,176 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon-40.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "icon-60.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "icon-58.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "icon-87.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "icon-80.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "icon-120.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "icon-121.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "icon-180.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "icon-20.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "icon-41.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "icon-29.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "icon-59.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "icon-42.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "icon-81.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "icon-76.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "icon-152.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "icon-167.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "icon-1024.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - }, - { - "filename" : "Icon-MacOS-16x16@1x.png.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "16x16" - }, - { - "filename" : "Icon-MacOS-16x16@2x.png.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "16x16" - }, - { - "filename" : "Icon-MacOS-32x32@1x.png.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "32x32" - }, - { - "filename" : "Icon-MacOS-32x32@2x.png.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "32x32" - }, - { - "filename" : "Icon-MacOS-128x128@1x.png.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "128x128" - }, - { - "filename" : "Icon-MacOS-128x128@2x.png.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "128x128" - }, - { - "filename" : "Icon-MacOS-256x256@1x.png.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "256x256" - }, - { - "filename" : "Icon-MacOS-256x256@2x.png.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "256x256" - }, - { - "filename" : "Icon-MacOS-512x512@1x.png.png", - "idiom" : "mac", - "scale" : "1x", - "size" : "512x512" - }, - { - "filename" : "Icon-MacOS-512x512@2x.png.png", - "idiom" : "mac", - "scale" : "2x", - "size" : "512x512" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-128x128@1x.png.png b/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-128x128@1x.png.png deleted file mode 100644 index e8c6573fdb1f6c29bdab8156a7d2ef6ed4e6f866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16978 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 pj@dCgX2!J&~l}yr&@vGu0 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 z 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 diff --git a/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-16x16@1x.png.png b/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-16x16@1x.png.png deleted file mode 100644 index 4477733eeb3148f2e477c2960d823ed11f2f6485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 857 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 z zpaAKa>Y((LW7L_~wtyS@i`aDP>1Rxd4UFEKX>1&|dx0+}0bx3M(x1*c;QBa-5w#-2 zU;~S7^WB+)Uhe{JxS3$!h{sU1R@4{fAO9CxNZcOHh};dX}o@$QQG+$Fv`Wlqu- z&GC9`i&B}e?HH!lZ*a4FY&DUCo+Pcv{s~V7yB28Ggc*gKbT;;B01-mIYov#MLsP%D zUTVn_&yQeaWbizvVP-eIx4*b#=8>6COiVDy5^rgcibiXhx^{TAnbQ^j%p(c6{`G|( zo4p+1Q+iK>2Am^*h&*@!0Zp4;OJ4GP=dkP-?Zv@7Znx?6K+$e$s&G3O6^$bUFs8#= z$Zb+32y5v}I@IjUWIFws84)H}WUGoByB%Q(_H~zrb0(-g$XO|hzAv|U6khdGRL*NU zeOZQ_A30L%=t7z9y2+-$cy1>9d^nna^M|dV|Bl7(t@osl#Qxk`i>v!naa&X4L$8pl-|uh0Z|w+i?aS0|7J1}q zQuwdl$nwbyqu`;csW+Ou?$k?od>vx}=17A$YF0HE&K+F3t?Qnfz)u8`GAqNlK^?*jXh1jWZlSG-pi4AuC$7W%zMG5 zMqIDezKzdQQ_T?f2*Y0aI_01Kw@zvJd)FgUWH5#c)p7w9+ae=F1&f5XfC0M+>SkdUgHwPzaJ5A2W>yO zXjI{EN1RYnxBvC+E6m)iwoE_F3a8xYze0YK?3Ip)b9`5;8;yts-4ky1_Ib&!niB^l zrs0Zrf#Zl{*(MgZE?~4O$5Q%n(0}@9@A-uA6tMb z_&1apqysloAcvDB;|=J@&^r&8twf;WxQGw%GX%80a6mC8k-YA*v;`be{JE0Vkr$27$jivfjw2N&`Fz9{JW!7zl@_(tXjS}YF4X^H>UnqaXD&qhdexMopB2TIpMWSq@%`9w5Nf5}h*fr4ukG#40+!R}28K$C z?#$1jwhkI*iga>WIVa_D6VgMELm}g{sn8GTKY;s+a6Fm;c0l9GZ>cHN+ZWxEb!T>tzL$4zv%%9Bpjm_D(wj-QGlH+g#+Yve?ldd)%$SP;DP)fBFJ7j{WU*(>c+JF)Z6}t>&tIXfPKxQ2h4+|NRn^GBW zHZ%&e`g**XXCpGM;}loZg(e=!t>lCpygsQ!l%sBUm0{x_;J08_Wf{kIAH_AmQeUw6 z^xQ?XI^abkeX~>`E5?dF9Aoo^2&k=+ryNe~J<(kVIbzL-{+c>=%!nyKq|mLl7BrwO zG$M-xEuVdGO{I62c|9WP?gKa40=!&A6Rddm5dYwlvBrX+U|Q~k%Jp15cU+DW*Xy#x zgN0+H_(#z^CiOQmoxu6$p-Q?sLb7^PTE16-(3aOVNaQn7nnVN20y z{X2!x177Z~Gwuo6G&d-2#;~zZZ-D^}O0^jtlIcW_^X>9)7x%OP!w~kCK(vIu@zPK% zlPZV>Nb=He;g&f=uhPwfRiW?nLigF#Xwy_M_dAl0k#r3C=RT@j>qhy;k=;Le5M>C6 zf9?n;iD^h6NiD5~-~v4*yKvSJxOs!-0yINJFhYQWpi8LhF(iHYdM&YED&?xdGsvFL z->9dZvwM4Q(tADkU2A;hXbk{&kyGDou9_Cv4A4Nfrn{u(Yhm2vR>5dJ+-W`S@EC*t z;+)>NtwFj}3_h?FY3~TT!;{NPH;9e@ezLtyxHLnOBbJr9PK0MDMM1J%&{ZdsZ|sbl zZ~Mv;W9R=gzd@;JV(FNb=3xQGZTW2bd}FG1Uq2UTh8c2!0%v;cmzgSbpN`9xyqe%$ z!uk_6W#nSP2>mvpVmQ$!J^IyH4pf9X;h}`qQ5v+avAb%*TXuad|D^q-q z+Ofd})yBeP4eg*in492!heu%}%a{;S?$pTl&_pI37RBBzYtirwO!nuq4S4jGxDEhS zkobOrJ~lM;N0V3qj0mJh$O&r(JofU%(RK%-eym_cmBx79dq44$;&zKLMMdbrG?Q_P z$}gE+rZr33c;O}RQJTpujiFPmWI?A;!L~WE(FAAqjiUc%A0VW~HK4$WRP$WLaj2Hk zWJKnk8(Sm17mn-XBdLKFcvcwP4jcS&4wQW(1`oh2uSLr;E8N*BuyI4UJ!m9+bRxMO z)*1>UN1)~wUnqorDvm0i?y3zXS(F+h=n0Kpv>2Bs6?V zw7PG8{7<#-lP(kbl&hy1{^G!yZhO)w2ZsWb2DL#*s=U?Ne=fDrUL-ddTJs!v;X1U9 zn-%*86>xb+vSgQ$JLGeWv)+^;mb0WdxlmXCHix(P?HA9%ln#T)d0c(=h6%fKg{&j9 zb0R^PJqha!J=L5eBI(L5hWWq43bP~c$mQxPZ{8cTf)DAh9O zAFGq}tNeT5R#8IX7|2QoES)MHo&NShJ#|x9Q?~|y=YXgoB!^aWjLTw(RK9O;E|(EY z`rBg=`J&X_JtEVDfS%kA-p9IaB<$pVlsn{xu5CetX(tFVdpAqcIPm2F%8$a4@n_*+u^TaPPdfy-%wG(o#E?K_FSb zEBtIe=J|Uw)=jzOUxyEqYwzcm%!Vy_1^C)t!M^<@oHTY)$JcDC&pFZ-{5$%pj7Z{gF03hk}vF6L$#q7APUplT5=)420iN;`)M0EaRj? z&np?Cx&2bY<(=C7tFOyEs)mSm1bF|@MniYWgYG>`5w^{auA`%;l6tSapsjV(4ZO-{ zaLB|DFJHRx_xt>HvtyszFsK;QtO~VXFM0RO3`9al$04Vt*}U{h~hjuqUWxkJ5)X^cJiE?-))3LCFs#l z8arAKr{ntm+x_Z&i5Na;?Z;UL; z-Tpq-0^iknF!=d%YTY-?@@g6f1;%PKz!5#SsOvv9h9Xf7xKKo;D_r_r64Smc;IJA?_c}>Y;}hvHkA@#;Paz17)zfRzNP#kDkHz z{@m$_`M%Y8MFO9a=;A3rO}AGmhoB%vqtTNKB!2YmP1Dkb{Fx!Qfr;Kq>E44i$Vdzi zf~~~pWy}!>QtUE^U%O;*zrIdOu$EEENCzt^#n^gVu5cRDd@@xXSo@Y$*nDpGqf7(P zwy`rKAbYGG#hC^W>UT%<_&j4CZ6qb7*9aXH%4b(8c0rtwGcG<~C$Sc0pD)Qeo8thi z;WR3m&Xteygu)L^zc835SfGT)E}_XXpo@Wv1Ffp^qLSf!^w1cvdx(O1FW6tCx|HKJAlu6OJKEC^1VYFurc4z9Zue-6=T~!00W&^xs(ozWOCTaW^=e zaF?iS_qBG)C$MiUe|^WLKdr8Y-F}1DwacIRSu#sn)?C6QKv)vGXcPI-0|kW# z1xYD{(t3-3dGSvRxD#k@w8B~^W}dXZpf$>)+)a`F#5s9~4OyC)To_TOy0nFy^)CI7 zX&#Khmj3Gz_U#G;VJq;DE@!!b#^aG(_Ao_*M(~OX{f+iga}%;Cl95HVsM}iz|Bn*? z5le>6*s08b>Usx$wB?`2aBSkKKXwc+(tZtgp*L~==P$5 z$%2HsB69;;ft@|Y_$O#7j7g|YnP~lH4dlB*x|LklxP{!DfWUIz>2w*sjf{@#Ka;`l zc&^6#FWLVk1#v%#z4JKMaKt=yD~z-`>9?d~5PwxO;Lmws%PTzb7bfwEw;zv{Rcj8UR3=OV(=#I&ooL|C-uM-K^-H^P)OPFb zAuJRMf}O@zk+sKW7F0tl%=%|O`QZoY|7P7wB@>O&jFVB+680jNJ!b| zYg>KM_JJYGN6$eQTC_VauzILtLb_|CR--4T0M`wwHQ(`?0Ih#hO1xpqjwi`rNOLeC zVClR7UXq8T9VDV}nv9LEd}nrJblV?TymOE^G}_$+2N&!3z;iy0vvv~NztIuD+c}4q z1bqqp=Rgy<^sR5e*+S-crCd!#+^Y(6$qY6oEaf!?o+s0|B2&0^Z`)sPDISev1b4**dNc6a@~sv*tU&J;eo(Gi~$7# zIj5B<`^=~|lJLE!p(IodmNnHpL(s7*EbIAqItmR1Jnv!u7oechydG9u$qwSXLHs`# zOyC-P;cag;n7|b`ZAO~rAqc1%O zM;ico8AX*jM9ai!0tY(4g^$>Xe|hJbSX$0;=YbrxT58g@XSYnEF*bttzV#dU+rPaE zSN&igKK0of@b1@r9m^{@wjH&BDheQ}*O4~r$QtyXp*B)8_uo3$HNj)m0=71#mm@Jl z9|_-7MKq={u>hp1qZEAwl}*Sp(Sy{CBr`Wuv~zEY$#rg9q?LZ{8X!_L&LA5^tnV01 zS#YLLCKfLSl&DtgHr18(*QgM_3ctqyA=!%>i|r;(-Fg5I+Ip=`s4^fzov-7b6Q{qZ zKKn%9>(IGJet&m^?IV?s;pc4_8@26a|(k1_QYtfsMSRioqrz$c6pV_S9LJ?Df_{Zt_mj z8V9l2nN$h&8L;~)r`^H}GP!0ff=C37EueCiF-h{2@ zbH^(1j7M+6KmO6#SX?e}=fNClk{WZM(QIJz5mOkS9K)t9(-@x|N8ZiQT}@GRQgoIQ zbXOCTFh&)a+KVLFsZU_)`wuiGYiLZ>%zJaXW-0{N$4Fa9&HKnq&3qg0V*F+eWz>Cb1+9HWDFX09xq4|5*hC@fJy`kxHapQKd(Z{-5FVgBfCX@rpf_=4 zDR&p~$*##ki~&^zj#WlkCRs%r1+dRo?^TFOe{=e)<(`3=X!mfMNej0goJLWM0QCi+ z-GTI_dIQd)1frX_Aj^u-|1Wjt;i+=|=YXB4P%A(wOpMm>{c9GDL!_p9 ziQd0-O#FrJ{cbHuzSiG`ApWBIxBISi9*<5}PEto^lq3JN%hPyN6HtGk*6N{*Re$M*dI%9t{CKM zR`hsUJbvZ6Hn~#mQVa0rY$Df?a%ssrYE8DDV^Ai5=X823X z1d~g4nH*Wgk9Tju4{tjjsO<;ZE70v#=;8sw1e(|4vOj!1&f0khSKYK3S(3Z?a8-f) zq=wL8u%ap2sn1T;am95@xN^@bCaT0<+5jCUM*00(L|^pzT-=4^?_nUN?d)4Rcc#}S z$Q{kBf`w&!@Kh{b2q@Zbr#g%>l+7(7169_>J?n;IH5O5X>)X99&9} zk=mcuQ5$QZKHdyrfr$+f)jF~MdhH5#DCJEdo0S?8$*Prry`3&WYGH~J(Go^bbVaWL zt_I|ve*m(=^eY#Y7*e=>)~1FJNgl))5Cc$t9wMpa=%G(4WNh0rqY%dko`D#SChop- zW*r9}n}cf31Ivp>6S&_q0df)T+lI0F_wlj+@qR!xu-wjK=pKIk`)lwT z7{aUB$ne$wIAElIEpf!`2;RR06Y!tcU;+{GmlYM?e6~{FzQXzZG5Qcc;|Va{0gdYq z0WY{ zLEzF{1>y%14M*Uiim)Jl))B#~mW`25kt0>B_@{3^7-#M5;Mk-76N+j~t=f(gDsin^ ztAuz@2=ngj7kw`z!aY5Yu6!m6JkZ4Ku~%Z>p%d}N%TL0_$z^{Y<#7}NziYu^P2Iu5 z^!C4g*E}Bes7*L&x{kS`4{|SduOj%;h1at!D{3D7*M0XXg=c_oFFF?D&jjZjYAZbc z^igcvHj2-Ff6)MfW6c`0w#1(}!lz^bVgx1$2sX)wgQJvV$^n#D6{1%$gFx^4D^bb(jkM;pDGFGqU{MtB=16P%-SDRgFu&9+55dedQau)ANDag6F@Xc zP)TJ?3!?U$`_8?}F9>gkY520?!35AAr6q|nGqQrou{k{ZPoIY`{qQLOnF2-=Si1jf z0`%$-ayN$y&-jKZt5vWEK$hBu0|WWo>^X5iHJcgs9?J3AuiRmix~d9+nDwx~|9w*Z8cS8^MvnyKD%72JI63k_=!GIUyY=yBP7{CyOsBDDe~+^&fOFLPV#f+G7U z-(X}Wvt{aP%4c&j<0!czvU4M9lhJDP6dDr`sAM1^#YLU8$O9mI1ftgz;Os!I6l}P- zEP^4zGHjzTFTR2>$+GcHub}?7&nVm~Zvk;-w%4*3dkwl|5N2Aexq+D{w?4U8AYe@(})a z-RC&O1a7zk_|?ab8^-dEf0{S8%=CB`Y505$CinFN16YZz(V(a9tjb+o|<2q+8z zZd^ZrOBt&NSV0h;#8Plsww)YW+FqdC=+GF{2)U*3qTh)*Fo4JrS7xp>7R50iu@{69Y<{H8Yb}M*FG6v{LU`|lMDABCg6x)ljL7ngvt&AY*_aBF{ zXhXS)Q{45&sg!0RbI=L z#fwy^9wLT9Ibhm1u8Dxa=m`FME^brRI&8neuyqvg5~)t>KL)A+u&P)JLz8;f{n0#ADNlX2O% zAASE|0!;i}NBqPQ&%O!Y`@yf`!(V}-nkdI{zt1WV5xevZ#k#GU~e}0Dm*m~(W zpfNBFK&qjvMzt3$amNJ^9QY#DwX|2Q1#?bj0>Ua)%DRCl5ybfX6~%~Cym$?TYU0Sv zIVLAtc+&4b319qqX9AM=mlvRD(thD4+_~=pJnKFG3(af}jjZbyw}_u+J6bGy$Rfhd zMP_T|IVN!AG~WMrSL0i|S8#OGO7$ur*kc;>OAe|e2*u1m^=JW>*p&zv>LdMiAHpx; zgNj(YAWh(weI=gu$Wgrb{BazlZqe-$X&QqPTxz~L-Ml`%3s7Jm%5^sO`4xzn0a!B? zxB&xwI%l9;$DD#ox=GVbJ-`ZrXufA3krrBl`Kl|D18dc@@_b~J3X72cHoFx3BobF+ zEpfTv6d>ZXfJWUgg91(L+*V+Eri}}J?}@nVTaN@L7cCQ5`8i<%JfzxB#DC5%>|J;` z9{uun}uI#&#_P&kybdDmXg!uFcKFk3kR6aOf`)=?V|U5&nygztnH`z zM?_xvu3tEDFEb!wS5a<(X9E2q4Eqp%@GK~CJY^WnY6rMwzs6G@F^U(QH;zLKIhIyS zYgQ}Pikw-L1PL9=rw3wHq6C{4NLh^h^O|O6!PZrXQHcRWKvw=yK5Sd&$wVHpbsPhW z1k_rMdF{qcQqc{;7+!F(@yV^N`C(~6>{@$zkpPZQgB2ZGO_G?~mk?Rgf-JLr1!pF^ zXmxV@^`}n4BTnn!xZ`es>Cm-`pIyYDl>E8~YJY11IOi7ZT{s7ic*!5*#(iTrbte&j z-C!NIZB>FSNsJV{bw8!fmIff3U)I=js4xLEV@+j>ZE{y3))tKWNtc+Js^L4|-i@gv z$8q7QGq|HGQ1~hq(1$tn#SN&xc3SkKhqB>&R6oZzpV2 zS<-Bih~S&54__98^{&Z?Y4p}2U`^n*gTNCXHe$4dk9}xe(UwPY40Q+bo>GejF~i8%7ja^ItpaC`j!Guf7m$Q z^1Kar@Ntd459MFKxr{e_=m4(2ql1%=OwnoEy6akZQRXx+ZKSG;pIm<@PCH>7pZn;A zrsK}-hum`$pq?yEE(^N$V+7UDe7oVH3nt?JkoI>({4TdZ3xd}bY{6;{*36*Jz?)`( z&ws0hkAHm$Gm{ybbt(`76AfuW=RgWFE!YYxEx97eUWFMn@$u*9Im zb|HGx2)%v(@wU)-jmIAWWD7*s~ab@{<W~%-Cm3J}b5@T?90tr&$aeL-~3m(zLGap01V2)La6HuW{ zI-8lweU5tmOD$BaX$V{(s=h3(I+p{GNCuPGT9}^Tl_-<%)C#qp#<>`S0RhEi0wQNx zfPadCJUMv`rZ_QRCN2~G*;3nMO(O;ot%`5+yot$_u0Fh})Cwx$R5SH((+2evtD7=X zh6!xbnA*_6`L8$+U;K{&GXYrtsP49%tB(LbBK|XQ?(=>RyY6V>kkyAw!@JNJ3s4H^WKT46T288+yaMi1P^BW!W|Jawf z{$pU-fIb4SqRd3|SBa#8YxPZ1E=gR)Rwe8uw^@=V4rs9e4~5Aa)h%oaqFab6xmBgQ__^$})(atTH)_UhxVp&1$M_>e{ za(M~b)d_F`Lw@@n%2>BCxIiFJts(HDnrH11d`5o_KxhfS@0D^ei<>nfe#*KUnN3h1 zr?_in(kh!XsY}GLtAWCUwTX18BT4J7I)2U6m(%Gej@qs<#Z2JeAGS^|LOC~OEcwqQ z;y(@N{`$+Y>y8nebo?ChqT#FE5Hloccg+o}c1{|IVBq`Nb!o>I}W;RaZRj>OpKKAunamr+10$ytJaVy^2ex^YA)64-O z{c~MOH?A-Wc^q#jD^UPC2`_pyblqLY1fKf%CVuUSW7vN%$7-9HK*-W#7obcH<|LoU z6pg@Wu_jZ&KsdN9k$-E48-!w@DyiUF15yJ9Y637L@IYN5Zc_kBmPRZwt1L`}38rwU zY?%iYicJTa(5&gOv~GgVvNA8K1y9@8Co+s|$ZUz{@yuKh)sLgt0IIBG7=i)Rn%J?m z#MDfV3;x#y_!4UZ4PpX^v7P{g+E0?7GMyfLC-%-i2o<4f)G12473!-{TScH@^m$EYP|*tdmL}_CK130Tg6NU-623~q%QJy_ z;29S*@!ThmnP4G`B4o8c1OkaRY=+^*0XxCQh$}Kj6YeFyQ~NnCz(oRDK`6Ca6(47v z$G}X0QWgZE?7gNdgACsvAxLt52x*A=A>v136N6~q+9 zI!h&5^QB2JDmqjlhBO4K1z&f4*ysW>Q(9UZO`w4?X<)~e0#maEp7?u`2`n5QCIG~0 zKN0`wcVh3tsW|u7{yTQjc+bzk(M(eJeir`^T<1-*+Yb`VZDCx?!~1m=NfKBQX- zuG>d&;tBI8w5@+{7(kLCFH-#EhE=@ySGM7UzkmGQp8kH)AHuCh2|HF3I1vv%b_74V zv1M9u8N5MRMv#{&wr-xr$k-@e^77B&1E07SCr17(9t25oh#(ISm?UyXWwZxk7;sTqwrsNP z_CoOl7V&eomiOb@(ojhjL<40CQcpMf+*wRewCn|ud$2j(!04tX(t6#LnAXM|Xd{~b)=RW5pM)IF{;yjA7;X2#erWPdmufK5>FM7sy zeDKvL{+a6{ta_qbEU<GCE=@t?|)0;&x8pqtpGFA2{z6uQ+XKdwekp`jw2d{ z_QH%yM?@_cnOoOMDt8JGK$=YqIu45XF)$54M2X2tE83JyQbuLxY$@e@s5%d2mPzgR zSyg3dqNrUoIhz$W+%mQ0mJ91b{Qt>&6L8C_>Rj}nYwhN=b*iHps)wQ|ibjkL(GY~h zT!WhU^cuZsM5T!#qS1UB6G^VuymaO!G4DQOe8F@#_a=FX8e7ze0s%$EC`BVs1=Uei zP*l~a)1R~VUTe+w&1Q@_<~;jARZ+DKyv4UUr}o*+T64|O{o@~F(7+7Sf6cH0by-@h zzzm8s*g(-zHvTs$!m918ok@e48FQw1sJXZwd9x3ye*l}$QCPON!jvpM4mwed9mloA*A63zq>Si+r*t z6*M7)sdbL5c4E=z#q&?`NZ&J0@U!{+)ZwjvPz2I>Q+`ra6wxSh z=i}R-5$7Ml+VdgZeAOj1J5d=s$)jhZ!E`Am`S^`jwB17WFHtsa=VAkGbE^i;Zw#Bh z>%O64DLh2eC!iBrCmE}5NkM)>i^~c)nAs{4CUIokHrfDy1811gQFS-Zy{!NE* zczg?9{DwDs%Rh;tYWh)E-tr^IBRgks?Q7TKruS_{vci{7po=$<3uSN| z7Cd^?#N#-Xf_$Blp@HA|g9E_II&k}4(>Q#zK(iiJgj3Z?Y;Qw>N@{=v&|^M}4xN1j z04|Gzf>DbpBE33#Mg^86AM%2T5^TeP0a#%-O%v;bE{AVP7D|Q)?qRA3i#CBZihBvV z7R-hH>8h;U8%*BZCstD-@dS(#aMNaU%uLp> zYN&<5!4`hvS6+dy8c$$k0;(|%OpZYtZ@}>Q%L2YlkrjO1ng*uEp{hw>gR%VQ;F6!a z3VRL?V9Pm^Hs)8}?N`dV{f|5{i);S#THN&O=N;ENceNUN0Y!lL_oyTRz*GU-SMQEL zyAbDZ9>PPr4OyrzG7{b!FpR;C%Q3uY0DttMujA*h`WM{wy(h4BDX@A4I6O-gK^h_) zj}R{?+`_Ue`COMrPAoqFD^~!kM}V6?JAu#LGLGfTGM+K1Mf#3ggprM^fm3)u5LzW- zcqkRpdq^xk8ARzlq*UYMy5rCMIGx|a2K(|qojI5{vNNpvRB3jr0FleD+`?)d(0_KT zs-R`5Ku9j}uR|4L#rap8H7HHFNafX_V;+@-QzDv>MrDRHbWn9# zu2`mW1v53Yui)&uL79aohZO6Ufy36m8i!X|5h;x$gTB4uE zfQ{6Fqmutb9n`xDN^+qZ8NwVJ{kU$+%+x%!1TZ}kA4 zsDL9!#dmk9=9BeM(eLuSQVo}|^i=v&#V$JSr~Uz8?IKetSmLI?dmLZ;#w=E@8o=P7 zQ)uwUz}86kG=y^i+y`cU5Uck6ETlmTfFPx?L&{Id^r4Eqi)cii^>X#$JAdQ!7X$S~ z0sQa>r>p`nu6*9`c~C0+5hMzGFayx}CzY7#NdSw8b~n1%FCZ9V7UK6@L4B*|NW9dJc~rs#zs)^N0TxS6+I%#S?IN z5V|6BV3bS;7@7fw#&Ph-HeCAVpT%wy^IOZ`u)S`lu29btf(SKrBG1@aqsg zEvx_p5odW5I6PV4@?YML@9&xlO28^gS4n6+ovLFy@661!@c5oltX?;a|MFkX$7^1D z0XCn}hfx4ejymVadUlEMr@tc+`~@XI5Gx}^AQXW4JX6bX<`O$N9$)(M%5&aGN>H|W!Y@KRuTu9P;qPI*mw2Dx3@GU!B)NZ;>BD#a`g249 zyySyZ2g{CaHRsuS%C<;$TmWVB_lCc3EW1$$+PoN7zG5?e@|9b0!R8UWB8O&ysi_4*kZwvqJRj{aEFk>iWrIV&%0a-i zmi)#yp1`L+y9eLCXA&bz7h(CbMbN5YrwLm{?B@&Gv0^@zOdlu}Kq@-(7=S+3xA;?~ zLKh+JiA7~>tg<{@uX1$)hrj+@@c>@(!RdogrXPR@N z=$eHGLX8LIzG?L6B*qR+V#VqqTz1(8yzIx$!t-Ca9%nAftTjH?cFLeEV=o2Wl)zK$ zHU`y|V<|2f2Kr$XSB1O3y&qrw+HQR7?!!>^CeB>56uH@GS<{lf3`-M& z$TLnIE77!;wPhkftO!)>Aw-m73JD%nmExqJY@+MZo!R$ z$Qv5XVHM`IL%8+HPzFY6L8HVSM!-tIHw>Z9EaXX4Whmm->@GNO!Oe4X7(rDy#=2Dk zg>!k!PTO`haZNN#`Js7qaPY}GrY4(c_I1$6JGN+NX10lXe~B}fPNQjtL1>p#w^es4 zhZ$#TNIuuR?!;n#aryD@3%LFj;`m#>S0{oml|?0#z}dsVp0NT~-f$mw?w!V#4Sgs& zg<(}NZlc}97WdOUUlcZqo|>A&;X{+CHx;&RU5*#LcnzNa{59CJZ6#K%>a)UX(1e)^ zn4NPZ9jjNmfRr-3YU&aiO<dih| z25yL6hVx+*fMI}I)}<#u5d(=viQ6_}98-W9eZ1MT^d`hg03zO(DMg8GQAl9%tE@K| zK#wK^$y7taaQH~1He-|Z6lIo zJ#`gsDv^)EIPJ_~2ez+(`%;^V)ZQu>K&Ws4#p*LUsFqFHR@IdcIcizkTapGUF6T8d zzi0UEIB~#FE^YMt(+Gc8_rHtqr>(XKG<;|r*u1!g&;5@J@l)@-A3OKW;2fg_ypnX< z)2x&61U%Wpv}dbI3=H*S({P{l8g}iS#P;pqL*KxC*sy*Co6lW_E$5wq4I7tY^_e4B zvSa|mX7qN$HLjElS?%iu3jcF@3K%`y!o!Cq@YrKx*!Ad9?AS4iUAx9GIbGPvM{CwC zwit_PduB2|Sx)`BvtW98o*-Bn?Oa8~U3!&V@GSJTlzW|(g%8H!!C37@LEtR~Q(oWAWlXEM3xvWy^*!G*rj% za1(<=eP}dmHl1q}>)do36BDzTo-HtbYz9Y;%;MPCEXF6=wjbc|a36*j^`mB5!;3~I z26Hh*U#1M)v{bXMzpuAYp75j;O&K<^d**6WGy)cY@H+(ELlJ0ALJUPVhyNZ)M~YvF zEI?K2!{4~^x#9r;^IUd_LJ0d$a|E&c8?&cMyNT;uAJ2ppe&StW0KGY1=78+SM&snJ3DzRpX9rnAJ)jJ30m6 zy3rbjUv4|s?AS4btN)La6aHvz(H-=Qlz>eAiAzu0c0Z*e5WDc9W5BsfYxt`VZNtyJ z{eB!B*S6PQRb^IL+PMtI+GZsxi**!MAu3gxPJLd9nmYUn!@~_MS~Or;p+>k(pThkI zXYuH+2^5{mchHGVqHVL4xpbXT41N7|H2eE;=J1eHxa>A&)+#uQ?^?ncA`=m=Y@I`v zhxdTSa{2UMDNGrIj6S_gS*DC}WB$GJ)vHh{5^QqwDH}jALKF@NqSEO;dZPfOH$?7F z6+!_j6{f|sF1`roCE&MuuxknW_sbxR;UkUp|!XXa9VJZ2CpIHfDENnG=S2* z#3=?2OUyQHSE%(H=Aaw*Y|=v%9$4?fen5uICYV>x9r3FaK?gBcow3Z0n}WlOvCrNJkBs?m{-a%<5|V-a0+ zyb^J4uCZ_&`&mYu>)~gF|Jv7_iJMNKq&Hd4@Ou};zgj@}8R?hfxKg2Cs1JYAfP;>G z8u(9FEW_V_<}i+ql^7nXIoeF_KHRL2^@I%Rs^)4jOqx*To_Apt0qoytjkCI|--v=` zi5-cCsDT6GU3PEHL9NYlU)Jm!s*oa3zPl2=&b;3>Mpcac5aU0K7=GfHO#D*^ppTR= zm-bfSt#*&6DMRr)_ap4lV36L-1rY7OtN9TmB>o&#k#3<=7d(nF6<;+0jFj{jjW z7UOA|wN?$o=_vj8NaQRi0VP~@BlNoRx%)h{HFNz9UHyj@baMIq-<1afZLF^{KQY-~ zpZ`kg*O#$jl30Ln-G!lnV7x};ABw>w)0I9(UU%RhMkG_L)rRk-Or$JfTI+Yur7 zX{?V}_*2xM1YIhCvYQ96Q0py-jY$GfnMw&@)ry8=_#q2!u+~ho&J2)hc>x4_SJv$} zVS;^$DFVy2^$?1=%8t-B3fNR|I)TuU!O(udCcFL?b5I_<^B^99e?IeKup47EoC0tX zZF^2;)EZq`yeDI?f@r+1b&>Xpr>ep{4n&w;P)-Av*s?%u*rIk+EOF2b+k?`C(rQc;U5r-Y4=Q7jmkUA7q~ zWoWEY(Dt4hd?y>qQR{0u0FX#snG-1$rD;6?D}Y$$@`Dil3`%F=cLr>gO$!p|pS=pf z8zbXlJ6Rb;RTFqX9=rH*BU`Kq!qb%R@!iaFtxT#PZaGii#S%uDYWf589g1g=W$|?Z+yhrbi@S6~# zDuS25H@xPQ38#4AG7@&fcEFp(#F~x4%oQ2=ngZ(~^kukb*DT)l>Sg%YJJy{18Ycf> z!PieO{Blfpqy!f50HpP&n4jHZA^i47-BD~0KG{aS<^@Rz5yi!989`Hwo#KQFeIb>0 zDOaPkji=R_DQxprqg*XxGZ$mKgf}SL04o)KDr!D}VBr@C4Yp>tO98%^`*UxugK-BGVzC(ZUKvL4Q*+c#`$kT2O%%Ew}^y zOq(!sH;fn1H6hn95-d#tp6e_lE3& z@-qnGH&PW^Lx~PVX4vNTU30kZ@)7*`FRwf`OSypX>n<_8MzHixW&OJeJ}ZE9bBdIh z`TXU5z+>YTwm&e1kwtDh+546`Pawt&l%MUW?MwqZmB-^kP6l0?)^LZ6z#4wO_0IZg zwzgnCG9Kdq{O`Hx6MToF-TEu<~LZnc5Zt)%Dn@h!J(9Ga8Kg2VD!9H5}=Ab z6-viBs0RY80a z&CiDb*DDHuX{6>7?%QABx+@0p(YGyoW@|=2yA}8d;qN+&znkE9Q39p-jBakfFo@yE zfO7|c&pj}SoBnnmR<0NjfAp4?6+j5tK*d(2XJh6Np`E+Jkalyiy5W8p;MF#Mq4Mxd zd>0{d+%yMGiu_%xrN9%WkqR3fy{p*208WU>ZYiU!Dnt zKzlcAA?6n_5SW7Fr|IaC0?0}0lJaUwv&t>8Lrs<7x~!G&d+b?cU0wfVtQP6BNbt$+_ZD#L5ODj$6S)3e_t*gq!$XGS5Ez#B{$z?ZyJL9L znmPAhA%s-H{S8R4_Mx8Pb^PS#rRI_t55w9PJ`Uqo&cUmljE<+K-?FLWn5CD_UFgy9w=#Rc#E`?04CFO5Pbr zdV=;sGedn<5Vy5#r`%Nt^`uj$E?C59gZ%zyjfNl{AIb<@m{cj}=SYtwoM3kIz{& zF{Rj*ePSJqh)`gUA1iV0>KuRl_Qj`U-J*2g0>U2&au?y3;9vCbWIUHlCq@G}q|2K- z;lJ~tV|ep*w^`v|zhS@@^e9izvMkM9+j)L_509YJ?!(HZvsgOZ!NhC>d!87wOu#kE zM$z9WP?i}Br>5#kExj;ry)$2T(bi~{rOghQIS;y|Oc8a2Qn5lvgpq3c&F7f=YknF+ z7iR)Q`>y69<;Qu23Oy|hm?WzOUWIA!J~NdwO_HV%+_xlLZ{;i zSAKnJd4VU6EyBdi61?W6JMo&AY{x}sJ&u)2S{R*d;DNm>aPzk>#3%mkdC-`}##LtU zDP<3$2!Kg5;F%ABm}4qF4Zv#|pr$J{8x3vooiLBm;Q=NMZ1JWxEalkHyUqJdmdKTA z`w+qN_YK{<*4Eseil~7A4yK zG1IEBerbj)wl$v7T6G2by0H5=_D_-iG~Vy#{y&xQ%b^yD@ZVvC|LU7jmUXP(G-AhX z%f=Y>dWAs`%-vt8Dh<%zJS4t%Mv_5?lnMkwL&mPy*PT)7F>A>v}pDT z#FmvbucjspOeRt6wsSm(;6rg|A(3znz1u`Zp)IeNa^fdG`Lpy;VX^mu`m8SXjjq{hbgc?d1+zs>b_O3yY-D7oU`S$!S|Y>jJ} ziS0%iw5Q!qs~8}J-)9&Y*bZAU3KOIe39Z8dQHYd8FR8%28bP3GC_`0-oyX3*ju(k$ ztl2}RSok>y;u(r4-!N|aDc(pQPVqjM9cQ*TA$*}nCBhSOIUztA*%5`MmxMED8tv%>$@&!H$3)~;WQ!gTskRA!r@Ue{LmN9>g0 zkKlr{ZUbNj2AV0YZJ=df{0`9SxPM!Z?o2Eh-j3V;L*J{*iWx(+`Z|~qd zH#j4-h?5{P?Fp3&#UaYSnVpFcqsx7wli1vac`9^!^7}J)eM4CpAPM!D<}QHiXdj82 ztJ0eYkWbVq`I%BNiBxj_P~A(9ZIsN$y6DzbK^jiB5w&dLjpInR01Y#9s* z$P5P2BDF|vpiWS+EH&yn{)hRFzM967>B6=GJE4`4SM)SRJtX|5*f5IqkJIY2@T-M| zUxor(7Xf#E{|Mgvmd~QoQCPQOscrb76gAPvQO`AY?q7K4*wHhC40uLW(W9Pxnajl3>gdeHkcPYm;g5NHKphsSS7yM!& zmtPQmr0^pVekFwe>kl5mRaW?cb?cX)G{W!tve^ndGe>X7{-sy|kU($0G*H7GANd&0 zUH^5Ubp~KaSZ2teamnW@H+tC2AaDEM&2#qe=CKNk1|GoeAN~L?-sqKp=_g2v+v7X( z-msvN;88l5G#k8vAlI7uNpM)0qVZBP5j3Q<;$kmKo=NaHM0){|#o+T4X#czopaPgk zO>ue!2KGb&Fm+bC)HH`(i;YKzSP+hh`28VeB-fChWCDktl{%T>%KabwqMfg=B{KoCS>Z(s$pl{u} zWzOB1+LQ0_Hm4FEc{`dp9 z_^e4hux~Z$jgkd8qzK);w^p4S$mlr#@2$Mb1x*+-Kd)jTjqrqoHxOYxV7!TjdGbCM zuZK_w_MZ|9&|N-D?q!*Y>A}%E5Ky}Fk_*6ydhFtBisMyahH=29bsRsDM_5rmK|-*p z1k^oYrxE2D3omtWRna+Uw(^8gWKmj1v$@tfjFC3ghkWnKM zPa*;${)WUuBCyU|Z(CL#g_ps7r|;#@kXbJ!-lD>WV5Jf+sV7HoLI8@sq-IlKAqRwO z4H8~rhULr#bFrR^aRb(*iVUR$vmJ|2NLt_#L3|!cT5}+JNvWH^u@=z=i|Ah39RY z#C^M0+Ux*GK*<=ea8e7mAfZtWzc2EV?l^gu#bvVb_fOSfzr?C)~H-8j_;$ef`Z$ zfkwtP14IDf5JY@0TjUBHi@2~LC@Si&t$bzM_T4SK>f%0p>NnOP&uch3;XZ5kp()H2 z755vh77%1JzO|{2eL$IDY?CKaCRj$bSeG6I8!TMu1+|E1{Q1Zxleq{eEK? zUJ@h_7Kvm3+~@nv-2c+$a}uoH7dP?AUteYU1ygec`WhJ)4K!?;_>spaF=LvRhGyaOs`yB_N$^`mjP{dP zkSc;A2?tWaKW^cF$i)1gLeWv!aJC2hxMj8xeuYO4EXE>h`Tq&$ZTudfz3>;_ElD{T z$LqsBjS{%^zngGi3is_k!=?z8ioxT^6O(a2!oDIefzyM818^K4T)s4hr{}c@Jq+8> zjj~tKXL1^ucqziQm*J|s>}bh^{+yS3K21ljLVzsxn?2J?j`5PgaRU1A%2vYXXGNmf z8Z(%vwa+qyW}pNJR_S*^0+Ie{!Wu|lRisV`m$38Ov3+kFKlQu@KJmU4_8i+qg?g?~ z%apAQ92sbsCNkK0U;%MB$NI+Q??|vOVf@V_0Ht|;1W^3=h5uii<=?mr zrEvR=2hgZzR``wEf5)GH66bBY2f$*WLzW-059@`yny!bA?fMIbJ%vH+Z;3RdB^cV^u%m|D}HLl-Gxk5=LXWZWPW0%GOB-okSU z15joZj6~;ktZf-6(Sgku<@-hMS4&MQXqEv)4Bs0Degdt@l81}9KT7gYOdvrD;s`fS z`AWlkc6IRTiyQdo_bs=7uS{c5Gp)w-7_u!WY8&r9gmG;qNr@Cx^(r;!*suH zc?D32SieXuzYz99#Qc&kzz$Wy=~s#HpG$z>oBzd<^ERBd43+JS;Ra?HCD1T#zZL!l z?)=!Nv2D}6PWTNIu%mP#%Z~%It z*An;a?%-9=tK*;Fvy?wV33S<%uIAngFp6N&U=z7g*tu^E<88-9Cu>jcerKV)eizH% zE#()n`x07jO7bznf7io?+y80H@LRuexgBHfCge7P@E=@^;XdQ`f5r>{i2H&zokVK+ z;~EUN<|m*8u&@$vp1_T`XyY{Q+iR3S8HJ35?nAcx@`IY<6r#kE;(bA<%eT6kZ*VyD zFiLyE?MXNNDSQ?=G<@j^)tJDwociY&+{dC;aAv+QRLpt7kzvy-HxjD1i^%Xgz@k z9$W4Th(JJ`j`fgi8>i#Ezm~iagnb#2fFu@>UV<=Orn3}h2>c_j31BegydeG#CH^g4 z|6VD9-h7R+9&((!N(+jxHv zeoFO8w_mAPI!?C|7<8Dx1#72q-|l4=6Nmz8p^QRGc)rlf7(Fr|@}4I3DiP_&ueo87 zn#oZTGz_Wf6wmT@MKVeg{mJstqm)2zLV(K5iH@u16xIFf5UbfkW&#p~mp@MjFm9el z!TT+AiZQLfq7Mf!JzH5yY1gveZlQpVd-q9~U!_1_Qq@Pof9>_3v*ez&>z1L@F_UtdXfEnU zV^JT5mN&8c=n^OV|Ie4O?X2$uSmbxQcGjOzMn3TWI%N5r9ehEWY$C3C~3O zPo@uhnGft;v?2CPXx~JOEz~0&vR0b~J+{t~`>$f4@3zJ-fP1Frv#QFhiezCL`yHCfCH}ihs+*8Dgp?7CTPA8;b>$)1Vugb#GYN(TyZ@8js#704~!7Uv-otP0&x3AzGd2h9vn`UPy6c2>n&IQ;f#k zc*nK`58(sCIS7jpFh7Ip0}mc7@SiTIJK;ahL-`X{AaKwr0SX0-C(z&5u&TKd<9!e{?gpo%Ns> zet%PJOd`Xkg@nELp1@as|3+N6ZU*=5S%$iqJ}gqcvau-dx#Tn{Z9I>iCr?$T1LbS{ zXXmy-sm}`3JkVSsGDz+^!gA0)W_LlHG-hFUtU?v9W$L{O5fzc-+Tf7gp{A}IIMtuqa|LjDaWVYvnYIg7p0vZ z0q6+<9;F9!Gw~+NkY^eC`WonTD(u>I1T(W0>P>I;7l`pAtKaQG7R*~6ljr~Dj!|5D z{pZmsO+Ei|7)nxB^Ju?O0$B}*Ck9c^`*6#LzKrwM-z$V)bP)A7^67=Ww@P5~(7pKT zhi=3LRtYS%DME^~nHh?3pCxQW6kqpyXdn{ZTs8mEO<9=CQaMNSClJ$%5#Gn=B2w5Y z6D`BU^SwBF#RRmgYcEpAR+t{-Vv!|dZ$N-_ItdGCF(uhTG1BkZf0dgzSMSel?$%BW zvi$%xkN29#C^Q{@%yi&(g%AJ2U~vDE%hFvQ3<$Cy?I}Cht=P0f*!e3-qzkV4?O_smmXuhfjjT#P(jo@SN zyc-v6x;wc2o7JwC!rbdT@floxK!8v6Q}R!l?TAVw-k5@s=&KH7481$rp;Fv zKtS&4=1^%Uy^(s%JMHee*P8KQng(~~L1Vkm3U~F%u@YCDSHndcYkZUVNH&0=2!yA& zzF!eBQJ~UB_?;(U$B8%Un42r{{fCZNOki+O;A~H2@rC=(58uYiSpKVj=?fO{bE!U) z25s1fo#^T7`kxpd#>=076#x0MZ@a#ITEOG>q@O~#{{txjg9&`~L+{7=YiDu)z9lvs z;QNYr|4@iPh9*5#eojp8jR2H@e5o^)GE7c{>PVwu(Fq=~d9pFjO@$rN9uoC27b8NzE`@`#!53lue>U2$T< z{~y8=*p9FL!Hu|J%`EQUyBPJn zAX>Q*;+zuhW^Mj9)DLXi@Hk8> zAKfX!?&Umx>SFvyRsw4DO60e$^-OwM(1|Gsh5`hXS7eK?RR0TqBFtJ3$S z2ZOwt8^tCWHzhZkaQ9__mG@w!(2~ned;nT94tcZieys!etppfNpCP@2(|z>D(MY=g zN|0lIGY%EuO%NJ1T@;F`wGM+iVM;aM2L(jfaoot#AL5t>ZVsU+S6{`lg+Js=V88^ZvEmDjws3w2B6% z+vdZkfp!bJr186n;64kLz%9S`er!8)4iD^G?0XFQurNyi9ch)to{>%vx&1Qj9C?sF z<5bM)Fw&0xOx%Q29w^eybRM9ZNu!sQt1Enp1ov_gb?DwSATh zECIk!(?>HI#{4WhIxqya7NDa$xms=pSpx6A=@6#d8jI^dOS?LlIn&IxFhehW6`w8W zakBxO&}-Ws+$e&AD*TfAey0R7Yx#}vo6%L~=C4^lf{9~O_~*anzGBh-b?d$GXH8^z)1~|}2mWQXns10; z+M(x`n=sv~ zBUU+(nd@B=g%JsV-X)Whdi_1p0H?F<07o~gU;4f`DV1%K?!4j@i(hGS`y&vF4RoLi zBe^juEH**!5y+Ejbe;o{*^Gnf6X?PT9X5h?c){X9jRzl_!Po8?!|Q)^36?e#j&?+Y z4uS5IYcFGc1_0+#eHA*|JhZK=DU?Y&RycF*A{;w9i9hOR!#4V<}V2`X#(n>OZGUihh{mucm# z2tcr@D>Hk)z~0@1xbCO71I@$0cmt@p{(s222;zwd=JC8Qy_xE1Ucb=MEr(x@pl@&o z-f-CixcS>J!>%WXv3${-U4J491xqc)d5d#kYOWFkV^l!?Ilj+=g=!2a_9*x=V+r4jc*B5^G!>1b!IGuWimNNUH_l$l;soLcX;>m8V%1>DFF&PW1MEzB~43eIy zxM!Q@yuU_lOz0}me;cKOHFnBmC`3qop-kRfU;Oi508+aNytse)GmJVE=&$ ztXaF*zQ>S<=Gv7Nc=P+J6$9uWXkcc#gC~x(tYEKRHG*b;1KJ|{Qs}9%M~pu#NFNba|1_l>FnfM|XJl2RsQ_X+w=^jA$*F?`FhU(KC z+|wPd00S_?Kx=$k%nkQT<`?qNkS=l53$$G z{%Q;-sZob=(QsDMbWyfIw<(!`si_n$T^(N3ZRx})@3pVxP?(dJ|Cx7j3 zjLwzVJm|s!W5L@V7jUJ$D!BdjAwq%5S^h#R%dIhhpUzyn%7=LQ55#4q)|pUN&CFN@EGWA#4{*Ery+pcHOCDIgdUe2&{8Y= z4Pt<~3%3m7yAO}y6~B5X4$qd@yoj3OXdZY&`^`Oc(#Vs9-=Y1LSqCHh8)_IEZQ*&Bhjn>CQv8W_&)n^F@MuD{TjBmU-1mT zoX2^Y#WVn@;jbG(UOd#s;LsFa{*E``_J4o5Qv!_%VES3A1hlBFrnY5A>-f1BejXQY zn8Da|e_#pb5_pRT*huV2Myk?)(VjEQ+89LSK`{46grJ;hmY0~?_+BA^J?scnlC}%L zh+AE%$OB?UK%pw9Taupt-2YDqI?}x&k=;y*He<>S2=%eP>F-7sK?&^~Zk)3F>HKp> zuzkldyz*VQ;^=IF&5M=w0E~9)&_Enx<>#ddz3?j+@0;#DR`}OsI6B(K+kWNqcx2xs zHf>rFarLc08;hQK0dMpnulFG{kD7n3<^-RuKZgL6?sLK)cDnL7K)6_wIasr727Lq5 z__6C>kK4X;889*q)tG#CDgm7+0aK%Uv>%P(hj7W}2XSns!ESdf(c)L?UX>7jWOxwe z{|$&+ON!ZK%ulJpjK87Ph4NxkyDl^Ftoyn2Yv39y(GCl@sG z9+Xr#K?N&D`r%SxW)A#xVGD&E5-(=bW-d>!d@xs*3g@4*%qoFb|H@ab5;$k6@(psF z5^(84bHSMv`qEWGS>Y$Q-~2p#wZf6HHs1P&YAoQ3_h2bF5!EgJ$0>uK2~*;P&sl^x3ZjDwnX= z+UIAhQLJ11guO=q4RxWtAUAAq-C0ixgTO*7-e;B`RXAnHJt(tSvZBx{i!4b4`pcAg zu+w(*iV4_}7blfL3XCvWBC+a_7(u0@Gq(#SC%OtHBQlXGaUy^10#A z@~TjttdnyrZN_AszhybLKXeQ~eZws{Hd|oJGIzJM(pI>wr8mmJXg)>4Z!Ew2`{q>& zN5|W^>V_|3$L;33rC zT6|=#aiF0dn;D6Dj=Y`+#h@}9eD$3 zYLJU`#NM*aW@;j&kUW5-MY{}xXl}#7r^%}d?mP?;E ztk7=TdIs*>c?_?6*DVKaG9KDBj&qFLuj?Xj?*y6! zKXcDJV9!11HRb{8;_Fj>w$rE=ezyAL{`0jvdarF@VHs;V4*;Rxi?V?YXLisW?BH^v z1nz$Evrh@wITFV8pM#p60haH_)c860#*PcHd}vY#e)u@vGm^lQ#c4nZ5=tt&1n}6B zt3)Xvcm@1%Dfb{Kkk-N%cj}H_F#$VVupt-;MB@y!*CuSK!{A$MD);xdmgh1uk6X zW)Nn+J8b3$NuGa(!r_TFe)jGEiU%JV$Ck}2QJK&4g72)mR|Fo&GsQbu9+-Sq*j0l^ zcG-?Tp4U%6UuHd)jOz?kCM>)XGZW3V)^Y|3*~2l)Ag`m;O>9_GpgGXN<=6ZqZvW1+ zNC{ZsFWouLOhRD{SU-cmxa*DBxqk@5ebXEQaDRZrFa-cFZurUjRq@vZg)jCuy^g?a znfi;;;PUjTZpEF@b4LMa=xMrdamz1p$k;1-O_=Fkd4Z1z6C%E+Bl;e~23(LXz9(_8 zG*AElAOJ~3K~$87hWJmh<>VMH%h8%JCB(1-XIyP3cup`4aChE0D{%iKV|eX5Zo$2K z$ML)oV9OGP4NDZZELFI0G4Q=dkKyOu`4v38djea|S!tC=M%FxQvVdn9rT*#>nTLMQ zEKAQ>dxP{F?7#@U*@YQdeVutFpm?EdTxl3^xlaL_5U1`GM`j5#rXs55zsrD$4HQ)q z8`c(R4i?WICBVWz3rtTy6%)XVcj4ZL-iqJ(X;GriKSJQ`Q<)Mh z!eIGjlZL7aH-c-kDXmx_QRlvEP?Q5wRxnIqjJtU`T9Xy}7UxztWnWD5d4^Q8^_&%W zWZx)W`>wCy=dav|AG&Y_8qEe~W?T68d!NKVeqlGJ<|=I2yuu1CBx^4V@w<)Pjpg?4 zJ964NV)K)-qVxAyh70kPjY)aX3NhVOP^e|QW6!(R%q;8CC<~+LT#0qvu7eqUW`wqe?f!qEPc-afT4K)s<*4^4RJYz7m##xs1Ydemk8(j|R^E#}DeBL*mu!_kD zf5!;_ZtU3qT3q>m{w{JgiIIU>tJrL;pZmTMT6rZ9DCzuFS!{5^`S?B!o;}!}f+GPT zK22)q5@B3Iktii-!t`cWn=;i4+3bk|(3PG^>#KQ@1=)v5KC_Fw*R6^FnVd}Qj5+y&Zl}A3tJT(2lANqSwuG$4NWsYd*5&gHm+NW@yQwd z>Hm5N{mqBbtY>JoD$KSuR<0Pr`eg%_|D!2^$kaM35DEV! zd$42wEAX;+{}HB(0$bLPq0<>)wkTa2$MPwPFMvF<51KeCdFb|QEPs2_)s>iRKvhPR z0?ug3vEkx&@~xu?*A!{#;<=;%w1Hs5MMg-eKPXO;LqI5Ik7A~TUZv6kB7{!E&~g@_ ziZn~;+M+nc7?KXkD~imy*Ok{OqR+gI?`poOOy%N!;|UD*58$kg4NEmP96|%YSNR?Z&bu*H z!d4j+U<$PPnfdR9ub$knrX@T9jhDUf?jNiY(878cPp0Eze&hCEvKJ5U`*B?M&fmjS zQR3Y7htMeoBf(|Yo>o%M{ZA?A-kRqE#8du0SY=XEHcYewLv@@bh(lHImlNki)9-|9 zxly;{C$?ZGcl1O7Kv&}&mwT5-3l4v`*lPY~2rXO%A?IeHxi18XYB9Z%$lV6yngChE z5h)dTfKWb{c?07~LYWf~`p(Sfcyy^OyU)1pnTe~j%3>B2LfDwS=38<3nBL{V6aEelg5@YRW1zv&$U^ z!mpqCthz#J<_NC#p1^gl#O)tfxab(+3U&F$0V*W|s#rv`2u`BSSZ~p)$S{2Sa z>oAIH(C--+9$Czb=l6X08ZEE~743h% z&$=2tvBf&MqZbOma59h4Snd=EVIYROqSWHSAJD1N*BlPeYpe@jlI2oiA^kuIBlr&W z75jKn1UcFWRq170x>E&>YtHZMO`fI}AqN548R0ylOAt^UJ+Xy4xuYi@ zK-K9Svk0jKLj(g#VgjU9WgBo_>=HcaF*5Q>XcJA%9uxy$t_yI?{pRl}{cC9^U?pM= zsV(fEsiam5-nUZ_R?!e}XO`7?9GO!j#>!f75283Hqn}Rr;kyO1+ppYbx?Fuwc0uyv zHC7@tkS|j{*3Z0>G+_-}vQm4nF!LBm#n+=e5E?p0c)-kr1BD9*tP;5PO5FBw{9u$o zl?eX}4&dR(eiT3Yw)bIdPGReYF%){xhH*-T=KD;C&K-E_yg9)UAom6mePp^X5}HxyCd}w4U4M}6TB>74>Y($v*y3>KL|sLIaar;w6UcARbnV6Ukvrp6>7LY7_TNg13&m&=w7 zdqr&46|C`ZX3n;cwZhF7=@&0VaT{_KHF2omET^Fb=S_d2S;p_B)RDECrp1>kk=0z! z;J`ri+yajez;^<+KiMoOF$n}g3yS&$=0zj}QaE**c}lA3K``s2)x@O65*e%HuC0nZ zA2(LpgHirQ(7+U01JV`b9#fLV^f%aW=3L?loTlsm0~&}ezY+e64`RoGm*Udv-h=U$ z!q)Xp_&L4mS&mi#n^3D#!Q!*4B-T@o>q6MGR+#HaQ4eI+$*)hx;Q`I2avTAK4%1u! z2YBXb7ogC5UorRG@c`zI9hm4}veo`h02^spI%L|#9_jDg|33k3lmNkKZC!hwC_@l2 zuzY60{!NA?LMg}?&RKtDfjZ4drTai99A-ngjzX$tgu3$F0(z-a4i;$_m3i=U0<8Ga zrpy&zk0Ke7vA?iR0iAZw8*s0ht8AQ4WzU3T80A%(t|g)|iVRa_`qh<6Cm^lB6*5Ox zaov?QuwkuH0t%O3`^wX(1ZdKV5&o7F{%R7q=pc3;d0JW7XE1zcesCgp!GT9Ze^ zg`d9TbTR??#Gm-y$7cb(H>^~=u+&6BchSa>7y;9WgT)S>LrBkseHP~$l^|u13$3FP zE_e$oIt&9GD~6Mz5Q7S9JdwsW+9Z;Xo4#XzN8Ka+zAvB3*;i*zAa|d~n1oP@(q*OR z+-ybXpBlk$Pj%3qEYO*8F_f`(w8@>tuk61w&j{pi(ZPd(A6-UxgvBm02W;B@0=CkS z*omP7QK|c|(b9$sn;p30yDvWVRfO)w$HITX<5u{8?V zx7P~MsPv<>@{5KBMY8&*;;H$a%}-AJoF!xubsg1_6G`|66R1kai?xM<#7nzTY&V@#o`91;g{Ry2StNF2Fbzh_uN|Foj2{Z;v+fTqMfyK{I z33yk`3ICK6{;f}7=fO*G=`}at*lg~EU-!B5s5Ou`8e#l76+Gp!`wyQIWCfgNqteJk z2_Ar0TN>{zF)mvlP$H7>EDzrkx&1O^U~i%LR_nm_lNPuWIZmkp(0XA-RkmmC6}btj zj_X8}$>8FFh1x_v=Dq1JRK`MxmN86;_qj)J*_&F#2SdaF?#}v`|fjP zA-nil^g6P}lyisQFd2hKaZDN|3o6&#gwCH7lA-zX@`%BnPQiH)%7+CJAqHW6LVX2k zj4bXd1YbH_BT^F;G&PZBt|PH=#W&i10tGJr#aH3Z1(g8iD*+|EADQaIByjc#BIK z81&y5ySzpngam&jk!*R7%`%tmsqZZ$M^9yBPv+>A0?=c-ZrN|!=5=ZF&WovhYJ?hf z$O0j_RjW#|X~^mcVj-VpNnP)WQj zkY_%;@!o(%*aI+VJ%PN5Lib~%DJ32#@v^tQ8h3uLn-W-H44F!VUrhp=4&jjlFT_i) zejAR>)Nq~`eg-3{jM|q>+jeLEJe@ZtLmL%RxJhgu?V(Dp%L4W|8Pz6J*0%DLFculn zi2D=$?!RyP$-O&HK(?OI(JKr9hwgk|M^~LMgg7?=-dOm8m%yNk(AE(cBVR{PsaROp zMN^8shScqoDMCK!D!9|RcmFGqjj$7k3t74>-Ss$*CX|`3SC*YRd`sXJLdePTuvZ|2 zl7Ktq2Yghe7GNHESMu{h?%QPrG_Ps!bVP`RaDNnq2`YpG@U&;yDTx}EDBqgAC=4dh zL9@TWGjh++@g& zAJlPGbVp~UwiOIp4g>hLRiFiv<&UBgAOGjIkRJ|1ag^Zdt8g834kV;$gA&3Sw6H?5 zIxT8MA=7j88Ky9&Vo;LeQR14@_v=#3OW;}v|I@P?scagFQeuJkaXB?cr7Q=x9H*9I zc`bMWejK?`1U4Knm_UDtD}L#xaOXWg?3KV6FnJ7m+AD(2tb4R(pl6MOI0l6YU@Zy% zbr?0mztLO%nw)y!20)eWLFG_17l~{O~e>(y4>Cc+-_=ag8 zM(IvUu~A<^(;vHG88EkWcV7Z5IR-T}1~oGZOdN%t7=@l3 z1*VSL=TzSqu;y{>+;4>c8jM=Ef7*r?G&3Pi`591B2!AGGeraY2>kx`Mlcy%0A-;sR+pEbs<`GD%r+VCCc#h0R=u^q+jKmcNJ{AkUAw z^H`d$7-z;_hcHTj>oCOOjtZY|N13%v>aVoigNR2_2@fKRl|dAqMC&BOm5jLsdDFQm zF8cy@cd4S1-lw?XDDfX0@4;XKP_B0(O)o0YhmEV968MRC{1iU<)t>-{+fZj7hFUs` ztnMCa$tcv?CxPV?xMTYjxa@6jb;5tvwEYZ9J324J_f+sL+pS_Ez>+{$;{JQwgqfDS zE`rJ{C0Jr8O1wUgm8`7N6tGfg0#b8$XVKPHA<*YZ1tY_P$N&9v+ZPi0Qw;#3XZ--& zVb8v7PyK1$82-P=;%iyLD&ya-JpH)vC92y;BIsJ&)Oqo}4(Sl) zLM%QPLH$*(ZX)cNP;wm@m_o5@G8$fq=CP6|o*2JE>?Mcn1G+z)iT%6iZDEu^(VDyI zq5t)+cCX_9aEDIO!MywV(x50oe)bz~Suwo&Mf>?iWJ%#k>T2=Zg_=dMb~1E`8j7em zwvv{VIL$dO+;mkO$SqlliqQ%^jQ`_NsNO8EV{(h`7?^Bk)bow zL3^rlq#sJ5N-A@*RNd~bQq;*-Vh14}4kzF<6s4zFD=koM_@*e@dPlB%5(T&}cV;In z82X5NKS2xZ$`6=qu+qvLhV%()gl{ml|f zM>-hjw*&Wl3-r(?-8D}QF@HvY2_*kQ2tSja1k+NweWwe(~*_*OwCq%7sRPpAH3ZT0#JB@ zbzf(J6;)S^lCujh02HK4Lf;o$?LhFDkLW8QXoR3EprTXLdS|sk!96FNzfs4&Is#bI{BC)pFlhcN=r$FMc);bNe7&Oend)u-bd#pn3&P< zRkEBaww&~#?z6Js29rX{oqKG`s#RSvH^MD$j=pArGgp>&fG350VH8`PDZO$43bFeX zx(I*H7cLZSoH~U^=_!+w*G1?>#IwjkcVP@leum66CHsP&H(zZso}D?3+K38+Zv7T- zPmle2IdNb?*Z*|H|LAoVfPR1QuP*qmuJl1jA!Ex*s}fvm=^9H*CIy<_BRzo>BhVbj zB|dhvnWa0fqR*4fB%{yvKn{5V(uLQtZi#v0NUV;q8s>S!KPYA^3;J0uf}lDRj-fL8 z;PgU7+^R^C3gllXA?5!b0IZ-2GpXuI}XZY1aUxiHE$0$V{4^3vbUhbhv^q^$7 zKP~Om;+BZdGnT*6uhoVZ6yZ+x#3OVT+2GC0o5aQyh_T-^!8pEq>%0nq3lHDM7 zCEl58;uLKc3l7r45lu7mHQC9TNsNF#nkRmTa+(5R1nVUwfGa-}m^;NRz z(o6A~4)dJ`@ptLIjIBvk#pml>eea&u1a(#75Gp8$d5#$=snQKM4TV_#Yq(B8i?}#+ zw;`*YiFR*hoEi^ashl@utgKV=na5wu#pIq1SlWJriY`nEy0P-jQ+=8-t5Lk43u=y4pupJrHE%XT(b(Q!w+auyFe$tIaB1z9z)Pa$qRG zU&IhD_wDQS1vOL(60;7)Ij|C{;#OMn+(`JMT(k%LOihDn<3$u>Ku0wT#3qzhM>5ge zFOs~X;x%Q8s??U`S%@`NJ|E@VtpI{$y@CALh*lt|lCmN5?>y%f1RL~-? zoxn#9`3fMqx-JDsh!luN zy_IVu>XcH=er97hXA3NExEyRs-^Ce%dFv8hE6Gprqos}D&W(2%sH(hw7}9dSzn~7F z9C;y|jv zf2&x?+_i*esa#!|WpSCZz$M7_N9EIboY{$iILTvBLP<*Ho@NR7dAiLBw?so^21I57 ziNd9|rIKHl)yyi(#*m<8yi2Y}=P?c>;^U%Hy9mO2(PNK1}5 z&Xz|Mmu1Q3mz!5=@2IhZ0MqQhT~EAPf5s#r8PiEMHV^O<&vSSq^TuKWQC&wE(&Us`6(00Fry@nBAj~!h-T=k+ zuBM>I15#XiuOWu6)M-XD3Ab&zfHJ7YyOX{Mc|FULnrc^6l$^ zyke1cZaq!zy~qKJw$$=G=zF3Kr&RQBYHmtxs99ihxp@`;h{6U@^AK>ABqR{so#L#4 zXo#Y{Ap3zRWO@p%>( zbfp;q?bn_hF?so2?XeERK5t)^ra#8iZ-4uDU%Xog{}1Fi?I8fVyDYSPSqKFV|8J!l zuSMcAOADS7HM$8J#bRmT5xtj~fNU{?`%3PonVf4pfN(NFz^Ri_1nMF24umd`T+!$P zoR`s=DbN}(tsVxKlfw-XmkDvBUP?tPR6;E&eM@*BZ)?aSit)m4}ds~2Jh%I_witu9!CeiK=G z?{wjcd+J&8MS)=#En2Dw((C0f7AQAaW%*kAoJzh&#>i^kN6NC+Jvs8=tuIep{~y@V6Au7S?FG%sQmx{4!B7~K~$$Z zD;is+*qSIBZ-w|~MWH|<6cPD@-Rc-PgddRM+HB=k7#l-bcpX9|-#nl%x%rV-B4T|A z;dO1swe8<;T6tR`sVVkC=scO8jPM-`#rV=3#i2o5=T93xvi#!Sum#VOl4*XwPQb$W z{0PU1?{qSwL8YG)dNN4m!RJr+C_}EX=s}M zJ17;gF2bXoJ-Yj4cYR>nw}k>YA?uG*>;d#l0pK`8fpf3A_maMmjkiko9H0#uTWbyr zQWrn^PN~gFy(9MXA{W~MO-+OT*A!2K)X5E}jUquIk(J{i63UO>GUK)B9P9v(LZfVH zUvsZQ{QxN`kNighpSZW7k!KJV`C6jFN*)6DAJpPAAPGt;3cDoW#n+{^aJ##3FRWn? z1yW%F<=lp#h~-Q?K)B&@G`uL|wO+;o0k~8e5<8OTOF4a=0cs7E@>Vwr_r9xOBdkNT zJ^~=65J@U-dVg!;$TeSo|GIw=Zhsdh3vJ2&|0n>6!d>fBop<$)S2YG#{qusKt)-?9 zf2WvFi-sLiAS8X(c@k8UN$*!~j(??5@6S-{%R_oggqLhk(_5#~e>;z*Jzcn|L75W0 z02Fr_R+&^%zPTr5M0D6(^79$6iY%NE3LVxW#N}cANukBUB8rsKO&{Gy`dfTYC`_oL z0j0XDC1#49NDpuh zq?PB{nHm3$JKneIe{>Q46SDr%eLe+8PceWl7bZnW)51LXS6goG%shD&5DUgam;ev{ zlonWSWRLVKFOW9RP9I1+gEp6M6K+Onna?xroIoR_6GO~MITxHMX3SOOhUZjL>voL+ z87=CcccG%{@DH7&|D zUPr#}Jk$#K;m`JUo!N;Gdg1Tp_MedOpX%cW2?ElgQw3li-~Y?apKMP*@w4Gi-gQm5 z@BqT*kt{X@w_E~$VY8>cW2lBR!cS$lWC^Gbppcu8-UAVMD$6u9Afo9Z$Su3%m5QG! z*@W76snl9W@AJdEG8MVb!O92MpA;guK!b46m5RHuooSIa z)^j!{*6dL(wNNSa_HoI5&o?bh1%`4(}#Ee#J4`U?XFWT{5Zu5;0G20 zJPjT|3uPDY(SN#Z=i&SR;i9T&eFEgNN()>{OhCk(IE5w>4Y5gUu7hyisB!&%s4`UZuhy68I?%6+fQXG5S#5;p=#rymAw-bzprc%y zDD|0%RGCzyS-1<*n~-6KJVzx#G2u<{)Lk)jGYvJO_tt{Y^LHW4@FTn?VlJY~y-?sR z0e`o`y!WvoDaE>q`<&hjCH9p4wd{*F{QBdIjM+gJK9)E_?<7fP{Z4m3SHAdtwg2 ze5(hQY@#fzi@Yzg^p^e@2|EPfmS7|Cei7@KzGPkjP9Q`n722dl0HXLTq#S_MLy-zL zcHr!D?Wyq(Z2z09|8(-9n+q@Sq*@jfew>8dJSRc`K7obt0E8{ZO29rgz4nW1hgQAd zLqPL2P$6zjxd3$2fjFn_Pd4%n9H{17TG?KJ3XP$fZ+e+H7V&(8kjZ}VfsXh0ML{s(g~H$e~)54m{o;6Wh>0l}a*ZypppiAN85 zQZeWyiXJ@VmXned62YudZyHFl`PrS_WP7_ys;8^!y;nUmJ?l(%XZC%t%xq6rb#--p z@2_50sYn16MYFKB9{|;~bRa6f1XW0j#RNrefkN6ASvASTEA;g zpFceETL-N_F!IB=2>_@s1R_Cj=(P*aPj0{e6VUoWti^D>c@~mS+8QAE^Da>b%69;4 zet9w#obHL~#FuXuz~zD_QP5sBXytlZ2!LWi593%$3F$|X3;Z$dj~5pO69%-uzH=#< z=5J>gvLGA&UB`(pRY6h`h(l(3Xir(##SMU(%^oJ4=gF=+khX$&M93iX8w(yhY@GE_ zSYqgUuJ7Dd0lBlxoGX{d*No#X?7MeC%~HB_<>cJwZ+x@-=NX>YKNRxAI0^vhPY4h} zusT_i?|r58L2Od;=J-S)_gbsxlL<2bGfCkB5X}!k`;lz7(jP4{`_jBH z|AT3(JVEe)@^J;@cKAi^05@NmOW>#PoTejzJLS)5*M;K);P(q4CNvTb08GPmNow&X zG}Ep;CgA%Q`OH{Id6OTT)%Z8&zE!o^#|2QXKfVWl4g`zB)uWl^L9XM*hpRUy0&X>3 zS$OaAx$nNbbn3(+B7CPg{(+Gn##I17_ZzEn35Xz=ed?X&y-y#1VPf08|G{zzL3A7B0br_=La9KXc~k3WG40NO{x z<4ON@4XmaC+?c~UtN|EPGu#oz`usNi*Am)C zc+nujDZzH#JG)WG%0dc_=|(iq42THMG<74XF#StYzrDLqDTFjc3s(S8SAf*nX@&ts z$lN_(0fDt;6gWi!l0^N9+eH0z|6rts)A-GGW+(}f_KHt}h3Ndd@ zU<(EJ2`h)68HyRKWvi{v?%e$M+xhQ5_~rVqU#~H;cS`OV3i)9x2mt8M8mJNk#pmqd zcboS-`sx#nsr}FCiJ6ylGI7*vRiN6y62zMSme@rar)qD^f&E%jrUX0kS@PO<`HPo& z%FH$#K*NK|M8kq_w1H1X?JFyEi(0z264N_xSAx$cbr6OHl0`{25R`E9cr!QY-8l7wT+Qf&u%ZvW& z8dyz3xKZeRv)u$iufO8_eb0V0v*WDC!ztacZ~Uz;W=3hPl~xTxWR~FuD(v0wkNIW4ga6OT zj$;pbhBa9@Cz#-PQBT(hD5oTy%i)e=zZ(CBa}j9!y|7TROp0a@O z@t?KZw{EnqT)cXD?sRME;tzOPm%4w@i}pmn{`-+Ab<)1z>jq+%j@oT zUBSkp*T6Fs->W_i`(Aads%(70jpIUJxZ67ets6ZyM&!Ni-MTJ9fgb}#=uW*Xq~H9g zVqaY$05!u z00;aaYD&jWPfm!xHL&jII}W7B7z+V_u?}HCiVvw-f)U2Jksf301OUb`H&qmjFUFbh z9Ahm2IPS()OM=nDRwBDVAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)apv u5C{YUfj}S-2m}IwKp+qZ1cDI&0Q?8cJiS$#Hofxz0000ERG diff --git a/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-256x256@2x.png.png b/Multiplatform/Shared/Assets.xcassets/AppIcon.appiconset/Icon-MacOS-256x256@2x.png.png deleted file mode 100644 index 943c3a89ea614bc73779dd8dfb5a838e3dbc3c98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187013 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