Mac Catalyst

RSS for tag

Start building a native Mac app from your current iPad app using Mac Catalyst.

Mac Catalyst Documentation

Posts under Mac Catalyst tag

147 Posts
Sort by:
Post not yet marked as solved
2 Replies
190 Views
I get this error in Xcode 13.4. I set the deployment target to macOS 12.3 (latest available) but I still get this error. Which version of macOS should I set as deployment target, to get rid of this error. I dont want to use 'if #available' because I have no alternative code path. Which macOS version corresponds to Mac Catalyst 14.0?
Posted
by
Post not yet marked as solved
0 Replies
118 Views
Hi, I've made a simple list using UITableview for Mac Catalyst and have set the separator style to default. ( I'm not using Diffable datasource ) The problem is it is showing separators in iPhone and iPad, but not showing in Mac. Does any one has any idea about this behaviour? Is there any way to show for the Mac or do I have to make custom cells with separators ?
Posted
by
Post not yet marked as solved
4 Replies
329 Views
I'm trying with the MacCatalyst app which has editor screen with UITextView. Whenever I select some text [Attributed] & try to copy/paste ( using ctrl + c ) to another Mac app ( i.e Notes, Safari) it works well but if I try to paste it to Mail App's Composer, it doesn't work! When selecting some text and copying, it prints this log in debug window: Incorrect NSStringEncoding value 0x8000100 detected. Assuming NSASCIIStringEncoding. Will stop this compatibility mapping behavior in the near future. When converting Attributed string to Data, I'm applying the Encoding options as below: [NSAttributedString.DocumentAttributeKey: Any] = [ .documentType: NSAttributedString.DocumentType.rtfd, .characterEncoding: String.Encoding.utf8 ] Still it doesn't seem to work. Anyone has any idea about this ?
Posted
by
Post not yet marked as solved
0 Replies
165 Views
I currently have 3 different apps (one for iPhone, one for iPad and one for Mac, with different bundle ids) published in the App Store and I'm thinking of the possibility to merge them into one, and make that one Universal. At the moment I have 3 different Xcode targets with some code shared and some unique per platform. This allows me to keep iPhone-only code on the iPhone target, and iPad only code to the iPad, for example. My question is if I can keep this 3 different targets and create 3 different builds but somehow put them under the same app in AppStoreConnect (I don't know how to do that)? If the answer is no, I suppose I'd have to take the iPhone app, make it universal, and update my code to use the iPad's one instead. I currently use compiler conditionals like #if IS_IPAD_APP, I wonder if I could do a similar thing to avoid compiling iPhone code or assets into the iPad? For Mac I believe I can submit a different bundle? Thank you in advance!
Posted
by
Post not yet marked as solved
0 Replies
160 Views
Hi, In a Mac Catalyst app, I need to allow the user insert a passcode using a UITextField. The field is used to insert a one time passcode and I want to keep the content hidden. For this reason I set the isSecureTextEntry property to true. passcodeTextField.isSecureTextEntry = true By doing this, a button to allow the user to pick a password from the keychain is displayed: This option in my case should not appear because the password is a one time password that change every time. For that reason I set the textContentType to oneTimeCode. passcodeTextField.textContentType = .oneTimeCode This actually removes the password button, but introduce something weird. If the user type something and then delete everything, a big empty box appear under the field: I have no idea what this box is and why it appears. Does anyone know why it appears and how I can remove it? Thank you
Posted
by
Post not yet marked as solved
4 Replies
515 Views
I'm trying to debug a couple of crash reports for a Mac Catalyst app and seem to be unable to symbolicate my crash reports. In the Xcode Organizer, I see unsymbolicated lines for my app, despite having the original archive for the build in question. A search for the relevant dSYM (using the process from https://developer.apple.com/documentation/xcode/adding-identifiable-symbol-names-to-a-crash-report#Locate-a-dSYM-Using-Spotlight) yields no results. Unlike iOS builds, the "Download dSYMs" button isn't present in the organizer, nor is the option to download dSYMs from App Store Connect. I assume this is because macOS apps don't use bitcode. The app's Debug Information Format is set to DWARF with dSYM File. Has anyone else run into this issue? Any ideas about how I can symbolicate the crash logs?
Posted
by
Post not yet marked as solved
0 Replies
218 Views
I have an iOS app that can play audio books as FairPlay DRM'd audio streams. I'm using AVContentKeySession to fetch keys and AVQueuePlayer to play. It works great on iOS, but on Catalyst (Monterey 12.3.1, M1 Max MacBook Pro) it crashes. When it happens in debug, I get a message "Too few bits left in input buffer" printed to the console, and an exception is thrown in the guts of what appears to be core media. Here's the output from [NSThread callStackSymbols] when paused on an exception breakpoint at that point: 0   ???                       0x0000000156b8cc9c 0x0 + 5749918876, 1   BRFree                    0x000000010445cf08 main + 0, 2   AudioCodecs               0x0000000157918c24 _ZL11GetPropertyPvjPjS_ + 52, 3   AudioToolboxCore          0x00000001862536a4 _ZN15ADTSAudioStream11ParseHeaderER27AudioFileStreamContinuation + 1060, 4   AudioToolboxCore          0x000000018624259c AudioFileStreamParseBytes + 412, 5   MediaToolbox              0x00000001915f7d98 FigManifoldCreateForICY + 2176, 6   MediaToolbox              0x00000001915f7718 FigManifoldCreateForICY + 512, 7   MediaToolbox              0x00000001916bbd78 FigPlayerStreamCreate + 315920, 8   MediaToolbox              0x0000000191a269a0 FigMetadataConverterCreateForQuickTimeToFromiTunes + 45888, 9   MediaToolbox              0x0000000191a4a290 FigMetadataConverterCreateForQuickTimeToFromiTunes + 191536, 10  MediaToolbox              0x0000000191a2a470 FigMetadataConverterCreateForQuickTimeToFromiTunes + 60944, 11  MediaToolbox              0x0000000191a28c34 FigMetadataConverterCreateForQuickTimeToFromiTunes + 54740, 12  MediaToolbox              0x0000000191a413b4 FigMetadataConverterCreateForQuickTimeToFromiTunes + 154964, 13  MediaToolbox              0x0000000191a2f144 FigMetadataConverterCreateForQuickTimeToFromiTunes + 80612, 14  MediaToolbox              0x00000001917cae64 FigAlternateFilterMonitorCreateForThermalNotification + 30428, 15  MediaToolbox              0x00000001917ccb44 FigAlternateFilterMonitorCreateForThermalNotification + 37820, 16  MediaToolbox              0x00000001917cb134 FigAlternateFilterMonitorCreateForThermalNotification + 31148, 17  CFNetwork                 0x0000000189937cd4 _CFHostIsDomainTopLevelForCertificatePolicy + 27728, 18  Foundation                0x0000000185ba980c __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 24, 19  Foundation                0x0000000185ba96b4 -[NSBlockOperation main] + 104, 20  Foundation                0x0000000185ba9644 __NSOPERATION_IS_INVOKING_MAIN__ + 24, 21  Foundation                0x0000000185ba88dc -[NSOperation start] + 788, 22  Foundation                0x0000000185ba85c0 __NSOPERATIONQUEUE_IS_STARTING_AN_OPERATION__ + 24, 23  Foundation                0x0000000185ba8478 __NSOQSchedule_f + 184, 24  libdispatch.dylib         0x00000001099f60f4 _dispatch_block_async_invoke2 + 148, 25  libdispatch.dylib         0x00000001099e2394 _dispatch_client_callout + 20, 26  libdispatch.dylib         0x00000001099eb778 _dispatch_lane_serial_drain + 980, 27  libdispatch.dylib         0x00000001099ec814 _dispatch_lane_invoke + 492, 28  libdispatch.dylib         0x00000001099f9fc8 _dispatch_root_queue_drain + 408, 29  libdispatch.dylib         0x00000001099f9d3c _dispatch_worker_thread + 264, 30  libsystem_pthread.dylib   0x00000001094e1890 _pthread_start + 148, 31  libsystem_pthread.dylib   0x00000001094ebaa8 thread_start + 8 In the Debug Navigator, the top of the stack looks a little different: #0 0x0000000184bdeb3c in __cxa_throw () #1 0x000000015791941c in ACMP4AACLowComplexityDecoder::GetProperty(unsigned int, unsigned int&, void*) () #2 0x0000000157918c24 in GetProperty(void*, unsigned int, unsigned int*, void*) () #3 0x00000001862536a4 in ADTSAudioStream::ParseHeader(AudioFileStreamContinuation&) () #4 0x000000018624259c in AudioFileStreamParseBytes () #5 0x00000001915f7d98 in ___lldb_unnamed_symbol598$$MediaToolbox () What's going wrong here? Can anyone give me direction on what to fix? Or is FairPlay audio not even expected to work in Catalyst at this point?
Posted
by
Post not yet marked as solved
2 Replies
432 Views
We released our app 2 years ago, it is available on iPhone, iPad and macOS (with catalyst). Since macOS Monterey, the WKWebview is crashing at random, for different customers it will be a different thing that triggers the crash. It could be a specific button or simply one text box inside a web page and it will be that specific thing all the time that will crash the app from now on. For different customers it will be a different trigger. It could be anything. The problem is exactly the same on Intel and M1. Only a restart (or multiple) or a shut down can resolve the problem, but not for everyone, for some people it will be one specific button on one of our 5 000 web pages that will start crashing the app and nothing will ever make it work again. Of course I cleared the cashes programmatically, even deleted the files and uninstalled the app. The crash dump is mostly the same and in my crash log, there is not a single line of code belonging to my code. The crash is really inside the Safari engine or the WKWebview. There are other problems with WKWebview since Monterey : Pasting text Cmd+V in web page paste the text twice and dropdown can only be used once, after that they never open again unless you click on an empty space elsewhere. This is on any web pages, not just ours. Of course none of these problems are happening on iPhone and iPad and they use the exact same code (macCatalyst). Please Apple take the macOS seriously or discontinue the product. Crash Dump Application Specific Information: *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: <SPRoundedWindow: 0x154e8f060>. "frame=!CGRectIsNull(frame)"' terminating with uncaught exception of type NSException abort() called Application Specific Backtrace 0: 0 CoreFoundation 0x00000001c404eb08 __exceptionPreprocess + 240 1 libobjc.A.dylib 0x00000001c3d99e14 objc_exception_throw + 60 2 Foundation 0x00000001c4fc4c80 -[NSMutableDictionary(NSMutableDictionary) initWithContentsOfFile:] + 0 3 AppKit 0x00000001c6b7fbec -[NSWindow _reallySetFrame:] + 900 4 AppKit 0x00000001c6b7f4ac -[NSWindow _oldPlaceWindow:fromServer:] + 228 5 AppKit 0x00000001c6b7e490 -[NSWindow _setFrameCommon:display:fromServer:] + 2220 6 SafariPlatformSupport 0x00000001eaf26f08 __85-[SPSafariPlatformSupport displayOTPAutoFillRelativeToRect:ofView:completionHandler:]_block_invoke + 300
Posted
by
Post not yet marked as solved
0 Replies
232 Views
In the documentation, UIScreen supports Mac Catalyst https://developer.apple.com/documentation/uikit/uiscreen/ but when I actually do UIScreen.screens with mac catalyst, I only get the main screen and cannot detect the external display. import SwiftUI struct ContentView: View {       @EnvironmentObject var externalDisplayContent: ExternalDisplayContent       var body: some View {     VStack {       Button("Display"){         print(UIScreen.screens)       }     }   }     } struct ContentView_Previews: PreviewProvider {       static var previews: some View {     ContentView()   }     }
Posted
by
Post not yet marked as solved
1 Replies
264 Views
I can successfully connect and show ExternalView() on the external display on IOS target. However, mac catalyst is unable to detect the display connection in NotificationCenter. How do I use NotificationCenter in mac catalyst to detect and connect an external display? import Combine import SwiftUI @main struct ScreensApp: App {   @ObservedObject var externalDisplayContent = ExternalDisplayContent()   @State var additionalWindows: [UIWindow] = []   private var screenDidConnectPublisher: AnyPublisher<UIScreen, Never> {     NotificationCenter.default       .publisher(for: UIScreen.didConnectNotification)       .compactMap { $0.object as? UIScreen }       .receive(on: RunLoop.main)       .eraseToAnyPublisher()   }   private var screenDidDisconnectPublisher: AnyPublisher<UIScreen, Never> {     NotificationCenter.default       .publisher(for: UIScreen.didDisconnectNotification)       .compactMap { $0.object as? UIScreen }       .receive(on: RunLoop.main)       .eraseToAnyPublisher()   }   var body: some Scene {     WindowGroup {       ContentView()         .environmentObject(externalDisplayContent)         .onReceive(           screenDidConnectPublisher,           perform: screenDidConnect         )         .onReceive(           screenDidDisconnectPublisher,           perform: screenDidDisconnect         )     }   }   private func screenDidConnect(_ screen: UIScreen) {     print("connected")     let window = UIWindow(frame: screen.bounds)     window.windowScene = UIApplication.shared.connectedScenes       .first { ($0 as? UIWindowScene)?.screen == screen }       as? UIWindowScene     let view = ExternalView()       .environmentObject(externalDisplayContent)     let controller = UIHostingController(rootView: view)     window.rootViewController = controller     window.isHidden = false     additionalWindows.append(window)     externalDisplayContent.isShowingOnExternalDisplay = true   }   private func screenDidDisconnect(_ screen: UIScreen) {     print("disconnected")     additionalWindows.removeAll { $0.screen == screen }     externalDisplayContent.isShowingOnExternalDisplay = false   } }
Posted
by
Post not yet marked as solved
2 Replies
524 Views
I know macOS doesn't allow running multiple instances of an application in normal circumstances. However, for macOS native applications, there is a work around of using -n in the command line. Unfortunately, this option doesn't seem to work for iOS applications running on iOS. Also, I have been having issues with locations services working correctly when running such an instance. For example, if a game requires doing a GPS location check, it does not seem to be able to do it correctly when running the application in macOS, the app doesn't freeze, but it gets stuck and needs to be restarted. I have looked around online and searched around in settings for quite a bit of time with no success. Any ideas?
Posted
by
Post marked as solved
1 Replies
220 Views
Hi, I'm storing a string on a named UIPasteboard, and when reading it back, it comes as nil. It works fine on iOS, but on MacCatalyst it always returns nil. I store it like that: let p = UIPasteboard(name: UIPasteboard.Name(rawValue: "aaa"), create: true)! p.string = "some text" print("hasStrings: \(p.hasStrings)") // hasStrings: true and I read it like that: let p = UIPasteboard(name: UIPasteboard.Name(rawValue: "aaa"), create: false)! print("hasStrings: \(p.hasStrings)") // hasStrings: false I'm running the two pieces of code from two different methods of a UIViewController. Say I store the string in 'viewWillAppear', and read it back in 'viewDidAppear'.
Posted
by
Post not yet marked as solved
0 Replies
357 Views
Hi, We have an iOS app with Safari and Content Blocker extensions. Everything works fine when running the app on M1 devices except for the content blocker. The issue is with the following code: contentBlockerManager.getStateOfContentBlocker(withIdentifier: "...") { [ weak self ] in state, error ... } I receive an error which I believe means the content blocker was not found: SFErrorDomain error 1 Now, when running the exact same app with Mac Catalyst all works as expected. Is there a reason for this to happen? Thanks.
Posted
by
Post not yet marked as solved
3 Replies
425 Views
My standard "native" Mac app uses Catalyst helper. Helper is registered as Login Item via SMLoginItemSetEnabled. I tried to establish XPC communication between these process but I failed. Is it possible to configure XPC connection between these two apps (mac host and catalyst helper)? As far as I can understand it is possible to create XPC connection in Catalyst via passing listener endpoint. However how to send this endpoint between helper and host app? NSXPCListener.init(machServiceName:) is not available for Catalyst app.
Posted
by
Post not yet marked as solved
1 Replies
357 Views
Mac Catalyst treats a SwiiftUI .sheet View as compact, even though there is as much horizontal space in the view as on a physical iPad. The outcome of this is that, with an iPhone, iPad, Catalyst app, abbreviated HStacks that I use for the iPhone version also appear on the Catalyst version, unless I use #if targetEnvironment(macCatalyst) A few months back a Stack Overflow user complained that a Catalyst popover (UIKit) was reporting as .regular and should be .compact. Apple agreed it was a bug. However, in my case (SwiftUI sheet), it doesn't make sense to regard a Catalyst SwiftUI sheet as compact when there is as much space available as on a physical iPad. Regards to all, Michaela
Posted
by
Post not yet marked as solved
1 Replies
287 Views
Hi there, I've setup scene-based state restoration for my iPhone/iPad app and it works perfectly. In func sceneWillResignActive(_ scene: UIScene) I create an NSUserActivity object and assigned it to the scene.userActivity I then return scene.userActivity from func stateRestorationActivity(for scene: UIScene) -> NSUserActivity?  The first issue I'm facing with Catalyst is func sceneWillResignActive(_ scene: UIScene) is being called after func stateRestorationActivity(for scene: UIScene) -> NSUserActivity?  so the restoration activity is never set. I tried setting the scene.userActivity in the func stateRestorationActivity(for scene: UIScene) -> NSUserActivity?  function and it seemed to work insomuch as I can see there is an NSUserActivity created. Even so, session.stateRestorationActivity is nil when func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) is called. I've disabled the "Close windows when quitting app" option in System Preference > General. I also noticed a post somewhere suggesting you wait for the app to disappear from Activity Monitor before relaunching. I've tried this to no avail.
Posted
by
Post not yet marked as solved
0 Replies
255 Views
I asked a similar question in the following thread https://developer.apple.com/forums/thread/700817, I got the answer but I would like to enable the port my app with mac Catalyst but with template file. My project relies heavily on the pbxproj.template file and I would like to it via template instead of making changes in xcode Initially I was able to run for iphone os targets but I made changes to existing template to include SUPPORTS_MACCATALYST = YES; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; but that didn't help and I still get the error that it is unable to find the library in the location when I run for MacOS. so I understand I need xcframework for MacOS specifically but can we do via the template? Sample template /* Begin PBXHeadersBuildPhase section */ 0657BF9D263C8102008D179B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 0657BFA1263C8102008D179B /* jam_lite{{__COMPONENT_SET__}} */ = { isa = PBXNativeTarget; buildConfigurationList = 0657BFAA263C8102008D179B /* Build configuration list for PBXNativeTarget "jam_lite{{__COMPONENT_SET__}}" */; buildPhases = ( 0657BF9D263C8102008D179B /* Headers */, 0657BF9E263C8102008D179B /* Sources */, 0657BF9F263C8102008D179B /* Frameworks */, 0657BFA0263C8102008D179B /* Resources */, ); buildRules = ( ); dependencies = ( ); name = jam_lite{{__COMPONENT_SET__}}; productName = jam_lite{{__COMPONENT_SET__}}; productReference = 0657BFA2263C8102008D179B /* jam_lite{{__COMPONENT_SET__}}.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0657BF99263C8102008D179B /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 1250; TargetAttributes = { 0657BFA1263C8102008D179B = { CreatedOnToolsVersion = 12.5; }; }; }; buildConfigurationList = 0657BF9C263C8102008D179B /* Build configuration list for PBXProject "jam_lite{{__COMPONENT_SET__}}" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 0657BF98263C8102008D179B; productRefGroup = 0657BFA3263C8102008D179B /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0657BFA1263C8102008D179B /* jam_lite{{__COMPONENT_SET__}} */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 0657BFA0263C8102008D179B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 0657BF9E263C8102008D179B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 0657BFAF263C8246008D179B /* dummy.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ 0657BFAB263C8102008D179B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = ( armv7, x86_64, arm64 ); CODE_SIGN_STYLE = Automatic; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = xxxx; HEADER_SEARCH_PATHS = ( ); INFOPLIST_FILE = jam_lite/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 10.0; "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 13.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", "@loader_path/Frameworks", ); MACH_O_TYPE = staticlib; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = ( ); PRODUCT_BUNDLE_IDENTIFIER = com.jam_lite{{__COMPONENT_SET__}}; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = NO; SUPPORTS_MACCATALYST = YES; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 0657BF9C263C8102008D179B /* Build configuration list for PBXProject "jam_lite_{{__COMPONENT_SET__}}" */ = { isa = XCConfigurationList; buildConfigurations = ( 2EB60FB31DF7B32800F69392 /* Production */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 0657BFAA263C8102008D179B /* Build configuration list for PBXNativeTarget "jam_lite_{{__COMPONENT_SET__}}" */ = { isa = XCConfigurationList; buildConfigurations = ( 2EB60FB31DF7B32800F69392 /* Production */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0657BF99263C8102008D179B /* Project object */; }
Posted
by
Post not yet marked as solved
2 Replies
397 Views
I want to use the original_application_version value from the app receipt to grandfather some features for users who are first-time users vs existing users. In the Receipt Validation Programming Guide, the field's notes are as follows: This corresponds to the value of CFBundleVersion (in iOS) or CFBundleShortVersionString (in macOS) in the Info.plist file when the purchase was originally made. In the sandbox environment, the value of this field is always “1.0”. I'm unsure which value to expect in Mac Catalyst, since it's a UIKit (and thus iOS)-based app being distributed through the Mac App Store and run on a Mac. My instinct is that the store is determinative, and thus to expect the macOS CFBundleShortVersionString on the Mac. Unfortunately, since the value is always "1.0" in the sandbox (including TestFlight) I don't have a good way to test this. Does anyone have any real-world experience that can shed light on what format I can expect?
Posted
by
Post not yet marked as solved
0 Replies
302 Views
Hi, Inside a Mac Catalyst app, I need to display a popover starting from an NSToolbarItem contained inside the app toolbar (like the Apple Maps Mac app does, see below image). In order to do that, when I press the button I need to find the toolbar item view and use it as popover anchor. How can I find the view or frame of an NSToolbarItem on Mac Catalyst? A property that could help me is the NSToolbarItem "view" property (NSView), but that property has been marked has unavailable in Mac Catalyst. Any idea? Thank you
Posted
by