From 6b98af656a51e07bb5871fdb239f56eff3bec51f Mon Sep 17 00:00:00 2001
From: uday
Date: Wed, 20 Nov 2024 16:59:39 +0530
Subject: [PATCH 01/12] v2.1.9 compatible
---
Podfile | 12 +-
Podfile.lock | 73 +-
.../Assets/PrivacyInfo.xcprivacy | 10 +-
.../Constants/IQKeyboardConstants.swift | 41 +
.../Classes/IQKeyboardExtended.swift | 65 +
.../Classes/IQTextInputView.swift | 86 +
.../UIKitExtensions/UIView+Hierarchy.swift | 168 +
Pods/IQKeyboardCore/LICENSE | 21 +
Pods/IQKeyboardCore/README.md | 29 +
.../IQKeyboardAppearanceConfiguration.swift | 43 +
...IQKeyboardAppearanceManager+Internal.swift | 50 +
.../IQKeyboardAppearanceManager.swift | 44 +
.../IQKeyboardManager+Appearance.swift | 55 +
...eyboardManager+Appearance_Deprecated.swift | 43 +
.../Categories/IQNSArray+Sort.swift | 57 -
.../Categories/IQUIScrollView+Additions.swift | 117 -
.../IQUITextFieldView+Additions.swift | 93 -
.../Categories/IQUIView+Hierarchy.swift | 324 -
.../IQUIViewController+Additions.swift | 54 -
.../IQKeyboardManagerConstants.swift | 150 -
.../IQKeyboardManagerConstantsInternal.swift | 24 -
.../IQKeyboardManager+Debug.swift | 111 -
.../IQKeyboardManager+Internal.swift | 193 -
...boardManager+OrientationNotification.swift | 77 -
.../IQKeyboardManager+Position.swift | 694 -
.../IQKeyboardManager+Toolbar.swift | 398 -
...yboardManager+UIKeyboardNotification.swift | 341 -
...dManager+UITextFieldViewNotification.swift | 230 -
.../IQKeyboardManager.swift | 427 -
.../Configuration/IQActiveConfiguration.swift | 273 +
.../IQRootControllerConfiguration.swift | 95 +
.../IQScrollViewConfiguration.swift | 100 +
.../Debug/IQKeyboardManager+Debug.swift | 78 +
.../IQKeyboardManager+Deprecated.swift | 169 +
...QKeyboardManager+ActiveConfiguration.swift | 126 +
.../IQKeyboardManager+Internal.swift | 88 +
.../IQKeyboardManager+Position.swift | 795 +
.../IQKeyboardManager/IQKeyboardManager.swift | 133 +
...crollView+IQKeyboardManagerExtension.swift | 118 +
...lView+IQKeyboardManagerExtensionObjc.swift | 46 +
.../UIView+IQKeyboardManagerExtension.swift | 106 +
...IView+IQKeyboardManagerExtensionObjc.swift | 55 +
.../UICollectionView+IndexPaths.swift | 45 +
.../UITableView+IndexPaths.swift | 45 +
.../UIKitExtensions/UIView+Parent.swift | 99 +
.../UIKitExtensions/UIView+ParentObjc.swift | 31 +
.../UIViewController+ParentContainer.swift | 49 +
.../IQKeyboardReturnKeyHandler.swift | 695 -
.../IQKeyboardManager+ToolbarManager.swift | 137 +
...oardManager+ToolbarManagerDeprecated.swift | 177 +
.../IQTextView/IQPlaceholderable.swift | 38 -
.../IQTextView/IQTextView.swift | 186 -
.../IQToolbar/IQBarButtonItem.swift | 112 -
.../IQToolbar/IQInvocation.swift | 45 -
.../IQToolbar/IQPreviousNextView.swift | 29 -
.../IQToolbar/IQTitleBarButtonItem.swift | 138 -
.../IQUIView+IQKeyboardToolbar.swift | 513 -
.../PrivacyInfo.xcprivacy | 4 +
.../Resign/IQKeyboardManager+Resign.swift | 100 +
.../IQKeyboardManager+Resign_Deprecated.swift | 37 +
.../IQKeyboardResignHandler+Internal.swift | 103 +
.../Resign/IQKeyboardResignHandler.swift | 149 +
.../UIKItExtensions/UIView+Resign.swift | 69 +
.../UIKItExtensions/UIView+ResignObjc.swift | 45 +
Pods/IQKeyboardManagerSwift/LICENSE.md | 2 +-
Pods/IQKeyboardManagerSwift/README.md | 130 +-
.../Assets/PrivacyInfo.xcprivacy | 14 +
.../Classes/IQKeyboardInfo.swift | 227 +
.../Classes/IQKeyboardNotification.swift | 149 +
Pods/IQKeyboardNotification/LICENSE | 21 +
Pods/IQKeyboardNotification/README.md | 36 +
.../Assets/PrivacyInfo.xcprivacy | 14 +
...ardReturnManager+UITextFieldDelegate.swift | 154 +
...oardReturnManager+UITextViewDelegate.swift | 398 +
.../Classes/IQKeyboardReturnManager.swift | 277 +
.../Classes/IQTextInputViewInfoModel.swift | 56 +
Pods/IQKeyboardReturnManager/LICENSE | 21 +
Pods/IQKeyboardReturnManager/README.md | 68 +
.../Assets/PrivacyInfo.xcprivacy | 14 +
.../IQBarButtonItem/IQBarButtonItem.swift | 120 +
.../IQBarButtonItemConfiguration.swift | 96 +
.../IQBarButtonItem/IQInvocation.swift | 42 +
.../IQTitleBarButtonItem.swift | 168 +
.../UIView+IQKeyboardExtension.swift | 344 +
...UIView+IQKeyboardExtensionDeprecated.swift | 228 +
.../UIView+IQKeyboardExtensionObjc.swift | 254 +
.../Classes/IQKeyboardToolbar.swift} | 91 +-
...boardToolbarPlaceholderConfiguration.swift | 60 +
.../Placeholderable/IQPlaceholderable.swift | 37 +
Pods/IQKeyboardToolbar/LICENSE | 21 +
Pods/IQKeyboardToolbar/README.md | 85 +
.../Assets/PrivacyInfo.xcprivacy | 14 +
.../IQKeyboardToolbarConfiguration.swift | 90 +
.../IQKeyboardToolbarConstants.swift | 68 +
.../IQKeyboardToolbarManager+Debug.swift | 52 +
.../IQDeepResponderContainerView.swift | 29 +
.../IQKeyboardToolbarManager+Deprecated.swift | 183 +
.../IQKeyboardToolbarManager+Internal.swift | 143 +
.../Classes/IQKeyboardToolbarManager.swift | 142 +
.../IQKeyboardToolbarManager+Action.swift | 210 +
.../IQKeyboardToolbarManager+Toolbar.swift | 269 +
.../Classes/UIKitExtensions/Array+Sort.swift | 58 +
.../UIKitExtensions/UIView+Responders.swift | 179 +
.../UIView+RespondersObjc.swift | 44 +
Pods/IQKeyboardToolbarManager/LICENSE | 21 +
Pods/IQKeyboardToolbarManager/README.md | 93 +
.../Assets/PrivacyInfo.xcprivacy | 14 +
.../Classes/IQTextInputViewInfo.swift | 91 +
.../Classes/IQTextInputViewNotification.swift | 182 +
Pods/IQTextInputViewNotification/LICENSE | 19 +
Pods/IQTextInputViewNotification/README.md | 66 +
.../IQTextView/Assets/PrivacyInfo.xcprivacy | 14 +
.../Classes/IQTextView+Placeholderable.swift | 29 +
.../IQTextView/Classes/IQTextView.swift | 193 +
Pods/IQTextView/LICENSE | 21 +
Pods/IQTextView/README.md | 48 +
Pods/Local Podspecs/VideoSDKRTC.podspec.json | 14 +-
Pods/Manifest.lock | 73 +-
Pods/Pods.xcodeproj/project.pbxproj | 4786 +-
.../xcschemes/xcschememanagement.plist | 46 -
.../IQKeyboardCore-IQKeyboardCore.xcscheme} | 8 +-
.../xcschemes/IQKeyboardCore.xcscheme} | 8 +-
...nagerSwift-IQKeyboardManagerSwift.xcscheme | 58 +
...tification-IQKeyboardNotification.xcscheme | 58 +
.../IQKeyboardNotification.xcscheme} | 8 +-
...rnManager-IQKeyboardReturnManager.xcscheme | 58 +
.../IQKeyboardReturnManager.xcscheme | 58 +
...KeyboardToolbar-IQKeyboardToolbar.xcscheme | 58 +
.../xcschemes/IQKeyboardToolbar.xcscheme | 58 +
...rManager-IQKeyboardToolbarManager.xcscheme | 58 +
.../IQKeyboardToolbarManager.xcscheme} | 8 +-
...ation-IQTextInputViewNotification.xcscheme | 58 +
.../IQTextInputViewNotification.xcscheme | 58 +
.../xcschemes/IQTextView-IQTextView.xcscheme | 58 +
.../xcschemes/IQTextView.xcscheme} | 8 +-
.../xcschemes/Socket.IO-Client-Swift.xcscheme | 58 +
.../Starscream-Starscream_Privacy.xcscheme | 58 +
.../xcschemes/Starscream.xcscheme | 2 +-
.../xcschemes/xcschememanagement.plist | 100 +-
Pods/Socket.IO-Client-Swift/LICENSE | 230 +
Pods/Socket.IO-Client-Swift/README.md | 128 +
.../SocketIO/Ack/SocketAckEmitter.swift | 146 +
.../SocketIO/Ack/SocketAckManager.swift | 88 +
.../SocketIO/Client/SocketAnyEvent.swift | 48 +
.../SocketIO/Client/SocketEventHandler.swift | 50 +
.../SocketIO/Client/SocketIOClient.swift | 549 +
.../Client/SocketIOClientConfiguration.swift | 138 +
.../Client/SocketIOClientOption.swift | 241 +
.../SocketIO/Client/SocketIOClientSpec.swift | 392 +
.../SocketIO/Client/SocketIOStatus.swift | 59 +
.../SocketIO/Client/SocketRawView.swift | 163 +
.../Source/SocketIO/Engine/SocketEngine.swift | 778 +
.../SocketIO/Engine/SocketEngineClient.swift | 73 +
.../Engine/SocketEnginePacketType.swift | 50 +
.../Engine/SocketEnginePollable.swift | 262 +
.../SocketIO/Engine/SocketEngineSpec.swift | 209 +
.../Engine/SocketEngineWebsocket.swift | 87 +
.../SocketIO/Manager/SocketManager.swift | 613 +
.../SocketIO/Manager/SocketManagerSpec.swift | 148 +
.../Source/SocketIO/Parse/SocketPacket.swift | 250 +
.../SocketIO/Parse/SocketParsable.swift | 181 +
.../SocketIO/Util/SocketExtensions.swift | 132 +
.../Source/SocketIO/Util/SocketLogger.swift | 75 +
.../SocketIO/Util/SocketStringReader.swift | 73 +
.../Source/SocketIO/Util/SocketTypes.swift | 86 +
Pods/Starscream/LICENSE | 176 +
Pods/Starscream/README.md | 277 +
.../Sources/Compression/Compression.swift | 29 +
.../Sources/Compression/WSCompression.swift | 256 +
.../Sources/DataBytes/Data+Extensions.swift | 53 +
Pods/Starscream/Sources/Engine/Engine.swift | 36 +
.../Sources/Engine/NativeEngine.swift | 115 +
Pods/Starscream/Sources/Engine/WSEngine.swift | 265 +
.../Framer/FoundationHTTPHandler.swift | 124 +
.../Framer/FoundationHTTPServerHandler.swift | 99 +
.../Sources/Framer/FrameCollector.swift | 107 +
Pods/Starscream/Sources/Framer/Framer.swift | 365 +
.../Sources/Framer/HTTPHandler.swift | 150 +
.../Sources/Framer/StringHTTPHandler.swift | 143 +
Pods/Starscream/Sources/PrivacyInfo.xcprivacy | 14 +
.../Sources/Security/FoundationSecurity.swift | 99 +
.../Sources/Security/Security.swift | 45 +
Pods/Starscream/Sources/Server/Server.swift | 56 +
.../Sources/Server/WebSocketServer.swift | 198 +
.../Sources/Starscream/WebSocket.swift | 174 +
.../Transport/FoundationTransport.swift | 218 +
.../Sources/Transport/TCPTransport.swift | 171 +
.../Sources/Transport/Transport.swift | 63 +
.../IQKeyboardCore/IQKeyboardCore-Info.plist | 26 +
.../IQKeyboardCore/IQKeyboardCore-dummy.m | 5 +
.../IQKeyboardCore/IQKeyboardCore-prefix.pch | 12 +
.../IQKeyboardCore/IQKeyboardCore-umbrella.h | 16 +
.../IQKeyboardCore.debug.xcconfig | 16 +
.../IQKeyboardCore/IQKeyboardCore.modulemap | 6 +
.../IQKeyboardCore.release.xcconfig | 16 +
...e-IQKeyboardCore-IQKeyboardCore-Info.plist | 24 +
.../IQKeyboardManagerSwift-Info.plist | 2 +-
.../IQKeyboardManagerSwift.debug.xcconfig | 6 +-
.../IQKeyboardManagerSwift.release.xcconfig | 6 +-
...gerSwift-IQKeyboardManagerSwift-Info.plist | 24 +
.../IQKeyboardNotification-Info.plist | 26 +
.../IQKeyboardNotification-dummy.m | 5 +
.../IQKeyboardNotification-prefix.pch | 12 +
.../IQKeyboardNotification-umbrella.h | 16 +
.../IQKeyboardNotification.debug.xcconfig | 16 +
.../IQKeyboardNotification.modulemap | 6 +
.../IQKeyboardNotification.release.xcconfig | 16 +
...fication-IQKeyboardNotification-Info.plist | 24 +
.../IQKeyboardReturnManager-Info.plist | 26 +
.../IQKeyboardReturnManager-dummy.m | 5 +
.../IQKeyboardReturnManager-prefix.pch | 12 +
.../IQKeyboardReturnManager-umbrella.h | 16 +
.../IQKeyboardReturnManager.debug.xcconfig | 17 +
.../IQKeyboardReturnManager.modulemap | 6 +
.../IQKeyboardReturnManager.release.xcconfig | 17 +
...Manager-IQKeyboardReturnManager-Info.plist | 24 +
.../IQKeyboardToolbar-Info.plist | 26 +
.../IQKeyboardToolbar-dummy.m | 5 +
.../IQKeyboardToolbar-prefix.pch | 12 +
.../IQKeyboardToolbar-umbrella.h | 16 +
.../IQKeyboardToolbar.debug.xcconfig | 17 +
.../IQKeyboardToolbar.modulemap | 6 +
.../IQKeyboardToolbar.release.xcconfig | 17 +
...yboardToolbar-IQKeyboardToolbar-Info.plist | 24 +
.../IQKeyboardToolbarManager-Info.plist | 26 +
.../IQKeyboardToolbarManager-dummy.m | 5 +
.../IQKeyboardToolbarManager-prefix.pch | 12 +
.../IQKeyboardToolbarManager-umbrella.h | 16 +
.../IQKeyboardToolbarManager.debug.xcconfig | 18 +
.../IQKeyboardToolbarManager.modulemap | 6 +
.../IQKeyboardToolbarManager.release.xcconfig | 18 +
...anager-IQKeyboardToolbarManager-Info.plist | 24 +
.../IQTextInputViewNotification-Info.plist | 26 +
.../IQTextInputViewNotification-dummy.m | 5 +
.../IQTextInputViewNotification-prefix.pch | 12 +
.../IQTextInputViewNotification-umbrella.h | 16 +
...IQTextInputViewNotification.debug.xcconfig | 18 +
.../IQTextInputViewNotification.modulemap | 6 +
...TextInputViewNotification.release.xcconfig | 18 +
...ion-IQTextInputViewNotification-Info.plist | 24 +
.../IQTextView/IQTextView-Info.plist | 26 +
.../IQTextView/IQTextView-dummy.m | 5 +
.../IQTextView/IQTextView-prefix.pch | 12 +
.../IQTextView/IQTextView-umbrella.h | 16 +
.../IQTextView/IQTextView.debug.xcconfig | 18 +
.../IQTextView/IQTextView.modulemap | 6 +
.../IQTextView/IQTextView.release.xcconfig | 18 +
...rceBundle-IQTextView-IQTextView-Info.plist | 24 +
...eoSDKRTC_Example-acknowledgements.markdown | 588 +-
...VideoSDKRTC_Example-acknowledgements.plist | 642 +-
...le-frameworks-Debug-input-files.xcfilelist | 12 +-
...e-frameworks-Debug-output-files.xcfilelist | 12 +-
...-frameworks-Release-input-files.xcfilelist | 12 +-
...frameworks-Release-output-files.xcfilelist | 12 +-
.../Pods-VideoSDKRTC_Example-frameworks.sh | 20 +-
.../Pods-VideoSDKRTC_Example.debug.xcconfig | 9 +-
.../Pods-VideoSDKRTC_Example.release.xcconfig | 9 +-
.../Socket.IO-Client-Swift-Info.plist | 26 +
.../Socket.IO-Client-Swift-dummy.m | 5 +
.../Socket.IO-Client-Swift-prefix.pch | 12 +
.../Socket.IO-Client-Swift-umbrella.h | 16 +
.../Socket.IO-Client-Swift.debug.xcconfig | 18 +
.../Socket.IO-Client-Swift.modulemap | 6 +
.../Socket.IO-Client-Swift.release.xcconfig | 18 +
...e-Starscream_Privacy-Starscream-Info.plist | 24 +
.../Starscream/Starscream-Info.plist | 26 +
.../Starscream/Starscream-dummy.m | 5 +
.../Starscream/Starscream-prefix.pch | 12 +
.../Starscream/Starscream-umbrella.h | 16 +
.../Starscream/Starscream.debug.xcconfig | 15 +
.../Starscream/Starscream.modulemap | 6 +
.../Starscream/Starscream.release.xcconfig | 15 +
...SDKRTC-xcframeworks-input-files.xcfilelist | 3 +-
...DKRTC-xcframeworks-output-files.xcfilelist | 3 +-
.../VideoSDKRTC/VideoSDKRTC-xcframeworks.sh | 13 -
.../VideoSDKRTC/VideoSDKRTC.debug.xcconfig | 2 +-
.../VideoSDKRTC/VideoSDKRTC.release.xcconfig | 2 +-
.../VideoSDKRTC.xcframework/Info.plist | 10 +-
.../Headers/VideoSDKRTC-Swift.h | 27 +-
.../VideoSDKRTC.framework/Info.plist | Bin 794 -> 794 bytes
.../arm64-apple-ios.abi.json | 100636 +++++----------
.../arm64-apple-ios.private.swiftinterface | 366 +-
.../arm64-apple-ios.swiftdoc | Bin 785568 -> 800496 bytes
.../arm64-apple-ios.swiftinterface | 366 +-
.../VideoSDKRTC.framework/VideoSDKRTC | Bin 9364816 -> 8994056 bytes
.../Headers/VideoSDKRTC-Swift.h | 54 +-
.../VideoSDKRTC.framework/Info.plist | Bin 774 -> 774 bytes
.../arm64-apple-ios-simulator.abi.json | 100636 +++++----------
...apple-ios-simulator.private.swiftinterface | 366 +-
.../arm64-apple-ios-simulator.swiftdoc | Bin 785580 -> 800508 bytes
.../arm64-apple-ios-simulator.swiftinterface | 366 +-
.../x86_64-apple-ios-simulator.abi.json | 100636 +++++----------
...apple-ios-simulator.private.swiftinterface | 366 +-
.../x86_64-apple-ios-simulator.swiftdoc | Bin 785580 -> 800508 bytes
.../x86_64-apple-ios-simulator.swiftinterface | 366 +-
.../VideoSDKRTC.framework/VideoSDKRTC | Bin 19077936 -> 18247312 bytes
.../_CodeSignature/CodeResources | 46 +-
.../VideosdkWebSocket.xcframework/Info.plist | 40 -
.../Headers/VideosdkWebSocket-Swift.h | 287 -
.../VideosdkWebSocket.framework/Info.plist | Bin 761 -> 0 bytes
.../arm64-apple-ios.abi.json | 18610 ---
.../arm64-apple-ios.private.swiftinterface | 435 -
.../arm64-apple-ios.swiftdoc | Bin 4472 -> 0 bytes
.../arm64-apple-ios.swiftinterface | 435 -
.../VideosdkWebSocket | Bin 731904 -> 0 bytes
.../Headers/VideosdkWebSocket-Swift.h | 570 -
.../VideosdkWebSocket.framework/Info.plist | Bin 741 -> 0 bytes
.../arm64-apple-ios-simulator.abi.json | 18610 ---
...apple-ios-simulator.private.swiftinterface | 435 -
.../arm64-apple-ios-simulator.swiftdoc | Bin 4484 -> 0 bytes
.../arm64-apple-ios-simulator.swiftinterface | 435 -
.../x86_64-apple-ios-simulator.abi.json | 18610 ---
...apple-ios-simulator.private.swiftinterface | 435 -
.../x86_64-apple-ios-simulator.swiftdoc | Bin 4484 -> 0 bytes
.../x86_64-apple-ios-simulator.swiftinterface | 435 -
.../VideosdkWebSocket | Bin 1534976 -> 0 bytes
.../_CodeSignature/CodeResources | 223 -
Pods/VideoSDKRTC/README.md | 2 +-
VideoSDKRTC_Example.xcodeproj/project.pbxproj | 35 +-
.../xcschemes/xcschememanagement.plist | 19 +
.../UserInterfaceState.xcuserstate | Bin 167672 -> 0 bytes
.../xcdebugger/Breakpoints_v2.xcbkptlist | 6 -
.../UserInterfaceState.xcuserstate | Bin 84950 -> 57232 bytes
.../xcdebugger/Breakpoints_v2.xcbkptlist | 2 +-
VideoSDKRTC_Example/API/APIService.swift | 26 -
VideoSDKRTC_Example/AppDelegate.swift | 2 +-
.../controllers/MeetingViewController.swift | 190 +-
.../StartMeetingViewController.swift | 98 +-
.../utilities/LoaderUtils.swift | 37 +-
.../views/ParticipantCellView.swift | 6 +-
330 files changed, 133381 insertions(+), 261999 deletions(-)
rename VideoSDKRTC_Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist => Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy (50%)
create mode 100644 Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift
create mode 100644 Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift
create mode 100644 Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift
create mode 100644 Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift
create mode 100644 Pods/IQKeyboardCore/LICENSE
create mode 100644 Pods/IQKeyboardCore/README.md
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQNSArray+Sort.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIScrollView+Additions.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUITextFieldView+Additions.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIView+Hierarchy.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIViewController+Additions.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstantsInternal.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Debug.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Internal.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+OrientationNotification.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Position.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Toolbar.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+UIKeyboardNotification.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+UITextFieldViewNotification.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardReturnKeyHandler.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQPlaceholderable.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQTextView.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQBarButtonItem.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQInvocation.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQTitleBarButtonItem.swift
delete mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+Resign.swift
create mode 100644 Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+ResignObjc.swift
create mode 100644 Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy
create mode 100644 Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift
create mode 100644 Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift
create mode 100644 Pods/IQKeyboardNotification/LICENSE
create mode 100644 Pods/IQKeyboardNotification/README.md
create mode 100644 Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy
create mode 100644 Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift
create mode 100644 Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift
create mode 100644 Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift
create mode 100644 Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift
create mode 100644 Pods/IQKeyboardReturnManager/LICENSE
create mode 100644 Pods/IQKeyboardReturnManager/README.md
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift
rename Pods/{IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift => IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift} (54%)
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift
create mode 100644 Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift
create mode 100644 Pods/IQKeyboardToolbar/LICENSE
create mode 100644 Pods/IQKeyboardToolbar/README.md
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift
create mode 100644 Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift
create mode 100644 Pods/IQKeyboardToolbarManager/LICENSE
create mode 100644 Pods/IQKeyboardToolbarManager/README.md
create mode 100644 Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy
create mode 100644 Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift
create mode 100644 Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift
create mode 100644 Pods/IQTextInputViewNotification/LICENSE
create mode 100644 Pods/IQTextInputViewNotification/README.md
create mode 100644 Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy
create mode 100644 Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift
create mode 100644 Pods/IQTextView/IQTextView/Classes/IQTextView.swift
create mode 100644 Pods/IQTextView/LICENSE
create mode 100644 Pods/IQTextView/README.md
delete mode 100644 Pods/Pods.xcodeproj/xcuserdata/parth.xcuserdatad/xcschemes/xcschememanagement.plist
rename Pods/Pods.xcodeproj/xcuserdata/{parth.xcuserdatad/xcschemes/InputBarAccessoryView.xcscheme => udaygajera.xcuserdatad/xcschemes/IQKeyboardCore-IQKeyboardCore.xcscheme} (89%)
rename Pods/Pods.xcodeproj/xcuserdata/{parth.xcuserdatad/xcschemes/VideoSDKRTC.xcscheme => udaygajera.xcuserdatad/xcschemes/IQKeyboardCore.xcscheme} (89%)
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQKeyboardManagerSwift-IQKeyboardManagerSwift.xcscheme
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQKeyboardNotification-IQKeyboardNotification.xcscheme
rename Pods/Pods.xcodeproj/xcuserdata/{parth.xcuserdatad/xcschemes/IQKeyboardManagerSwift.xcscheme => udaygajera.xcuserdatad/xcschemes/IQKeyboardNotification.xcscheme} (89%)
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQKeyboardReturnManager-IQKeyboardReturnManager.xcscheme
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQKeyboardReturnManager.xcscheme
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQKeyboardToolbar-IQKeyboardToolbar.xcscheme
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQKeyboardToolbar.xcscheme
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQKeyboardToolbarManager-IQKeyboardToolbarManager.xcscheme
rename Pods/Pods.xcodeproj/xcuserdata/{parth.xcuserdatad/xcschemes/Pods-VideoSDKRTC_Example.xcscheme => udaygajera.xcuserdatad/xcschemes/IQKeyboardToolbarManager.xcscheme} (89%)
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQTextInputViewNotification-IQTextInputViewNotification.xcscheme
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQTextInputViewNotification.xcscheme
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/IQTextView-IQTextView.xcscheme
rename Pods/Pods.xcodeproj/xcuserdata/{parth.xcuserdatad/xcschemes/MessageKit.xcscheme => udaygajera.xcuserdatad/xcschemes/IQTextView.xcscheme} (90%)
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/Socket.IO-Client-Swift.xcscheme
create mode 100644 Pods/Pods.xcodeproj/xcuserdata/udaygajera.xcuserdatad/xcschemes/Starscream-Starscream_Privacy.xcscheme
rename Pods/Pods.xcodeproj/xcuserdata/{parth.xcuserdatad => udaygajera.xcuserdatad}/xcschemes/Starscream.xcscheme (98%)
create mode 100644 Pods/Socket.IO-Client-Swift/LICENSE
create mode 100644 Pods/Socket.IO-Client-Swift/README.md
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Ack/SocketAckEmitter.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Ack/SocketAckManager.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Client/SocketAnyEvent.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Client/SocketEventHandler.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Client/SocketIOClient.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Client/SocketIOClientConfiguration.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Client/SocketIOClientOption.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Client/SocketIOClientSpec.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Client/SocketIOStatus.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Client/SocketRawView.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Engine/SocketEngine.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Engine/SocketEngineClient.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Engine/SocketEnginePacketType.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Engine/SocketEnginePollable.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Engine/SocketEngineSpec.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Engine/SocketEngineWebsocket.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Manager/SocketManager.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Manager/SocketManagerSpec.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Parse/SocketPacket.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Parse/SocketParsable.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Util/SocketExtensions.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Util/SocketLogger.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Util/SocketStringReader.swift
create mode 100644 Pods/Socket.IO-Client-Swift/Source/SocketIO/Util/SocketTypes.swift
create mode 100644 Pods/Starscream/LICENSE
create mode 100644 Pods/Starscream/README.md
create mode 100644 Pods/Starscream/Sources/Compression/Compression.swift
create mode 100644 Pods/Starscream/Sources/Compression/WSCompression.swift
create mode 100644 Pods/Starscream/Sources/DataBytes/Data+Extensions.swift
create mode 100644 Pods/Starscream/Sources/Engine/Engine.swift
create mode 100644 Pods/Starscream/Sources/Engine/NativeEngine.swift
create mode 100644 Pods/Starscream/Sources/Engine/WSEngine.swift
create mode 100644 Pods/Starscream/Sources/Framer/FoundationHTTPHandler.swift
create mode 100644 Pods/Starscream/Sources/Framer/FoundationHTTPServerHandler.swift
create mode 100644 Pods/Starscream/Sources/Framer/FrameCollector.swift
create mode 100644 Pods/Starscream/Sources/Framer/Framer.swift
create mode 100644 Pods/Starscream/Sources/Framer/HTTPHandler.swift
create mode 100644 Pods/Starscream/Sources/Framer/StringHTTPHandler.swift
create mode 100644 Pods/Starscream/Sources/PrivacyInfo.xcprivacy
create mode 100644 Pods/Starscream/Sources/Security/FoundationSecurity.swift
create mode 100644 Pods/Starscream/Sources/Security/Security.swift
create mode 100644 Pods/Starscream/Sources/Server/Server.swift
create mode 100644 Pods/Starscream/Sources/Server/WebSocketServer.swift
create mode 100644 Pods/Starscream/Sources/Starscream/WebSocket.swift
create mode 100644 Pods/Starscream/Sources/Transport/FoundationTransport.swift
create mode 100644 Pods/Starscream/Sources/Transport/TCPTransport.swift
create mode 100644 Pods/Starscream/Sources/Transport/Transport.swift
create mode 100644 Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-dummy.m
create mode 100644 Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch
create mode 100644 Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-umbrella.h
create mode 100644 Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.debug.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap
create mode 100644 Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.release.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-dummy.m
create mode 100644 Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch
create mode 100644 Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-umbrella.h
create mode 100644 Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.debug.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap
create mode 100644 Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.release.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-dummy.m
create mode 100644 Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch
create mode 100644 Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-umbrella.h
create mode 100644 Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.debug.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap
create mode 100644 Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.release.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-dummy.m
create mode 100644 Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch
create mode 100644 Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-umbrella.h
create mode 100644 Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.debug.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap
create mode 100644 Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.release.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist
create mode 100644 Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-dummy.m
create mode 100644 Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch
create mode 100644 Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-umbrella.h
create mode 100644 Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.debug.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap
create mode 100644 Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.release.xcconfig
create mode 100644 Pods/Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist
create mode 100644 Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist
create mode 100644 Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-dummy.m
create mode 100644 Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch
create mode 100644 Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-umbrella.h
create mode 100644 Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.debug.xcconfig
create mode 100644 Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap
create mode 100644 Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.release.xcconfig
create mode 100644 Pods/Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist
create mode 100644 Pods/Target Support Files/IQTextView/IQTextView-Info.plist
create mode 100644 Pods/Target Support Files/IQTextView/IQTextView-dummy.m
create mode 100644 Pods/Target Support Files/IQTextView/IQTextView-prefix.pch
create mode 100644 Pods/Target Support Files/IQTextView/IQTextView-umbrella.h
create mode 100644 Pods/Target Support Files/IQTextView/IQTextView.debug.xcconfig
create mode 100644 Pods/Target Support Files/IQTextView/IQTextView.modulemap
create mode 100644 Pods/Target Support Files/IQTextView/IQTextView.release.xcconfig
create mode 100644 Pods/Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist
create mode 100644 Pods/Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift-Info.plist
create mode 100644 Pods/Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift-dummy.m
create mode 100644 Pods/Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift-prefix.pch
create mode 100644 Pods/Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift-umbrella.h
create mode 100644 Pods/Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift.debug.xcconfig
create mode 100644 Pods/Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift.modulemap
create mode 100644 Pods/Target Support Files/Socket.IO-Client-Swift/Socket.IO-Client-Swift.release.xcconfig
create mode 100644 Pods/Target Support Files/Starscream/ResourceBundle-Starscream_Privacy-Starscream-Info.plist
create mode 100644 Pods/Target Support Files/Starscream/Starscream-Info.plist
create mode 100644 Pods/Target Support Files/Starscream/Starscream-dummy.m
create mode 100644 Pods/Target Support Files/Starscream/Starscream-prefix.pch
create mode 100644 Pods/Target Support Files/Starscream/Starscream-umbrella.h
create mode 100644 Pods/Target Support Files/Starscream/Starscream.debug.xcconfig
create mode 100644 Pods/Target Support Files/Starscream/Starscream.modulemap
create mode 100644 Pods/Target Support Files/Starscream/Starscream.release.xcconfig
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/Info.plist
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64/VideosdkWebSocket.framework/Headers/VideosdkWebSocket-Swift.h
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64/VideosdkWebSocket.framework/Info.plist
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/arm64-apple-ios.abi.json
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/arm64-apple-ios.private.swiftinterface
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/arm64-apple-ios.swiftdoc
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/arm64-apple-ios.swiftinterface
delete mode 100755 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64/VideosdkWebSocket.framework/VideosdkWebSocket
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Headers/VideosdkWebSocket-Swift.h
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Info.plist
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/arm64-apple-ios-simulator.abi.json
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/arm64-apple-ios-simulator.private.swiftinterface
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/arm64-apple-ios-simulator.swiftdoc
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/arm64-apple-ios-simulator.swiftinterface
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/x86_64-apple-ios-simulator.abi.json
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/x86_64-apple-ios-simulator.private.swiftinterface
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/x86_64-apple-ios-simulator.swiftdoc
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/Modules/VideosdkWebSocket.swiftmodule/x86_64-apple-ios-simulator.swiftinterface
delete mode 100755 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/VideosdkWebSocket
delete mode 100644 Pods/VideoSDKRTC/Frameworks/VideosdkWebSocket.xcframework/ios-arm64_x86_64-simulator/VideosdkWebSocket.framework/_CodeSignature/CodeResources
create mode 100644 VideoSDKRTC_Example.xcodeproj/xcuserdata/deepbhupatkar.xcuserdatad/xcschemes/xcschememanagement.plist
delete mode 100644 VideoSDKRTC_Example.xcworkspace/xcuserdata/parth.xcuserdatad/UserInterfaceState.xcuserstate
delete mode 100644 VideoSDKRTC_Example.xcworkspace/xcuserdata/parth.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
diff --git a/Podfile b/Podfile
index b066728..46d0d2a 100644
--- a/Podfile
+++ b/Podfile
@@ -1,10 +1,14 @@
-platform :ios, '12.0'
+# Uncomment the next line to define a global platform for your project
+# platform :ios, '9.0'
target 'VideoSDKRTC_Example' do
+ # Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
- pod 'VideoSDKRTC', :git => 'https://github.com/videosdk-live/videosdk-rtc-ios-sdk.git'
- pod 'MessageKit'
- pod 'IQKeyboardManagerSwift'
+ # Pods for VideoSDKRTC_Example
+ pod 'VideoSDKRTC', :git => 'https://github.com/videosdk-live/videosdk-rtc-ios-sdk.git'
+ pod 'MessageKit'
+ pod 'IQKeyboardManagerSwift'
end
+
diff --git a/Podfile.lock b/Podfile.lock
index d15b72c..55fa858 100644
--- a/Podfile.lock
+++ b/Podfile.lock
@@ -2,10 +2,53 @@ PODS:
- InputBarAccessoryView (5.5.0):
- InputBarAccessoryView/Core (= 5.5.0)
- InputBarAccessoryView/Core (5.5.0)
- - IQKeyboardManagerSwift (6.5.16)
+ - IQKeyboardCore (1.0.5)
+ - IQKeyboardManagerSwift (8.0.0):
+ - IQKeyboardManagerSwift/Appearance (= 8.0.0)
+ - IQKeyboardManagerSwift/Core (= 8.0.0)
+ - IQKeyboardManagerSwift/IQKeyboardReturnManager (= 8.0.0)
+ - IQKeyboardManagerSwift/IQKeyboardToolbarManager (= 8.0.0)
+ - IQKeyboardManagerSwift/IQTextView (= 8.0.0)
+ - IQKeyboardManagerSwift/Resign (= 8.0.0)
+ - IQKeyboardManagerSwift/Appearance (8.0.0):
+ - IQKeyboardManagerSwift/Core
+ - IQKeyboardManagerSwift/Core (8.0.0):
+ - IQKeyboardNotification
+ - IQTextInputViewNotification
+ - IQKeyboardManagerSwift/IQKeyboardReturnManager (8.0.0):
+ - IQKeyboardReturnManager
+ - IQKeyboardManagerSwift/IQKeyboardToolbarManager (8.0.0):
+ - IQKeyboardManagerSwift/Core
+ - IQKeyboardToolbarManager
+ - IQKeyboardManagerSwift/IQTextView (8.0.0):
+ - IQTextView
+ - IQKeyboardManagerSwift/Resign (8.0.0):
+ - IQKeyboardManagerSwift/Core
+ - IQKeyboardNotification (1.0.3)
+ - IQKeyboardReturnManager (1.0.4):
+ - IQKeyboardCore (= 1.0.5)
+ - IQKeyboardToolbar (1.1.1):
+ - IQKeyboardCore
+ - IQKeyboardToolbar/Core (= 1.1.1)
+ - IQKeyboardToolbar/Core (1.1.1):
+ - IQKeyboardCore
+ - IQKeyboardToolbar/Placeholderable
+ - IQKeyboardToolbar/Placeholderable (1.1.1):
+ - IQKeyboardCore
+ - IQKeyboardToolbarManager (1.1.2):
+ - IQKeyboardToolbar
+ - IQTextInputViewNotification
+ - IQTextInputViewNotification (1.0.8):
+ - IQKeyboardCore
+ - IQTextView (1.0.5):
+ - IQKeyboardToolbar/Placeholderable
- MessageKit (3.8.0):
- InputBarAccessoryView (~> 5.5.0)
- - VideoSDKRTC (2.1.0)
+ - Socket.IO-Client-Swift (16.1.1):
+ - Starscream (~> 4.0.8)
+ - Starscream (4.0.8)
+ - VideoSDKRTC (2.1.9):
+ - Socket.IO-Client-Swift (= 16.1.1)
DEPENDENCIES:
- IQKeyboardManagerSwift
@@ -15,8 +58,17 @@ DEPENDENCIES:
SPEC REPOS:
trunk:
- InputBarAccessoryView
+ - IQKeyboardCore
- IQKeyboardManagerSwift
+ - IQKeyboardNotification
+ - IQKeyboardReturnManager
+ - IQKeyboardToolbar
+ - IQKeyboardToolbarManager
+ - IQTextInputViewNotification
+ - IQTextView
- MessageKit
+ - Socket.IO-Client-Swift
+ - Starscream
EXTERNAL SOURCES:
VideoSDKRTC:
@@ -24,15 +76,24 @@ EXTERNAL SOURCES:
CHECKOUT OPTIONS:
VideoSDKRTC:
- :commit: 915455b5395e243a620c315d49b650c1884216a0
+ :commit: aedc4a2ca0407d35961be509309e45e6b7aa8ea9
:git: https://github.com/videosdk-live/videosdk-rtc-ios-sdk.git
SPEC CHECKSUMS:
InputBarAccessoryView: 1d7b0a672b36e370f01f264b3907ef39d03328e3
- IQKeyboardManagerSwift: 12d89768845bb77b55cc092ecc2b1f9370f06b76
+ IQKeyboardCore: 28c8bf3bcd8ba5aa1570b318cbc4da94b861711e
+ IQKeyboardManagerSwift: 0c6fbbaa2e60739e48d7cf59f25661471a7a3a65
+ IQKeyboardNotification: d7382c4466c5a5adef92c7452ebf861b36050088
+ IQKeyboardReturnManager: 972be48528ce9e7508ab3ab15ac7efac803f17f5
+ IQKeyboardToolbar: d4bdccfb78324aec2f3920659c77bb89acd33312
+ IQKeyboardToolbarManager: 6f4072ac620c2572d4af8c09f42a801f3e4909f7
+ IQTextInputViewNotification: f5e954d8881fd9808b744e49e024cc0d4bcfe572
+ IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
MessageKit: a1ba0c69ebead94029867853eb44dd05b9b3f453
- VideoSDKRTC: 42abab38e8bb4dd5c9ad5d23415cf5e0ce87908b
+ Socket.IO-Client-Swift: 3614bea82ba005df1c2ff01154f4004993e05ad7
+ Starscream: 19b5533ddb925208db698f0ac508a100b884a1b9
+ VideoSDKRTC: 679cdce8548a9de7b8328fc4d880102f29c31057
-PODFILE CHECKSUM: 9a6c26d40d9f65335d130d844a4f98bb47161e02
+PODFILE CHECKSUM: 1014d5c5fdb18889deee645f7a165d4898c12f61
COCOAPODS: 1.15.2
diff --git a/VideoSDKRTC_Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy
similarity index 50%
rename from VideoSDKRTC_Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
rename to Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy
index 18d9810..9021190 100644
--- a/VideoSDKRTC_Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy
@@ -2,7 +2,13 @@
- IDEDidComputeMac32BitWarning
-
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift
new file mode 100644
index 0000000..a4e8fe6
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift
@@ -0,0 +1,41 @@
+//
+// IQKeyboardConstants.swift
+// https://github.com/hackiftekhar/IQKeyboardCore
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+
+/**
+ `IQEnableModeDefault`
+ Pick default settings.
+
+ `IQEnableModeEnabled`
+ setting is enabled.
+
+ `IQEnableModeDisabled`
+ setting is disabled.
+ */
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQEnableMode: Int {
+ case `default`
+ case enabled
+ case disabled
+}
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift
new file mode 100644
index 0000000..24b15d7
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift
@@ -0,0 +1,65 @@
+//
+// IQKeyboardExtended.swift
+// https://github.com/hackiftekhar/IQKeyboardCore
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/// Wrapper for IQKeyboardManager compatible types. This type provides an extension point for
+/// convenience methods in IQKeyboardManager.
+@available(iOSApplicationExtension, unavailable)
+public struct IQKeyboardExtension {
+ public private(set) weak var base: Base?
+ fileprivate init(_ base: Base) {
+ self.base = base
+ }
+}
+
+// swiftlint:disable identifier_name
+/// Represents an object type that is compatible with IQKeyboardManager. You can use `iq` property to get a
+/// value in the namespace of IQKeyboardManager.
+@available(iOSApplicationExtension, unavailable)
+public protocol IQKeyboardExtended {
+ /// Type being extended.
+ associatedtype Base: AnyObject
+
+ /// Instance IQKeyboardManager extension point.
+ @MainActor
+ var iq: IQKeyboardExtension { get set }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+public extension IQKeyboardExtended where Self: UIView {
+
+ /// Instance IQKeyboardManager extension point.
+ @MainActor
+ var iq: IQKeyboardExtension {
+ get { IQKeyboardExtension(self) }
+ set {}
+ }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension UIView: IQKeyboardExtended {}
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift
new file mode 100644
index 0000000..5c1612a
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift
@@ -0,0 +1,86 @@
+//
+// IQTextInputView.swift
+// https://github.com/hackiftekhar/IQKeyboardCore
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public protocol IQTextInputView where Self: UIView, Self: UITextInputTraits {
+
+ @available(iOS 16.0, *)
+ @objc var iqIsFindInteractionEnabled: Bool { get }
+
+ @available(iOS 16.0, *)
+ @objc var iqFindInteraction: UIFindInteraction? { get }
+
+ @objc var returnKeyType: UIReturnKeyType { get set }
+ @objc var keyboardAppearance: UIKeyboardAppearance { get set }
+
+ @objc var iqIsEnabled: Bool { get }
+
+ @objc var inputAccessoryView: UIView? { get set }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextField: IQTextInputView {
+
+ @available(iOS 16.0, *)
+ public var iqIsFindInteractionEnabled: Bool { false }
+
+ @available(iOS 16.0, *)
+ public var iqFindInteraction: UIFindInteraction? { nil }
+
+ public var iqIsEnabled: Bool { isEnabled }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextView: IQTextInputView {
+ @available(iOS 16.0, *)
+ public var iqIsFindInteractionEnabled: Bool { isFindInteractionEnabled }
+
+ @available(iOS 16.0, *)
+ public var iqFindInteraction: UIFindInteraction? { findInteraction }
+
+ public var iqIsEnabled: Bool { isEditable }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UISearchBar: IQTextInputView {
+
+ @available(iOS 16.0, *)
+ public var iqIsFindInteractionEnabled: Bool { false }
+
+ @available(iOS 16.0, *)
+ public var iqFindInteraction: UIFindInteraction? { nil }
+
+ public var iqIsEnabled: Bool {
+ if #available(iOS 16.4, *) {
+ return isEnabled
+ } else {
+ return searchTextField.isEnabled
+ }
+ }
+}
diff --git a/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift
new file mode 100644
index 0000000..f97a484
--- /dev/null
+++ b/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift
@@ -0,0 +1,168 @@
+//
+// UIView+Hierarchy.swift
+// https://github.com/hackiftekhar/IQKeyboardCore
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/**
+ UIView hierarchy category.
+ */
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+ // MARK: viewControllers
+
+ /**
+ Returns the UIViewController object that manages the receiver.
+ */
+ func viewContainingController() -> UIViewController? {
+
+ var nextResponder: UIResponder? = base
+
+ repeat {
+ nextResponder = nextResponder?.next
+
+ if let viewController: UIViewController = nextResponder as? UIViewController {
+ return viewController
+ }
+
+ } while nextResponder != nil
+
+ return nil
+ }
+
+ @available(*, unavailable, message: "This has been removed because it no longer needed")
+ func topMostController() -> UIViewController? { nil }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+ // MARK: Superviews
+ /**
+ Returns the superView of provided class type.
+
+ @param classType class type of the object which is to be search in above hierarchy and return
+
+ @param belowView view object in upper hierarchy where method should stop searching and return nil
+ */
+ func superviewOf(type classType: T.Type, belowView: UIView? = nil) -> T? {
+
+ var superView: UIView? = base?.superview
+
+ while let aSuperview: UIView = superView {
+
+ if aSuperview.isKind(of: classType) {
+
+ // If it's UIScrollView, then validating for special cases
+ if aSuperview is UIScrollView {
+
+ let classNameString: String = "\(type(of: aSuperview.self))"
+
+ // If it's not UITableViewWrapperView class,
+ // this is internal class which is actually manage in UITableview.
+ // The speciality of this class is that it's superview is UITableView.
+ // If it's not UITableViewCellScrollView class,
+ // this is internal class which is actually manage in UITableviewCell.
+ // The speciality of this class is that it's superview is UITableViewCell.
+ // If it's not _UIQueuingScrollView class,
+ // actually we validate for _ prefix which usually used by Apple internal classes
+ if !(aSuperview.superview is UITableView),
+ !(aSuperview.superview is UITableViewCell),
+ !classNameString.hasPrefix("_") {
+ return superView as? T
+ }
+ } else {
+ return superView as? T
+ }
+ } else if aSuperview == belowView {
+ return nil
+ }
+
+ superView = aSuperview.superview
+ }
+
+ return nil
+ }
+
+ // MARK: Special TextFields
+
+ /**
+ Returns searchBar if receiver object is UISearchBarTextField, otherwise return nil.
+ */
+ func textFieldSearchBar() -> UISearchBar? {
+
+ var responder: UIResponder? = base?.next
+
+ while let bar: UIResponder = responder {
+
+ if let searchBar: UISearchBar = bar as? UISearchBar {
+ return searchBar
+ } else if bar is UIViewController {
+ break
+ }
+
+ responder = bar.next
+ }
+
+ return nil
+ }
+
+ /**
+ Returns YES if the receiver object is UIAlertSheetTextField, otherwise return NO.
+ */
+ func isAlertViewTextField() -> Bool {
+
+ var alertViewController: UIResponder? = viewContainingController()
+
+ var isAlertViewTextField: Bool = false
+
+ while let controller: UIResponder = alertViewController, !isAlertViewTextField {
+
+ if controller is UIAlertController {
+ isAlertViewTextField = true
+ break
+ }
+
+ alertViewController = controller.next
+ }
+
+ return isAlertViewTextField
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+ @available(*, unavailable, renamed: "iq.viewContainingController()")
+ func viewContainingController() -> UIViewController? { nil }
+
+ @available(*, unavailable, message: "This has been removed because it no longer needed")
+ func topMostController() -> UIViewController? { nil }
+
+ @available(*, unavailable, renamed: "iq.superviewOf(type:belowView:)")
+ func superviewOfClassType(_ classType: UIView.Type, belowView: UIView? = nil) -> UIView? { nil }
+}
diff --git a/Pods/IQKeyboardCore/LICENSE b/Pods/IQKeyboardCore/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardCore/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardCore/README.md b/Pods/IQKeyboardCore/README.md
new file mode 100644
index 0000000..620ea83
--- /dev/null
+++ b/Pods/IQKeyboardCore/README.md
@@ -0,0 +1,29 @@
+# IQKeyboardCore
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardCore.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardCore)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardCore is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardCore'
+```
+
+## Author
+
+hackiftekhar, ideviftekhar@gmail.com
+
+## License
+
+IQKeyboardCore is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift
new file mode 100644
index 0000000..49de03b
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift
@@ -0,0 +1,43 @@
+//
+// IQKeyboardAppearanceConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardAppearanceConfiguration: NSObject {
+
+ /**
+ Override the keyboardAppearance for all textInputView. Default is NO.
+ */
+ public var overrideAppearance: Bool = false
+
+ /**
+ If overrideKeyboardAppearance is YES, then all the textInputView keyboardAppearance is set using this property.
+ */
+ public var appearance: UIKeyboardAppearance = .default
+}
+
+@available(*, unavailable, renamed: "IQKeyboardAppearanceConfiguration")
+@MainActor
+@objcMembers public final class IQKeyboardConfiguration: NSObject {}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift
new file mode 100644
index 0000000..117af28
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift
@@ -0,0 +1,50 @@
+//
+// IQKeyboardAppearanceManager+Internal.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardAppearanceManager {
+
+ func removeTextInputViewObserver() {
+ textInputViewObserver.unsubscribe(identifier: "IQKeyboardAppearanceManager")
+ }
+
+ func addTextInputViewObserver() {
+ textInputViewObserver.subscribe(identifier: "IQKeyboardAppearanceManager",
+ changeHandler: { [weak self] event, textInputView in
+ guard let self = self else { return }
+ switch event {
+ case .beginEditing:
+ guard keyboardConfiguration.overrideAppearance,
+ textInputView.keyboardAppearance != keyboardConfiguration.appearance else { return }
+
+ textInputView.keyboardAppearance = keyboardConfiguration.appearance
+ textInputView.reloadInputViews()
+ case .endEditing:
+ break
+ }
+ })
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift
new file mode 100644
index 0000000..4a6fdaa
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift
@@ -0,0 +1,44 @@
+//
+// IQKeyboardAppearanceManager.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQTextInputViewNotification
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers internal final class IQKeyboardAppearanceManager: NSObject {
+
+ let textInputViewObserver: IQTextInputViewNotification = .init()
+
+ /**
+ Configuration related to keyboard appearance
+ */
+ var keyboardConfiguration: IQKeyboardAppearanceConfiguration = .init()
+
+ public override init() {
+ super.init()
+
+ // Registering one time only
+ addTextInputViewObserver()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift
new file mode 100644
index 0000000..cea51c2
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift
@@ -0,0 +1,55 @@
+//
+// IQKeyboardManager+Appearance.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var appearanceManager: Int = 0
+ }
+
+ internal var appearanceManager: IQKeyboardAppearanceManager {
+ if let object = objc_getAssociatedObject(self, &AssociatedKeys.appearanceManager)
+ as? IQKeyboardAppearanceManager {
+ return object
+ }
+
+ let object: IQKeyboardAppearanceManager = .init()
+ objc_setAssociatedObject(self, &AssociatedKeys.appearanceManager,
+ object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+
+ return object
+ }
+
+ /**
+ Configuration related to keyboard appearance
+ */
+ var keyboardConfiguration: IQKeyboardAppearanceConfiguration {
+ get { appearanceManager.keyboardConfiguration }
+ set { appearanceManager.keyboardConfiguration = newValue }
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift
new file mode 100644
index 0000000..8e9cfb5
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift
@@ -0,0 +1,43 @@
+//
+// IQKeyboardManager+Appearance_Deprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "keyboardConfiguration.overrideAppearance")
+ var overrideKeyboardAppearance: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "keyboardConfiguration.appearance")
+ var keyboardAppearance: UIKeyboardAppearance {
+ get { .default }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQNSArray+Sort.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQNSArray+Sort.swift
deleted file mode 100644
index 1d3a4c2..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQNSArray+Sort.swift
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// IQNSArray+Sort.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-/**
-UIView.subviews sorting category.
-*/
-@available(iOSApplicationExtension, unavailable)
-internal extension Array where Element: UIView {
-
- /**
- Returns the array by sorting the UIView's by their tag property.
- */
- func sortedArrayByTag() -> [Element] {
-
- return sorted(by: { (obj1: Element, obj2: Element) -> Bool in
-
- return (obj1.tag < obj2.tag)
- })
- }
-
- /**
- Returns the array by sorting the UIView's by their tag property.
- */
- func sortedArrayByPosition() -> [Element] {
-
- return sorted(by: { (obj1: Element, obj2: Element) -> Bool in
- if obj1.frame.minY != obj2.frame.minY {
- return obj1.frame.minY < obj2.frame.minY
- } else {
- return obj1.frame.minX < obj2.frame.minX
- }
- })
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIScrollView+Additions.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIScrollView+Additions.swift
deleted file mode 100644
index 280f5e5..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIScrollView+Additions.swift
+++ /dev/null
@@ -1,117 +0,0 @@
-//
-// IQUIScrollView+Additions.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-@objc public extension UIScrollView {
-
- private struct AssociatedKeys {
- static var shouldIgnoreScrollingAdjustment: Int = 0
- static var shouldIgnoreContentInsetAdjustment: Int = 0
- static var shouldRestoreScrollViewContentOffset: Int = 0
- }
-
- /**
- If YES, then scrollview will ignore scrolling (simply not scroll it) for adjusting textfield position. Default is NO.
- */
- var shouldIgnoreScrollingAdjustment: Bool {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.shouldIgnoreScrollingAdjustment) as? Bool ?? false
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.shouldIgnoreScrollingAdjustment, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /**
- If YES, then scrollview will ignore content inset adjustment (simply not updating it) when keyboard is shown. Default is NO.
- */
- var shouldIgnoreContentInsetAdjustment: Bool {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.shouldIgnoreContentInsetAdjustment) as? Bool ?? false
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.shouldIgnoreContentInsetAdjustment, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /**
- To set customized distance from keyboard for textField/textView. Can't be less than zero
- */
- var shouldRestoreScrollViewContentOffset: Bool {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.shouldRestoreScrollViewContentOffset) as? Bool ?? false
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.shouldRestoreScrollViewContentOffset, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-}
-
-@available(iOSApplicationExtension, unavailable)
-internal extension UITableView {
-
- func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
- var previousRow = indexPath.row - 1
- var previousSection = indexPath.section
-
- // Fixing indexPath
- if previousRow < 0 {
- previousSection -= 1
- if previousSection >= 0 {
- previousRow = self.numberOfRows(inSection: previousSection) - 1
- }
- }
-
- if previousRow >= 0, previousSection >= 0 {
- return IndexPath(row: previousRow, section: previousSection)
- } else {
- return nil
- }
- }
-}
-
-@available(iOSApplicationExtension, unavailable)
-internal extension UICollectionView {
-
- func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
- var previousRow = indexPath.row - 1
- var previousSection = indexPath.section
-
- // Fixing indexPath
- if previousRow < 0 {
- previousSection -= 1
- if previousSection >= 0 {
- previousRow = self.numberOfItems(inSection: previousSection) - 1
- }
- }
-
- if previousRow >= 0, previousSection >= 0 {
- return IndexPath(item: previousRow, section: previousSection)
- } else {
- return nil
- }
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUITextFieldView+Additions.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUITextFieldView+Additions.swift
deleted file mode 100644
index 19ce042..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUITextFieldView+Additions.swift
+++ /dev/null
@@ -1,93 +0,0 @@
-//
-// IQUITextFieldView+Additions.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-/**
-Uses default keyboard distance for textField.
-*/
-@available(iOSApplicationExtension, unavailable)
-public let kIQUseDefaultKeyboardDistance = CGFloat.greatestFiniteMagnitude
-
-/**
-UIView category for managing UITextField/UITextView
-*/
-@available(iOSApplicationExtension, unavailable)
-@objc public extension UIView {
-
- private struct AssociatedKeys {
- static var keyboardDistanceFromTextField: Int = 0
- static var ignoreSwitchingByNextPrevious: Int = 0
- static var enableMode: Int = 0
- static var shouldResignOnTouchOutsideMode: Int = 0
- }
-
- /**
- To set customized distance from keyboard for textField/textView. Can't be less than zero
- */
- var keyboardDistanceFromTextField: CGFloat {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.keyboardDistanceFromTextField) as? CGFloat ?? kIQUseDefaultKeyboardDistance
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.keyboardDistanceFromTextField, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /**
- If shouldIgnoreSwitchingByNextPrevious is true then library will ignore this textField/textView while moving to other textField/textView using keyboard toolbar next previous buttons. Default is false
- */
- var ignoreSwitchingByNextPrevious: Bool {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.ignoreSwitchingByNextPrevious) as? Bool ?? false
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.ignoreSwitchingByNextPrevious, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /**
- Override Enable/disable managing distance between keyboard and textField behaviour for this particular textField.
- */
- var enableMode: IQEnableMode {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.enableMode) as? IQEnableMode ?? .default
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.enableMode, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /**
- Override resigns Keyboard on touching outside of UITextField/View behaviour for this particular textField.
- */
- var shouldResignOnTouchOutsideMode: IQEnableMode {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.shouldResignOnTouchOutsideMode) as? IQEnableMode ?? .default
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.shouldResignOnTouchOutsideMode, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIView+Hierarchy.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIView+Hierarchy.swift
deleted file mode 100644
index 0f554d9..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIView+Hierarchy.swift
+++ /dev/null
@@ -1,324 +0,0 @@
-//
-// IQUIView+Hierarchy.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import UIKit
-
-/**
-UIView hierarchy category.
-*/
-@available(iOSApplicationExtension, unavailable)
-@objc public extension UIView {
-
- // MARK: viewControllers
-
- /**
- Returns the UIViewController object that manages the receiver.
- */
- func viewContainingController() -> UIViewController? {
-
- var nextResponder: UIResponder? = self
-
- repeat {
- nextResponder = nextResponder?.next
-
- if let viewController = nextResponder as? UIViewController {
- return viewController
- }
-
- } while nextResponder != nil
-
- return nil
- }
-
- /**
- Returns the topMost UIViewController object in hierarchy.
- */
- func topMostController() -> UIViewController? {
-
- var controllersHierarchy = [UIViewController]()
-
- if var topController = window?.rootViewController {
- controllersHierarchy.append(topController)
-
- while let presented = topController.presentedViewController {
-
- topController = presented
-
- controllersHierarchy.append(presented)
- }
-
- var matchController: UIResponder? = viewContainingController()
-
- while let mController = matchController as? UIViewController, controllersHierarchy.contains(mController) == false {
-
- repeat {
- matchController = matchController?.next
-
- } while matchController != nil && matchController is UIViewController == false
- }
-
- return matchController as? UIViewController
-
- } else {
- return viewContainingController()
- }
- }
-
- /**
- Returns the UIViewController object that is actually the parent of this object. Most of the time it's the viewController object which actually contains it, but result may be different if it's viewController is added as childViewController of another viewController.
- */
- func parentContainerViewController() -> UIViewController? {
-
- var matchController = viewContainingController()
- var parentContainerViewController: UIViewController?
-
- if var navController = matchController?.navigationController {
-
- while let parentNav = navController.navigationController {
- navController = parentNav
- }
-
- var parentController: UIViewController = navController
-
- while let parent = parentController.parent,
- (parent.isKind(of: UINavigationController.self) == false &&
- parent.isKind(of: UITabBarController.self) == false &&
- parent.isKind(of: UISplitViewController.self) == false) {
-
- parentController = parent
- }
-
- if navController == parentController {
- parentContainerViewController = navController.topViewController
- } else {
- parentContainerViewController = parentController
- }
- } else if let tabController = matchController?.tabBarController {
-
- if let navController = tabController.selectedViewController as? UINavigationController {
- parentContainerViewController = navController.topViewController
- } else {
- parentContainerViewController = tabController.selectedViewController
- }
- } else {
- while let parentController = matchController?.parent,
- (parentController.isKind(of: UINavigationController.self) == false &&
- parentController.isKind(of: UITabBarController.self) == false &&
- parentController.isKind(of: UISplitViewController.self) == false) {
-
- matchController = parentController
- }
-
- parentContainerViewController = matchController
- }
-
- let finalController = parentContainerViewController?.parentIQContainerViewController() ?? parentContainerViewController
-
- return finalController
-
- }
-
- // MARK: Superviews/Subviews/Siglings
-
- /**
- Returns the superView of provided class type.
-
-
- @param classType class type of the object which is to be search in above hierarchy and return
-
- @param belowView view object in upper hierarchy where method should stop searching and return nil
-*/
- func superviewOfClassType(_ classType: UIView.Type, belowView: UIView? = nil) -> UIView? {
-
- var superView = superview
-
- while let unwrappedSuperView = superView {
-
- if unwrappedSuperView.isKind(of: classType) {
-
- // If it's UIScrollView, then validating for special cases
- if unwrappedSuperView.isKind(of: UIScrollView.self) {
-
- let classNameString: String = "\(type(of: unwrappedSuperView.self))"
-
- // If it's not UITableViewWrapperView class, this is internal class which is actually manage in UITableview. The speciality of this class is that it's superview is UITableView.
- // If it's not UITableViewCellScrollView class, this is internal class which is actually manage in UITableviewCell. The speciality of this class is that it's superview is UITableViewCell.
- // If it's not _UIQueuingScrollView class, actually we validate for _ prefix which usually used by Apple internal classes
- if unwrappedSuperView.superview?.isKind(of: UITableView.self) == false,
- unwrappedSuperView.superview?.isKind(of: UITableViewCell.self) == false,
- classNameString.hasPrefix("_") == false {
- return superView
- }
- } else {
- return superView
- }
- } else if unwrappedSuperView == belowView {
- return nil
- }
-
- superView = unwrappedSuperView.superview
- }
-
- return nil
- }
-
- /**
- Returns all siblings of the receiver which canBecomeFirstResponder.
- */
- internal func responderSiblings() -> [UIView] {
-
- // Array of (UITextField/UITextView's).
- var tempTextFields = [UIView]()
-
- // Getting all siblings
- if let siblings = superview?.subviews {
- for textField in siblings {
- if (textField == self || textField.ignoreSwitchingByNextPrevious == false), textField.IQcanBecomeFirstResponder() {
- tempTextFields.append(textField)
- }
- }
- }
-
- return tempTextFields
- }
-
- /**
- Returns all deep subViews of the receiver which canBecomeFirstResponder.
- */
- internal func deepResponderViews() -> [UIView] {
-
- // Array of (UITextField/UITextView's).
- var textfields = [UIView]()
-
- for textField in subviews {
-
- if (textField == self || textField.ignoreSwitchingByNextPrevious == false), textField.IQcanBecomeFirstResponder() {
- textfields.append(textField)
- }
- // Sometimes there are hidden or disabled views and textField inside them still recorded, so we added some more validations here (Bug ID: #458)
- // Uncommented else (Bug ID: #625)
- else if textField.subviews.count != 0, isUserInteractionEnabled, !isHidden, alpha != 0.0 {
- for deepView in textField.deepResponderViews() {
- textfields.append(deepView)
- }
- }
- }
-
- // subviews are returning in opposite order. Sorting according the frames 'y'.
- return textfields.sorted(by: { (view1: UIView, view2: UIView) -> Bool in
-
- let frame1 = view1.convert(view1.bounds, to: self)
- let frame2 = view2.convert(view2.bounds, to: self)
-
- if frame1.minY != frame2.minY {
- return frame1.minY < frame2.minY
- } else {
- return frame1.minX < frame2.minX
- }
- })
- }
-
- private func IQcanBecomeFirstResponder() -> Bool {
-
- var IQcanBecomeFirstResponder = false
-
- if self.conforms(to: UITextInput.self) {
- // Setting toolbar to keyboard.
- if let textView = self as? UITextView {
- IQcanBecomeFirstResponder = textView.isEditable
- } else if let textField = self as? UITextField {
- IQcanBecomeFirstResponder = textField.isEnabled
- }
- }
-
- if IQcanBecomeFirstResponder {
- IQcanBecomeFirstResponder = isUserInteractionEnabled && !isHidden && alpha != 0.0 && !isAlertViewTextField() && textFieldSearchBar() == nil
- }
-
- return IQcanBecomeFirstResponder
- }
-
- // MARK: Special TextFields
-
- /**
- Returns searchBar if receiver object is UISearchBarTextField, otherwise return nil.
- */
- internal func textFieldSearchBar() -> UISearchBar? {
-
- var responder: UIResponder? = self.next
-
- while let bar = responder {
-
- if let searchBar = bar as? UISearchBar {
- return searchBar
- } else if bar is UIViewController {
- break
- }
-
- responder = bar.next
- }
-
- return nil
- }
-
- /**
- Returns YES if the receiver object is UIAlertSheetTextField, otherwise return NO.
- */
- internal func isAlertViewTextField() -> Bool {
-
- var alertViewController: UIResponder? = viewContainingController()
-
- var isAlertViewTextField = false
-
- while let controller = alertViewController, !isAlertViewTextField {
-
- if controller.isKind(of: UIAlertController.self) {
- isAlertViewTextField = true
- break
- }
-
- alertViewController = controller.next
- }
-
- return isAlertViewTextField
- }
-
- private func depth() -> Int {
- var depth: Int = 0
-
- if let superView = superview {
- depth = superView.depth()+1
- }
-
- return depth
- }
-
-}
-
-@available(iOSApplicationExtension, unavailable)
-extension NSObject {
-
- internal func _IQDescription() -> String {
- return "<\(self) \(Unmanaged.passUnretained(self).toOpaque())>"
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIViewController+Additions.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIViewController+Additions.swift
deleted file mode 100644
index 5cba198..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIViewController+Additions.swift
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-// IQUIViewController+Additions.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-@objc extension UIViewController {
-
- private struct AssociatedKeys {
- static var IQLayoutGuideConstraint: Int = 0
- }
-
- /**
- This method is provided to override by viewController's if the library lifts a viewController which you doesn't want to lift . This may happen if you have implemented side menu feature in your app and the library try to lift the side menu controller. Overriding this method in side menu class to return correct controller should fix the problem.
- */
- open func parentIQContainerViewController() -> UIViewController? {
- return self
- }
-
- /**
- To set customized distance from keyboard for textField/textView. Can't be less than zero
-
- @deprecated Due to change in core-logic of handling distance between textField and keyboard distance, this layout contraint tweak is no longer needed and things will just work out of the box regardless of constraint pinned with safeArea/layoutGuide/superview
- */
- @available(*, deprecated, message: "Due to change in core-logic of handling distance between textField and keyboard distance, this layout contraint tweak is no longer needed and things will just work out of the box regardless of constraint pinned with safeArea/layoutGuide/superview.")
- @IBOutlet public var IQLayoutGuideConstraint: NSLayoutConstraint? {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.IQLayoutGuideConstraint) as? NSLayoutConstraint
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.IQLayoutGuideConstraint, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift
deleted file mode 100644
index 3eea696..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-// IQKeyboardManagerConstants.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import Foundation
-
-// MARK: IQAutoToolbarManageBehaviour
-
-/**
-`IQAutoToolbarBySubviews`
-Creates Toolbar according to subview's hirarchy of Textfield's in view.
-
-`IQAutoToolbarByTag`
-Creates Toolbar according to tag property of TextField's.
-
-`IQAutoToolbarByPosition`
-Creates Toolbar according to the y,x position of textField in it's superview coordinate.
-*/
-@available(iOSApplicationExtension, unavailable)
-@objc public enum IQAutoToolbarManageBehaviour: Int {
- case bySubviews
- case byTag
- case byPosition
-}
-
-/**
- `IQPreviousNextDisplayModeDefault`
- Show NextPrevious when there are more than 1 textField otherwise hide.
-
- `IQPreviousNextDisplayModeAlwaysHide`
- Do not show NextPrevious buttons in any case.
-
- `IQPreviousNextDisplayModeAlwaysShow`
- Always show nextPrevious buttons, if there are more than 1 textField then both buttons will be visible but will be shown as disabled.
- */
-@available(iOSApplicationExtension, unavailable)
-@objc public enum IQPreviousNextDisplayMode: Int {
- case `default`
- case alwaysHide
- case alwaysShow
-}
-
-/**
- `IQEnableModeDefault`
- Pick default settings.
-
- `IQEnableModeEnabled`
- setting is enabled.
-
- `IQEnableModeDisabled`
- setting is disabled.
- */
-@available(iOSApplicationExtension, unavailable)
-@objc public enum IQEnableMode: Int {
- case `default`
- case enabled
- case disabled
-}
-
-/*
- /---------------------------------------------------------------------------------------------------\
- \---------------------------------------------------------------------------------------------------/
- | iOS Notification Mechanism |
- /---------------------------------------------------------------------------------------------------\
- \---------------------------------------------------------------------------------------------------/
-
- ------------------------------------------------------------
- When UITextField become first responder
- ------------------------------------------------------------
- - UITextFieldTextDidBeginEditingNotification (UITextField)
- - UIKeyboardWillShowNotification
- - UIKeyboardDidShowNotification
-
- ------------------------------------------------------------
- When UITextView become first responder
- ------------------------------------------------------------
- - UIKeyboardWillShowNotification
- - UITextViewTextDidBeginEditingNotification (UITextView)
- - UIKeyboardDidShowNotification
-
- ------------------------------------------------------------
- When switching focus from UITextField to another UITextField
- ------------------------------------------------------------
- - UITextFieldTextDidEndEditingNotification (UITextField1)
- - UITextFieldTextDidBeginEditingNotification (UITextField2)
- - UIKeyboardWillShowNotification
- - UIKeyboardDidShowNotification
-
- ------------------------------------------------------------
- When switching focus from UITextView to another UITextView
- ------------------------------------------------------------
- - UITextViewTextDidEndEditingNotification: (UITextView1)
- - UIKeyboardWillShowNotification
- - UITextViewTextDidBeginEditingNotification: (UITextView2)
- - UIKeyboardDidShowNotification
-
- ------------------------------------------------------------
- When switching focus from UITextField to UITextView
- ------------------------------------------------------------
- - UITextFieldTextDidEndEditingNotification (UITextField)
- - UIKeyboardWillShowNotification
- - UITextViewTextDidBeginEditingNotification (UITextView)
- - UIKeyboardDidShowNotification
-
- ------------------------------------------------------------
- When switching focus from UITextView to UITextField
- ------------------------------------------------------------
- - UITextViewTextDidEndEditingNotification (UITextView)
- - UITextFieldTextDidBeginEditingNotification (UITextField)
- - UIKeyboardWillShowNotification
- - UIKeyboardDidShowNotification
-
- ------------------------------------------------------------
- When opening/closing UIKeyboard Predictive bar
- ------------------------------------------------------------
- - UIKeyboardWillShowNotification
- - UIKeyboardDidShowNotification
-
- ------------------------------------------------------------
- On orientation change
- ------------------------------------------------------------
- - UIApplicationWillChangeStatusBarOrientationNotification
- - UIKeyboardWillHideNotification
- - UIKeyboardDidHideNotification
- - UIApplicationDidChangeStatusBarOrientationNotification
- - UIKeyboardWillShowNotification
- - UIKeyboardDidShowNotification
- - UIKeyboardWillShowNotification
- - UIKeyboardDidShowNotification
-
- */
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstantsInternal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstantsInternal.swift
deleted file mode 100644
index 595b2e5..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstantsInternal.swift
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// IQKeyboardManagerConstantsInternal.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import UIKit
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Debug.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Debug.swift
deleted file mode 100644
index b5008db..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Debug.swift
+++ /dev/null
@@ -1,111 +0,0 @@
-//
-// IQKeyboardManager+Debug.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-// MARK: Debugging & Developer options
-@available(iOSApplicationExtension, unavailable)
-public extension IQKeyboardManager {
-
- private struct AssociatedKeys {
- static var enableDebugging: Int = 0
- }
-
- @objc var enableDebugging: Bool {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.enableDebugging) as? Bool ?? false
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.enableDebugging, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /**
- @warning Use below methods to completely enable/disable notifications registered by library internally.
- Please keep in mind that library is totally dependent on NSNotification of UITextField, UITextField, Keyboard etc.
- If you do unregisterAllNotifications then library will not work at all. You should only use below methods if you want to completedly disable all library functions.
- You should use below methods at your own risk.
- */
- @objc func registerAllNotifications() {
-
- // Registering for keyboard notification.
- NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
- NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
-
- NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)), name: UIApplication.didBecomeActiveNotification, object: nil)
-
- // Registering for UITextField notification.
- registerTextFieldViewClass(UITextField.self, didBeginEditingNotificationName: UITextField.textDidBeginEditingNotification.rawValue, didEndEditingNotificationName: UITextField.textDidEndEditingNotification.rawValue)
-
- // Registering for UITextView notification.
- registerTextFieldViewClass(UITextView.self, didBeginEditingNotificationName: UITextView.textDidBeginEditingNotification.rawValue, didEndEditingNotificationName: UITextView.textDidEndEditingNotification.rawValue)
-
- // Registering for orientation changes notification
- NotificationCenter.default.addObserver(self, selector: #selector(self.willChangeStatusBarOrientation(_:)), name: UIApplication.willChangeStatusBarOrientationNotification, object: UIApplication.shared)
- }
-
- @objc func unregisterAllNotifications() {
-
- // Unregistering for keyboard notification.
- NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
- NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
-
- NotificationCenter.default.removeObserver(self, name: UIApplication.didBecomeActiveNotification, object: nil)
-
- // Unregistering for UITextField notification.
- unregisterTextFieldViewClass(UITextField.self, didBeginEditingNotificationName: UITextField.textDidBeginEditingNotification.rawValue, didEndEditingNotificationName: UITextField.textDidEndEditingNotification.rawValue)
-
- // Unregistering for UITextView notification.
- unregisterTextFieldViewClass(UITextView.self, didBeginEditingNotificationName: UITextView.textDidBeginEditingNotification.rawValue, didEndEditingNotificationName: UITextView.textDidEndEditingNotification.rawValue)
-
- // Unregistering for orientation changes notification
- NotificationCenter.default.removeObserver(self, name: UIApplication.willChangeStatusBarOrientationNotification, object: UIApplication.shared)
- }
-
- struct Static {
- static var indentation = 0
- }
-
- internal func showLog(_ logString: String, indentation: Int = 0) {
-
- guard enableDebugging else {
- return
- }
-
- if indentation < 0 {
- Static.indentation = max(0, Static.indentation + indentation)
- }
-
- var preLog = "IQKeyboardManager"
- for _ in 0 ... Static.indentation {
- preLog += "|\t"
- }
-
- print(preLog + logString)
-
- if indentation > 0 {
- Static.indentation += indentation
- }
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Internal.swift
deleted file mode 100644
index a37a560..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Internal.swift
+++ /dev/null
@@ -1,193 +0,0 @@
-//
-// IQKeyboardManager+Internal.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-internal extension IQKeyboardManager {
-
- /** Get all UITextField/UITextView siblings of textFieldView. */
- func responderViews() -> [UIView]? {
-
- var superConsideredView: UIView?
-
- // If find any consider responderView in it's upper hierarchy then will get deepResponderView.
- for disabledClass in toolbarPreviousNextAllowedClasses {
- superConsideredView = textFieldView?.superviewOfClassType(disabledClass)
- if superConsideredView != nil {
- break
- }
- }
-
- // If there is a superConsideredView in view's hierarchy, then fetching all it's subview that responds. No sorting for superConsideredView, it's by subView position. (Enhancement ID: #22)
- if let view = superConsideredView {
- return view.deepResponderViews()
- } else { // Otherwise fetching all the siblings
-
- guard let textFields = textFieldView?.responderSiblings() else {
- return nil
- }
-
- // Sorting textFields according to behaviour
- switch toolbarManageBehaviour {
- // If autoToolbar behaviour is bySubviews, then returning it.
- case .bySubviews: return textFields
-
- // If autoToolbar behaviour is by tag, then sorting it according to tag property.
- case .byTag: return textFields.sortedArrayByTag()
-
- // If autoToolbar behaviour is by tag, then sorting it according to tag property.
- case .byPosition: return textFields.sortedArrayByPosition()
- }
- }
- }
-
- func privateIsEnabled() -> Bool {
-
- var isEnabled = enable
-
- let enableMode = textFieldView?.enableMode
-
- if enableMode == .enabled {
- isEnabled = true
- } else if enableMode == .disabled {
- isEnabled = false
- } else if var textFieldViewController = textFieldView?.viewContainingController() {
-
- // If it is searchBar textField embedded in Navigation Bar
- if textFieldView?.textFieldSearchBar() != nil, let navController = textFieldViewController as? UINavigationController, let topController = navController.topViewController {
- textFieldViewController = topController
- }
-
- // If viewController is kind of enable viewController class, then assuming it's enabled.
- if !isEnabled, enabledDistanceHandlingClasses.contains(where: { textFieldViewController.isKind(of: $0) }) {
- isEnabled = true
- }
-
- if isEnabled {
-
- // If viewController is kind of disabled viewController class, then assuming it's disabled.
- if disabledDistanceHandlingClasses.contains(where: { textFieldViewController.isKind(of: $0) }) {
- isEnabled = false
- }
-
- // Special Controllers
- if isEnabled {
-
- let classNameString: String = "\(type(of: textFieldViewController.self))"
-
- // _UIAlertControllerTextFieldViewController
- if classNameString.contains("UIAlertController"), classNameString.hasSuffix("TextFieldViewController") {
- isEnabled = false
- }
- }
- }
- }
-
- return isEnabled
- }
-
- func privateIsEnableAutoToolbar() -> Bool {
-
- guard var textFieldViewController = textFieldView?.viewContainingController() else {
- return enableAutoToolbar
- }
-
- // If it is searchBar textField embedded in Navigation Bar
- if textFieldView?.textFieldSearchBar() != nil, let navController = textFieldViewController as? UINavigationController, let topController = navController.topViewController {
- textFieldViewController = topController
- }
-
- var enableToolbar = enableAutoToolbar
-
- if !enableToolbar, enabledToolbarClasses.contains(where: { textFieldViewController.isKind(of: $0) }) {
- enableToolbar = true
- }
-
- if enableToolbar {
-
- // If found any toolbar disabled classes then return.
- if disabledToolbarClasses.contains(where: { textFieldViewController.isKind(of: $0) }) {
- enableToolbar = false
- }
-
- // Special Controllers
- if enableToolbar {
-
- let classNameString: String = "\(type(of: textFieldViewController.self))"
-
- // _UIAlertControllerTextFieldViewController
- if classNameString.contains("UIAlertController"), classNameString.hasSuffix("TextFieldViewController") {
- enableToolbar = false
- }
- }
- }
-
- return enableToolbar
- }
-
- func privateShouldResignOnTouchOutside() -> Bool {
-
- var shouldResign = shouldResignOnTouchOutside
-
- let enableMode = textFieldView?.shouldResignOnTouchOutsideMode
-
- if enableMode == .enabled {
- shouldResign = true
- } else if enableMode == .disabled {
- shouldResign = false
- } else if var textFieldViewController = textFieldView?.viewContainingController() {
-
- // If it is searchBar textField embedded in Navigation Bar
- if textFieldView?.textFieldSearchBar() != nil, let navController = textFieldViewController as? UINavigationController, let topController = navController.topViewController {
- textFieldViewController = topController
- }
-
- // If viewController is kind of enable viewController class, then assuming shouldResignOnTouchOutside is enabled.
- if !shouldResign, enabledTouchResignedClasses.contains(where: { textFieldViewController.isKind(of: $0) }) {
- shouldResign = true
- }
-
- if shouldResign {
-
- // If viewController is kind of disable viewController class, then assuming shouldResignOnTouchOutside is disable.
- if disabledTouchResignedClasses.contains(where: { textFieldViewController.isKind(of: $0) }) {
- shouldResign = false
- }
-
- // Special Controllers
- if shouldResign {
-
- let classNameString: String = "\(type(of: textFieldViewController.self))"
-
- // _UIAlertControllerTextFieldViewController
- if classNameString.contains("UIAlertController"), classNameString.hasSuffix("TextFieldViewController") {
- shouldResign = false
- }
- }
- }
- }
- return shouldResign
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+OrientationNotification.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+OrientationNotification.swift
deleted file mode 100644
index fc819dc..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+OrientationNotification.swift
+++ /dev/null
@@ -1,77 +0,0 @@
-//
-// IQKeyboardManager+OrientationNotification.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-// MARK: UIStatusBar Notification methods
-@available(iOSApplicationExtension, unavailable)
-internal extension IQKeyboardManager {
-
- /** UIApplicationWillChangeStatusBarOrientationNotification. Need to set the textView to it's original position. If any frame changes made. (Bug ID: #92)*/
- @objc func willChangeStatusBarOrientation(_ notification: Notification) {
-
- let currentStatusBarOrientation: UIInterfaceOrientation
- #if swift(>=5.1)
- if #available(iOS 13, *) {
- currentStatusBarOrientation = keyWindow()?.windowScene?.interfaceOrientation ?? UIInterfaceOrientation.unknown
- } else {
- currentStatusBarOrientation = UIApplication.shared.statusBarOrientation
- }
- #else
- currentStatusBarOrientation = UIApplication.shared.statusBarOrientation
- #endif
-
- guard let statusBarOrientation = notification.userInfo?[UIApplication.statusBarOrientationUserInfoKey] as? Int, currentStatusBarOrientation.rawValue != statusBarOrientation else {
- return
- }
-
- let startTime = CACurrentMediaTime()
- showLog("๐ฑ>>>>> \(#function) started >>>>>", indentation: 1)
- showLog("Notification Object:\(notification.object ?? "NULL")")
-
- // If textViewContentInsetChanged is saved then restore it.
- if let textView = textFieldView as? UIScrollView, textView.responds(to: #selector(getter: UITextView.isEditable)) {
-
- if isTextViewContentInsetChanged {
- self.isTextViewContentInsetChanged = false
- if textView.contentInset != self.startingTextViewContentInsets {
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- self.showLog("Restoring textView.contentInset to: \(self.startingTextViewContentInsets)")
-
- // Setting textField to it's initial contentInset
- textView.contentInset = self.startingTextViewContentInsets
- textView.scrollIndicatorInsets = self.startingTextViewScrollIndicatorInsets
-
- }, completion: { (_) -> Void in })
- }
- }
- }
-
- restorePosition()
-
- let elapsedTime = CACurrentMediaTime() - startTime
- showLog("๐ฑ<<<<< \(#function) ended: \(elapsedTime) seconds <<<<<", indentation: -1)
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Position.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Position.swift
deleted file mode 100644
index b9a3937..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Position.swift
+++ /dev/null
@@ -1,694 +0,0 @@
-//
-// IQKeyboardManager+Position.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-public extension IQKeyboardManager {
-
- private struct AssociatedKeys {
- static var movedDistance: Int = 0
- static var movedDistanceChanged: Int = 0
- static var lastScrollView: Int = 0
- static var startingContentOffset: Int = 0
- static var startingScrollIndicatorInsets: Int = 0
- static var startingContentInsets: Int = 0
- static var startingTextViewContentInsets: Int = 0
- static var startingTextViewScrollIndicatorInsets: Int = 0
- static var isTextViewContentInsetChanged: Int = 0
- }
-
- /**
- moved distance to the top used to maintain distance between keyboard and textField. Most of the time this will be a positive value.
- */
- @objc private(set) var movedDistance: CGFloat {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.movedDistance) as? CGFloat ?? 0.0
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.movedDistance, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- movedDistanceChanged?(movedDistance)
- }
- }
-
- /**
- Will be called then movedDistance will be changed
- */
- @objc var movedDistanceChanged: ((CGFloat) -> Void)? {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.movedDistanceChanged) as? ((CGFloat) -> Void)
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.movedDistanceChanged, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- movedDistanceChanged?(movedDistance)
- }
- }
-
- /** Variable to save lastScrollView that was scrolled. */
- internal weak var lastScrollView: UIScrollView? {
- get {
- return (objc_getAssociatedObject(self, &AssociatedKeys.lastScrollView) as? WeakObjectContainer)?.object as? UIScrollView
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.lastScrollView, WeakObjectContainer(object: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** LastScrollView's initial contentOffset. */
- internal var startingContentOffset: CGPoint {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.startingContentOffset) as? CGPoint ?? IQKeyboardManager.kIQCGPointInvalid
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.startingContentOffset, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** LastScrollView's initial scrollIndicatorInsets. */
- internal var startingScrollIndicatorInsets: UIEdgeInsets {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.startingScrollIndicatorInsets) as? UIEdgeInsets ?? .init()
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.startingScrollIndicatorInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** LastScrollView's initial contentInsets. */
- internal var startingContentInsets: UIEdgeInsets {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.startingContentInsets) as? UIEdgeInsets ?? .init()
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.startingContentInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** used to adjust contentInset of UITextView. */
- internal var startingTextViewContentInsets: UIEdgeInsets {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.startingTextViewContentInsets) as? UIEdgeInsets ?? .init()
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.startingTextViewContentInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** used to adjust scrollIndicatorInsets of UITextView. */
- internal var startingTextViewScrollIndicatorInsets: UIEdgeInsets {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.startingTextViewScrollIndicatorInsets) as? UIEdgeInsets ?? .init()
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.startingTextViewScrollIndicatorInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** used with textView to detect a textFieldView contentInset is changed or not. (Bug ID: #92)*/
- internal var isTextViewContentInsetChanged: Bool {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.isTextViewContentInsetChanged) as? Bool ?? false
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.isTextViewContentInsetChanged, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- @objc internal func applicationDidBecomeActive(_ notificatin: Notification) {
-
- guard privateIsEnabled(),
- keyboardShowing,
- topViewBeginOrigin.equalTo(IQKeyboardManager.kIQCGPointInvalid) == false, let textFieldView = textFieldView,
- textFieldView.isAlertViewTextField() == false else {
- return
- }
- self.adjustPosition()
- }
-
- // swiftlint:disable function_body_length
- /* Adjusting RootViewController's frame according to interface orientation. */
- internal func adjustPosition() {
-
- // We are unable to get textField object while keyboard showing on WKWebView's textField. (Bug ID: #11)
- guard UIApplication.shared.applicationState == .active,
- let textFieldView = textFieldView,
- let rootController = textFieldView.parentContainerViewController(),
- let window = keyWindow(),
- let textFieldViewRectInWindow = textFieldView.superview?.convert(textFieldView.frame, to: window),
- let textFieldViewRectInRootSuperview = textFieldView.superview?.convert(textFieldView.frame, to: rootController.view?.superview) else {
- return
- }
-
- let startTime = CACurrentMediaTime()
- showLog(">>>>> \(#function) started >>>>>", indentation: 1)
-
- // Getting RootViewOrigin.
- var rootViewOrigin = rootController.view.frame.origin
-
- // Maintain keyboardDistanceFromTextField
- let specialKeyboardDistanceFromTextField: CGFloat
-
- if let searchBar = textFieldView.textFieldSearchBar() {
- specialKeyboardDistanceFromTextField = searchBar.keyboardDistanceFromTextField
- } else {
- specialKeyboardDistanceFromTextField = textFieldView.keyboardDistanceFromTextField
- }
-
- let newKeyboardDistanceFromTextField = (specialKeyboardDistanceFromTextField == kIQUseDefaultKeyboardDistance) ? keyboardDistanceFromTextField : specialKeyboardDistanceFromTextField
-
- let kbSize: CGSize
- let originalKbSize: CGSize
-
- // Calculating actual keyboard covered size respect to window, keyboard frame may be different when hardware keyboard is attached (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506)
- do {
- var kbFrame = keyboardFrame
-
- kbFrame.origin.y -= newKeyboardDistanceFromTextField
- kbFrame.size.height += newKeyboardDistanceFromTextField
-
- kbFrame.origin.y -= topViewBeginSafeAreaInsets.bottom
- kbFrame.size.height += topViewBeginSafeAreaInsets.bottom
-
- let intersectRect = kbFrame.intersection(window.frame)
- if intersectRect.isNull {
- kbSize = CGSize(width: kbFrame.size.width, height: 0)
- } else {
- kbSize = intersectRect.size
- }
- }
-
- do {
- let intersectRect = keyboardFrame.intersection(window.frame)
- if intersectRect.isNull {
- originalKbSize = CGSize(width: keyboardFrame.size.width, height: 0)
- } else {
- originalKbSize = intersectRect.size
- }
- }
-
- let statusBarHeight: CGFloat
-
- let navigationBarAreaHeight: CGFloat
- if let navigationController = rootController.navigationController {
- navigationBarAreaHeight = navigationController.navigationBar.frame.maxY
- } else {
-#if swift(>=5.1)
- if #available(iOS 13, *) {
- statusBarHeight = window.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
- } else {
- statusBarHeight = UIApplication.shared.statusBarFrame.height
- }
-#else
- statusBarHeight = UIApplication.shared.statusBarFrame.height
-#endif
- navigationBarAreaHeight = statusBarHeight
- }
-
- let layoutAreaHeight: CGFloat = rootController.view.directionalLayoutMargins.top
-
- let isScrollableTextView: Bool
-
- if let textView = textFieldView as? UIScrollView, textFieldView.responds(to: #selector(getter: UITextView.isEditable)) {
- isScrollableTextView = textView.isScrollEnabled
- } else {
- isScrollableTextView = false
- }
-
- let topLayoutGuide: CGFloat = max(navigationBarAreaHeight, layoutAreaHeight)
-
- // Validation of textView for case where there is a tab bar at the bottom or running on iPhone X and textView is at the bottom.
- let bottomLayoutGuide: CGFloat = isScrollableTextView ? 0 : rootController.view.directionalLayoutMargins.bottom
-
- // Move positive = textField is hidden.
- // Move negative = textField is showing.
- // Calculating move position.
- var moveUp: CGFloat
-
- do {
- let visibleHeight: CGFloat = window.frame.height-kbSize.height
-
- let topMovement: CGFloat = textFieldViewRectInRootSuperview.minY-topLayoutGuide
- let bottomMovement: CGFloat = textFieldViewRectInWindow.maxY - visibleHeight + bottomLayoutGuide
- moveUp = min(topMovement, bottomMovement)
- }
-
- showLog("Need to move: \(moveUp), will be moving \(moveUp < 0 ? "down" : "up")")
-
- var superScrollView: UIScrollView?
- var superView = textFieldView.superviewOfClassType(UIScrollView.self) as? UIScrollView
-
- // Getting UIScrollView whose scrolling is enabled. // (Bug ID: #285)
- while let view = superView {
-
- if view.isScrollEnabled, !view.shouldIgnoreScrollingAdjustment {
- superScrollView = view
- break
- } else {
- // Getting it's superScrollView. // (Enhancement ID: #21, #24)
- superView = view.superviewOfClassType(UIScrollView.self) as? UIScrollView
- }
- }
-
- // If there was a lastScrollView. // (Bug ID: #34)
- if let lastScrollView = lastScrollView {
- // If we can't find current superScrollView, then setting lastScrollView to it's original form.
- if superScrollView == nil {
-
- if lastScrollView.contentInset != self.startingContentInsets {
- showLog("Restoring contentInset to: \(startingContentInsets)")
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- lastScrollView.contentInset = self.startingContentInsets
- lastScrollView.scrollIndicatorInsets = self.startingScrollIndicatorInsets
- })
- }
-
- if lastScrollView.shouldRestoreScrollViewContentOffset, !lastScrollView.contentOffset.equalTo(startingContentOffset) {
- showLog("Restoring contentOffset to: \(startingContentOffset)")
-
- let animatedContentOffset = textFieldView.superviewOfClassType(UIStackView.self, belowView: lastScrollView) != nil // (Bug ID: #1365, #1508, #1541)
-
- if animatedContentOffset {
- lastScrollView.setContentOffset(startingContentOffset, animated: UIView.areAnimationsEnabled)
- } else {
- lastScrollView.contentOffset = startingContentOffset
- }
- }
-
- startingContentInsets = .zero
- startingScrollIndicatorInsets = .zero
- startingContentOffset = .zero
- self.lastScrollView = nil
- } else if superScrollView != lastScrollView { // If both scrollView's are different, then reset lastScrollView to it's original frame and setting current scrollView as last scrollView.
-
- if lastScrollView.contentInset != self.startingContentInsets {
- showLog("Restoring contentInset to: \(startingContentInsets)")
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- lastScrollView.contentInset = self.startingContentInsets
- lastScrollView.scrollIndicatorInsets = self.startingScrollIndicatorInsets
- })
- }
-
- if lastScrollView.shouldRestoreScrollViewContentOffset, !lastScrollView.contentOffset.equalTo(startingContentOffset) {
- showLog("Restoring contentOffset to: \(startingContentOffset)")
-
- let animatedContentOffset = textFieldView.superviewOfClassType(UIStackView.self, belowView: lastScrollView) != nil // (Bug ID: #1365, #1508, #1541)
-
- if animatedContentOffset {
- lastScrollView.setContentOffset(startingContentOffset, animated: UIView.areAnimationsEnabled)
- } else {
- lastScrollView.contentOffset = startingContentOffset
- }
- }
-
- self.lastScrollView = superScrollView
- if let scrollView = superScrollView {
- startingContentInsets = scrollView.contentInset
- startingContentOffset = scrollView.contentOffset
-
- #if swift(>=5.1)
- if #available(iOS 11.1, *) {
- startingScrollIndicatorInsets = scrollView.verticalScrollIndicatorInsets
- } else {
- startingScrollIndicatorInsets = scrollView.scrollIndicatorInsets
- }
- #else
- startingScrollIndicatorInsets = scrollView.scrollIndicatorInsets
- #endif
- }
-
- showLog("Saving ScrollView New contentInset: \(startingContentInsets) and contentOffset: \(startingContentOffset)")
- }
- // Else the case where superScrollView == lastScrollView means we are on same scrollView after switching to different textField. So doing nothing, going ahead
- } else if let unwrappedSuperScrollView = superScrollView { // If there was no lastScrollView and we found a current scrollView. then setting it as lastScrollView.
- lastScrollView = unwrappedSuperScrollView
- startingContentInsets = unwrappedSuperScrollView.contentInset
- startingContentOffset = unwrappedSuperScrollView.contentOffset
-
- #if swift(>=5.1)
- if #available(iOS 11.1, *) {
- startingScrollIndicatorInsets = unwrappedSuperScrollView.verticalScrollIndicatorInsets
- } else {
- startingScrollIndicatorInsets = unwrappedSuperScrollView.scrollIndicatorInsets
- }
- #else
- startingScrollIndicatorInsets = unwrappedSuperScrollView.scrollIndicatorInsets
- #endif
-
- showLog("Saving ScrollView contentInset: \(startingContentInsets) and contentOffset: \(startingContentOffset)")
- }
-
- // Special case for ScrollView.
- // If we found lastScrollView then setting it's contentOffset to show textField.
- if let lastScrollView = lastScrollView {
- // Saving
- var lastView = textFieldView
- var superScrollView = self.lastScrollView
-
- while let scrollView = superScrollView {
-
- var shouldContinue = false
-
- if moveUp > 0 {
- shouldContinue = moveUp > (-scrollView.contentOffset.y - scrollView.contentInset.top)
-
- } else if let tableView = scrollView.superviewOfClassType(UITableView.self) as? UITableView {
- // Special treatment for UITableView due to their cell reusing logic
- shouldContinue = scrollView.contentOffset.y > 0
-
- if shouldContinue, let tableCell = textFieldView.superviewOfClassType(UITableViewCell.self) as? UITableViewCell, let indexPath = tableView.indexPath(for: tableCell), let previousIndexPath = tableView.previousIndexPath(of: indexPath) {
-
- let previousCellRect = tableView.rectForRow(at: previousIndexPath)
- if !previousCellRect.isEmpty {
- let previousCellRectInRootSuperview = tableView.convert(previousCellRect, to: rootController.view.superview)
-
- moveUp = min(0, previousCellRectInRootSuperview.maxY - topLayoutGuide)
- }
- }
- } else if let collectionView = scrollView.superviewOfClassType(UICollectionView.self) as? UICollectionView {
- // Special treatment for UITableView due to their cell reusing logic
- shouldContinue = scrollView.contentOffset.y > 0
-
- if shouldContinue, let collectionCell = textFieldView.superviewOfClassType(UICollectionViewCell.self) as? UICollectionViewCell, let indexPath = collectionView.indexPath(for: collectionCell), let previousIndexPath = collectionView.previousIndexPath(of: indexPath), let attributes = collectionView.layoutAttributesForItem(at: previousIndexPath) {
-
- let previousCellRect = attributes.frame
- if !previousCellRect.isEmpty {
- let previousCellRectInRootSuperview = collectionView.convert(previousCellRect, to: rootController.view.superview)
-
- moveUp = min(0, previousCellRectInRootSuperview.maxY - topLayoutGuide)
- }
- }
- } else {
-
- shouldContinue = textFieldViewRectInRootSuperview.minY < topLayoutGuide
-
- if shouldContinue {
- moveUp = min(0, textFieldViewRectInRootSuperview.minY - topLayoutGuide)
- }
- }
-
- // Looping in upper hierarchy until we don't found any scrollView in it's upper hirarchy till UIWindow object.
- if shouldContinue {
-
- var tempScrollView = scrollView.superviewOfClassType(UIScrollView.self) as? UIScrollView
- var nextScrollView: UIScrollView?
- while let view = tempScrollView {
-
- if view.isScrollEnabled, !view.shouldIgnoreScrollingAdjustment {
- nextScrollView = view
- break
- } else {
- tempScrollView = view.superviewOfClassType(UIScrollView.self) as? UIScrollView
- }
- }
-
- // Getting lastViewRect.
- if let lastViewRect = lastView.superview?.convert(lastView.frame, to: scrollView) {
-
- // Calculating the expected Y offset from move and scrollView's contentOffset.
- var shouldOffsetY = scrollView.contentOffset.y - min(scrollView.contentOffset.y, -moveUp)
-
- // Rearranging the expected Y offset according to the view.
- shouldOffsetY = min(shouldOffsetY, lastViewRect.minY)
-
- // [_textFieldView isKindOfClass:[UITextView class]] If is a UITextView type
- // nextScrollView == nil If processing scrollView is last scrollView in upper hierarchy (there is no other scrollView upper hierrchy.)
- // [_textFieldView isKindOfClass:[UITextView class]] If is a UITextView type
- // shouldOffsetY >= 0 shouldOffsetY must be greater than in order to keep distance from navigationBar (Bug ID: #92)
- if isScrollableTextView,
- nextScrollView == nil,
- shouldOffsetY >= 0 {
-
- // Converting Rectangle according to window bounds.
- if let currentTextFieldViewRect = textFieldView.superview?.convert(textFieldView.frame, to: window) {
-
- // Calculating expected fix distance which needs to be managed from navigation bar
- let expectedFixDistance: CGFloat = currentTextFieldViewRect.minY - topLayoutGuide
-
- // Now if expectedOffsetY (superScrollView.contentOffset.y + expectedFixDistance) is lower than current shouldOffsetY, which means we're in a position where navigationBar up and hide, then reducing shouldOffsetY with expectedOffsetY (superScrollView.contentOffset.y + expectedFixDistance)
- shouldOffsetY = min(shouldOffsetY, scrollView.contentOffset.y + expectedFixDistance)
-
- // Setting move to 0 because now we don't want to move any view anymore (All will be managed by our contentInset logic.
- moveUp = 0
- } else {
- // Subtracting the Y offset from the move variable, because we are going to change scrollView's contentOffset.y to shouldOffsetY.
- moveUp -= (shouldOffsetY-scrollView.contentOffset.y)
- }
- } else {
- // Subtracting the Y offset from the move variable, because we are going to change scrollView's contentOffset.y to shouldOffsetY.
- moveUp -= (shouldOffsetY-scrollView.contentOffset.y)
- }
-
- let newContentOffset = CGPoint(x: scrollView.contentOffset.x, y: shouldOffsetY)
-
- if scrollView.contentOffset.equalTo(newContentOffset) == false {
-
- showLog("old contentOffset: \(scrollView.contentOffset) new contentOffset: \(newContentOffset)")
- self.showLog("Remaining Move: \(moveUp)")
-
- // Getting problem while using `setContentOffset:animated:`, So I used animation API.
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- let animatedContentOffset = textFieldView.superviewOfClassType(UIStackView.self, belowView: scrollView) != nil // (Bug ID: #1365, #1508, #1541)
-
- if animatedContentOffset {
- scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
- } else {
- scrollView.contentOffset = newContentOffset
- }
- }, completion: { _ in
-
- if scrollView is UITableView || scrollView is UICollectionView {
- // This will update the next/previous states
- self.addToolbarIfRequired()
- }
- })
- }
- }
-
- // Getting next lastView & superScrollView.
- lastView = scrollView
- superScrollView = nextScrollView
- } else {
- moveUp = 0
- break
- }
- }
-
- // Updating contentInset
- if let lastScrollViewRect = lastScrollView.superview?.convert(lastScrollView.frame, to: window),
- lastScrollView.shouldIgnoreContentInsetAdjustment == false {
-
- var bottomInset: CGFloat = (kbSize.height)-(window.frame.height-lastScrollViewRect.maxY)
- var bottomScrollIndicatorInset = bottomInset - newKeyboardDistanceFromTextField - topViewBeginSafeAreaInsets.bottom
-
- // Update the insets so that the scroll vew doesn't shift incorrectly when the offset is near the bottom of the scroll view.
- bottomInset = max(startingContentInsets.bottom, bottomInset)
- bottomScrollIndicatorInset = max(startingScrollIndicatorInsets.bottom, bottomScrollIndicatorInset)
-
- bottomInset -= lastScrollView.safeAreaInsets.bottom
- bottomScrollIndicatorInset -= lastScrollView.safeAreaInsets.bottom
-
- var movedInsets = lastScrollView.contentInset
- movedInsets.bottom = bottomInset
-
- if lastScrollView.contentInset != movedInsets {
- showLog("old ContentInset: \(lastScrollView.contentInset) new ContentInset: \(movedInsets)")
-
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
- lastScrollView.contentInset = movedInsets
-
- var newScrollIndicatorInset: UIEdgeInsets
-
- #if swift(>=5.1)
- if #available(iOS 11.1, *) {
- newScrollIndicatorInset = lastScrollView.verticalScrollIndicatorInsets
- } else {
- newScrollIndicatorInset = lastScrollView.scrollIndicatorInsets
- }
- #else
- newScrollIndicatorInset = lastScrollView.scrollIndicatorInsets
- #endif
-
- newScrollIndicatorInset.bottom = bottomScrollIndicatorInset
- lastScrollView.scrollIndicatorInsets = newScrollIndicatorInset
- })
- }
- }
- }
- // Going ahead. No else if.
-
- // Special case for UITextView(Readjusting textView.contentInset when textView hight is too big to fit on screen)
- // _lastScrollView If not having inside any scrollView, (now contentInset manages the full screen textView.
- // [_textFieldView isKindOfClass:[UITextView class]] If is a UITextView type
- if isScrollableTextView, let textView = textFieldView as? UIScrollView {
-
- let keyboardYPosition = window.frame.height - originalKbSize.height
- var rootSuperViewFrameInWindow = window.frame
- if let rootSuperview = rootController.view.superview {
- rootSuperViewFrameInWindow = rootSuperview.convert(rootSuperview.bounds, to: window)
- }
-
- let keyboardOverlapping = rootSuperViewFrameInWindow.maxY - keyboardYPosition
-
- let textViewHeight = min(textView.frame.height, rootSuperViewFrameInWindow.height-topLayoutGuide-keyboardOverlapping)
-
- if textView.frame.size.height-textView.contentInset.bottom>textViewHeight {
- // _isTextViewContentInsetChanged, If frame is not change by library in past, then saving user textView properties (Bug ID: #92)
- if !self.isTextViewContentInsetChanged {
- self.startingTextViewContentInsets = textView.contentInset
-
- #if swift(>=5.1)
- if #available(iOS 11.1, *) {
- self.startingTextViewScrollIndicatorInsets = textView.verticalScrollIndicatorInsets
- } else {
- self.startingTextViewScrollIndicatorInsets = textView.scrollIndicatorInsets
- }
- #else
- self.startingTextViewScrollIndicatorInsets = textView.scrollIndicatorInsets
- #endif
- }
-
- self.isTextViewContentInsetChanged = true
-
- var newContentInset = textView.contentInset
- newContentInset.bottom = textView.frame.size.height-textViewHeight
- newContentInset.bottom -= textView.safeAreaInsets.bottom
-
- if textView.contentInset != newContentInset {
- self.showLog("\(textFieldView) Old UITextView.contentInset: \(textView.contentInset) New UITextView.contentInset: \(newContentInset)")
-
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- textView.contentInset = newContentInset
- textView.scrollIndicatorInsets = newContentInset
- }, completion: { (_) -> Void in })
- }
- }
- }
-
- // +Positive or zero.
- if moveUp >= 0 {
-
- rootViewOrigin.y = max(rootViewOrigin.y - moveUp, min(0, -originalKbSize.height))
-
- if rootController.view.frame.origin.equalTo(rootViewOrigin) == false {
- showLog("Moving Upward")
-
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- var rect = rootController.view.frame
- rect.origin = rootViewOrigin
- rootController.view.frame = rect
-
- // Animating content if needed (Bug ID: #204)
- if self.layoutIfNeededOnUpdate {
- // Animating content (Bug ID: #160)
- rootController.view.setNeedsLayout()
- rootController.view.layoutIfNeeded()
- }
-
- self.showLog("Set \(rootController) origin to: \(rootViewOrigin)")
- })
- }
-
- movedDistance = (topViewBeginOrigin.y-rootViewOrigin.y)
- } else { // -Negative
- let disturbDistance: CGFloat = rootViewOrigin.y-topViewBeginOrigin.y
-
- // disturbDistance Negative = frame disturbed.
- // disturbDistance positive = frame not disturbed.
- if disturbDistance <= 0 {
-
- rootViewOrigin.y -= max(moveUp, disturbDistance)
-
- if rootController.view.frame.origin.equalTo(rootViewOrigin) == false {
- showLog("Moving Downward")
- // Setting adjusted rootViewRect
- // Setting adjusted rootViewRect
-
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- var rect = rootController.view.frame
- rect.origin = rootViewOrigin
- rootController.view.frame = rect
-
- // Animating content if needed (Bug ID: #204)
- if self.layoutIfNeededOnUpdate {
- // Animating content (Bug ID: #160)
- rootController.view.setNeedsLayout()
- rootController.view.layoutIfNeeded()
- }
-
- self.showLog("Set \(rootController) origin to: \(rootViewOrigin)")
- })
- }
-
- movedDistance = (topViewBeginOrigin.y-rootViewOrigin.y)
- }
- }
-
- let elapsedTime = CACurrentMediaTime() - startTime
- showLog("<<<<< \(#function) ended: \(elapsedTime) seconds <<<<<", indentation: -1)
- }
- // swiftlint:enable function_body_length
-
- internal func restorePosition() {
-
- // Setting rootViewController frame to it's original position. // (Bug ID: #18)
- guard topViewBeginOrigin.equalTo(IQKeyboardManager.kIQCGPointInvalid) == false, let rootViewController = rootViewController else {
- return
- }
-
- if rootViewController.view.frame.origin.equalTo(self.topViewBeginOrigin) == false {
- // Used UIViewAnimationOptionBeginFromCurrentState to minimize strange animations.
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- // Setting it's new frame
- var rect = rootViewController.view.frame
- rect.origin = self.topViewBeginOrigin
- rootViewController.view.frame = rect
-
- // Animating content if needed (Bug ID: #204)
- if self.layoutIfNeededOnUpdate {
- // Animating content (Bug ID: #160)
- rootViewController.view.setNeedsLayout()
- rootViewController.view.layoutIfNeeded()
- }
-
- self.showLog("Restoring \(rootViewController) origin to: \(self.topViewBeginOrigin)")
- })
- }
-
- self.movedDistance = 0
-
- if rootViewController.navigationController?.interactivePopGestureRecognizer?.state == .began {
- self.rootViewControllerWhilePopGestureRecognizerActive = rootViewController
- self.topViewBeginOriginWhilePopGestureRecognizerActive = self.topViewBeginOrigin
- }
-
- self.rootViewController = nil
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Toolbar.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Toolbar.swift
deleted file mode 100644
index dbc930a..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+Toolbar.swift
+++ /dev/null
@@ -1,398 +0,0 @@
-//
-// IQKeyboardManager+Toolbar.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-public extension IQKeyboardManager {
-
- /**
- Default tag for toolbar with Done button -1002.
- */
- private static let kIQDoneButtonToolbarTag = -1002
-
- /**
- Default tag for toolbar with Previous/Next buttons -1005.
- */
- private static let kIQPreviousNextButtonToolbarTag = -1005
-
- /** Add toolbar if it is required to add on textFields and it's siblings. */
- internal func addToolbarIfRequired() {
-
- // Either there is no inputAccessoryView or if accessoryView is not appropriate for current situation(There is Previous/Next/Done toolbar).
- guard let siblings = responderViews(), !siblings.isEmpty,
- let textField = textFieldView, textField.responds(to: #selector(setter: UITextField.inputAccessoryView)),
- (textField.inputAccessoryView == nil ||
- textField.inputAccessoryView?.tag == IQKeyboardManager.kIQPreviousNextButtonToolbarTag ||
- textField.inputAccessoryView?.tag == IQKeyboardManager.kIQDoneButtonToolbarTag) else {
- return
- }
-
- let startTime = CACurrentMediaTime()
- showLog(">>>>> \(#function) started >>>>>", indentation: 1)
-
- showLog("Found \(siblings.count) responder sibling(s)")
-
- let rightConfiguration: IQBarButtonItemConfiguration
-
- if let doneBarButtonItemImage = toolbarDoneBarButtonItemImage {
- rightConfiguration = IQBarButtonItemConfiguration(image: doneBarButtonItemImage, action: #selector(self.doneAction(_:)))
- } else if let doneBarButtonItemText = toolbarDoneBarButtonItemText {
- rightConfiguration = IQBarButtonItemConfiguration(title: doneBarButtonItemText, action: #selector(self.doneAction(_:)))
- } else {
- rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: #selector(self.doneAction(_:)))
- }
- rightConfiguration.accessibilityLabel = toolbarDoneBarButtonItemAccessibilityLabel ?? "Done"
-
- let isTableCollectionView: Bool
- if textField.superviewOfClassType(UITableView.self) != nil ||
- textField.superviewOfClassType(UICollectionView.self) != nil {
- isTableCollectionView = true
- } else {
- isTableCollectionView = false
- }
-
- let shouldHavePreviousNext: Bool
- switch previousNextDisplayMode {
- case .default:
- // If the textField is part of UITableView/UICollectionView then we should be exposing previous/next too
- // Because at this time we don't know the previous or next cell if it contains another textField to move.
- if isTableCollectionView {
- shouldHavePreviousNext = true
- } else if siblings.count <= 1 {
- // If only one object is found, then adding only Done button.
- shouldHavePreviousNext = false
- } else {
- shouldHavePreviousNext = true
- }
- case .alwaysShow:
- shouldHavePreviousNext = true
- case .alwaysHide:
- shouldHavePreviousNext = false
- }
-
- if shouldHavePreviousNext {
- let prevConfiguration: IQBarButtonItemConfiguration
-
- if let doneBarButtonItemImage = toolbarPreviousBarButtonItemImage {
- prevConfiguration = IQBarButtonItemConfiguration(image: doneBarButtonItemImage, action: #selector(self.previousAction(_:)))
- } else if let doneBarButtonItemText = toolbarPreviousBarButtonItemText {
- prevConfiguration = IQBarButtonItemConfiguration(title: doneBarButtonItemText, action: #selector(self.previousAction(_:)))
- } else {
- prevConfiguration = IQBarButtonItemConfiguration(image: (UIImage.keyboardPreviousImage() ?? UIImage()), action: #selector(self.previousAction(_:)))
- }
- prevConfiguration.accessibilityLabel = toolbarPreviousBarButtonItemAccessibilityLabel ?? "Previous"
-
- let nextConfiguration: IQBarButtonItemConfiguration
-
- if let doneBarButtonItemImage = toolbarNextBarButtonItemImage {
- nextConfiguration = IQBarButtonItemConfiguration(image: doneBarButtonItemImage, action: #selector(self.nextAction(_:)))
- } else if let doneBarButtonItemText = toolbarNextBarButtonItemText {
- nextConfiguration = IQBarButtonItemConfiguration(title: doneBarButtonItemText, action: #selector(self.nextAction(_:)))
- } else {
- nextConfiguration = IQBarButtonItemConfiguration(image: (UIImage.keyboardNextImage() ?? UIImage()), action: #selector(self.nextAction(_:)))
- }
- nextConfiguration.accessibilityLabel = toolbarNextBarButtonItemAccessibilityLabel ?? "Next"
-
- textField.addKeyboardToolbarWithTarget(target: self, titleText: (shouldShowToolbarPlaceholder ? textField.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: toolbarTitlBarButtonItemAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
-
- textField.inputAccessoryView?.tag = IQKeyboardManager.kIQPreviousNextButtonToolbarTag // (Bug ID: #78)
-
- if isTableCollectionView {
- // In case of UITableView (Special), the next/previous buttons should always be enabled. (Bug ID: #56)
- textField.keyboardToolbar.previousBarButton.isEnabled = true
- textField.keyboardToolbar.nextBarButton.isEnabled = true
- } else {
- // If firstTextField, then previous should not be enabled.
- textField.keyboardToolbar.previousBarButton.isEnabled = (siblings.first != textField)
- // If lastTextField then next should not be enaled.
- textField.keyboardToolbar.nextBarButton.isEnabled = (siblings.last != textField)
- }
-
- } else {
- textField.addKeyboardToolbarWithTarget(target: self, titleText: (shouldShowToolbarPlaceholder ? textField.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: toolbarTitlBarButtonItemAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: nil, nextBarButtonConfiguration: nil)
-
- textField.inputAccessoryView?.tag = IQKeyboardManager.kIQDoneButtonToolbarTag // (Bug ID: #78)
- }
-
- let toolbar = textField.keyboardToolbar
-
- // Setting toolbar tintColor // (Enhancement ID: #30)
- toolbar.tintColor = shouldToolbarUsesTextFieldTintColor ? textField.tintColor : toolbarTintColor
-
- // Setting toolbar to keyboard.
- if let textFieldView = textField as? UITextInput {
-
- // Bar style according to keyboard appearance
- switch textFieldView.keyboardAppearance {
-
- case .dark?:
- toolbar.barStyle = .black
- toolbar.barTintColor = nil
- default:
- toolbar.barStyle = .default
- toolbar.barTintColor = toolbarBarTintColor
- }
- }
-
- // Setting toolbar title font. // (Enhancement ID: #30)
- if shouldShowToolbarPlaceholder, !textField.shouldHideToolbarPlaceholder {
-
- // Updating placeholder font to toolbar. //(Bug ID: #148, #272)
- if toolbar.titleBarButton.title == nil ||
- toolbar.titleBarButton.title != textField.drawingToolbarPlaceholder {
- toolbar.titleBarButton.title = textField.drawingToolbarPlaceholder
- }
-
- // Setting toolbar title font. // (Enhancement ID: #30)
- toolbar.titleBarButton.titleFont = placeholderFont
-
- // Setting toolbar title color. // (Enhancement ID: #880)
- toolbar.titleBarButton.titleColor = placeholderColor
-
- // Setting toolbar button title color. // (Enhancement ID: #880)
- toolbar.titleBarButton.selectableTitleColor = placeholderButtonColor
-
- } else {
- toolbar.titleBarButton.title = nil
- }
-
- let elapsedTime = CACurrentMediaTime() - startTime
- showLog("<<<<< \(#function) ended: \(elapsedTime) seconds <<<<<", indentation: -1)
- }
-
- /** Remove any toolbar if it is IQToolbar. */
- internal func removeToolbarIfRequired() { // (Bug ID: #18)
-
- guard let siblings = responderViews(), !siblings.isEmpty,
- let textField = textFieldView, textField.responds(to: #selector(setter: UITextField.inputAccessoryView)),
- (textField.inputAccessoryView == nil ||
- textField.inputAccessoryView?.tag == IQKeyboardManager.kIQPreviousNextButtonToolbarTag ||
- textField.inputAccessoryView?.tag == IQKeyboardManager.kIQDoneButtonToolbarTag) else {
- return
- }
-
- let startTime = CACurrentMediaTime()
- showLog(">>>>> \(#function) started >>>>>", indentation: 1)
-
- showLog("Found \(siblings.count) responder sibling(s)")
-
- for view in siblings {
- if let toolbar = view.inputAccessoryView as? IQToolbar {
-
- // setInputAccessoryView: check (Bug ID: #307)
- if view.responds(to: #selector(setter: UITextField.inputAccessoryView)),
- (toolbar.tag == IQKeyboardManager.kIQDoneButtonToolbarTag || toolbar.tag == IQKeyboardManager.kIQPreviousNextButtonToolbarTag) {
-
- if let textField = view as? UITextField {
- textField.inputAccessoryView = nil
- } else if let textView = view as? UITextView {
- textView.inputAccessoryView = nil
- }
-
- view.reloadInputViews()
- }
- }
- }
-
- let elapsedTime = CACurrentMediaTime() - startTime
- showLog("<<<<< \(#function) ended: \(elapsedTime) seconds <<<<<", indentation: -1)
- }
-
- /** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */
- @objc func reloadInputViews() {
-
- // If enabled then adding toolbar.
- if privateIsEnableAutoToolbar() {
- self.addToolbarIfRequired()
- } else {
- self.removeToolbarIfRequired()
- }
- }
-}
-
-// MARK: Previous next button actions
-@available(iOSApplicationExtension, unavailable)
-public extension IQKeyboardManager {
-
- /**
- Returns YES if can navigate to previous responder textField/textView, otherwise NO.
- */
- @objc var canGoPrevious: Bool {
- // If it is not first textField. then it's previous object canBecomeFirstResponder.
- guard let textFields = responderViews(), let textFieldRetain = textFieldView, let index = textFields.firstIndex(of: textFieldRetain), index > 0 else {
- return false
- }
- return true
- }
-
- /**
- Returns YES if can navigate to next responder textField/textView, otherwise NO.
- */
- @objc var canGoNext: Bool {
- // If it is not first textField. then it's previous object canBecomeFirstResponder.
- guard let textFields = responderViews(), let textFieldRetain = textFieldView, let index = textFields.firstIndex(of: textFieldRetain), index < textFields.count-1 else {
- return false
- }
- return true
- }
-
- /**
- Navigate to previous responder textField/textView.
- */
- @objc @discardableResult func goPrevious() -> Bool {
-
- // If it is not first textField. then it's previous object becomeFirstResponder.
- guard let textFields = responderViews(), let textFieldRetain = textFieldView, let index = textFields.firstIndex(of: textFieldRetain), index > 0 else {
- return false
- }
-
- let nextTextField = textFields[index-1]
-
- let isAcceptAsFirstResponder = nextTextField.becomeFirstResponder()
-
- // If it refuses then becoming previous textFieldView as first responder again. (Bug ID: #96)
- if isAcceptAsFirstResponder == false {
- showLog("Refuses to become first responder: \(nextTextField)")
- }
-
- return isAcceptAsFirstResponder
- }
-
- /**
- Navigate to next responder textField/textView.
- */
- @objc @discardableResult func goNext() -> Bool {
-
- // If it is not first textField. then it's previous object becomeFirstResponder.
- guard let textFields = responderViews(), let textFieldRetain = textFieldView, let index = textFields.firstIndex(of: textFieldRetain), index < textFields.count-1 else {
- return false
- }
-
- let nextTextField = textFields[index+1]
-
- let isAcceptAsFirstResponder = nextTextField.becomeFirstResponder()
-
- // If it refuses then becoming previous textFieldView as first responder again. (Bug ID: #96)
- if isAcceptAsFirstResponder == false {
- showLog("Refuses to become first responder: \(nextTextField)")
- }
-
- return isAcceptAsFirstResponder
- }
-
- /** previousAction. */
- @objc internal func previousAction (_ barButton: IQBarButtonItem) {
-
- // If user wants to play input Click sound.
- if shouldPlayInputClicks {
- // Play Input Click Sound.
- UIDevice.current.playInputClick()
- }
-
- guard canGoPrevious, let textFieldRetain = textFieldView else {
- return
- }
-
- let isAcceptAsFirstResponder = goPrevious()
-
- var invocation = barButton.invocation
- var sender = textFieldRetain
-
- // Handling search bar special case
- do {
- if let searchBar = textFieldRetain.textFieldSearchBar() {
- invocation = searchBar.keyboardToolbar.previousBarButton.invocation
- sender = searchBar
- }
- }
-
- if isAcceptAsFirstResponder {
- invocation?.invoke(from: sender)
- }
- }
-
- /** nextAction. */
- @objc internal func nextAction (_ barButton: IQBarButtonItem) {
-
- // If user wants to play input Click sound.
- if shouldPlayInputClicks {
- // Play Input Click Sound.
- UIDevice.current.playInputClick()
- }
-
- guard canGoNext, let textFieldRetain = textFieldView else {
- return
- }
-
- let isAcceptAsFirstResponder = goNext()
-
- var invocation = barButton.invocation
- var sender = textFieldRetain
-
- // Handling search bar special case
- do {
- if let searchBar = textFieldRetain.textFieldSearchBar() {
- invocation = searchBar.keyboardToolbar.nextBarButton.invocation
- sender = searchBar
- }
- }
-
- if isAcceptAsFirstResponder {
- invocation?.invoke(from: sender)
- }
- }
-
- /** doneAction. Resigning current textField. */
- @objc internal func doneAction (_ barButton: IQBarButtonItem) {
-
- // If user wants to play input Click sound.
- if shouldPlayInputClicks {
- // Play Input Click Sound.
- UIDevice.current.playInputClick()
- }
-
- guard let textFieldRetain = textFieldView else {
- return
- }
-
- // Resign textFieldView.
- let isResignedFirstResponder = resignFirstResponder()
-
- var invocation = barButton.invocation
- var sender = textFieldRetain
-
- // Handling search bar special case
- do {
- if let searchBar = textFieldRetain.textFieldSearchBar() {
- invocation = searchBar.keyboardToolbar.doneBarButton.invocation
- sender = searchBar
- }
- }
-
- if isResignedFirstResponder {
- invocation?.invoke(from: sender)
- }
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+UIKeyboardNotification.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+UIKeyboardNotification.swift
deleted file mode 100644
index d2e436e..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+UIKeyboardNotification.swift
+++ /dev/null
@@ -1,341 +0,0 @@
-//
-// IQKeyboardManager+UIKeyboardNotification.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-// MARK: UIKeyboard Notifications
-@available(iOSApplicationExtension, unavailable)
-public extension IQKeyboardManager {
-
- typealias SizeBlock = (_ size: CGSize) -> Void
-
- private final class KeyboardSizeObserver: NSObject {
- weak var observer: NSObject?
- var sizeHandler: (_ size: CGSize) -> Void
-
- init(observer: NSObject?, sizeHandler: @escaping (_ size: CGSize) -> Void) {
- self.observer = observer
- self.sizeHandler = sizeHandler
- }
- }
-
- private struct AssociatedKeys {
- static var keyboardSizeObservers: Int = 0
- static var keyboardLastNotifySize: Int = 0
- static var keyboardShowing: Int = 0
- static var keyboardShowNotification: Int = 0
- static var keyboardFrame: Int = 0
- static var animationDuration: Int = 0
- static var animationCurve: Int = 0
- }
-
- private var keyboardLastNotifySize: CGSize {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.keyboardLastNotifySize) as? CGSize ?? .zero
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.keyboardLastNotifySize, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- private var keyboardSizeObservers: [AnyHashable: SizeBlock] {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.keyboardSizeObservers) as? [AnyHashable: SizeBlock] ?? [:]
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.keyboardSizeObservers, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- @objc func registerKeyboardSizeChange(identifier: AnyHashable, sizeHandler: @escaping SizeBlock) {
- keyboardSizeObservers[identifier] = sizeHandler
- }
-
- @objc func unregisterKeyboardSizeChange(identifier: AnyHashable) {
- keyboardSizeObservers[identifier] = nil
- }
-
- internal func notifyKeyboardSize(size: CGSize) {
-
- guard !size.equalTo(keyboardLastNotifySize) else {
- return
- }
-
- keyboardLastNotifySize = size
-
- for block in keyboardSizeObservers.values {
- block(size)
- }
- }
-
- /**
- Boolean to know if keyboard is showing.
- */
- @objc private(set) var keyboardShowing: Bool {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.keyboardShowing) as? Bool ?? false
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.keyboardShowing, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** To save keyboardWillShowNotification. Needed for enable keyboard functionality. */
- internal var keyboardShowNotification: Notification? {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.keyboardShowNotification) as? Notification
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.keyboardShowNotification, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** To save keyboard rame. */
- @objc private(set) var keyboardFrame: CGRect {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.keyboardFrame) as? CGRect ?? .zero
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.keyboardFrame, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** To save keyboard animation duration. */
- internal var animationDuration: TimeInterval {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.animationDuration) as? TimeInterval ?? 0.25
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.animationDuration, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** To mimic the keyboard animation */
- internal var animationCurve: UIView.AnimationOptions {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.animationCurve) as? UIView.AnimationOptions ?? .curveEaseOut
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.animationCurve, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /* UIKeyboardWillShowNotification. */
- @objc internal func keyboardWillShow(_ notification: Notification) {
-
- keyboardShowNotification = notification
-
- // Boolean to know keyboard is showing/hiding
- keyboardShowing = true
-
- let oldKBFrame = keyboardFrame
-
- if let info = notification.userInfo {
-
- // Getting keyboard animation.
- if let curve = info[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt {
- animationCurve = UIView.AnimationOptions(rawValue: curve).union(.beginFromCurrentState)
- } else {
- animationCurve = UIView.AnimationOptions.curveEaseOut.union(.beginFromCurrentState)
- }
-
- // Getting keyboard animation duration
- if let duration = info[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval, duration != 0 {
- animationDuration = duration
- } else {
- animationDuration = 0.25
- }
-
- // Getting UIKeyboardSize.
- if let kbFrame = info[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect {
-
- keyboardFrame = kbFrame
- notifyKeyboardSize(size: keyboardFrame.size)
- showLog("UIKeyboard Frame: \(keyboardFrame)")
- }
- }
-
- guard privateIsEnabled() else {
- restorePosition()
- topViewBeginOrigin = IQKeyboardManager.kIQCGPointInvalid
- topViewBeginSafeAreaInsets = .zero
- return
- }
-
- let startTime = CACurrentMediaTime()
- showLog("โจ๏ธ>>>>> \(#function) started >>>>>", indentation: 1)
-
- showLog("Notification Object:\(notification.object ?? "NULL")")
-
- // (Bug ID: #5)
- if let textFieldView = textFieldView, topViewBeginOrigin.equalTo(IQKeyboardManager.kIQCGPointInvalid) {
-
- // keyboard is not showing(At the beginning only). We should save rootViewRect.
- rootViewController = textFieldView.parentContainerViewController()
- if let controller = rootViewController {
-
- if rootViewControllerWhilePopGestureRecognizerActive == controller {
- topViewBeginOrigin = topViewBeginOriginWhilePopGestureRecognizerActive
- } else {
- topViewBeginOrigin = controller.view.frame.origin
- topViewBeginSafeAreaInsets = controller.view.safeAreaInsets
- }
-
- rootViewControllerWhilePopGestureRecognizerActive = nil
- topViewBeginOriginWhilePopGestureRecognizerActive = IQKeyboardManager.kIQCGPointInvalid
-
- self.showLog("Saving \(controller) beginning origin: \(self.topViewBeginOrigin)")
- }
- }
-
- // If last restored keyboard size is different(any orientation accure), then refresh. otherwise not.
- if keyboardFrame.equalTo(oldKBFrame) == false {
-
- // If textFieldView is inside UITableViewController then let UITableViewController to handle it (Bug ID: #37) (Bug ID: #76) See note:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70).
-
- if keyboardShowing,
- let textFieldView = textFieldView,
- textFieldView.isAlertViewTextField() == false {
-
- // keyboard is already showing. adjust position.
- self.adjustPosition()
- }
- }
-
- let elapsedTime = CACurrentMediaTime() - startTime
- showLog("โจ๏ธ<<<<< \(#function) ended: \(elapsedTime) seconds <<<<<", indentation: -1)
- }
-
- /* UIKeyboardWillHideNotification. So setting rootViewController to it's default frame. */
- @objc internal func keyboardWillHide(_ notification: Notification?) {
-
- // If it's not a fake notification generated by [self setEnable:NO].
- if notification != nil {
- keyboardShowNotification = nil
- }
-
- // Boolean to know keyboard is showing/hiding
- keyboardShowing = false
-
- if let info = notification?.userInfo {
-
- // Getting keyboard animation.
- if let curve = info[UIResponder.keyboardAnimationCurveUserInfoKey] as? UInt {
- animationCurve = UIView.AnimationOptions(rawValue: curve).union(.beginFromCurrentState)
- } else {
- animationCurve = UIView.AnimationOptions.curveEaseOut.union(.beginFromCurrentState)
- }
-
- // Getting keyboard animation duration
- if let duration = info[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval, duration != 0 {
- animationDuration = duration
- } else {
- animationDuration = 0.25
- }
- }
-
- // If not enabled then do nothing.
- guard privateIsEnabled() else {
- return
- }
-
- let startTime = CACurrentMediaTime()
- showLog("โจ๏ธ>>>>> \(#function) started >>>>>", indentation: 1)
- showLog("Notification Object:\(notification?.object ?? "NULL")")
-
- // Commented due to #56. Added all the conditions below to handle WKWebView's textFields. (Bug ID: #56)
- // We are unable to get textField object while keyboard showing on WKWebView's textField. (Bug ID: #11)
- // if (_textFieldView == nil) return
-
- // Restoring the contentOffset of the lastScrollView
- if let lastScrollView = lastScrollView {
-
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- if lastScrollView.contentInset != self.startingContentInsets {
- self.showLog("Restoring contentInset to: \(self.startingContentInsets)")
- lastScrollView.contentInset = self.startingContentInsets
- lastScrollView.scrollIndicatorInsets = self.startingScrollIndicatorInsets
- }
-
- if lastScrollView.shouldRestoreScrollViewContentOffset, !lastScrollView.contentOffset.equalTo(self.startingContentOffset) {
- self.showLog("Restoring contentOffset to: \(self.startingContentOffset)")
-
- let animatedContentOffset = self.textFieldView?.superviewOfClassType(UIStackView.self, belowView: lastScrollView) != nil // (Bug ID: #1365, #1508, #1541)
-
- if animatedContentOffset {
- lastScrollView.setContentOffset(self.startingContentOffset, animated: UIView.areAnimationsEnabled)
- } else {
- lastScrollView.contentOffset = self.startingContentOffset
- }
- }
-
- // TODO: restore scrollView state
- // This is temporary solution. Have to implement the save and restore scrollView state
- var superScrollView: UIScrollView? = lastScrollView
-
- while let scrollView = superScrollView {
-
- let contentSize = CGSize(width: max(scrollView.contentSize.width, scrollView.frame.width), height: max(scrollView.contentSize.height, scrollView.frame.height))
-
- let minimumY = contentSize.height - scrollView.frame.height
-
- if minimumY < scrollView.contentOffset.y {
-
- let newContentOffset = CGPoint(x: scrollView.contentOffset.x, y: minimumY)
- if scrollView.contentOffset.equalTo(newContentOffset) == false {
-
- let animatedContentOffset = self.textFieldView?.superviewOfClassType(UIStackView.self, belowView: scrollView) != nil // (Bug ID: #1365, #1508, #1541)
-
- if animatedContentOffset {
- scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
- } else {
- scrollView.contentOffset = newContentOffset
- }
-
- self.showLog("Restoring contentOffset to: \(self.startingContentOffset)")
- }
- }
-
- superScrollView = scrollView.superviewOfClassType(UIScrollView.self) as? UIScrollView
- }
- })
- }
-
- restorePosition()
-
- // Reset all values
- lastScrollView = nil
- keyboardFrame = .zero
- notifyKeyboardSize(size: keyboardFrame.size)
- startingContentInsets = .zero
- startingScrollIndicatorInsets = .zero
- startingContentOffset = CGPoint.zero
- topViewBeginOrigin = IQKeyboardManager.kIQCGPointInvalid
- topViewBeginSafeAreaInsets = .zero
-
- let elapsedTime = CACurrentMediaTime() - startTime
- showLog("โจ๏ธ<<<<< \(#function) ended: \(elapsedTime) seconds <<<<<", indentation: -1)
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+UITextFieldViewNotification.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+UITextFieldViewNotification.swift
deleted file mode 100644
index dd707f2..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager+UITextFieldViewNotification.swift
+++ /dev/null
@@ -1,230 +0,0 @@
-//
-// IQKeyboardManager+UITextFieldViewNotification.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-// MARK: UITextField/UITextView Notifications
-@available(iOSApplicationExtension, unavailable)
-internal extension IQKeyboardManager {
-
- private struct AssociatedKeys {
- static var textFieldView: Int = 0
- static var topViewBeginOrigin: Int = 0
- static var topViewBeginSafeAreaInsets: Int = 0
- static var rootViewController: Int = 0
- static var rootViewControllerWhilePopGestureRecognizerActive: Int = 0
- static var topViewBeginOriginWhilePopGestureRecognizerActive: Int = 0
- }
-
- /** To save UITextField/UITextView object voa textField/textView notifications. */
- weak var textFieldView: UIView? {
- get {
- return (objc_getAssociatedObject(self, &AssociatedKeys.textFieldView) as? WeakObjectContainer)?.object as? UIView
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.textFieldView, WeakObjectContainer(object: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- var topViewBeginOrigin: CGPoint {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.topViewBeginOrigin) as? CGPoint ?? IQKeyboardManager.kIQCGPointInvalid
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.topViewBeginOrigin, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- var topViewBeginSafeAreaInsets: UIEdgeInsets {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.topViewBeginSafeAreaInsets) as? UIEdgeInsets ?? .zero
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.topViewBeginSafeAreaInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** To save rootViewController */
- weak var rootViewController: UIViewController? {
- get {
- return (objc_getAssociatedObject(self, &AssociatedKeys.rootViewController) as? WeakObjectContainer)?.object as? UIViewController
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.rootViewController, WeakObjectContainer(object: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** To overcome with popGestureRecognizer issue Bug ID: #1361 */
- weak var rootViewControllerWhilePopGestureRecognizerActive: UIViewController? {
- get {
- return (objc_getAssociatedObject(self, &AssociatedKeys.rootViewControllerWhilePopGestureRecognizerActive) as? WeakObjectContainer)?.object as? UIViewController
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.rootViewControllerWhilePopGestureRecognizerActive, WeakObjectContainer(object: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- var topViewBeginOriginWhilePopGestureRecognizerActive: CGPoint {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.topViewBeginOriginWhilePopGestureRecognizerActive) as? CGPoint ?? IQKeyboardManager.kIQCGPointInvalid
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.topViewBeginOriginWhilePopGestureRecognizerActive, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- }
- }
-
- /** UITextFieldTextDidBeginEditingNotification, UITextViewTextDidBeginEditingNotification. Fetching UITextFieldView object. */
- @objc func textFieldViewDidBeginEditing(_ notification: Notification) {
-
- guard let object = notification.object as? UIView, let isKeyWindow = object.window?.isKeyWindow, isKeyWindow else {
- return
- }
-
- let startTime = CACurrentMediaTime()
- showLog("๐>>>>> \(#function) started >>>>>", indentation: 1)
- showLog("Notification Object:\(notification.object ?? "NULL")")
-
- // Getting object
- textFieldView = notification.object as? UIView
-
- if overrideKeyboardAppearance, let textInput = textFieldView as? UITextInput, textInput.keyboardAppearance != keyboardAppearance {
- // Setting textField keyboard appearance and reloading inputViews.
- if let textFieldView = textFieldView as? UITextField {
- textFieldView.keyboardAppearance = keyboardAppearance
- } else if let textFieldView = textFieldView as? UITextView {
- textFieldView.keyboardAppearance = keyboardAppearance
- }
- textFieldView?.reloadInputViews()
- }
-
- // If autoToolbar enable, then add toolbar on all the UITextField/UITextView's if required.
- if privateIsEnableAutoToolbar() {
-
- // UITextView special case. Keyboard Notification is firing before textView notification so we need to resign it first and then again set it as first responder to add toolbar on it.
- if let textView = textFieldView as? UIScrollView, textView.responds(to: #selector(getter: UITextView.isEditable)),
- textView.inputAccessoryView == nil {
- self.addToolbarIfRequired()
- } else {
- // Adding toolbar
- addToolbarIfRequired()
- }
- } else {
- removeToolbarIfRequired()
- }
-
- resignFirstResponderGesture.isEnabled = privateShouldResignOnTouchOutside()
- textFieldView?.window?.addGestureRecognizer(resignFirstResponderGesture) // (Enhancement ID: #14)
-
- if privateIsEnabled() == false {
- restorePosition()
- topViewBeginOrigin = IQKeyboardManager.kIQCGPointInvalid
- topViewBeginSafeAreaInsets = .zero
- } else {
- if topViewBeginOrigin.equalTo(IQKeyboardManager.kIQCGPointInvalid) { // (Bug ID: #5)
-
- rootViewController = textFieldView?.parentContainerViewController()
-
- if let controller = rootViewController {
-
- if rootViewControllerWhilePopGestureRecognizerActive == controller {
- topViewBeginOrigin = topViewBeginOriginWhilePopGestureRecognizerActive
- } else {
- topViewBeginOrigin = controller.view.frame.origin
- topViewBeginSafeAreaInsets = controller.view.safeAreaInsets
- }
-
- rootViewControllerWhilePopGestureRecognizerActive = nil
- topViewBeginOriginWhilePopGestureRecognizerActive = IQKeyboardManager.kIQCGPointInvalid
-
- self.showLog("Saving \(controller) beginning origin: \(self.topViewBeginOrigin)")
- }
- }
-
- // If textFieldView is inside ignored responder then do nothing. (Bug ID: #37, #74, #76)
- // See notes:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70).
- if keyboardShowing,
- let textFieldView = textFieldView,
- textFieldView.isAlertViewTextField() == false {
-
- // keyboard is already showing. adjust position.
- self.adjustPosition()
- }
- }
-
- let elapsedTime = CACurrentMediaTime() - startTime
- showLog("๐<<<<< \(#function) ended: \(elapsedTime) seconds <<<<<", indentation: -1)
- }
-
- /** UITextFieldTextDidEndEditingNotification, UITextViewTextDidEndEditingNotification. Removing fetched object. */
- @objc func textFieldViewDidEndEditing(_ notification: Notification) {
-
- guard let object = notification.object as? UIView, let isKeyWindow = object.window?.isKeyWindow, isKeyWindow else {
- return
- }
-
- let startTime = CACurrentMediaTime()
- showLog("๐>>>>> \(#function) started >>>>>", indentation: 1)
- showLog("Notification Object:\(notification.object ?? "NULL")")
-
- // Removing gesture recognizer (Enhancement ID: #14)
- textFieldView?.window?.removeGestureRecognizer(resignFirstResponderGesture)
-
- // We check if there's a change in original frame or not.
-
- if let textView = textFieldView as? UIScrollView, textView.responds(to: #selector(getter: UITextView.isEditable)) {
-
- if isTextViewContentInsetChanged {
- self.isTextViewContentInsetChanged = false
-
- if textView.contentInset != self.startingTextViewContentInsets {
- self.showLog("Restoring textView.contentInset to: \(self.startingTextViewContentInsets)")
-
- UIView.animate(withDuration: animationDuration, delay: 0, options: animationCurve, animations: { () -> Void in
-
- // Setting textField to it's initial contentInset
- textView.contentInset = self.startingTextViewContentInsets
- textView.scrollIndicatorInsets = self.startingTextViewScrollIndicatorInsets
-
- }, completion: { (_) -> Void in })
- }
- }
- }
-
- // Setting object to nil
-#if swift(>=5.7)
- if #available(iOS 16.0, *), let textView = object as? UITextView, textView.isFindInteractionEnabled {
- // Not setting it nil, because it may be doing find interaction.
- // As of now, here textView.findInteraction?.isFindNavigatorVisible returns false
- // So there is no way to detect if this is dismissed due to findInteraction
- } else {
- textFieldView = nil
- }
- #else
- textFieldView = nil
-#endif
-
- let elapsedTime = CACurrentMediaTime() - startTime
- showLog("๐<<<<< \(#function) ended: \(elapsedTime) seconds <<<<<", indentation: -1)
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager.swift
deleted file mode 100644
index c0580a6..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager.swift
+++ /dev/null
@@ -1,427 +0,0 @@
-//
-// IQKeyboardManager.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-import CoreGraphics
-import QuartzCore
-
-// MARK: IQToolbar tags
-
-/**
-Codeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code nor any setup required and much more. A generic version of KeyboardManagement. https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
-*/
-
-@available(iOSApplicationExtension, unavailable)
-@objc public final class IQKeyboardManager: NSObject {
-
- /**
- Returns the default singleton instance.
- */
- @objc public static let shared = IQKeyboardManager()
-
- /**
- Invalid point value.
- */
- internal static let kIQCGPointInvalid = CGPoint.init(x: CGFloat.greatestFiniteMagnitude, y: CGFloat.greatestFiniteMagnitude)
-
- // MARK: UIKeyboard handling
-
- /**
- Enable/disable managing distance between keyboard and textField. Default is YES(Enabled when class loads in `+(void)load` method).
- */
- @objc public var enable = false {
-
- didSet {
- // If not enable, enable it.
- if enable, !oldValue {
- // If keyboard is currently showing. Sending a fake notification for keyboardWillHide to retain view's original position.
- if let notification = keyboardShowNotification {
- keyboardWillShow(notification)
- }
- showLog("Enabled")
- } else if !enable, oldValue { // If not disable, desable it.
- keyboardWillHide(nil)
- showLog("Disabled")
- }
- }
- }
-
- /**
- To set keyboard distance from textField. can't be less than zero. Default is 10.0.
- */
- @objc public var keyboardDistanceFromTextField: CGFloat = 10.0
-
- // MARK: IQToolbar handling
-
- /**
- Automatic add the IQToolbar functionality. Default is YES.
- */
- @objc public var enableAutoToolbar = true {
- didSet {
- if privateIsEnableAutoToolbar() {
- addToolbarIfRequired()
- } else {
- removeToolbarIfRequired()
- }
-
- let enableToolbar = enableAutoToolbar ? "Yes" : "NO"
-
- showLog("enableAutoToolbar: \(enableToolbar)")
- }
- }
-
- /**
- /**
- IQAutoToolbarBySubviews: Creates Toolbar according to subview's hirarchy of Textfield's in view.
- IQAutoToolbarByTag: Creates Toolbar according to tag property of TextField's.
- IQAutoToolbarByPosition: Creates Toolbar according to the y,x position of textField in it's superview coordinate.
-
- Default is IQAutoToolbarBySubviews.
- */
- AutoToolbar managing behaviour. Default is IQAutoToolbarBySubviews.
- */
- @objc public var toolbarManageBehaviour = IQAutoToolbarManageBehaviour.bySubviews
-
- /**
- If YES, then uses textField's tintColor property for IQToolbar, otherwise tint color is default. Default is NO.
- */
- @objc public var shouldToolbarUsesTextFieldTintColor = false
-
- /**
- This is used for toolbar.tintColor when textfield.keyboardAppearance is UIKeyboardAppearanceDefault. If shouldToolbarUsesTextFieldTintColor is YES then this property is ignored. Default is nil and uses black color.
- */
- @objc public var toolbarTintColor: UIColor?
-
- /**
- This is used for toolbar.barTintColor. Default is nil.
- */
- @objc public var toolbarBarTintColor: UIColor?
-
- /**
- IQPreviousNextDisplayModeDefault: Show NextPrevious when there are more than 1 textField otherwise hide.
- IQPreviousNextDisplayModeAlwaysHide: Do not show NextPrevious buttons in any case.
- IQPreviousNextDisplayModeAlwaysShow: Always show nextPrevious buttons, if there are more than 1 textField then both buttons will be visible but will be shown as disabled.
- */
- @objc public var previousNextDisplayMode = IQPreviousNextDisplayMode.default
-
- /**
- Toolbar previous/next/done button icon, If nothing is provided then check toolbarDoneBarButtonItemText to draw done button.
- */
- @objc public var toolbarPreviousBarButtonItemImage: UIImage?
- @objc public var toolbarNextBarButtonItemImage: UIImage?
- @objc public var toolbarDoneBarButtonItemImage: UIImage?
-
- /**
- Toolbar previous/next/done button text, If nothing is provided then system default 'UIBarButtonSystemItemDone' will be used.
- */
- @objc public var toolbarPreviousBarButtonItemText: String?
- @objc public var toolbarPreviousBarButtonItemAccessibilityLabel: String?
- @objc public var toolbarNextBarButtonItemText: String?
- @objc public var toolbarNextBarButtonItemAccessibilityLabel: String?
- @objc public var toolbarDoneBarButtonItemText: String?
- @objc public var toolbarDoneBarButtonItemAccessibilityLabel: String?
- @objc public var toolbarTitlBarButtonItemAccessibilityLabel: String?
- /**
- If YES, then it add the textField's placeholder text on IQToolbar. Default is YES.
- */
- @objc public var shouldShowToolbarPlaceholder = true
-
- /**
- Placeholder Font. Default is nil.
- */
- @objc public var placeholderFont: UIFont?
-
- /**
- Placeholder Color. Default is nil. Which means lightGray
- */
- @objc public var placeholderColor: UIColor?
-
- /**
- Placeholder Button Color when it's treated as button. Default is nil.
- */
- @objc public var placeholderButtonColor: UIColor?
-
- // MARK: UIKeyboard appearance overriding
-
- /**
- Override the keyboardAppearance for all textField/textView. Default is NO.
- */
- @objc public var overrideKeyboardAppearance = false
-
- /**
- If overrideKeyboardAppearance is YES, then all the textField keyboardAppearance is set using this property.
- */
- @objc public var keyboardAppearance = UIKeyboardAppearance.default
-
- // MARK: UITextField/UITextView Next/Previous/Resign handling
-
- /**
- Resigns Keyboard on touching outside of UITextField/View. Default is NO.
- */
- @objc public var shouldResignOnTouchOutside = false {
-
- didSet {
- resignFirstResponderGesture.isEnabled = privateShouldResignOnTouchOutside()
-
- let shouldResign = shouldResignOnTouchOutside ? "Yes" : "NO"
-
- showLog("shouldResignOnTouchOutside: \(shouldResign)")
- }
- }
-
- /** TapGesture to resign keyboard on view's touch. It's a readonly property and exposed only for adding/removing dependencies if your added gesture does have collision with this one */
- @objc lazy public var resignFirstResponderGesture: UITapGestureRecognizer = {
-
- let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapRecognized(_:)))
- tapGesture.cancelsTouchesInView = false
- tapGesture.delegate = self
-
- return tapGesture
- }()
-
- /*******************************************/
-
- /**
- Resigns currently first responder field.
- */
- @objc @discardableResult public func resignFirstResponder() -> Bool {
-
- guard let textFieldRetain = textFieldView else {
- return false
- }
-
- // Resigning first responder
- guard textFieldRetain.resignFirstResponder() else {
- showLog("Refuses to resign first responder: \(textFieldRetain)")
- // If it refuses then becoming it as first responder again. (Bug ID: #96)
- // If it refuses to resign then becoming it first responder again for getting notifications callback.
- textFieldRetain.becomeFirstResponder()
- return false
- }
- return true
- }
-
- // MARK: UISound handling
-
- /**
- If YES, then it plays inputClick sound on next/previous/done click.
- */
- @objc public var shouldPlayInputClicks = true
-
- // MARK: UIAnimation handling
-
- /**
- If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view.
- */
- @objc public var layoutIfNeededOnUpdate = false
-
- // MARK: Class Level disabling methods
-
- /**
- Disable distance handling within the scope of disabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController.
- */
- @objc public var disabledDistanceHandlingClasses = [UIViewController.Type]()
-
- /**
- Enable distance handling within the scope of enabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController. If same Class is added in disabledDistanceHandlingClasses list, then enabledDistanceHandlingClasses will be ignored.
- */
- @objc public var enabledDistanceHandlingClasses = [UIViewController.Type]()
-
- /**
- Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes. Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
- */
- @objc public var disabledToolbarClasses = [UIViewController.Type]()
-
- /**
- Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes. Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController. If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.
- */
- @objc public var enabledToolbarClasses = [UIViewController.Type]()
-
- /**
- Allowed subclasses of UIView to add all inner textField, this will allow to navigate between textField contains in different superview. Class should be kind of UIView.
- */
- @objc public var toolbarPreviousNextAllowedClasses = [UIView.Type]()
-
- /**
- Disabled classes to ignore 'shouldResignOnTouchOutside' property, Class should be kind of UIViewController.
- */
- @objc public var disabledTouchResignedClasses = [UIViewController.Type]()
-
- /**
- Enabled classes to forcefully enable 'shouldResignOnTouchOutsite' property. Class should be kind of UIViewController. If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
- */
- @objc public var enabledTouchResignedClasses = [UIViewController.Type]()
-
- /**
- if shouldResignOnTouchOutside is enabled then you can customise the behaviour to not recognise gesture touches on some specific view subclasses. Class should be kind of UIView. Default is [UIControl, UINavigationBar]
- */
- @objc public var touchResignedGestureIgnoreClasses = [UIView.Type]()
-
- // MARK: Third Party Library support
- /// Add TextField/TextView Notifications customised Notifications. For example while using YYTextView https://github.com/ibireme/YYText
-
- /**
- Add/Remove customised Notification for third party customised TextField/TextView. Please be aware that the Notification object must be idential to UITextField/UITextView Notification objects and customised TextField/TextView support must be idential to UITextField/UITextView.
- @param didBeginEditingNotificationName This should be identical to UITextViewTextDidBeginEditingNotification
- @param didEndEditingNotificationName This should be identical to UITextViewTextDidEndEditingNotification
- */
-
- @objc public func registerTextFieldViewClass(_ aClass: UIView.Type, didBeginEditingNotificationName: String, didEndEditingNotificationName: String) {
-
- NotificationCenter.default.addObserver(self, selector: #selector(self.textFieldViewDidBeginEditing(_:)), name: Notification.Name(rawValue: didBeginEditingNotificationName), object: nil)
- NotificationCenter.default.addObserver(self, selector: #selector(self.textFieldViewDidEndEditing(_:)), name: Notification.Name(rawValue: didEndEditingNotificationName), object: nil)
- }
-
- @objc public func unregisterTextFieldViewClass(_ aClass: UIView.Type, didBeginEditingNotificationName: String, didEndEditingNotificationName: String) {
-
- NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: didBeginEditingNotificationName), object: nil)
- NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: didEndEditingNotificationName), object: nil)
- }
-
- /**************************************************************************************/
- internal struct WeakObjectContainer {
- weak var object: AnyObject?
- }
-
- /**************************************************************************************/
-
- // MARK: Initialization/Deinitialization
-
- /* Singleton Object Initialization. */
- override init() {
-
- super.init()
-
- self.registerAllNotifications()
-
- // Creating gesture for @shouldResignOnTouchOutside. (Enhancement ID: #14)
- resignFirstResponderGesture.isEnabled = shouldResignOnTouchOutside
-
- disabledDistanceHandlingClasses.append(UITableViewController.self)
- disabledDistanceHandlingClasses.append(UIAlertController.self)
- disabledToolbarClasses.append(UIAlertController.self)
- disabledTouchResignedClasses.append(UIAlertController.self)
- toolbarPreviousNextAllowedClasses.append(UITableView.self)
- toolbarPreviousNextAllowedClasses.append(UICollectionView.self)
- toolbarPreviousNextAllowedClasses.append(IQPreviousNextView.self)
- touchResignedGestureIgnoreClasses.append(UIControl.self)
- touchResignedGestureIgnoreClasses.append(UINavigationBar.self)
-
- // Loading IQToolbar, IQTitleBarButtonItem, IQBarButtonItem to fix first time keyboard appearance delay (Bug ID: #550)
- // If you experience exception breakpoint issue at below line then try these solutions https://stackoverflow.com/questions/27375640/all-exception-break-point-is-stopping-for-no-reason-on-simulator
- DispatchQueue.main.async {
- let textField = UITextField()
- textField.addDoneOnKeyboardWithTarget(nil, action: #selector(self.doneAction(_:)))
- textField.addPreviousNextDoneOnKeyboardWithTarget(nil, previousAction: #selector(self.previousAction(_:)), nextAction: #selector(self.nextAction(_:)), doneAction: #selector(self.doneAction(_:)))
- }
- }
-
- deinit {
- // Disable the keyboard manager.
- enable = false
- }
-
- /** Getting keyWindow. */
- internal func keyWindow() -> UIWindow? {
-
- if let keyWindow = textFieldView?.window {
- return keyWindow
- } else {
-
- struct Static {
- /** @abstract Save keyWindow object for reuse.
- @discussion Sometimes [[UIApplication sharedApplication] keyWindow] is returning nil between the app. */
- static weak var keyWindow: UIWindow?
- }
-
- var originalKeyWindow: UIWindow?
-
- #if swift(>=5.1)
- if #available(iOS 13, *) {
- originalKeyWindow = UIApplication.shared.connectedScenes
- .compactMap { $0 as? UIWindowScene }
- .flatMap { $0.windows }
- .first(where: { $0.isKeyWindow })
- } else {
- originalKeyWindow = UIApplication.shared.keyWindow
- }
- #else
- originalKeyWindow = UIApplication.shared.keyWindow
- #endif
-
- // If original key window is not nil and the cached keywindow is also not original keywindow then changing keywindow.
- if let originalKeyWindow = originalKeyWindow {
- Static.keyWindow = originalKeyWindow
- }
-
- // Return KeyWindow
- return Static.keyWindow
- }
- }
-
- // MARK: Public Methods
-
- /* Refreshes textField/textView position if any external changes is explicitly made by user. */
- @objc public func reloadLayoutIfNeeded() {
-
- guard privateIsEnabled(),
- keyboardShowing,
- topViewBeginOrigin.equalTo(IQKeyboardManager.kIQCGPointInvalid) == false, let textFieldView = textFieldView,
- textFieldView.isAlertViewTextField() == false else {
- return
- }
- self.adjustPosition()
- }
-}
-
-@available(iOSApplicationExtension, unavailable)
-extension IQKeyboardManager: UIGestureRecognizerDelegate {
-
- /** Resigning on tap gesture. (Enhancement ID: #14)*/
- @objc internal func tapRecognized(_ gesture: UITapGestureRecognizer) {
-
- if gesture.state == .ended {
-
- // Resigning currently responder textField.
- resignFirstResponder()
- }
- }
-
- /** Note: returning YES is guaranteed to allow simultaneous recognition. returning NO is not guaranteed to prevent simultaneous recognition, as the other gesture's delegate may return YES. */
- @objc public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
- return false
- }
-
- /** To not detect touch events in a subclass of UIControl, these may have added their own selector for specific work */
- @objc public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
- // Should not recognize gesture if the clicked view is either UIControl or UINavigationBar( = []
+
+ enum Event: Int {
+ case hide
+ case show
+ case change
+
+ var name: String {
+ switch self {
+ case .hide:
+ return "hide"
+ case .show:
+ return "show"
+ case .change:
+ return "change"
+ }
+ }
+ }
+
+ private var lastEvent: Event = .hide
+
+ var rootConfiguration: IQRootControllerConfiguration?
+
+ var isReady: Bool {
+ if textInputViewInfo != nil,
+ let rootConfiguration = rootConfiguration {
+ return rootConfiguration.isReady
+ }
+ return false
+ }
+
+ override init() {
+ super.init()
+ addKeyboardObserver()
+ addTextInputViewObserver()
+ }
+
+ private func sendEvent() {
+
+ guard let rootConfiguration = rootConfiguration,
+ rootConfiguration.isReady else { return }
+
+ if keyboardInfo.isVisible {
+ if lastEvent == .hide {
+ self.notify(event: .show, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+ } else {
+ self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+ }
+
+ } else if lastEvent != .hide {
+ if rootConfiguration.beginOrientation == rootConfiguration.currentOrientation {
+
+ // If interactive pop gesture is active then it manipulate viewController.view's frame
+ // To overcome with this, we have to do this workaround.
+ if rootConfiguration.isInteractiveGestureActive,
+ let rootController: UIViewController = rootConfiguration.rootController {
+
+ self.cancellable.forEach { $0.cancel() }
+ self.cancellable.removeAll()
+
+ // Saving current keyboard info and textInputView
+ let keyboardInfo = keyboardObserver.keyboardInfo
+ let textInputViewInfo = textInputViewObserver.textInputViewInfo
+
+ // Start observing frame changes.
+ // If pop successful, then we'll not get callbacks here again
+ // If user cancels the pop, then we'll get frame as .zero at some time
+ // Also the interactiveGesture becomes inactive (genuinely it's state is .possible)
+ // At this moment.
+ rootController.view.publisher(for: \.frame)
+ .sink(receiveValue: { [self] frame in
+ print(frame)
+ guard frame.origin == .zero,
+ !rootConfiguration.isInteractiveGestureActive else { return }
+
+ cancellable.forEach { $0.cancel() }
+ cancellable.removeAll()
+
+ // Restore keyboard info and textInputViewInfo
+ notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+ }).store(in: &cancellable)
+
+ } else {
+ self.notify(event: .hide, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+ self.rootConfiguration = nil
+ }
+
+ } else if rootConfiguration.hasChanged {
+ animate(alongsideTransition: {
+ rootConfiguration.restore()
+ }, completion: nil)
+ }
+ }
+ }
+
+ private func updateRootController(textInputView: IQTextInputView?) {
+
+ guard let textInputView: UIView = textInputView,
+ let controller: UIViewController = textInputView.iq.parentContainerViewController() else {
+ if let rootConfiguration = rootConfiguration,
+ rootConfiguration.hasChanged {
+ animate(alongsideTransition: {
+ rootConfiguration.restore()
+ }, completion: nil)
+ }
+ rootConfiguration = nil
+ return
+ }
+
+ let newConfiguration = IQRootControllerConfiguration(rootController: controller)
+
+ guard newConfiguration.rootController?.view.window != rootConfiguration?.rootController?.view.window ||
+ newConfiguration.beginOrientation != rootConfiguration?.beginOrientation else { return }
+
+ if rootConfiguration?.rootController != newConfiguration.rootController {
+
+ // If there was an old configuration but things are changed
+ if let rootConfiguration = rootConfiguration,
+ rootConfiguration.hasChanged {
+ animate(alongsideTransition: {
+ rootConfiguration.restore()
+ }, completion: nil)
+ }
+ }
+
+ rootConfiguration = newConfiguration
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+ var keyboardInfo: IQKeyboardInfo {
+ return keyboardObserver.keyboardInfo
+ }
+
+ private func addKeyboardObserver() {
+ keyboardObserver.subscribe(identifier: "IQActiveConfiguration", changeHandler: { [weak self] _, endFrame in
+
+ guard let self = self else { return }
+
+ guard keyboardObserver.oldKeyboardInfo.endFrame.height != endFrame.height else { return }
+
+ if let info = textInputViewInfo, keyboardInfo.isVisible {
+ if let rootConfiguration = rootConfiguration {
+ let beginIsPortrait: Bool = rootConfiguration.beginOrientation.isPortrait
+ let currentIsPortrait: Bool = rootConfiguration.currentOrientation.isPortrait
+ if beginIsPortrait != currentIsPortrait {
+ updateRootController(textInputView: info.textInputView)
+ }
+ } else {
+ updateRootController(textInputView: info.textInputView)
+ }
+ }
+
+ self.sendEvent()
+
+ // If interactive pop gesture is active then we don't want to remove this textField
+ if endFrame.height == 0,
+ !(rootConfiguration?.isInteractiveGestureActive ?? false) {
+ updateRootController(textInputView: nil)
+ }
+ })
+ }
+
+ public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+ keyboardObserver.animate(alongsideTransition: transition, completion: completion)
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+ var textInputView: (any IQTextInputView)? {
+ guard let textInputView: UIView = textInputViewObserver.textInputView,
+ textInputView.iq.isAlertViewTextField() == false else {
+ return nil
+ }
+
+ return textInputViewObserver.textInputView
+ }
+
+ var textInputViewInfo: IQTextInputViewInfo? {
+ guard let textInputView: UIView = textInputView,
+ textInputView.iq.isAlertViewTextField() == false else {
+ return nil
+ }
+
+ return textInputViewObserver.textInputViewInfo
+ }
+
+ private func addTextInputViewObserver() {
+ textInputViewObserver.subscribe(identifier: "IQActiveConfiguration",
+ changeHandler: { [weak self] event, textInputView in
+
+ guard let self = self else { return }
+
+// print(info.event.name)
+ guard (textInputView as UIView).iq.isAlertViewTextField() == false else {
+ return
+ }
+
+ if event == .beginEditing {
+ updateRootController(textInputView: textInputView)
+ self.sendEvent()
+ }
+ })
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+ typealias ConfigurationCompletion = (_ event: Event,
+ _ keyboardInfo: IQKeyboardInfo,
+ _ textInputViewInfo: IQTextInputViewInfo?) -> Void
+
+ func subscribe(identifier: AnyHashable, changeHandler: @escaping ConfigurationCompletion) {
+ changeObservers[identifier] = changeHandler
+ }
+
+ func unsubscribe(identifier: AnyHashable) {
+ changeObservers[identifier] = nil
+ }
+
+ private func notify(event: Event, keyboardInfo: IQKeyboardInfo, textInputViewInfo: IQTextInputViewInfo?) {
+ lastEvent = event
+
+ for block in changeObservers.values {
+ block(event, keyboardInfo, textInputViewInfo)
+ }
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift
new file mode 100644
index 0000000..4980b73
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift
@@ -0,0 +1,95 @@
+//
+// IQRootControllerConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal struct IQRootControllerConfiguration {
+
+ weak var rootController: UIViewController?
+ let beginOrigin: CGPoint
+ let beginSafeAreaInsets: UIEdgeInsets
+ let beginOrientation: UIInterfaceOrientation
+
+ init(rootController: UIViewController) {
+ self.rootController = rootController
+ beginOrigin = rootController.view.frame.origin
+ beginSafeAreaInsets = rootController.view.safeAreaInsets
+
+ let interfaceOrientation: UIInterfaceOrientation
+ if let scene = rootController.view.window?.windowScene {
+ interfaceOrientation = scene.interfaceOrientation
+ } else {
+ interfaceOrientation = .unknown
+ }
+
+ beginOrientation = interfaceOrientation
+ }
+
+ var currentOrientation: UIInterfaceOrientation {
+ let interfaceOrientation: UIInterfaceOrientation
+ if let scene = rootController?.view.window?.windowScene {
+ interfaceOrientation = scene.interfaceOrientation
+ } else {
+ interfaceOrientation = .unknown
+ }
+ return interfaceOrientation
+ }
+
+ var isReady: Bool {
+ return rootController?.view.window != nil
+ }
+
+ var hasChanged: Bool {
+ let origin: CGPoint = rootController?.view.frame.origin ?? .zero
+ return !origin.equalTo(beginOrigin)
+ }
+
+ var isInteractiveGestureActive: Bool {
+ guard let rootController: UIViewController = rootController,
+ let navigationController: UINavigationController = rootController.navigationController,
+ let interactiveGestureRecognizer = navigationController.interactivePopGestureRecognizer else {
+ return false
+ }
+ switch interactiveGestureRecognizer.state {
+ case .began, .changed:
+ return true
+ case .possible, .ended, .cancelled, .failed, .recognized:
+ // swiftlint:disable:next no_fallthrough_only
+ fallthrough
+ default:
+ return false
+ }
+ }
+ @discardableResult
+ func restore() -> Bool {
+ guard let rootController: UIViewController = rootController,
+ !rootController.view.frame.origin.equalTo(beginOrigin) else { return false }
+ // Setting it's new frame
+ var rect: CGRect = rootController.view.frame
+ rect.origin = beginOrigin
+ rootController.view.frame = rect
+ return true
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift
new file mode 100644
index 0000000..8ced7b5
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift
@@ -0,0 +1,100 @@
+//
+// IQScrollViewConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal struct IQScrollViewConfiguration {
+ let scrollView: UIScrollView
+ let startingContentOffset: CGPoint
+ let startingScrollIndicatorInsets: UIEdgeInsets
+ let startingContentInset: UIEdgeInsets
+
+ private let canRestoreContentOffset: Bool
+
+ init(scrollView: UIScrollView, canRestoreContentOffset: Bool) {
+ self.scrollView = scrollView
+ self.canRestoreContentOffset = canRestoreContentOffset
+
+ startingContentOffset = scrollView.contentOffset
+ startingContentInset = scrollView.contentInset
+ startingScrollIndicatorInsets = scrollView.verticalScrollIndicatorInsets
+ }
+
+ var hasChanged: Bool {
+ if scrollView.contentInset != self.startingContentInset {
+ return true
+ }
+
+ if canRestoreContentOffset,
+ scrollView.iq.restoreContentOffset,
+ !scrollView.contentOffset.equalTo(startingContentOffset) {
+ return true
+ }
+ return false
+ }
+
+ @discardableResult
+ func restore(for textInputView: (some IQTextInputView)?) -> Bool {
+ var success: Bool = false
+
+ if scrollView.contentInset != self.startingContentInset {
+ scrollView.contentInset = self.startingContentInset
+ scrollView.layoutIfNeeded() // (Bug ID: #1996)
+ success = true
+ }
+
+ if scrollView.verticalScrollIndicatorInsets != self.startingScrollIndicatorInsets {
+ scrollView.verticalScrollIndicatorInsets = self.startingScrollIndicatorInsets
+ }
+
+ if canRestoreContentOffset,
+ scrollView.iq.restoreContentOffset,
+ !scrollView.contentOffset.equalTo(startingContentOffset) {
+
+ // (Bug ID: #1365, #1508, #1541)
+ let stackView: UIStackView?
+ if let textInputView: UIView = textInputView {
+ stackView = textInputView.iq.superviewOf(type: UIStackView.self,
+ belowView: scrollView)
+ } else {
+ stackView = nil
+ }
+ // (Bug ID: #1901, #1996)
+ let animatedContentOffset: Bool = stackView != nil ||
+ scrollView is UICollectionView ||
+ scrollView is UITableView
+
+ if animatedContentOffset {
+ scrollView.setContentOffset(startingContentOffset, animated: UIView.areAnimationsEnabled)
+ } else {
+ scrollView.contentOffset = startingContentOffset
+ }
+ success = true
+ }
+
+ return success
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift
new file mode 100644
index 0000000..ccea38b
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift
@@ -0,0 +1,78 @@
+//
+// IQKeyboardManager+Debug.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: Debugging & Developer options
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var isDebuggingEnabled: Int = 0
+ static var logIndentation: Int = 0
+ }
+
+ var isDebuggingEnabled: Bool {
+ get {
+ return objc_getAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled) as? Bool ?? false
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+
+ private var logIndentation: Int {
+ get {
+ return objc_getAssociatedObject(self, &AssociatedKeys.logIndentation) as? Int ?? 0
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.logIndentation,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+
+ internal func showLog(_ logString: String, indentation: Int = 0) {
+
+ guard isDebuggingEnabled else {
+ return
+ }
+
+ if indentation < 0 {
+ logIndentation = max(0, logIndentation + indentation)
+ }
+
+ var preLog: String = "IQKeyboardManager"
+ for _ in 0 ... logIndentation {
+ preLog += "|\t"
+ }
+
+ print(preLog + logString)
+
+ if indentation > 0 {
+ logIndentation += indentation
+ }
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift
new file mode 100644
index 0000000..87bb3f9
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift
@@ -0,0 +1,169 @@
+//
+// IQKeyboardManager+Deprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable line_length
+// swiftlint:disable type_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "keyboardDistance")
+ var keyboardDistanceFromTextField: CGFloat {
+ get { fatalError() }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, message: "This feature has been removed due to few compatibility problems")
+ func registerTextFieldViewClass(_ aClass: UIView.Type,
+ didBeginEditingNotificationName: String,
+ didEndEditingNotificationName: String) {
+ }
+
+ @available(*, unavailable, message: "This feature has been removed due to few compatibility problems")
+ func unregisterTextFieldViewClass(_ aClass: UIView.Type,
+ didBeginEditingNotificationName: String,
+ didEndEditingNotificationName: String) {
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ typealias SizeBlock = (_ size: CGSize) -> Void
+
+ @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+ func registerKeyboardSizeChange(identifier: AnyHashable, sizeHandler: @escaping SizeBlock) {}
+
+ @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+ func unregisterKeyboardSizeChange(identifier: AnyHashable) {}
+
+ @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+ var keyboardShowing: Bool { false }
+
+ @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+ var keyboardFrame: CGRect { .zero }
+}
+
+@available(*, unavailable, renamed: "IQKeyboardReturnManager", message: "Please use `IQKeyboardReturnManager` independently from https://github.com/hackiftekhar/IQKeyboardReturnManager")
+@MainActor
+@objcMembers public final class IQKeyboardReturnKeyHandler: NSObject {}
+
+@available(*, unavailable, renamed: "IQKeyboardNotification", message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+@MainActor
+@objcMembers public final class IQKeyboardListener: NSObject {}
+
+@available(*, unavailable, renamed: "IQTextInputViewNotification", message: "Please use `IQTextInputViewNotification` independently from https://github.com/hackiftekhar/IQTextInputViewNotification")
+@MainActor
+@objcMembers public final class IQTextFieldViewListener: NSObject {}
+
+@available(*, unavailable, renamed: "IQDeepResponderContainerView", message: "Please use `IQDeepResponderContainerView` class which is now part of `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager.")
+@MainActor
+@objcMembers open class IQPreviousNextView: UIView {}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQToolbarPlaceholderConfigurationDeprecated: NSObject {
+ public var showPlaceholder: Bool = true
+ public var font: UIFont?
+ public var color: UIColor?
+ public var buttonColor: UIColor?
+ public override var accessibilityLabel: String? { didSet { } }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQBarButtonItemConfigurationDeprecated: NSObject {
+
+ public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) {
+ self.systemItem = systemItem
+ self.image = nil
+ self.title = nil
+ self.action = action
+ super.init()
+ }
+
+ public init(image: UIImage, action: Selector? = nil) {
+ self.systemItem = nil
+ self.image = image
+ self.title = nil
+ self.action = action
+ super.init()
+ }
+
+ public init(title: String, action: Selector? = nil) {
+ self.systemItem = nil
+ self.image = nil
+ self.title = title
+ self.action = action
+ super.init()
+ }
+
+ public let systemItem: UIBarButtonItem.SystemItem?
+ public let image: UIImage?
+ public let title: String?
+ public var action: Selector?
+ public override var accessibilityLabel: String? { didSet { } }
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@objc public enum IQAutoToolbarManageBehaviorDeprecated: Int {
+ case bySubviews
+ case byTag
+ case byPosition
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@objc public enum IQPreviousNextDisplayModeDeprecated: Int {
+ case `default`
+ case alwaysHide
+ case alwaysShow
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQToolbarConfiguration: NSObject {
+
+ public var useTextInputViewTintColor: Bool = false
+ public var tintColor: UIColor?
+ public var barTintColor: UIColor?
+ public var previousNextDisplayMode: IQPreviousNextDisplayModeDeprecated = .default
+ public var manageBehavior: IQAutoToolbarManageBehaviorDeprecated = .bySubviews
+ public var previousBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+ public var nextBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+ public var doneBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+ public let placeholderConfiguration: IQToolbarPlaceholderConfigurationDeprecated = .init()
+}
+
+// swiftlint:enable line_length
+// swiftlint:enable unused_setter_value
+// swiftlint:enable type_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift
new file mode 100644
index 0000000..a09bae8
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift
@@ -0,0 +1,126 @@
+//
+// IQKeyboardManager+ActiveConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+import Combine
+
+// MARK: UIKeyboard Notifications
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+ func addActiveConfigurationObserver() {
+ activeConfiguration.subscribe(identifier: "IQKeyboardManager", changeHandler: { [weak self] event, _, _ in
+ guard let self = self else { return }
+
+ switch event {
+ case .show:
+ self.handleKeyboardTextInputViewVisible()
+ case .change:
+ self.handleKeyboardTextInputViewChanged()
+ case .hide:
+ self.handleKeyboardTextInputViewHide()
+ }
+ })
+ }
+
+ private func handleKeyboardTextInputViewVisible() {
+
+ setupTextInputView()
+
+ if privateIsEnabled() {
+ adjustPosition()
+ } else {
+ restorePosition()
+ }
+ }
+
+ private func handleKeyboardTextInputViewChanged() {
+
+ setupTextInputView()
+
+ if privateIsEnabled() {
+ adjustPosition()
+ } else {
+ restorePosition()
+ }
+ }
+
+ private func handleKeyboardTextInputViewHide() {
+
+ self.restorePosition()
+ self.banishTextInputViewSetup()
+
+ self.lastScrollViewConfiguration = nil
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+ func setupTextInputView() {
+
+ guard let textInputView = activeConfiguration.textInputView else {
+ return
+ }
+
+ if let startingConfiguration = startingTextViewConfiguration,
+ startingConfiguration.hasChanged {
+
+ if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset {
+ showLog("""
+ Restoring textView.contentInset to: \(startingConfiguration.startingContentInset)
+ """)
+ }
+
+ activeConfiguration.animate(alongsideTransition: {
+ startingConfiguration.restore(for: textInputView)
+ })
+ }
+ startingTextViewConfiguration = nil
+ }
+
+ func banishTextInputViewSetup() {
+
+ guard let textInputView = activeConfiguration.textInputView else {
+ return
+ }
+
+ if let startingConfiguration = startingTextViewConfiguration,
+ startingConfiguration.hasChanged {
+
+ if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset {
+ showLog("""
+ Restoring textView.contentInset to: \(startingConfiguration.startingContentInset)
+ """)
+ }
+
+ activeConfiguration.animate(alongsideTransition: {
+ startingConfiguration.restore(for: textInputView)
+ })
+ }
+ startingTextViewConfiguration = nil
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift
new file mode 100644
index 0000000..5989671
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift
@@ -0,0 +1,88 @@
+//
+// IQKeyboardManager+Internal.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+ func privateIsEnabled() -> Bool {
+
+ guard let textInputView: any IQTextInputView = activeConfiguration.textInputView else {
+ return isEnabled
+ }
+
+ switch textInputView.internalEnableMode {
+ case .default:
+ guard var controller = (textInputView as UIView).iq.viewContainingController() else {
+ return isEnabled
+ }
+
+ // If it is searchBar textField embedded in Navigation Bar
+ if (textInputView as UIView).iq.textFieldSearchBar() != nil,
+ let navController: UINavigationController = controller as? UINavigationController,
+ let topController: UIViewController = navController.topViewController {
+ controller = topController
+ }
+
+ // If viewController is in enabledDistanceHandlingClasses, then assuming it's enabled.
+ let isWithEnabledClass: Bool = enabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) })
+ var isEnabled: Bool = isEnabled || isWithEnabledClass
+
+ if isEnabled {
+ // If viewController is in disabledDistanceHandlingClasses,
+ // then assuming it's disabled.
+ if disabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) }) {
+ isEnabled = false
+ } else {
+ // Special Controllers
+ let classNameString: String = "\(type(of: controller.self))"
+
+ // _UIAlertControllerTextFieldViewController
+ if classNameString.contains("UIAlertController"),
+ classNameString.hasSuffix("TextFieldViewController") {
+ isEnabled = false
+ }
+ }
+ }
+
+ return isEnabled
+ case .enabled:
+ return true
+ case .disabled:
+ return false
+ @unknown default:
+ return false
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+ var internalEnableMode: IQEnableMode {
+ return iq.enableMode
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift
new file mode 100644
index 0000000..478aa43
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift
@@ -0,0 +1,795 @@
+//
+// IQKeyboardManager+Position.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+// swiftlint:disable file_length
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ private typealias IQLayoutGuide = (top: CGFloat, bottom: CGFloat)
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var movedDistance: Int = 0
+ static var movedDistanceChanged: Int = 0
+ static var lastScrollViewConfiguration: Int = 0
+ static var startingTextViewConfiguration: Int = 0
+ static var activeConfiguration: Int = 0
+ }
+
+ /**
+ moved distance to the top used to maintain distance between keyboard and textInputView.
+ Most of the time this will be a positive value.
+ */
+ private(set) var movedDistance: CGFloat {
+ get {
+ return objc_getAssociatedObject(self, &AssociatedKeys.movedDistance) as? CGFloat ?? 0.0
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.movedDistance, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ movedDistanceChanged?(movedDistance)
+ }
+ }
+
+ /**
+ Will be called then movedDistance will be changed
+ */
+ var movedDistanceChanged: ((CGFloat) -> Void)? {
+ get {
+ return objc_getAssociatedObject(self, &AssociatedKeys.movedDistanceChanged) as? ((CGFloat) -> Void)
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.movedDistanceChanged,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ movedDistanceChanged?(movedDistance)
+ }
+ }
+
+ /** Variable to save lastScrollView that was scrolled. */
+ @nonobjc
+ internal var lastScrollViewConfiguration: IQScrollViewConfiguration? {
+ get {
+ return objc_getAssociatedObject(self,
+ &AssociatedKeys.lastScrollViewConfiguration) as? IQScrollViewConfiguration
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.lastScrollViewConfiguration,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+
+ /** used to adjust contentInset of UITextView. */
+ @nonobjc
+ internal var startingTextViewConfiguration: IQScrollViewConfiguration? {
+ get {
+ return objc_getAssociatedObject(self,
+ &AssociatedKeys.startingTextViewConfiguration) as? IQScrollViewConfiguration
+ }
+ set(newValue) {
+ objc_setAssociatedObject(self, &AssociatedKeys.startingTextViewConfiguration,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+
+ internal func applicationDidBecomeActive(_ notification: Notification) {
+
+ guard privateIsEnabled(),
+ activeConfiguration.keyboardInfo.isVisible,
+ activeConfiguration.isReady else {
+ return
+ }
+ adjustPosition()
+ }
+
+ /* Adjusting RootViewController's frame according to interface orientation. */
+ // swiftlint:disable function_body_length
+ internal func adjustPosition() {
+
+ guard UIApplication.shared.applicationState == .active,
+ let textInputView: any IQTextInputView = activeConfiguration.textInputView,
+ let superview: UIView = textInputView.superview,
+ let rootConfiguration = activeConfiguration.rootConfiguration,
+ let rootController: UIViewController = rootConfiguration.rootController,
+ let window: UIWindow = rootController.view.window else {
+ return
+ }
+
+ showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+ defer {
+ showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+ }
+
+ let textInputViewRectInWindow: CGRect = superview.convert(textInputView.frame, to: window)
+ let textInputViewRectInRootSuperview: CGRect = superview.convert(textInputView.frame,
+ to: rootController.view.superview)
+
+ // Getting RootViewOrigin.
+ let rootViewOrigin: CGPoint = rootController.view.frame.origin
+
+ let keyboardDistance: CGFloat = getSpecialTextInputViewDistance(textInputView: textInputView)
+
+ let kbSize: CGSize = Self.getKeyboardSize(keyboardDistance: keyboardDistance,
+ keyboardFrame: activeConfiguration.keyboardInfo.endFrame,
+ safeAreaInsets: rootConfiguration.beginSafeAreaInsets,
+ windowFrame: window.frame)
+ let originalKbSize: CGSize = activeConfiguration.keyboardInfo.endFrame.size
+
+ let isScrollableTextInputView: Bool
+
+ if let textInputView: UIScrollView = textInputView as? UITextView {
+ isScrollableTextInputView = textInputView.isScrollEnabled
+ } else {
+ isScrollableTextInputView = false
+ }
+
+ let layoutGuide: IQLayoutGuide = Self.getLayoutGuides(rootController: rootController, window: window,
+ isScrollableTextInputView: isScrollableTextInputView)
+
+ // Move positive = textInputView is hidden.
+ // Move negative = textInputView is showing.
+ // Calculating move position.
+ var moveUp: CGFloat = Self.getMoveUpDistance(keyboardSize: kbSize,
+ layoutGuide: layoutGuide,
+ textInputViewRectInRootSuperview: textInputViewRectInRootSuperview,
+ textInputViewRectInWindow: textInputViewRectInWindow,
+ windowFrame: window.frame)
+
+ showLog("Need to move: \(moveUp), will be moving \(moveUp < 0 ? "down" : "up")")
+
+ var superScrollView: UIScrollView?
+ var superView: UIScrollView? = (textInputView as UIView).iq.superviewOf(type: UIScrollView.self)
+
+ // Getting UIScrollView whose scrolling is enabled. // (Bug ID: #285)
+ while let view: UIScrollView = superView {
+
+ if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment {
+ superScrollView = view
+ break
+ } else {
+ // Getting it's superScrollView. // (Enhancement ID: #21, #24)
+ superView = view.iq.superviewOf(type: UIScrollView.self)
+ }
+ }
+
+ setupActiveScrollViewConfiguration(superScrollView: superScrollView, textInputView: textInputView)
+
+ // Special case for ScrollView.
+ // If we found lastScrollView then setting it's contentOffset to show textInputView.
+ if let lastScrollViewConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration {
+ adjustScrollViewContentOffsets(moveUp: &moveUp, textInputView: textInputView,
+ lastScrollViewConfiguration: lastScrollViewConfiguration,
+ rootSuperview: rootController.view.superview, layoutGuide: layoutGuide,
+ textInputViewRectInRootSuperview: textInputViewRectInRootSuperview,
+ isScrollableTextInputView: isScrollableTextInputView, window: window,
+ kbSize: kbSize, keyboardDistance: keyboardDistance,
+ rootBeginSafeAreaInsets: rootConfiguration.beginSafeAreaInsets)
+ }
+
+ // Special case for UITextView
+ // (Readjusting textInputView.contentInset when textInputView hight is too big to fit on screen)
+ // _lastScrollView If not having inside any scrollView, now contentInset manages the full screen textInputView.
+ // If is a UITextView type
+ if isScrollableTextInputView, let textInputView = textInputView as? UITextView {
+
+ adjustTextInputViewContentInset(window: window, originalKbSize: originalKbSize,
+ rootSuperview: rootController.view.superview,
+ layoutGuide: layoutGuide,
+ textInputView: textInputView)
+ }
+
+ adjustRootController(moveUp: moveUp, rootViewOrigin: rootViewOrigin, originalKbSize: originalKbSize,
+ rootController: rootController, rootBeginOrigin: rootConfiguration.beginOrigin)
+ }
+ // swiftlint:enable function_body_length
+
+ internal func restorePosition() {
+
+ // Setting rootViewController frame to it's original position. // (Bug ID: #18)
+ guard let configuration: IQRootControllerConfiguration = activeConfiguration.rootConfiguration else {
+ return
+ }
+ showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+ defer {
+ showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+ }
+
+ activeConfiguration.animate(alongsideTransition: {
+ if configuration.hasChanged {
+ let classNameString: String = "\(type(of: configuration.rootController.self))"
+ self.showLog("Restoring \(classNameString) origin to: \(configuration.beginOrigin)")
+ }
+ configuration.restore()
+
+ // Animating content if needed (Bug ID: #204)
+ if self.layoutIfNeededOnUpdate {
+ // Animating content (Bug ID: #160)
+ configuration.rootController?.view.setNeedsLayout()
+ configuration.rootController?.view.layoutIfNeeded()
+ }
+ })
+ // Restoring the contentOffset of the lastScrollView
+ if let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration {
+ let textInputView: (any IQTextInputView)? = activeConfiguration.textInputView
+
+ restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration, textInputView: textInputView)
+
+ activeConfiguration.animate(alongsideTransition: {
+ // This is temporary solution. Have to implement the save and restore scrollView state
+ self.restoreScrollViewContentOffset(superScrollView: lastConfiguration.scrollView,
+ textInputView: textInputView)
+ })
+ }
+
+ self.movedDistance = 0
+ }
+}
+
+// swiftlint:disable function_parameter_count
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardManager {
+
+ func getSpecialTextInputViewDistance(textInputView: some IQTextInputView) -> CGFloat {
+ // Maintain keyboardDistance
+ let specialKeyboardDistance: CGFloat
+
+ if let searchBar: UISearchBar = textInputView.iq.textFieldSearchBar() {
+ specialKeyboardDistance = searchBar.iq.distanceFromKeyboard
+ } else {
+ specialKeyboardDistance = textInputView.iq.distanceFromKeyboard
+ }
+
+ if specialKeyboardDistance == UIView.defaultKeyboardDistance {
+ return keyboardDistance
+ } else {
+ return specialKeyboardDistance
+ }
+ }
+
+ static func getKeyboardSize(keyboardDistance: CGFloat, keyboardFrame: CGRect,
+ safeAreaInsets: UIEdgeInsets, windowFrame: CGRect) -> CGSize {
+ let kbSize: CGSize
+ var kbFrame: CGRect = keyboardFrame
+
+ kbFrame.origin.y -= keyboardDistance
+ kbFrame.size.height += keyboardDistance
+
+ kbFrame.origin.y -= safeAreaInsets.bottom
+ kbFrame.size.height += safeAreaInsets.bottom
+
+ // (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506)
+ // Calculating actual keyboard covered size respect to window,
+ // keyboard frame may be different when hardware keyboard is attached
+ let intersectRect: CGRect = kbFrame.intersection(windowFrame)
+
+ if intersectRect.isNull {
+ kbSize = CGSize(width: kbFrame.size.width, height: 0)
+ } else {
+ kbSize = intersectRect.size
+ }
+ return kbSize
+ }
+
+ static private func getLayoutGuides(rootController: UIViewController, window: UIWindow,
+ isScrollableTextInputView: Bool) -> IQLayoutGuide {
+ let navigationBarAreaHeight: CGFloat
+ if let navigationController: UINavigationController = rootController.navigationController {
+ navigationBarAreaHeight = navigationController.navigationBar.frame.maxY
+ } else {
+ let statusBarHeight: CGFloat = window.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
+ navigationBarAreaHeight = statusBarHeight
+ }
+
+ let directionalLayoutMargin: NSDirectionalEdgeInsets = rootController.view.directionalLayoutMargins
+ let topLayoutGuide: CGFloat = CGFloat.maximum(navigationBarAreaHeight, directionalLayoutMargin.top)
+
+ // Validation of textInputView for case where there is a tab bar
+ // at the bottom or running on iPhone X and textInputView is at the bottom.
+ let bottomLayoutGuide: CGFloat = isScrollableTextInputView ? 0 : directionalLayoutMargin.bottom
+ return (topLayoutGuide, bottomLayoutGuide)
+ }
+
+ static private func getMoveUpDistance(keyboardSize: CGSize,
+ layoutGuide: IQLayoutGuide,
+ textInputViewRectInRootSuperview: CGRect,
+ textInputViewRectInWindow: CGRect,
+ windowFrame: CGRect) -> CGFloat {
+
+ // Move positive = textInputView is hidden.
+ // Move negative = textInputView is showing.
+ // Calculating move position.
+ let visibleHeight: CGFloat = windowFrame.height-keyboardSize.height
+
+ let topMovement: CGFloat = textInputViewRectInRootSuperview.minY-layoutGuide.top
+ let bottomMovement: CGFloat = textInputViewRectInWindow.maxY - visibleHeight + layoutGuide.bottom
+ var moveUp: CGFloat = CGFloat.minimum(topMovement, bottomMovement)
+ moveUp = CGFloat(Int(moveUp))
+ return moveUp
+ }
+
+ func setupActiveScrollViewConfiguration(superScrollView: UIScrollView?, textInputView: some IQTextInputView) {
+ // If there was a lastScrollView. // (Bug ID: #34)
+ guard let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration else {
+ if let superScrollView: UIScrollView = superScrollView {
+ // If there was no lastScrollView and we found a current scrollView. then setting it as lastScrollView.
+ let configuration = IQScrollViewConfiguration(scrollView: superScrollView,
+ canRestoreContentOffset: true)
+ self.lastScrollViewConfiguration = configuration
+ showLog("""
+ Saving ScrollView New contentInset: \(configuration.startingContentInset)
+ and contentOffset: \(configuration.startingContentOffset)
+ """)
+ }
+ return
+ }
+
+ // If we can't find current superScrollView, then setting lastScrollView to it's original form.
+ if superScrollView == nil {
+ restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration,
+ textInputView: textInputView)
+ self.lastScrollViewConfiguration = nil
+ } else if superScrollView != lastConfiguration.scrollView {
+ // If both scrollView's are different,
+ // then reset lastScrollView to it's original frame and setting current scrollView as last scrollView.
+ restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration,
+ textInputView: textInputView)
+
+ if let superScrollView = superScrollView {
+ let configuration = IQScrollViewConfiguration(scrollView: superScrollView,
+ canRestoreContentOffset: true)
+ self.lastScrollViewConfiguration = configuration
+ showLog("""
+ Saving ScrollView New contentInset: \(configuration.startingContentInset)
+ and contentOffset: \(configuration.startingContentOffset)
+ """)
+ } else {
+ self.lastScrollViewConfiguration = nil
+ }
+ }
+ // Else the case where superScrollView == lastScrollView means we are on same scrollView
+ // after switching to different textInputView. So doing nothing, going ahead
+ }
+
+ func restoreScrollViewConfigurationIfChanged(configuration: IQScrollViewConfiguration,
+ textInputView: (some IQTextInputView)?) {
+ guard configuration.hasChanged else { return }
+ if configuration.scrollView.contentInset != configuration.startingContentInset {
+ showLog("Restoring contentInset to: \(configuration.startingContentInset)")
+ }
+
+ if configuration.scrollView.iq.restoreContentOffset,
+ !configuration.scrollView.contentOffset.equalTo(configuration.startingContentOffset) {
+ showLog("Restoring contentOffset to: \(configuration.startingContentOffset)")
+ }
+
+ activeConfiguration.animate(alongsideTransition: {
+ configuration.restore(for: textInputView)
+ })
+ }
+
+ // swiftlint:disable function_body_length
+ private func adjustScrollViewContentOffsets(moveUp: inout CGFloat, textInputView: some IQTextInputView,
+ lastScrollViewConfiguration: IQScrollViewConfiguration,
+ rootSuperview: UIView?,
+ layoutGuide: IQLayoutGuide,
+ textInputViewRectInRootSuperview: CGRect,
+ isScrollableTextInputView: Bool, window: UIWindow,
+ kbSize: CGSize, keyboardDistance: CGFloat,
+ rootBeginSafeAreaInsets: UIEdgeInsets) {
+ // Saving
+ var lastView: UIView = textInputView
+ var superScrollView: UIScrollView? = lastScrollViewConfiguration.scrollView
+
+ while let scrollView: UIScrollView = superScrollView {
+
+ var isContinue: Bool = false
+
+ if moveUp > 0 {
+ isContinue = moveUp > (-scrollView.contentOffset.y - scrollView.contentInset.top)
+
+ } else if let tableView: UITableView = scrollView.iq.superviewOf(type: UITableView.self) {
+ // Special treatment for UITableView due to their cell reusing logic
+
+ isContinue = scrollView.contentOffset.y > 0
+
+ Self.handleTableViewCase(moveUp: &moveUp, isContinue: isContinue, textInputView: textInputView,
+ tableView: tableView, rootSuperview: rootSuperview, layoutGuide: layoutGuide)
+ } else if let collectionView = scrollView.iq.superviewOf(type: UICollectionView.self) {
+ // Special treatment for UICollectionView due to their cell reusing logic
+
+ isContinue = scrollView.contentOffset.y > 0
+
+ Self.handleCollectionViewCase(moveUp: &moveUp, isContinue: isContinue,
+ textInputView: textInputView, collectionView: collectionView,
+ rootSuperview: rootSuperview, layoutGuide: layoutGuide)
+ } else {
+ isContinue = textInputViewRectInRootSuperview.minY < layoutGuide.top
+
+ if isContinue {
+ moveUp = CGFloat.minimum(0, textInputViewRectInRootSuperview.minY - layoutGuide.top)
+ }
+ }
+
+ // Looping in upper hierarchy until we don't found any scrollView
+ // in it's upper hierarchy till UIWindow object.
+ if isContinue {
+
+ var tempScrollView: UIScrollView? = scrollView.iq.superviewOf(type: UIScrollView.self)
+ var nextScrollView: UIScrollView?
+ while let view: UIScrollView = tempScrollView {
+
+ if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment {
+ nextScrollView = view
+ break
+ } else {
+ tempScrollView = view.iq.superviewOf(type: UIScrollView.self)
+ }
+ }
+
+ // Getting lastViewRect.
+ if let lastViewRect: CGRect = lastView.superview?.convert(lastView.frame, to: scrollView) {
+
+ // Calculating the expected Y offset from move and scrollView's contentOffset.
+ let minimumMovement: CGFloat = CGFloat.minimum(scrollView.contentOffset.y, -moveUp)
+ var suggestedOffsetY: CGFloat = scrollView.contentOffset.y - minimumMovement
+
+ // Rearranging the expected Y offset according to the view.
+ suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, lastViewRect.minY)
+
+ updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: &suggestedOffsetY, moveUp: &moveUp,
+ isScrollableTextInputView: isScrollableTextInputView,
+ nextScrollView: nextScrollView, textInputView: textInputView,
+ window: window, layoutGuide: layoutGuide,
+ scrollViewContentOffset: scrollView.contentOffset)
+
+ let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: suggestedOffsetY)
+
+ if !scrollView.contentOffset.equalTo(newContentOffset) {
+
+ updateScrollViewContentOffset(scrollView: scrollView, newContentOffset: newContentOffset,
+ moveUp: moveUp, textInputView: textInputView)
+ }
+ }
+
+ // Getting next lastView & superScrollView.
+ lastView = scrollView
+ superScrollView = nextScrollView
+ } else {
+ moveUp = 0
+ break
+ }
+ }
+
+ adjustScrollViewContentInset(lastScrollViewConfiguration: lastScrollViewConfiguration, window: window,
+ kbSize: kbSize, keyboardDistance: keyboardDistance,
+ rootBeginSafeAreaInsets: rootBeginSafeAreaInsets)
+ }
+ // swiftlint:enable function_body_length
+
+ private static func handleTableViewCase(moveUp: inout CGFloat, isContinue: Bool,
+ textInputView: some IQTextInputView, tableView: UITableView,
+ rootSuperview: UIView?, layoutGuide: IQLayoutGuide) {
+ guard isContinue,
+ let tableCell: UITableViewCell = textInputView.iq.superviewOf(type: UITableViewCell.self),
+ let indexPath: IndexPath = tableView.indexPath(for: tableCell),
+ let previousIndexPath: IndexPath = tableView.previousIndexPath(of: indexPath) else { return }
+
+ let previousCellRect: CGRect = tableView.rectForRow(at: previousIndexPath)
+ guard !previousCellRect.isEmpty else { return }
+
+ let previousCellRectInRootSuperview: CGRect = tableView.convert(previousCellRect,
+ to: rootSuperview)
+
+ moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top)
+ }
+
+ private static func handleCollectionViewCase(moveUp: inout CGFloat, isContinue: Bool,
+ textInputView: some IQTextInputView, collectionView: UICollectionView,
+ rootSuperview: UIView?,
+ layoutGuide: IQLayoutGuide) {
+ guard isContinue,
+ let collectionCell = textInputView.iq.superviewOf(type: UICollectionViewCell.self),
+ let indexPath: IndexPath = collectionView.indexPath(for: collectionCell),
+ let previousIndexPath: IndexPath = collectionView.previousIndexPath(of: indexPath),
+ let attributes = collectionView.layoutAttributesForItem(at: previousIndexPath) else { return }
+
+ let previousCellRect: CGRect = attributes.frame
+ guard !previousCellRect.isEmpty else { return }
+ let previousCellRectInRootSuperview: CGRect = collectionView.convert(previousCellRect,
+ to: rootSuperview)
+
+ moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top)
+ }
+
+ private func updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: inout CGFloat, moveUp: inout CGFloat,
+ isScrollableTextInputView: Bool, nextScrollView: UIScrollView?,
+ textInputView: some IQTextInputView, window: UIWindow,
+ layoutGuide: IQLayoutGuide,
+ scrollViewContentOffset: CGPoint) {
+ // If is a UITextView type
+ // nextScrollView == nil
+ // If processing scrollView is last scrollView in upper hierarchy
+ // (there is no other scrollView in upper hierarchy.)
+ //
+ // suggestedOffsetY >= 0
+ // suggestedOffsetY must be >= 0 in order to keep distance from navigationBar (Bug ID: #92)
+ guard isScrollableTextInputView,
+ nextScrollView == nil,
+ suggestedOffsetY >= 0,
+ let superview: UIView = textInputView.superview else {
+ // Subtracting the Y offset from the move variable,
+ // because we are going to change scrollView's contentOffset.y to suggestedOffsetY.
+ moveUp -= (suggestedOffsetY-scrollViewContentOffset.y)
+ return
+ }
+
+ let currentTextInputViewRect: CGRect = superview.convert(textInputView.frame,
+ to: window)
+
+ // Calculating expected fix distance which needs to be managed from navigation bar
+ let expectedFixDistance: CGFloat = currentTextInputViewRect.minY - layoutGuide.top
+
+ // Now if expectedOffsetY (scrollView.contentOffset.y + expectedFixDistance)
+ // is lower than current suggestedOffsetY, which means we're in a position where
+ // navigationBar up and hide, then reducing suggestedOffsetY with expectedOffsetY
+ // (scrollView.contentOffset.y + expectedFixDistance)
+ let expectedOffsetY: CGFloat = scrollViewContentOffset.y + expectedFixDistance
+ suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, expectedOffsetY)
+
+ // Setting move to 0 because now we don't want to move any view anymore
+ // (All will be managed by our contentInset logic.
+ moveUp = 0
+ }
+
+ func updateScrollViewContentOffset(scrollView: UIScrollView, newContentOffset: CGPoint,
+ moveUp: CGFloat, textInputView: some IQTextInputView) {
+ showLog("""
+ old contentOffset: \(scrollView.contentOffset)
+ new contentOffset: \(newContentOffset)
+ """)
+ showLog("Remaining Move: \(moveUp)")
+
+ // Getting problem while using `setContentOffset:animated:`, So I used animation API.
+ activeConfiguration.animate(alongsideTransition: {
+
+ // (Bug ID: #1365, #1508, #1541)
+ let stackView: UIStackView? = textInputView.iq.superviewOf(type: UIStackView.self,
+ belowView: scrollView)
+ // (Bug ID: #1901, #1996)
+ let animatedContentOffset: Bool = stackView != nil ||
+ scrollView is UICollectionView ||
+ scrollView is UITableView
+
+ if animatedContentOffset {
+ scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
+ } else {
+ scrollView.contentOffset = newContentOffset
+ }
+ }, completion: {
+
+ if scrollView is UITableView || scrollView is UICollectionView {
+ // This will update the next/previous states
+ textInputView.reloadInputViews()
+ }
+ })
+ }
+
+ func adjustScrollViewContentInset(lastScrollViewConfiguration: IQScrollViewConfiguration,
+ window: UIWindow, kbSize: CGSize, keyboardDistance: CGFloat,
+ rootBeginSafeAreaInsets: UIEdgeInsets) {
+
+ let lastScrollView = lastScrollViewConfiguration.scrollView
+
+ guard let lastScrollViewRect: CGRect = lastScrollView.superview?.convert(lastScrollView.frame, to: window),
+ !lastScrollView.iq.ignoreContentInsetAdjustment else { return }
+
+ // Updating contentInset
+ var bottomInset: CGFloat = (kbSize.height)-(window.frame.height-lastScrollViewRect.maxY)
+ let keyboardAndSafeArea: CGFloat = keyboardDistance + rootBeginSafeAreaInsets.bottom
+ var bottomScrollIndicatorInset: CGFloat = bottomInset - keyboardAndSafeArea
+
+ // Update the insets so that the scrollView doesn't shift incorrectly
+ // when the offset is near the bottom of the scroll view.
+ bottomInset = CGFloat.maximum(lastScrollViewConfiguration.startingContentInset.bottom, bottomInset)
+ let startingScrollInset: UIEdgeInsets = lastScrollViewConfiguration.startingScrollIndicatorInsets
+ bottomScrollIndicatorInset = CGFloat.maximum(startingScrollInset.bottom,
+ bottomScrollIndicatorInset)
+
+ bottomInset -= lastScrollView.safeAreaInsets.bottom
+ bottomScrollIndicatorInset -= lastScrollView.safeAreaInsets.bottom
+
+ var movedInsets: UIEdgeInsets = lastScrollView.contentInset
+ movedInsets.bottom = bottomInset
+
+ guard lastScrollView.contentInset != movedInsets else { return }
+ showLog("""
+ old ContentInset: \(lastScrollView.contentInset) new ContentInset: \(movedInsets)
+ """)
+
+ activeConfiguration.animate(alongsideTransition: {
+ lastScrollView.contentInset = movedInsets
+ lastScrollView.layoutIfNeeded() // (Bug ID: #1996)
+
+ var newScrollIndicatorInset: UIEdgeInsets = lastScrollView.verticalScrollIndicatorInsets
+
+ newScrollIndicatorInset.bottom = bottomScrollIndicatorInset
+ lastScrollView.scrollIndicatorInsets = newScrollIndicatorInset
+ })
+ }
+
+ private func adjustTextInputViewContentInset(window: UIWindow, originalKbSize: CGSize,
+ rootSuperview: UIView?,
+ layoutGuide: IQLayoutGuide,
+ textInputView: UIScrollView) {
+ let keyboardYPosition: CGFloat = window.frame.height - originalKbSize.height
+ var rootSuperViewFrameInWindow: CGRect = window.frame
+ if let rootSuperview: UIView = rootSuperview {
+ rootSuperViewFrameInWindow = rootSuperview.convert(rootSuperview.bounds, to: window)
+ }
+
+ let keyboardOverlapping: CGFloat = rootSuperViewFrameInWindow.maxY - keyboardYPosition
+
+ let availableHeight: CGFloat = rootSuperViewFrameInWindow.height-layoutGuide.top-keyboardOverlapping
+ let textInputViewHeight: CGFloat = CGFloat.minimum(textInputView.frame.height, availableHeight)
+
+ guard textInputView.frame.size.height-textInputView.contentInset.bottom>textInputViewHeight else { return }
+ // If frame is not change by library in past, then saving user textInputView properties (Bug ID: #92)
+ if startingTextViewConfiguration == nil {
+ startingTextViewConfiguration = IQScrollViewConfiguration(scrollView: textInputView,
+ canRestoreContentOffset: false)
+ }
+
+ var newContentInset: UIEdgeInsets = textInputView.contentInset
+ newContentInset.bottom = textInputView.frame.size.height-textInputViewHeight
+ newContentInset.bottom -= textInputView.safeAreaInsets.bottom
+
+ guard textInputView.contentInset != newContentInset else { return }
+ showLog("""
+ \(textInputView) Old textInputView.contentInset: \(textInputView.contentInset)
+ New textInputView.contentInset: \(newContentInset)
+ """)
+
+ activeConfiguration.animate(alongsideTransition: {
+
+ textInputView.contentInset = newContentInset
+ textInputView.layoutIfNeeded() // (Bug ID: #1996)
+ textInputView.scrollIndicatorInsets = newContentInset
+ })
+ }
+
+ func adjustRootController(moveUp: CGFloat, rootViewOrigin: CGPoint, originalKbSize: CGSize,
+ rootController: UIViewController, rootBeginOrigin: CGPoint) {
+ // +Positive or zero.
+ var rootViewOrigin: CGPoint = rootViewOrigin
+ if moveUp >= 0 {
+
+ rootViewOrigin.y = CGFloat.maximum(rootViewOrigin.y - moveUp, CGFloat.minimum(0, -originalKbSize.height))
+
+ if !rootController.view.frame.origin.equalTo(rootViewOrigin) {
+ showLog("Moving Upward")
+
+ activeConfiguration.animate(alongsideTransition: {
+
+ var rect: CGRect = rootController.view.frame
+ rect.origin = rootViewOrigin
+ rootController.view.frame = rect
+
+ // Animating content if needed (Bug ID: #204)
+ if self.layoutIfNeededOnUpdate {
+ // Animating content (Bug ID: #160)
+ rootController.view.setNeedsLayout()
+ rootController.view.layoutIfNeeded()
+ }
+
+ let classNameString: String = "\(type(of: rootController.self))"
+ self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)")
+ })
+ }
+
+ movedDistance = rootBeginOrigin.y-rootViewOrigin.y
+ } else { // -Negative
+ let disturbDistance: CGFloat = rootViewOrigin.y-rootBeginOrigin.y
+
+ // disturbDistance Negative = frame disturbed.
+ // disturbDistance positive = frame not disturbed.
+ if disturbDistance <= 0 {
+
+ rootViewOrigin.y -= CGFloat.maximum(moveUp, disturbDistance)
+
+ if !rootController.view.frame.origin.equalTo(rootViewOrigin) {
+ showLog("Moving Downward")
+ // Setting adjusted rootViewRect
+ // Setting adjusted rootViewRect
+
+ activeConfiguration.animate(alongsideTransition: {
+
+ var rect: CGRect = rootController.view.frame
+ rect.origin = rootViewOrigin
+ rootController.view.frame = rect
+
+ // Animating content if needed (Bug ID: #204)
+ if self.layoutIfNeededOnUpdate {
+ // Animating content (Bug ID: #160)
+ rootController.view.setNeedsLayout()
+ rootController.view.layoutIfNeeded()
+ }
+
+ let classNameString: String = "\(type(of: rootController.self))"
+ self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)")
+ })
+ }
+
+ movedDistance = rootBeginOrigin.y-rootViewOrigin.y
+ }
+ }
+ }
+
+ func restoreScrollViewContentOffset(superScrollView: UIScrollView, textInputView: (some IQTextInputView)?) {
+ var superScrollView: UIScrollView? = superScrollView
+ while let scrollView: UIScrollView = superScrollView {
+
+ let width: CGFloat = CGFloat.maximum(scrollView.contentSize.width, scrollView.frame.width)
+ let height: CGFloat = CGFloat.maximum(scrollView.contentSize.height, scrollView.frame.height)
+ let contentSize: CGSize = CGSize(width: width, height: height)
+
+ let minimumY: CGFloat = contentSize.height - scrollView.frame.height
+
+ if minimumY < scrollView.contentOffset.y {
+
+ let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: minimumY)
+ if !scrollView.contentOffset.equalTo(newContentOffset) {
+
+ // (Bug ID: #1365, #1508, #1541)
+ let stackView: UIStackView?
+ if let textInputView: UIView = textInputView {
+ stackView = textInputView.iq.superviewOf(type: UIStackView.self,
+ belowView: scrollView)
+ } else {
+ stackView = nil
+ }
+
+ // (Bug ID: #1901, #1996)
+ let animatedContentOffset: Bool = stackView != nil ||
+ scrollView is UICollectionView ||
+ scrollView is UITableView
+
+ if animatedContentOffset {
+ scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
+ } else {
+ scrollView.contentOffset = newContentOffset
+ }
+
+ showLog("Restoring contentOffset to: \(newContentOffset)")
+ }
+ }
+
+ superScrollView = scrollView.iq.superviewOf(type: UIScrollView.self)
+ }
+ }
+}
+// swiftlint:enable function_parameter_count
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift
new file mode 100644
index 0000000..b6f232f
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift
@@ -0,0 +1,133 @@
+//
+// IQKeyboardManager.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/**
+Code-less drop-in universal library allows to prevent issues of keyboard sliding up and cover TextInputView.
+ Neither need to write any code nor any setup required and much more.
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardManager: NSObject {
+
+ /**
+ Returns the default singleton instance.
+ */
+ @MainActor
+ public static let shared: IQKeyboardManager = .init()
+
+ internal var activeConfiguration: IQActiveConfiguration = .init()
+
+ // MARK: UIKeyboard handling
+
+ /**
+ Enable/disable managing distance between keyboard and textInputView.
+ Default is YES(Enabled when class loads in `+(void)load` method).
+ */
+ public var isEnabled: Bool = false {
+ didSet {
+ guard isEnabled != oldValue else { return }
+ // If not enable, enable it.
+ if isEnabled {
+ // If keyboard is currently showing.
+ if activeConfiguration.keyboardInfo.isVisible {
+ adjustPosition()
+ } else {
+ restorePosition()
+ }
+ showLog("Enabled")
+ } else { // If not disable, disable it.
+ restorePosition()
+ showLog("Disabled")
+ }
+ }
+ }
+
+ /**
+ To set keyboard distance from textInputView. can't be less than zero. Default is 10.0.
+ */
+ public var keyboardDistance: CGFloat = 10.0
+
+ /*******************************************/
+
+ // MARK: UIAnimation handling
+
+ /**
+ If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view.
+ */
+ public var layoutIfNeededOnUpdate: Bool = false
+
+ // MARK: Class Level disabling methods
+
+ /**
+ Disable distance handling within the scope of disabled distance handling viewControllers classes.
+ Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController.
+ */
+ public var disabledDistanceHandlingClasses: [UIViewController.Type] = [
+ UITableViewController.self,
+ UIInputViewController.self,
+ UIAlertController.self
+ ]
+
+ /**
+ Enable distance handling within the scope of enabled distance handling viewControllers classes.
+ Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController.
+ If same Class is added in disabledDistanceHandlingClasses list,
+ then enabledDistanceHandlingClasses will be ignored.
+ */
+ public var enabledDistanceHandlingClasses: [UIViewController.Type] = []
+
+ /**************************************************************************************/
+
+ // MARK: Initialization/De-initialization
+
+ /* Singleton Object Initialization. */
+ private override init() {
+
+ super.init()
+
+ self.addActiveConfigurationObserver()
+
+ NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)),
+ name: UIApplication.didBecomeActiveNotification, object: nil)
+ }
+
+ deinit {
+ // Disable the keyboard manager.
+ isEnabled = false
+ }
+
+ // MARK: Public Methods
+
+ /* Refreshes textInputView position if any external changes is explicitly made by user. */
+ public func reloadLayoutIfNeeded() {
+
+ guard privateIsEnabled(),
+ activeConfiguration.keyboardInfo.isVisible,
+ activeConfiguration.isReady else {
+ return
+ }
+ adjustPosition()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift
new file mode 100644
index 0000000..91c2534
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift
@@ -0,0 +1,118 @@
+//
+// UIScrollView+IQKeyboardManagerExtension.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+ static var ignoreScrollingAdjustment: Int = 0
+ static var ignoreContentInsetAdjustment: Int = 0
+ static var restoreContentOffset: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIScrollView {
+
+ /**
+ If YES, then scrollview will ignore scrolling (simply not scroll it) for adjusting textInputView position.
+ Default is NO.
+ */
+ var ignoreScrollingAdjustment: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+
+ /**
+ If YES, then scrollview will ignore content inset adjustment (simply not updating it) when keyboard is shown.
+ Default is NO.
+ */
+ var ignoreContentInsetAdjustment: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+
+ /**
+ If we should restore scrollView contentOffset to it's initial position
+ */
+ var restoreContentOffset: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.restoreContentOffset) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.restoreContentOffset,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIScrollView {
+ @available(*, unavailable, renamed: "iq.ignoreScrollingAdjustment")
+ var shouldIgnoreScrollingAdjustment: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "iq.ignoreContentInsetAdjustment")
+ var shouldIgnoreContentInsetAdjustment: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "iq.restoreContentOffset")
+ var shouldRestoreScrollViewContentOffset: Bool {
+ get { false }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift
new file mode 100644
index 0000000..7a7c4b4
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift
@@ -0,0 +1,46 @@
+//
+// UIScrollView+IQKeyboardManagerExtensionObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UIScrollView {
+
+ var iq_ignoreScrollingAdjustment: Bool {
+ get { iq.ignoreScrollingAdjustment }
+ set { iq.ignoreScrollingAdjustment = newValue }
+ }
+
+ var iq_ignoreContentInsetAdjustment: Bool {
+ get { iq.ignoreContentInsetAdjustment }
+ set { iq.ignoreContentInsetAdjustment = newValue }
+ }
+
+ var iq_restoreContentOffset: Bool {
+ get { iq.restoreContentOffset }
+ set { iq.restoreContentOffset = newValue }
+ }
+}
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift
new file mode 100644
index 0000000..57fb2c8
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift
@@ -0,0 +1,106 @@
+//
+// UIView+IQKeyboardManagerExtension.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+ static var distanceFromKeyboard: Int = 0
+ static var enableMode: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+ nonisolated static let defaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude
+}
+
+@available(iOSApplicationExtension, unavailable)
+@available(*, unavailable, renamed: "UIView.defaultKeyboardDistance")
+nonisolated public let kIQUseDefaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude
+
+/**
+ TextInputView category for managing distance handling
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+ /**
+ To set customized distance from keyboard for textInputView. Can't be less than zero
+ */
+ var distanceFromKeyboard: CGFloat {
+ get {
+ if let base = base {
+ if let value = objc_getAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard) as? CGFloat {
+ return value
+ }
+ }
+ return UIView.defaultKeyboardDistance
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+
+ /**
+ Override Enable/disable managing distance between
+ keyboard and textInputView behavior for this particular textInputView.
+ */
+ var enableMode: IQEnableMode {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.enableMode) as? IQEnableMode ?? .default
+ }
+ return .default
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.enableMode, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+ @available(*, unavailable, renamed: "iq.distanceFromKeyboard")
+ var keyboardDistanceFromTextField: CGFloat {
+ get { 0 }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "iq.enableMode")
+ var enableMode: IQEnableMode {
+ get { .default }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift
new file mode 100644
index 0000000..84b52c8
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift
@@ -0,0 +1,55 @@
+//
+// UIView+IQKeyboardManagerExtensionObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+ var iq_distanceFromKeyboard: CGFloat {
+ get { iq.distanceFromKeyboard }
+ set { iq.distanceFromKeyboard = newValue }
+ }
+
+ var iq_enableMode: IQEnableMode {
+ get { iq.enableMode }
+ set { iq.enableMode = newValue }
+ }
+}
+
+@objc public extension UITextView {
+
+ var iq_distanceFromKeyboard: CGFloat {
+ get { iq.distanceFromKeyboard }
+ set { iq.distanceFromKeyboard = newValue }
+ }
+
+ var iq_enableMode: IQEnableMode {
+ get { iq.enableMode }
+ set { iq.enableMode = newValue }
+ }
+}
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift
new file mode 100644
index 0000000..99238ad
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift
@@ -0,0 +1,45 @@
+//
+// UICollectionView+IndexPaths.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension UICollectionView {
+
+ func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
+ var previousRow: Int = indexPath.row - 1
+ var previousSection: Int = indexPath.section
+
+ // Fixing indexPath
+ if previousRow < 0 {
+ previousSection -= 1
+ if previousSection >= 0 {
+ previousRow = self.numberOfItems(inSection: previousSection) - 1
+ }
+ }
+
+ guard previousRow >= 0, previousSection >= 0 else { return nil }
+ return IndexPath(item: previousRow, section: previousSection)
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift
new file mode 100644
index 0000000..5b61fa8
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift
@@ -0,0 +1,45 @@
+//
+// UITableView+IndexPaths.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension UITableView {
+
+ func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
+ var previousRow: Int = indexPath.row - 1
+ var previousSection: Int = indexPath.section
+
+ // Fixing indexPath
+ if previousRow < 0 {
+ previousSection -= 1
+ if previousSection >= 0 {
+ previousRow = self.numberOfRows(inSection: previousSection) - 1
+ }
+ }
+
+ guard previousRow >= 0, previousSection >= 0 else { return nil }
+ return IndexPath(row: previousRow, section: previousSection)
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift
new file mode 100644
index 0000000..cf2e63c
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift
@@ -0,0 +1,99 @@
+//
+// UIView+Parent.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+/**
+UIView hierarchy category.
+*/
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+ /**
+ Returns the UIViewController object that is actually the parent of this object.
+ Most of the time it's the viewController object which actually contains it,
+ but result may be different if it's viewController is added as childViewController of another viewController.
+ */
+ func parentContainerViewController() -> UIViewController? {
+
+ var matchController: UIViewController? = viewContainingController()
+ var parentContainerViewController: UIViewController?
+
+ if var navController: UINavigationController = matchController?.navigationController {
+
+ while let parentNav: UINavigationController = navController.navigationController {
+ navController = parentNav
+ }
+
+ var parentController: UIViewController = navController
+
+ while let parent: UIViewController = parentController.parent,
+ !(parent is UINavigationController) &&
+ !(parent is UITabBarController) &&
+ !(parent is UISplitViewController) {
+
+ parentController = parent
+ }
+
+ if navController == parentController {
+ parentContainerViewController = navController.topViewController
+ } else {
+ parentContainerViewController = parentController
+ }
+ } else if let tabController: UITabBarController = matchController?.tabBarController {
+ let selectedController = tabController.selectedViewController
+ if let navController: UINavigationController = selectedController as? UINavigationController {
+ parentContainerViewController = navController.topViewController
+ } else {
+ parentContainerViewController = tabController.selectedViewController
+ }
+ } else {
+ while let parent: UIViewController = matchController?.parent,
+ !(parent is UINavigationController) &&
+ !(parent is UITabBarController) &&
+ !(parent is UISplitViewController) {
+
+ matchController = parent
+ }
+
+ parentContainerViewController = matchController
+ }
+
+ if let controller: UIViewController = parentContainerViewController?.iq_parentContainerViewController() {
+ return controller
+ } else {
+ return parentContainerViewController
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+ @available(*, unavailable, renamed: "iq.parentContainerViewController()")
+ func parentContainerViewController() -> UIViewController? { nil }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift
new file mode 100644
index 0000000..9c0730e
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift
@@ -0,0 +1,31 @@
+//
+// UIView+ParentObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@objc public extension UIView {
+
+ func iq_parentContainerViewController() -> UIViewController? {
+ iq.parentContainerViewController()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift
new file mode 100644
index 0000000..7fc96a9
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift
@@ -0,0 +1,49 @@
+//
+// UIViewController+ParentContainer.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UIViewController {
+
+ /**
+ This method is provided to override by viewController's
+ if the library lifts a viewController which you doesn't want to lift.
+ This may happen if you have implemented side menu feature
+ in your app and the library try to lift the side menu controller.
+ Overriding this method in side menu class to return correct controller should fix the problem.
+ */
+ open func iq_parentContainerViewController() -> UIViewController? {
+ return self
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UIViewController {
+ @available(*, unavailable, renamed: "iq_parentContainerViewController()")
+ open func parentIQContainerViewController() -> UIViewController? {
+ return self
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardReturnKeyHandler.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardReturnKeyHandler.swift
deleted file mode 100644
index 48ba38c..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardReturnKeyHandler.swift
+++ /dev/null
@@ -1,695 +0,0 @@
-//
-// IQKeyboardReturnKeyHandler.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-private final class IQTextFieldViewInfoModal: NSObject {
-
- fileprivate weak var textFieldDelegate: UITextFieldDelegate?
- fileprivate weak var textViewDelegate: UITextViewDelegate?
- fileprivate weak var textFieldView: UIView?
- fileprivate let originalReturnKeyType: UIReturnKeyType
-
- init(textField: UITextField) {
- self.textFieldView = textField
- self.textFieldDelegate = textField.delegate
- self.originalReturnKeyType = textField.returnKeyType
- }
-
- init(textView: UITextView) {
- self.textFieldView = textView
- self.textViewDelegate = textView.delegate
- self.originalReturnKeyType = textView.returnKeyType
- }
-
- func restore() {
- if let textField = textFieldView as? UITextField {
- textField.returnKeyType = originalReturnKeyType
- textField.delegate = textFieldDelegate
- } else if let textView = textFieldView as? UITextView {
- textView.returnKeyType = originalReturnKeyType
- textView.delegate = textViewDelegate
- }
- }
-}
-
-/**
-Manages the return key to work like next/done in a view hierarchy.
-*/
-@available(iOSApplicationExtension, unavailable)
-@objc public final class IQKeyboardReturnKeyHandler: NSObject {
-
- // MARK: Settings
-
- /**
- Delegate of textField/textView.
- */
- @objc public weak var delegate: (UITextFieldDelegate & UITextViewDelegate)?
-
- /**
- Set the last textfield return key type. Default is UIReturnKeyDefault.
- */
- @objc public var lastTextFieldReturnKeyType: UIReturnKeyType = UIReturnKeyType.default {
-
- didSet {
-
- for model in textFieldInfoCache {
-
- if let view = model.textFieldView {
- updateReturnKeyTypeOnTextField(view)
- }
- }
- }
- }
-
- // MARK: Initialization/Deinitialization
-
- @objc public override init() {
- super.init()
- }
-
- /**
- Add all the textFields available in UIViewController's view.
- */
- @objc public init(controller: UIViewController) {
- super.init()
-
- addResponderFromView(controller.view)
- }
-
- deinit {
-
-// for model in textFieldInfoCache {
-// model.restore()
-// }
-
- textFieldInfoCache.removeAll()
- }
-
- // MARK: Private variables
- private var textFieldInfoCache = [IQTextFieldViewInfoModal]()
-
- // MARK: Private Functions
- private func textFieldViewCachedInfo(_ textField: UIView) -> IQTextFieldViewInfoModal? {
-
- for model in textFieldInfoCache {
-
- if let view = model.textFieldView {
-
- if view == textField {
- return model
- }
- }
- }
-
- return nil
- }
-
- private func updateReturnKeyTypeOnTextField(_ view: UIView) {
- var superConsideredView: UIView?
-
- // If find any consider responderView in it's upper hierarchy then will get deepResponderView. (Bug ID: #347)
- for disabledClass in IQKeyboardManager.shared.toolbarPreviousNextAllowedClasses {
-
- superConsideredView = view.superviewOfClassType(disabledClass)
-
- if superConsideredView != nil {
- break
- }
- }
-
- var textFields = [UIView]()
-
- // If there is a tableView in view's hierarchy, then fetching all it's subview that responds.
- if let unwrappedTableView = superConsideredView { // (Enhancement ID: #22)
- textFields = unwrappedTableView.deepResponderViews()
- } else { // Otherwise fetching all the siblings
-
- textFields = view.responderSiblings()
-
- // Sorting textFields according to behaviour
- switch IQKeyboardManager.shared.toolbarManageBehaviour {
- // If needs to sort it by tag
- case .byTag: textFields = textFields.sortedArrayByTag()
- // If needs to sort it by Position
- case .byPosition: textFields = textFields.sortedArrayByPosition()
- default: break
- }
- }
-
- if let lastView = textFields.last {
-
- if let textField = view as? UITextField {
-
- // If it's the last textField in responder view, else next
- textField.returnKeyType = (view == lastView) ? lastTextFieldReturnKeyType: UIReturnKeyType.next
- } else if let textView = view as? UITextView {
-
- // If it's the last textField in responder view, else next
- textView.returnKeyType = (view == lastView) ? lastTextFieldReturnKeyType: UIReturnKeyType.next
- }
- }
- }
-
- // MARK: Registering/Unregistering textFieldView
-
- /**
- Should pass UITextField/UITextView intance. Assign textFieldView delegate to self, change it's returnKeyType.
-
- @param view UITextField/UITextView object to register.
- */
- @objc public func addTextFieldView(_ view: UIView) {
-
- if let textField = view as? UITextField {
- let model = IQTextFieldViewInfoModal(textField: textField)
- textFieldInfoCache.append(model)
- textField.delegate = self
-
- } else if let textView = view as? UITextView {
- let model = IQTextFieldViewInfoModal(textView: textView)
- textFieldInfoCache.append(model)
- textView.delegate = self
- }
- }
-
- /**
- Should pass UITextField/UITextView intance. Restore it's textFieldView delegate and it's returnKeyType.
-
- @param view UITextField/UITextView object to unregister.
- */
- @objc public func removeTextFieldView(_ view: UIView) {
-
- if let model = textFieldViewCachedInfo(view) {
- model.restore()
-
- if let index = textFieldInfoCache.firstIndex(where: { $0.textFieldView == view}) {
- textFieldInfoCache.remove(at: index)
- }
- }
- }
-
- /**
- Add all the UITextField/UITextView responderView's.
-
- @param view UIView object to register all it's responder subviews.
- */
- @objc public func addResponderFromView(_ view: UIView) {
-
- let textFields = view.deepResponderViews()
-
- for textField in textFields {
-
- addTextFieldView(textField)
- }
- }
-
- /**
- Remove all the UITextField/UITextView responderView's.
-
- @param view UIView object to unregister all it's responder subviews.
- */
- @objc public func removeResponderFromView(_ view: UIView) {
-
- let textFields = view.deepResponderViews()
-
- for textField in textFields {
-
- removeTextFieldView(textField)
- }
- }
-
- @discardableResult private func goToNextResponderOrResign(_ view: UIView) -> Bool {
-
- var superConsideredView: UIView?
-
- // If find any consider responderView in it's upper hierarchy then will get deepResponderView. (Bug ID: #347)
- for disabledClass in IQKeyboardManager.shared.toolbarPreviousNextAllowedClasses {
-
- superConsideredView = view.superviewOfClassType(disabledClass)
-
- if superConsideredView != nil {
- break
- }
- }
-
- var textFields = [UIView]()
-
- // If there is a tableView in view's hierarchy, then fetching all it's subview that responds.
- if let unwrappedTableView = superConsideredView { // (Enhancement ID: #22)
- textFields = unwrappedTableView.deepResponderViews()
- } else { // Otherwise fetching all the siblings
-
- textFields = view.responderSiblings()
-
- // Sorting textFields according to behaviour
- switch IQKeyboardManager.shared.toolbarManageBehaviour {
- // If needs to sort it by tag
- case .byTag: textFields = textFields.sortedArrayByTag()
- // If needs to sort it by Position
- case .byPosition: textFields = textFields.sortedArrayByPosition()
- default:
- break
- }
- }
-
- // Getting index of current textField.
- if let index = textFields.firstIndex(of: view) {
- // If it is not last textField. then it's next object becomeFirstResponder.
- if index < (textFields.count - 1) {
-
- let nextTextField = textFields[index+1]
- nextTextField.becomeFirstResponder()
- return false
- } else {
-
- view.resignFirstResponder()
- return true
- }
- } else {
- return true
- }
- }
-}
-
-// MARK: UITextFieldDelegate
-@available(iOSApplicationExtension, unavailable)
-extension IQKeyboardReturnKeyHandler: UITextFieldDelegate {
-
- @objc public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(textField)?.textFieldDelegate {
- if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textFieldShouldBeginEditing(_:))) {
- return unwrapDelegate.textFieldShouldBeginEditing?(textField) ?? false
- }
- }
- }
-
- return true
- }
-
- @objc public func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(textField)?.textFieldDelegate {
- if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:))) {
- return unwrapDelegate.textFieldShouldEndEditing?(textField) ?? false
- }
- }
- }
-
- return true
- }
-
- @objc public func textFieldDidBeginEditing(_ textField: UITextField) {
- updateReturnKeyTypeOnTextField(textField)
-
- var aDelegate: UITextFieldDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textField) {
- aDelegate = model.textFieldDelegate
- }
- }
-
- aDelegate?.textFieldDidBeginEditing?(textField)
- }
-
- @objc public func textFieldDidEndEditing(_ textField: UITextField) {
-
- var aDelegate: UITextFieldDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textField) {
- aDelegate = model.textFieldDelegate
- }
- }
-
- aDelegate?.textFieldDidEndEditing?(textField)
- }
-
- @objc public func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
-
- var aDelegate: UITextFieldDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textField) {
- aDelegate = model.textFieldDelegate
- }
- }
-
- aDelegate?.textFieldDidEndEditing?(textField, reason: reason)
- }
-
- @objc public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(textField)?.textFieldDelegate {
- if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textField(_:shouldChangeCharactersIn:replacementString:))) {
- return unwrapDelegate.textField?(textField, shouldChangeCharactersIn: range, replacementString: string) ?? false
- }
- }
- }
- return true
- }
-
- @objc public func textFieldShouldClear(_ textField: UITextField) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(textField)?.textFieldDelegate {
- if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textFieldShouldClear(_:))) {
- return unwrapDelegate.textFieldShouldClear?(textField) ?? false
- }
- }
- }
-
- return true
- }
-
- @objc public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
-
- var shouldReturn = true
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(textField)?.textFieldDelegate {
- if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textFieldShouldReturn(_:))) {
- shouldReturn = unwrapDelegate.textFieldShouldReturn?(textField) ?? false
- }
- }
- }
-
- if shouldReturn {
- goToNextResponderOrResign(textField)
- return true
- } else {
- return goToNextResponderOrResign(textField)
- }
- }
-}
-
-// MARK: UITextViewDelegate
-@available(iOSApplicationExtension, unavailable)
-extension IQKeyboardReturnKeyHandler: UITextViewDelegate {
-
- @objc public func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(textView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(UITextViewDelegate.textViewShouldBeginEditing(_:))) {
- return unwrapDelegate.textViewShouldBeginEditing?(textView) ?? false
- }
- }
- }
-
- return true
- }
-
- @objc public func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(textView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(UITextViewDelegate.textViewShouldEndEditing(_:))) {
- return unwrapDelegate.textViewShouldEndEditing?(textView) ?? false
- }
- }
- }
-
- return true
- }
-
- @objc public func textViewDidBeginEditing(_ textView: UITextView) {
- updateReturnKeyTypeOnTextField(textView)
-
- var aDelegate: UITextViewDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textView) {
- aDelegate = model.textViewDelegate
- }
- }
-
- aDelegate?.textViewDidBeginEditing?(textView)
- }
-
- @objc public func textViewDidEndEditing(_ textView: UITextView) {
-
- var aDelegate: UITextViewDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textView) {
- aDelegate = model.textViewDelegate
- }
- }
-
- aDelegate?.textViewDidEndEditing?(textView)
- }
-
- @objc public func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
-
- var shouldReturn = true
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(textView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(UITextViewDelegate.textView(_:shouldChangeTextIn:replacementText:))) {
- shouldReturn = (unwrapDelegate.textView?(textView, shouldChangeTextIn: range, replacementText: text)) ?? false
- }
- }
- }
-
- if shouldReturn, text == "\n" {
- shouldReturn = goToNextResponderOrResign(textView)
- }
-
- return shouldReturn
- }
-
- @objc public func textViewDidChange(_ textView: UITextView) {
-
- var aDelegate: UITextViewDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textView) {
- aDelegate = model.textViewDelegate
- }
- }
-
- aDelegate?.textViewDidChange?(textView)
- }
-
- @objc public func textViewDidChangeSelection(_ textView: UITextView) {
-
- var aDelegate: UITextViewDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textView) {
- aDelegate = model.textViewDelegate
- }
- }
-
- aDelegate?.textViewDidChangeSelection?(textView)
- }
-
- @objc public func textView(_ aTextView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(textView as (UITextView, URL, NSRange, UITextItemInteraction) -> Bool)) {
- return unwrapDelegate.textView?(aTextView, shouldInteractWith: URL, in: characterRange, interaction: interaction) ?? false
- }
- }
- }
-
- return true
- }
-
- @objc public func textView(_ aTextView: UITextView, shouldInteractWith textAttachment: NSTextAttachment, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(textView as (UITextView, NSTextAttachment, NSRange, UITextItemInteraction) -> Bool)) {
- return unwrapDelegate.textView?(aTextView, shouldInteractWith: textAttachment, in: characterRange, interaction: interaction) ?? false
- }
- }
- }
-
- return true
- }
-
- @available(iOS, deprecated: 10.0)
- @objc public func textView(_ aTextView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(textView as (UITextView, URL, NSRange) -> Bool)) {
- return unwrapDelegate.textView?(aTextView, shouldInteractWith: URL, in: characterRange) ?? false
- }
- }
- }
-
- return true
- }
-
- @available(iOS, deprecated: 10.0)
- @objc public func textView(_ aTextView: UITextView, shouldInteractWith textAttachment: NSTextAttachment, in characterRange: NSRange) -> Bool {
-
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(textView as (UITextView, NSTextAttachment, NSRange) -> Bool)) {
- return unwrapDelegate.textView?(aTextView, shouldInteractWith: textAttachment, in: characterRange) ?? false
- }
- }
- }
-
- return true
- }
-}
-
-#if swift(>=5.7)
-@available(iOSApplicationExtension, unavailable)
-extension IQKeyboardReturnKeyHandler {
- @available(iOS 16.0, *)
- public func textView(_ aTextView: UITextView, editMenuForTextIn range: NSRange, suggestedActions: [UIMenuElement]) -> UIMenu? {
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(textView as (UITextView, NSRange, [UIMenuElement]) -> UIMenu?)) {
- return unwrapDelegate.textView?(aTextView, editMenuForTextIn: range, suggestedActions: suggestedActions)
- }
- }
- }
-
- return nil
- }
-
- @available(iOS 16.0, *)
- public func textView(_ aTextView: UITextView, willPresentEditMenuWith animator: UIEditMenuInteractionAnimating) {
- var aDelegate: UITextViewDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(aTextView) {
- aDelegate = model.textViewDelegate
- }
- }
-
- aDelegate?.textView?(aTextView, willPresentEditMenuWith: animator)
- }
-
- @available(iOS 16.0, *)
- public func textView(_ aTextView: UITextView, willDismissEditMenuWith animator: UIEditMenuInteractionAnimating) {
- var aDelegate: UITextViewDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(aTextView) {
- aDelegate = model.textViewDelegate
- }
- }
-
- aDelegate?.textView?(aTextView, willDismissEditMenuWith: animator)
- }
-}
-#endif
-
-#if swift(>=5.9)
-@available(iOSApplicationExtension, unavailable)
-extension IQKeyboardReturnKeyHandler {
-
- @available(iOS 17.0, *)
- public func textView(_ aTextView: UITextView, primaryActionFor textItem: UITextItem, defaultAction: UIAction) -> UIAction? {
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(textView as (UITextView, UITextItem, UIAction) -> UIAction?)) {
- return unwrapDelegate.textView?(aTextView, primaryActionFor: textItem, defaultAction: defaultAction)
- }
- }
- }
-
- return nil
- }
-
- @available(iOS 17.0, *)
- public func textView(_ aTextView: UITextView, menuConfigurationFor textItem: UITextItem, defaultMenu: UIMenu) -> UITextItem.MenuConfiguration? {
- if delegate == nil {
-
- if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?.textViewDelegate {
- if unwrapDelegate.responds(to: #selector(textView as (UITextView, UITextItem, UIMenu) -> UITextItem.MenuConfiguration?)) {
- return unwrapDelegate.textView?(aTextView, menuConfigurationFor: textItem, defaultMenu: defaultMenu)
- }
- }
- }
-
- return nil
- }
-
- @available(iOS 17.0, *)
- public func textView(_ textView: UITextView, textItemMenuWillDisplayFor textItem: UITextItem, animator: UIContextMenuInteractionAnimating) {
- var aDelegate: UITextViewDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textView) {
- aDelegate = model.textViewDelegate
- }
- }
-
- aDelegate?.textView?(textView, textItemMenuWillDisplayFor: textItem, animator: animator)
- }
-
- @available(iOS 17.0, *)
- public func textView(_ textView: UITextView, textItemMenuWillEndFor textItem: UITextItem, animator: UIContextMenuInteractionAnimating) {
- var aDelegate: UITextViewDelegate? = delegate
-
- if aDelegate == nil {
-
- if let model = textFieldViewCachedInfo(textView) {
- aDelegate = model.textViewDelegate
- }
- }
-
- aDelegate?.textView?(textView, textItemMenuWillEndFor: textItem, animator: animator)
- }
-}
-#endif
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift
new file mode 100644
index 0000000..4cf109c
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift
@@ -0,0 +1,137 @@
+//
+// IQKeyboardManager+ToolbarManager.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbarManager
+
+@available(iOSApplicationExtension, unavailable)
+// swiftlint:disable line_length
+@available(*, deprecated,
+ message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+// swiftlint:enable line_length
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var toolbarManager: Int = 0
+ }
+
+ internal var toolbarManager: IQKeyboardToolbarManager {
+ IQKeyboardToolbarManager.shared
+ }
+
+ var enableToolbarDebugging: Bool {
+ get { toolbarManager.isDebuggingEnabled }
+ set { toolbarManager.isDebuggingEnabled = newValue }
+ }
+
+ /**
+ Automatic add the toolbar functionality. Default is YES.
+ */
+ var enableAutoToolbar: Bool {
+ get { toolbarManager.isEnabled }
+ set { toolbarManager.isEnabled = newValue }
+ }
+
+ /**
+ Configurations related to the toolbar display over the keyboard.
+ */
+ var toolbarConfiguration: IQKeyboardToolbarConfiguration {
+ toolbarManager.toolbarConfiguration
+ }
+
+ // MARK: UISound handling
+
+ /**
+ If YES, then it plays inputClick sound on next/previous/done click.
+ */
+ var playInputClicks: Bool {
+ get { toolbarManager.playInputClicks }
+ set { toolbarManager.playInputClicks = newValue }
+ }
+
+ /**
+ Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes.
+ Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
+ */
+ var disabledToolbarClasses: [UIViewController.Type] {
+ get { toolbarManager.disabledToolbarClasses }
+ set { toolbarManager.disabledToolbarClasses = newValue }
+ }
+
+ /**
+ Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes.
+ Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
+ If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.
+ */
+ var enabledToolbarClasses: [UIViewController.Type] {
+ get { toolbarManager.enabledToolbarClasses }
+ set { toolbarManager.enabledToolbarClasses = newValue }
+ }
+
+ /**
+ Allowed subclasses of UIView to add all inner textField,
+ this will allow to navigate between textField contains in different superview.
+ Class should be kind of UIView.
+ */
+ var deepResponderAllowedContainerClasses: [UIView.Type] {
+ get { toolbarManager.deepResponderAllowedContainerClasses }
+ set { toolbarManager.deepResponderAllowedContainerClasses = newValue }
+ }
+
+ /** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */
+ func reloadInputViews() {
+ toolbarManager.reloadInputViews()
+ }
+
+ /**
+ Returns YES if can navigate to previous responder textInputView, otherwise NO.
+ */
+ var canGoPrevious: Bool {
+ toolbarManager.canGoPrevious
+ }
+
+ /**
+ Returns YES if can navigate to next responder textInputViews, otherwise NO.
+ */
+ var canGoNext: Bool {
+ toolbarManager.canGoNext
+ }
+
+ /**
+ Navigate to previous responder textInputViews
+ */
+ @discardableResult
+ func goPrevious() -> Bool {
+ toolbarManager.goPrevious()
+ }
+
+ /**
+ Navigate to next responder textInputView.
+ */
+ @discardableResult
+ func goNext() -> Bool {
+ toolbarManager.goNext()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift
new file mode 100644
index 0000000..e6b7321
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift
@@ -0,0 +1,177 @@
+//
+// IQKeyboardManager+ToolbarManagerDeprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbarManager
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable identifier_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "playInputClicks")
+ var shouldPlayInputClicks: Bool {
+ get { false }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior")
+ var toolbarManageBehaviour: IQKeyboardToolbarManageBehavior {
+ get { .bySubviews }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor")
+ var shouldToolbarUsesTextFieldTintColor: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.tintColor")
+ var toolbarTintColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.barTintColor")
+ var toolbarBarTintColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode")
+ var previousNextDisplayMode: IQPreviousNextDisplayMode {
+ get { .default }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "deepResponderAllowedContainerClasses")
+ var toolbarPreviousNextAllowedClasses: [UIView.Type] {
+ get { [] }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel")
+ var toolbarTitleBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder")
+ var shouldShowToolbarPlaceholder: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font")
+ var placeholderFont: UIFont? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color")
+ var placeholderColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor")
+ var placeholderButtonColor: UIColor? {
+ get { nil }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQPlaceholderable.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQPlaceholderable.swift
deleted file mode 100644
index d8021b4..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQPlaceholderable.swift
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// IQPlaceholderable.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import Foundation
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-public protocol IQPlaceholderable: AnyObject {
-
- var placeholder: String? { get set }
- var attributedPlaceholder: NSAttributedString? { get set }
-}
-
-@available(iOSApplicationExtension, unavailable)
-extension UITextField: IQPlaceholderable { }
-
-@available(iOSApplicationExtension, unavailable)
-extension IQTextView: IQPlaceholderable { }
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQTextView.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQTextView.swift
deleted file mode 100644
index 329d486..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQTextView.swift
+++ /dev/null
@@ -1,186 +0,0 @@
-//
-// IQTextView.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import UIKit
-
-/** @abstract UITextView with placeholder support */
-@available(iOSApplicationExtension, unavailable)
-@objc open class IQTextView: UITextView {
-
- @objc required public init?(coder aDecoder: NSCoder) {
- super.init(coder: aDecoder)
- NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: UITextView.textDidChangeNotification, object: self)
- }
-
- @objc override public init(frame: CGRect, textContainer: NSTextContainer?) {
- super.init(frame: frame, textContainer: textContainer)
- NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: UITextView.textDidChangeNotification, object: self)
- }
-
- @objc override open func awakeFromNib() {
- super.awakeFromNib()
- NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: UITextView.textDidChangeNotification, object: self)
- }
-
- private var placeholderInsets: UIEdgeInsets {
- return UIEdgeInsets(top: self.textContainerInset.top, left: self.textContainerInset.left + self.textContainer.lineFragmentPadding, bottom: self.textContainerInset.bottom, right: self.textContainerInset.right + self.textContainer.lineFragmentPadding)
- }
-
- private var placeholderExpectedFrame: CGRect {
- let placeholderInsets = self.placeholderInsets
- let maxWidth = self.frame.width-placeholderInsets.left-placeholderInsets.right
- let expectedSize = placeholderLabel.sizeThatFits(CGSize(width: maxWidth, height: self.frame.height-placeholderInsets.top-placeholderInsets.bottom))
-
- return CGRect(x: placeholderInsets.left, y: placeholderInsets.top, width: maxWidth, height: expectedSize.height)
- }
-
- lazy var placeholderLabel: UILabel = {
- let label = UILabel()
-
- label.autoresizingMask = [.flexibleWidth, .flexibleHeight]
- label.lineBreakMode = .byWordWrapping
- label.numberOfLines = 0
- label.font = self.font
- label.textAlignment = self.textAlignment
- label.backgroundColor = UIColor.clear
- label.isAccessibilityElement = false
- #if swift(>=5.1)
- label.textColor = UIColor.systemGray
- #else
- label.textColor = UIColor.lightText
- #endif
- label.alpha = 0
- self.addSubview(label)
-
- return label
- }()
-
- /** @abstract To set textView's placeholder text color. */
- @IBInspectable open var placeholderTextColor: UIColor? {
-
- get {
- return placeholderLabel.textColor
- }
-
- set {
- placeholderLabel.textColor = newValue
- }
- }
-
- /** @abstract To set textView's placeholder text. Default is nil. */
- @IBInspectable open var placeholder: String? {
-
- get {
- return placeholderLabel.text
- }
-
- set {
- placeholderLabel.text = newValue
- refreshPlaceholder()
- }
- }
-
- /** @abstract To set textView's placeholder attributed text. Default is nil. */
- open var attributedPlaceholder: NSAttributedString? {
- get {
- return placeholderLabel.attributedText
- }
-
- set {
- placeholderLabel.attributedText = newValue
- refreshPlaceholder()
- }
- }
-
- @objc override open func layoutSubviews() {
- super.layoutSubviews()
-
- placeholderLabel.frame = placeholderExpectedFrame
- }
-
- @objc internal func refreshPlaceholder() {
-
- let text: String = text ?? attributedText?.string ?? ""
- if text.isEmpty {
- placeholderLabel.alpha = 1
- } else {
- placeholderLabel.alpha = 0
- }
- }
-
- @objc override open var text: String! {
-
- didSet {
- refreshPlaceholder()
- }
- }
-
- open override var attributedText: NSAttributedString! {
-
- didSet {
- refreshPlaceholder()
- }
- }
-
- @objc override open var font: UIFont? {
-
- didSet {
-
- if let unwrappedFont = font {
- placeholderLabel.font = unwrappedFont
- } else {
- placeholderLabel.font = UIFont.systemFont(ofSize: 12)
- }
- }
- }
-
- @objc override open var textAlignment: NSTextAlignment {
- didSet {
- placeholderLabel.textAlignment = textAlignment
- }
- }
-
- @objc override weak open var delegate: UITextViewDelegate? {
-
- get {
- refreshPlaceholder()
- return super.delegate
- }
-
- set {
- super.delegate = newValue
- }
- }
-
- @objc override open var intrinsicContentSize: CGSize {
- guard !hasText else {
- return super.intrinsicContentSize
- }
-
- var newSize = super.intrinsicContentSize
- let placeholderInsets = self.placeholderInsets
- newSize.height = placeholderExpectedFrame.height + placeholderInsets.top + placeholderInsets.bottom
-
- return newSize
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQBarButtonItem.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQBarButtonItem.swift
deleted file mode 100644
index 0adf974..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQBarButtonItem.swift
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// IQBarButtonItem.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-// import Foundation - UIKit contains Foundation
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-@objc open class IQBarButtonItem: UIBarButtonItem {
-
- @objc public override init() {
- super.init()
- initialize()
- }
-
- @objc public required init?(coder aDecoder: NSCoder) {
- super.init(coder: aDecoder)
- initialize()
- }
-
- private func initialize() {
-
- let states: [UIControl.State] = [.normal, .highlighted, .disabled, .focused]
-
- for state in states {
-
- setBackgroundImage(UIImage(), for: state, barMetrics: .default)
- setBackgroundImage(UIImage(), for: state, style: .plain, barMetrics: .default)
- setBackButtonBackgroundImage(UIImage(), for: state, barMetrics: .default)
- }
-
- setTitlePositionAdjustment(UIOffset(), for: .default)
- setBackgroundVerticalPositionAdjustment(0, for: .default)
- setBackButtonBackgroundVerticalPositionAdjustment(0, for: .default)
- }
-
- @objc override open var tintColor: UIColor? {
- didSet {
-
- var textAttributes = [NSAttributedString.Key: Any]()
- textAttributes[.foregroundColor] = tintColor
-
- if let attributes = titleTextAttributes(for: .normal) {
- for (key, value) in attributes {
- textAttributes[key] = value
- }
- }
-
- setTitleTextAttributes(textAttributes, for: .normal)
- }
- }
-
- /**
- Boolean to know if it's a system item or custom item, we are having a limitation that we cannot override a designated initializer, so we are manually setting this property once in initialization
- */
- @objc internal var isSystemItem = false
-
- /**
- Additional target & action to do get callback action. Note that setting custom target & selector doesn't affect native functionality, this is just an additional target to get a callback.
-
- @param target Target object.
- @param action Target Selector.
- */
- @objc open func setTarget(_ target: AnyObject?, action: Selector?) {
- if let target = target, let action = action {
- invocation = IQInvocation(target, action)
- } else {
- invocation = nil
- }
- }
-
- /**
- Customized Invocation to be called when button is pressed. invocation is internally created using setTarget:action: method.
- */
- @objc open var invocation: IQInvocation? {
- didSet {
- // We have to put this condition here because if we override this function then
- // We were getting "Cannot override '_' which has been marked unavailable" in Xcode 15
- if let titleBarButton = self as? IQTitleBarButtonItem {
-
- if let target = invocation?.target, let action = invocation?.action {
- titleBarButton.isEnabled = true
- titleBarButton.titleButton?.isEnabled = true
- titleBarButton.titleButton?.addTarget(target, action: action, for: .touchUpInside)
- } else {
- titleBarButton.isEnabled = false
- titleBarButton.titleButton?.isEnabled = false
- titleBarButton.titleButton?.removeTarget(nil, action: nil, for: .touchUpInside)
- }
- }
- }
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQInvocation.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQInvocation.swift
deleted file mode 100644
index f43cd6e..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQInvocation.swift
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// IQInvocation.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-@objc public final class IQInvocation: NSObject {
- @objc public weak var target: AnyObject?
- @objc public var action: Selector
-
- @objc public init(_ target: AnyObject, _ action: Selector) {
- self.target = target
- self.action = action
- }
-
- @objc public func invoke(from: Any) {
- if let target = target {
- UIApplication.shared.sendAction(action, to: target, from: from, for: UIEvent())
- }
- }
-
- deinit {
- target = nil
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift
deleted file mode 100644
index f2add12..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// IQPreviousNextView.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-@objc open class IQPreviousNextView: UIView {
-
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQTitleBarButtonItem.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQTitleBarButtonItem.swift
deleted file mode 100644
index 396e376..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQTitleBarButtonItem.swift
+++ /dev/null
@@ -1,138 +0,0 @@
-//
-// IQTitleBarButtonItem.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import UIKit
-
-@available(iOSApplicationExtension, unavailable)
-@objc open class IQTitleBarButtonItem: IQBarButtonItem {
-
- @objc open var titleFont: UIFont? {
-
- didSet {
- if let unwrappedFont = titleFont {
- titleButton?.titleLabel?.font = unwrappedFont
- } else {
- titleButton?.titleLabel?.font = UIFont.systemFont(ofSize: 13)
- }
- }
- }
-
- @objc override open var title: String? {
- didSet {
- titleButton?.setTitle(title, for: .normal)
- }
- }
-
- /**
- titleColor to be used for displaying button text when displaying title (disabled state).
- */
- @objc open var titleColor: UIColor? {
-
- didSet {
-
- if let color = titleColor {
- titleButton?.setTitleColor(color, for: .disabled)
- } else {
- titleButton?.setTitleColor(UIColor.lightGray, for: .disabled)
- }
- }
- }
-
- /**
- selectableTitleColor to be used for displaying button text when button is enabled.
- */
- @objc open var selectableTitleColor: UIColor? {
-
- didSet {
-
- if let color = selectableTitleColor {
- titleButton?.setTitleColor(color, for: .normal)
- } else {
- #if swift(>=5.1)
- titleButton?.setTitleColor(UIColor.systemBlue, for: .normal)
- #else
- titleButton?.setTitleColor(UIColor(red: 0.0, green: 0.5, blue: 1.0, alpha: 1), for: .normal)
- #endif
- }
- }
- }
-
- internal var titleButton: UIButton?
- private var _titleView: UIView?
-
- override init() {
- super.init()
- }
-
- @objc public convenience init(title: String?) {
-
- self.init(title: nil, style: .plain, target: nil, action: nil)
-
- _titleView = UIView()
- _titleView?.backgroundColor = UIColor.clear
-
- titleButton = UIButton(type: .system)
- titleButton?.isEnabled = false
- titleButton?.titleLabel?.numberOfLines = 3
- titleButton?.setTitleColor(UIColor.lightGray, for: .disabled)
- #if swift(>=5.1)
- titleButton?.setTitleColor(UIColor.systemBlue, for: .normal)
- #else
- titleButton?.setTitleColor(UIColor(red: 0.0, green: 0.5, blue: 1.0, alpha: 1), for: .normal)
- #endif
- titleButton?.backgroundColor = UIColor.clear
- titleButton?.titleLabel?.textAlignment = .center
- titleButton?.setTitle(title, for: .normal)
- titleFont = UIFont.systemFont(ofSize: 13.0)
- titleButton?.titleLabel?.font = self.titleFont
- _titleView?.addSubview(titleButton!)
-
- let layoutDefaultLowPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultLow.rawValue-1)
- let layoutDefaultHighPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultHigh.rawValue-1)
-
- _titleView?.translatesAutoresizingMaskIntoConstraints = false
- _titleView?.setContentHuggingPriority(layoutDefaultLowPriority, for: .vertical)
- _titleView?.setContentHuggingPriority(layoutDefaultLowPriority, for: .horizontal)
- _titleView?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .vertical)
- _titleView?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .horizontal)
-
- titleButton?.translatesAutoresizingMaskIntoConstraints = false
- titleButton?.setContentHuggingPriority(layoutDefaultLowPriority, for: .vertical)
- titleButton?.setContentHuggingPriority(layoutDefaultLowPriority, for: .horizontal)
- titleButton?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .vertical)
- titleButton?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .horizontal)
-
- let top = NSLayoutConstraint.init(item: titleButton!, attribute: .top, relatedBy: .equal, toItem: _titleView, attribute: .top, multiplier: 1, constant: 0)
- let bottom = NSLayoutConstraint.init(item: titleButton!, attribute: .bottom, relatedBy: .equal, toItem: _titleView, attribute: .bottom, multiplier: 1, constant: 0)
- let leading = NSLayoutConstraint.init(item: titleButton!, attribute: .leading, relatedBy: .equal, toItem: _titleView, attribute: .leading, multiplier: 1, constant: 0)
- let trailing = NSLayoutConstraint.init(item: titleButton!, attribute: .trailing, relatedBy: .equal, toItem: _titleView, attribute: .trailing, multiplier: 1, constant: 0)
-
- _titleView?.addConstraints([top, bottom, leading, trailing])
-
- customView = _titleView
- }
-
- @objc required public init?(coder aDecoder: NSCoder) {
- super.init(coder: aDecoder)
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift
deleted file mode 100644
index 9587cfb..0000000
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift
+++ /dev/null
@@ -1,513 +0,0 @@
-//
-// IQUIView+IQKeyboardToolbar.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-
-import UIKit
-
-/**
- IQBarButtonItemConfiguration for creating toolbar with bar button items
- */
-@available(iOSApplicationExtension, unavailable)
-@objc public final class IQBarButtonItemConfiguration: NSObject {
-
- @objc public init(barButtonSystemItem: UIBarButtonItem.SystemItem, action: Selector) {
- self.barButtonSystemItem = barButtonSystemItem
- self.image = nil
- self.title = nil
- self.action = action
- super.init()
- }
-
- @objc public init(image: UIImage, action: Selector) {
- self.barButtonSystemItem = nil
- self.image = image
- self.title = nil
- self.action = action
- super.init()
- }
-
- @objc public init(title: String, action: Selector) {
- self.barButtonSystemItem = nil
- self.image = nil
- self.title = title
- self.action = action
- super.init()
- }
-
- public let barButtonSystemItem: UIBarButtonItem.SystemItem? // System Item to be used to instantiate bar button.
-
- @objc public let image: UIImage? // Image to show on bar button item if it's not a system item.
-
- @objc public let title: String? // Title to show on bar button item if it's not a system item.
-
- @objc public let action: Selector? // action for bar button item. Usually 'doneAction:(IQBarButtonItem*)item'.
-}
-
-/**
- UIImage category methods to get next/prev images
- */
-@available(iOSApplicationExtension, unavailable)
-@objc public extension UIImage {
-
- static func keyboardPreviousImage() -> UIImage? {
-
- struct Static {
- static var keyboardUpImage: UIImage?
- }
-
- if Static.keyboardUpImage == nil {
-
- // swiftlint:disable line_length
- let base64Data = "iVBORw0KGgoAAAANSUhEUgAAAD8AAAAkCAYAAAA+TuKHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAGmklEQVRoBd1ZWWwbRRie2bVz27s2adPGxzqxqAQCIRA3CDVJGxpKaEtRoSAVISQQggdeQIIHeIAHkOCBFyQeKlARhaYHvUJa0ksVoIgKUKFqKWqdeG2nR1Lsdeo0h73D54iku7NO6ySOk3alyPN//+zM/81/7MyEkDl66j2eJXWK8vocTT82rTgXk/t8vqBNEI9QSp9zOeVkPJnomgs7ik5eUZQ6OxGOEEq9WcKUksdlWbqU0LRfi70ARSXv8Xi8dkE8CsJ+I1FK6BNYgCgW4A8jPtvtopFHqNeWCLbDIF6fkxQjK91O1z9IgRM59bMAFoV8YEFgka1EyBJfMhkH5L9ACFstS9IpRMDJyfoVEp918sGamoVCme0QyN3GG87wAKcTOBYA4hrJKf+VSCb+nsBnqYHVnr2ntra2mpWWH0BVu52fhRH2XSZDmsA/xensokC21Pv9T3J4wcWrq17gob1er7tEhMcJuYsfGoS3hdTweuBpxaM0iCJph8fLuX7DJMPWnI2GOzi8YOKseD4gB+RSQezMRRx5vRPEn88Sz7IIx8KHgT3FCBniWJUyke6o8/uXc3jBxIKTd7vdTsFJfkSo38NbCY/vPRsOPwt81KgLqeoBXc+sBjZsxLF4ZfgM7goqSqMRL1S7oOSrq6sdLodjH0rYfbyByPEOePwZ4CO8Liv3RCL70Wctr8+mA2NkT53P91iu92aCFYx8TU1NpbOi8gfs2R7iDYLxnXqYPg3c5Fm+Xygcbs/omXXATZGBBagQqNAe9Psf4d+ZiVwQ8qjqFVVl5dmi9ShvDEL90IieXtVDevic5ruOyYiAXYiA9YSxsZow0YnSKkKFjoAn8OAENsPGjKs9qnp5iSDuBXFLXsLjR4fSIy29vb2DU7UThW4d8n0zxjXtRVAYNaJnlocikWNTHZPvP1PPl2LLujM3cfbzwJXUyukQzxrZraptRCcbEDm60Wh4S0IE7McByVJQjf3yac+EfEm9ouxAcWu2TsS6koOplr6+vstWXf5IKBrejBR4ybIAlLpE1JE6j8eyh8h/dEKmS95e7w9sy57G+MkQ6sdYMrmiv79/gNdNR0YEbGKUvIIFQMRffRBtbkG0HQj6fHdcRafWmg55Gzy+BR5vtUzF2O96kjSH4nHNopsB0B0Ob6SEvcYvAPYS1UwQDyqLFcu5IZ/pTMUkjxfEoD/wLVY9+z02PXDL8RE9s0y9qMZNigIJcU37TZblfj7aUAMqURLXuqqq9sQHBi5NZbqpkBfh8a9BPLtDMz3wyImh9GhTLBab0uSmQfIQcNQ95pJkDVG3wtgdC1KFA+HaSodjdzKZ/Neou1Y7X/JC0K98BeIvWAdjp+jwUKN6/nyfVVd4JK4lunDrkwJhc6Gl1GGjwhqnLO3UNC2Rz8z5kKfw+EYQf5EfEKF+Wh+kDd0XYxd43WzKiIBfEAEjiIAm0zyUSFiU1XJF+feJy5evW3euR57C41+A+MumSbICY2dGmd6gnlPPWXRFABABP7llCXsA2mCcDjVAJoK4qryycsfAwEDSqOPb1yQPj38O4q/yL4F4aCiTXhqNRmMWXREBFMGjslOywUbToQeyyy4IrVVO53bUgEk/uZOSr/MHPsOd0hs8F4R6mI2ONKi9vRFeNxdyIqkddknOMhA2nyuy+wAqtEol8rbEYCLnZisneXj8UxB/00KGkUiGsqU90WiPRTeHACLgoNsp4eBDHzaagRS4RbCzle6ysq3xVIq/LiMW8ti5fYRVfMs4yFibsdgI05eqqhqy6OYBEE9qnSiCLhRB7tRHFzDR1oIasBU1wHTAMpHHjcmHIP4OzwXf8XMkk24IR6NneN18klEE97mc0gJwuN9oF+SFNlF8vNJR1YYacGVcN0Eet6XvY6Pw3rhi/Bc5fiEzShp7eiOnx7H5/IsI6EAELEIE3Gu0EymwyCbQZocktWEfMHa3MEa+zqe8KwjCB8bO/7f70kxvVGPqyRy6eQshAtpdsuTDN/9us5F0MQ4zTS5BaIsPDQ3jO+5/G+fjj82dIDF2CZeKjd3R6J8W3Y0BYFca+JJQssFqLuvSUqlmESHSiZywGzsgx+OZNFnWE4scN+I3WJshAnYjAm5FBNxptp16y+y2hICLEtOVMXJcI0xvDveGi/ofU7NxBZN0XIpuIIy0mUZkZNNZVf1kDAt6lZagEhjGnxbweh8wdbw5hOwdxHbwY/j9BpTM9xi4MGzFvZhpk3Bz8J5gkb19ym7cJr5w/wEmUjzJqoNVhwAAAABJRU5ErkJggg=="
- // swiftlint:enable line_length
-
- if let data = Data(base64Encoded: base64Data, options: .ignoreUnknownCharacters) {
- Static.keyboardUpImage = UIImage(data: data, scale: 3)
- }
-
- // Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
- Static.keyboardUpImage = Static.keyboardUpImage?.imageFlippedForRightToLeftLayoutDirection()
- }
-
- return Static.keyboardUpImage
- }
-
- static func keyboardNextImage() -> UIImage? {
-
- struct Static {
- static var keyboardDownImage: UIImage?
- }
-
- if Static.keyboardDownImage == nil {
-
- // swiftlint:disable line_length
- let base64Data = "iVBORw0KGgoAAAANSUhEUgAAAD8AAAAkCAYAAAA+TuKHAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAGp0lEQVRoBd1ZCWhcRRiemff25WrydmOtuXbfZlMo4lEpKkppm6TpZUovC4UqKlQoUhURqQcUBcWDIkhVUCuI9SpJa+2h0VZjUawUEUUUirLNXqmxSnc32WaT7O4bv0nd5R1bc+2maR8s7z9m5v+/+f/5Z94sIf89jW73Yp/bfUuWvwLfDp/H8zhwObLYmCCaPJ6FjLJPCWNHNU1bkFVeQW/Zp2l7KWUvNmlaB3DJAhvz1ntvI5R1EUpnUUKdEifHGuvr519BwKUmj/cDYNtwARNd5/NoH4GWKIhzlFKXCSzn/xCut/jD4V9N8suPYYj4ewC+2e46f55Rwp/geExKSmdzJn2l1WrXmuSXF8MQ8XfyAeeEn9KTyV3MHwq9RTh50IqLEjJHUkh3Y13dPKvuMuApIr6bUHKP1VeE+Y8MIa09Z8/+JQlltD/+Q7VaFcW6X2VsjFmbRRnbUFFZeai/v/+cUTeDaYqIv4GlfL/NR879I3qmORwOnxG6UfCCiMbjJ51VagKdlgs+91BaKVO6oVJVD8bj8WhOPkMJn1t7jTL6gNU9pHpgKJ1q7u3tjWR1OfBCEOuPf+9Sq4YwAW3ZBqNvSqsYpeuc5WUHYolE3KSbQYzP430FwB+yuoSCFtKHaXP4z3DIqDOBFwpkwHfVThXLgrYaG6IGOAmT1pZVVHw8MDDQb9TNBLrJre0E8EdtvnAeSRPeHOwN9lh1NvCiASbgG5fqRLDJEmMHsSU6GFuDGrAfNWDAqLuUNE5uL6A2bbf5wPkZrmdaAuGw36aDIC940TAajx1HBijIgEWmjpRWS4ytrnKq+1EDEibdJWAa3dqzjLGnrKaxxvt4OtXS09v7u1WX5S8KXjRABnQ7VbUCEV+Y7SDeWAJX4dfuLCnZFzt//rxRN500jqo74NvTVptY42fTnLcGI5FTVp2R/1/womEsHj/mwgxg27vd2BH8bCrLq0rKyjoTicSgUTcdNIrbkwD+nM2WOJ3qmaVI9d9sOotgTPCiPTLgi+oqdTbOAbea+lM6xyHLK8pnVXSiCCZNuiIyjZr2GArSS1YTOKie45n0UqT6L1ZdPn5c4EVHHIS6sA3WYLZvNg6E9L9GZmwZzgEdqAFDRl0xaET8EQB/2To21ngsQ0kbIv6zVXcxftzgxQDIgM+qVbUeGbDAPCCtxbfxUhdjHdGhoWGzrnAcIr4NwHflGbGf6PqyQCj0Yx7dRUUTAi9GwQQccapOL7bBm4yjIiPqSElpC5VYRzKZLPgE4M5hK0rt67CDZDM9A+k0XxmIhE6apONgJgxejBmLxw65VHUu/LjRaANeNZQpyhJZUToGBwdHjLqp0Ij4FgB/0wocaxw7DV8F4CcmM/6kwMMQRwYcrFad87DvXW8yTKlbkZVFSmlJB3bBlEk3CQYRvxfA3wbw0Vun7BAAPqjrmfaecPjbrGyib2sKTbS/LG5F4NhGe0d+fDiTuSMSiUx6F8Bn6V343N6TB3gSyb/aHwx22+2OX2KazfF3y7VMnw4FcUvCP8lJcgRtVph0yEu8pTnRBAiv270JwN+1AscQw5zr66YKXLgyVfBijBQc2YQ0PCIY4wPH2yQPERNTYpSPRSPid0qUvY/+1mU5QjJ8PVL96FhjjEdfCPDCzggyAKnPP7cZpWQFlsZ+yPGdMPaDiK/F6fEjbKeypXVK5/pGfyTYZZFPmi0UeOHAcCZI1+Oa6JjVG0SwHbcrnZDn7sytbQSPiLdLTBJXy+Z2nKcR8U09odDhfP0mKyskeBIggaERPb0WGfC1zSFK1gDcXsitER1t6m3wrkTEbRmC5ZTRCd+MiB+wjTlFwVSrfV7zdXV15aWy0oWKvNjWgJMOfyiAIklwYXLhwfd4G/47OAxnTMVRAKec3u0PB8SkFfyxFpSCGMBHTkpWHPsU2bEEKe8xDUrJdfhKnItzgiiEXKvXWhijR9CuzNgOwHWc1+87HQ5+aJQXki4KeOGgOOFJDkdnqeJowSGlweg00vsGHJAa1UpnTJKIAF5u1AM4R8S3APgeo7zQdFHS3uikz+VSSWXVlwBo+hoUbUR0ITfVHQEcEd+K4rbbOE4xaJPhYhg4HY3GcYG4HFB/so5vBT6q53TbdAAXtooe+SzghoaGakWSu2FwflZmfWMffxjAX7XKi8VPG3gBoKam5uoKpeQEDjBz7YD4dpwUd9rlxZMUPe2Nrvf19f2dTKdasap7jHIsiR3TDdxsfxq5xtpazad5g02al+Na6plpND0zTHk8Hp+4iLyU3vwLp0orLWXqrZQAAAAASUVORK5CYII="
- // swiftlint:enable line_length
-
- if let data = Data(base64Encoded: base64Data, options: .ignoreUnknownCharacters) {
- Static.keyboardDownImage = UIImage(data: data, scale: 3)
- }
-
- // Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)
- Static.keyboardDownImage = Static.keyboardDownImage?.imageFlippedForRightToLeftLayoutDirection()
- }
-
- return Static.keyboardDownImage
- }
-}
-
-/**
-UIView category methods to add IQToolbar on UIKeyboard.
-*/
-@available(iOSApplicationExtension, unavailable)
-@objc public extension UIView {
-
- private struct AssociatedKeys {
- static var keyboardToolbar: Int = 0
- static var shouldHideToolbarPlaceholder: Int = 0
- static var toolbarPlaceholder: Int = 0
- }
-
- // MARK: Toolbar
-
- /**
- IQToolbar references for better customization control.
- */
- var keyboardToolbar: IQToolbar {
- var toolbar = inputAccessoryView as? IQToolbar
-
- if toolbar == nil {
- toolbar = objc_getAssociatedObject(self, &AssociatedKeys.keyboardToolbar) as? IQToolbar
- }
-
- if let unwrappedToolbar = toolbar {
- return unwrappedToolbar
- } else {
-
- var width: CGFloat = 0
-
- if #available(iOS 13.0, *) {
- width = window?.windowScene?.screen.bounds.width ?? .zero
- } else {
- width = UIScreen.main.bounds.width
- }
-
- let frame = CGRect(origin: .zero, size: .init(width: width, height: 44))
- let newToolbar = IQToolbar(frame: frame)
-
- objc_setAssociatedObject(self, &AssociatedKeys.keyboardToolbar, newToolbar, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
-
- return newToolbar
- }
- }
-
- // MARK: Toolbar title
-
- /**
- If `shouldHideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.
- */
- var shouldHideToolbarPlaceholder: Bool {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.shouldHideToolbarPlaceholder) as? Bool ?? false
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.shouldHideToolbarPlaceholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder
- }
- }
-
- /**
- `toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar.
- */
- var toolbarPlaceholder: String? {
- get {
- return objc_getAssociatedObject(self, &AssociatedKeys.toolbarPlaceholder) as? String
- }
- set(newValue) {
- objc_setAssociatedObject(self, &AssociatedKeys.toolbarPlaceholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
- self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder
- }
- }
-
- /**
- `drawingToolbarPlaceholder` will be actual text used to draw on toolbar. This would either `placeholder` or `toolbarPlaceholder`.
- */
- var drawingToolbarPlaceholder: String? {
-
- if self.shouldHideToolbarPlaceholder {
- return nil
- } else if self.toolbarPlaceholder?.isEmpty == false {
- return self.toolbarPlaceholder
- } else if let placeholderable: IQPlaceholderable = self as? IQPlaceholderable {
-
- if let placeholder = placeholderable.attributedPlaceholder?.string,
- !placeholder.isEmpty {
- return placeholder
- } else if let placeholder = placeholderable.placeholder {
- return placeholder
- } else {
- return nil
- }
- } else {
- return nil
- }
- }
-
- // MARK: Private helper
-
- private static func flexibleBarButtonItem () -> IQBarButtonItem {
-
- struct Static {
-
- static let nilButton = IQBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
- }
-
- Static.nilButton.isSystemItem = true
- return Static.nilButton
- }
-
- // MARK: Common
-
- // swiftlint:disable function_body_length
- func addKeyboardToolbarWithTarget(target: AnyObject?,
- titleText: String?,
- titleAccessibilityLabel: String? = nil,
- rightBarButtonConfiguration: IQBarButtonItemConfiguration?,
- previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil,
- nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil) {
-
- // If can't set InputAccessoryView. Then return
- if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {
-
- // Creating a toolBar for phoneNumber keyboard
- let toolbar = self.keyboardToolbar
-
- var items: [IQBarButtonItem] = []
-
- if let prevConfig = previousBarButtonConfiguration {
-
- var prev = toolbar.previousBarButton
-
- if prevConfig.barButtonSystemItem == nil, !prev.isSystemItem {
- prev.title = prevConfig.title
- prev.accessibilityLabel = prevConfig.accessibilityLabel
- prev.accessibilityIdentifier = prev.accessibilityLabel
- prev.image = prevConfig.image
- prev.target = target
- prev.action = prevConfig.action
- } else {
- if let systemItem = prevConfig.barButtonSystemItem {
- prev = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: prevConfig.action)
- prev.isSystemItem = true
- } else if let image = prevConfig.image {
- prev = IQBarButtonItem(image: image, style: .plain, target: target, action: prevConfig.action)
- } else {
- prev = IQBarButtonItem(title: prevConfig.title, style: .plain, target: target, action: prevConfig.action)
- }
-
- prev.invocation = toolbar.previousBarButton.invocation
- prev.accessibilityLabel = prevConfig.accessibilityLabel
- prev.accessibilityIdentifier = prev.accessibilityLabel
- prev.isEnabled = toolbar.previousBarButton.isEnabled
- prev.tag = toolbar.previousBarButton.tag
- toolbar.previousBarButton = prev
- }
-
- items.append(prev)
- }
-
- if previousBarButtonConfiguration != nil, nextBarButtonConfiguration != nil {
-
- items.append(toolbar.fixedSpaceBarButton)
- }
-
- if let nextConfig = nextBarButtonConfiguration {
-
- var next = toolbar.nextBarButton
-
- if nextConfig.barButtonSystemItem == nil, !next.isSystemItem {
- next.title = nextConfig.title
- next.accessibilityLabel = nextConfig.accessibilityLabel
- next.accessibilityIdentifier = next.accessibilityLabel
- next.image = nextConfig.image
- next.target = target
- next.action = nextConfig.action
- } else {
- if let systemItem = nextConfig.barButtonSystemItem {
- next = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: nextConfig.action)
- next.isSystemItem = true
- } else if let image = nextConfig.image {
- next = IQBarButtonItem(image: image, style: .plain, target: target, action: nextConfig.action)
- } else {
- next = IQBarButtonItem(title: nextConfig.title, style: .plain, target: target, action: nextConfig.action)
- }
-
- next.invocation = toolbar.nextBarButton.invocation
- next.accessibilityLabel = nextConfig.accessibilityLabel
- next.accessibilityIdentifier = next.accessibilityLabel
- next.isEnabled = toolbar.nextBarButton.isEnabled
- next.tag = toolbar.nextBarButton.tag
- toolbar.nextBarButton = next
- }
-
- items.append(next)
- }
-
- // Title bar button item
- do {
- // Flexible space
- items.append(UIView.flexibleBarButtonItem())
-
- // Title button
- toolbar.titleBarButton.title = titleText
- toolbar.titleBarButton.accessibilityLabel = titleAccessibilityLabel
- toolbar.titleBarButton.accessibilityIdentifier = titleAccessibilityLabel
-
- toolbar.titleBarButton.customView?.frame = CGRect.zero
-
- items.append(toolbar.titleBarButton)
-
- // Flexible space
- items.append(UIView.flexibleBarButtonItem())
- }
-
- if let rightConfig = rightBarButtonConfiguration {
-
- var done = toolbar.doneBarButton
-
- if rightConfig.barButtonSystemItem == nil, !done.isSystemItem {
- done.title = rightConfig.title
- done.accessibilityLabel = rightConfig.accessibilityLabel
- done.accessibilityIdentifier = done.accessibilityLabel
- done.image = rightConfig.image
- done.target = target
- done.action = rightConfig.action
- } else {
- if let systemItem = rightConfig.barButtonSystemItem {
- done = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: rightConfig.action)
- done.isSystemItem = true
- } else if let image = rightConfig.image {
- done = IQBarButtonItem(image: image, style: .plain, target: target, action: rightConfig.action)
- } else {
- done = IQBarButtonItem(title: rightConfig.title, style: .plain, target: target, action: rightConfig.action)
- }
-
- done.invocation = toolbar.doneBarButton.invocation
- done.accessibilityLabel = rightConfig.accessibilityLabel
- done.accessibilityIdentifier = done.accessibilityLabel
- done.isEnabled = toolbar.doneBarButton.isEnabled
- done.tag = toolbar.doneBarButton.tag
- toolbar.doneBarButton = done
- }
-
- items.append(done)
- }
-
- // Adding button to toolBar.
- toolbar.items = items
-
- if let textInput = self as? UITextInput {
- switch textInput.keyboardAppearance {
- case .dark?:
- toolbar.barStyle = .black
- default:
- toolbar.barStyle = .default
- }
- }
-
- // Setting toolbar to keyboard.
- let shouldReloadInputViews: Bool = self.inputAccessoryView == nil
- if let textField = self as? UITextField {
- textField.inputAccessoryView = toolbar
- } else if let textView = self as? UITextView {
- textView.inputAccessoryView = toolbar
- }
- if shouldReloadInputViews {
- self.reloadInputViews()
- }
- }
- }
- // swiftlint:enable function_body_length
-
- // MARK: Right
-
- func addDoneOnKeyboardWithTarget(_ target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addDoneOnKeyboardWithTarget(target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addDoneOnKeyboardWithTarget(_ target: AnyObject?, action: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: action)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, rightBarButtonConfiguration: rightConfiguration)
- }
-
- func addRightButtonOnKeyboardWithImage(_ image: UIImage, target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addRightButtonOnKeyboardWithImage(image, target: target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addRightButtonOnKeyboardWithImage(_ image: UIImage, target: AnyObject?, action: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let rightConfiguration = IQBarButtonItemConfiguration(image: image, action: action)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration)
- }
-
- func addRightButtonOnKeyboardWithText(_ text: String, target: AnyObject?, action: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addRightButtonOnKeyboardWithText(text, target: target, action: action, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addRightButtonOnKeyboardWithText(_ text: String, target: AnyObject?, action: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let rightConfiguration = IQBarButtonItemConfiguration(title: text, action: action)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration)
- }
-
- // MARK: Right/Left
-
- func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, cancelAction: Selector, doneAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addCancelDoneOnKeyboardWithTarget(target, cancelAction: cancelAction, doneAction: doneAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonTitle: String, rightButtonTitle: String, leftButtonAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addRightLeftOnKeyboardWithTarget(target, leftButtonTitle: leftButtonTitle, rightButtonTitle: rightButtonTitle, leftButtonAction: leftButtonAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonImage: UIImage, rightButtonImage: UIImage, leftButtonAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addRightLeftOnKeyboardWithTarget(target, leftButtonImage: leftButtonImage, rightButtonImage: rightButtonImage, leftButtonAction: leftButtonAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?, cancelAction: Selector, doneAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let leftConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .cancel, action: cancelAction)
- let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: doneAction)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
- }
-
- func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonTitle: String, rightButtonTitle: String, leftButtonAction: Selector, rightButtonAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let leftConfiguration = IQBarButtonItemConfiguration(title: leftButtonTitle, action: leftButtonAction)
- let rightConfiguration = IQBarButtonItemConfiguration(title: rightButtonTitle, action: rightButtonAction)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
- }
-
- func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?, leftButtonImage: UIImage, rightButtonImage: UIImage, leftButtonAction: Selector, rightButtonAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let leftConfiguration = IQBarButtonItemConfiguration(image: leftButtonImage, action: leftButtonAction)
- let rightConfiguration = IQBarButtonItemConfiguration(image: rightButtonImage, action: rightButtonAction)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: leftConfiguration)
- }
-
- // MARK: Previous/Next/Right
-
- func addPreviousNextDoneOnKeyboardWithTarget (_ target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addPreviousNextDoneOnKeyboardWithTarget(target, previousAction: previousAction, nextAction: nextAction, doneAction: doneAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonImage: UIImage, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addPreviousNextRightOnKeyboardWithTarget(target, rightButtonImage: rightButtonImage, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonTitle: String, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, shouldShowPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
-
- addPreviousNextRightOnKeyboardWithTarget(target, rightButtonTitle: rightButtonTitle, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: (shouldShowPlaceholder ? self.drawingToolbarPlaceholder: nil), titleAccessibilityLabel: titleAccessibilityLabel)
- }
-
- func addPreviousNextDoneOnKeyboardWithTarget (_ target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let rightConfiguration = IQBarButtonItemConfiguration(barButtonSystemItem: .done, action: doneAction)
- let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
- let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
- }
-
- func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonImage: UIImage, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let rightConfiguration = IQBarButtonItemConfiguration(image: rightButtonImage, action: rightButtonAction)
- let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
- let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
- }
-
- func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?, rightButtonTitle: String, previousAction: Selector, nextAction: Selector, rightButtonAction: Selector, titleText: String?, titleAccessibilityLabel: String? = nil) {
-
- let rightConfiguration = IQBarButtonItemConfiguration(title: rightButtonTitle, action: rightButtonAction)
- let nextConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardNextImage() ?? UIImage(), action: nextAction)
- let prevConfiguration = IQBarButtonItemConfiguration(image: UIImage.keyboardPreviousImage() ?? UIImage(), action: previousAction)
-
- addKeyboardToolbarWithTarget(target: target, titleText: titleText, titleAccessibilityLabel: titleAccessibilityLabel, rightBarButtonConfiguration: rightConfiguration, previousBarButtonConfiguration: prevConfiguration, nextBarButtonConfiguration: nextConfiguration)
- }
-}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy
index fcfc9b9..9021190 100644
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy
@@ -2,6 +2,10 @@
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
NSPrivacyCollectedDataTypes
NSPrivacyTracking
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift
new file mode 100644
index 0000000..5fc408d
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift
@@ -0,0 +1,100 @@
+//
+// IQKeyboardManager+Resign.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @MainActor
+ private struct AssociatedKeys {
+ static var resignHandler: Int = 0
+ }
+
+ internal var resignHandler: IQKeyboardResignHandler {
+ if let object = objc_getAssociatedObject(self, &AssociatedKeys.resignHandler)
+ as? IQKeyboardResignHandler {
+ return object
+ }
+
+ let object: IQKeyboardResignHandler = .init()
+ objc_setAssociatedObject(self, &AssociatedKeys.resignHandler,
+ object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+
+ return object
+ }
+
+ /**
+ Resigns Keyboard on touching outside TextInputView. Default is NO.
+ */
+ var resignOnTouchOutside: Bool {
+ get { resignHandler.resignOnTouchOutside }
+ set { resignHandler.resignOnTouchOutside = newValue }
+ }
+
+ /** TapGesture to resign keyboard on view's touch.
+ It's a readonly property and exposed only for adding/removing dependencies
+ if your added gesture does have collision with this one
+ */
+ var resignGesture: UITapGestureRecognizer {
+ get { resignHandler.resignGesture }
+ set { resignHandler.resignGesture = newValue }
+ }
+
+ /**
+ Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController.
+ */
+ var disabledTouchResignedClasses: [UIViewController.Type] {
+ get { resignHandler.disabledTouchResignedClasses }
+ set { resignHandler.disabledTouchResignedClasses = newValue }
+ }
+
+ /**
+ Enabled classes to forcefully enable 'resignOnTouchOutside' property.
+ Class should be kind of UIViewController
+ . If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
+ */
+ var enabledTouchResignedClasses: [UIViewController.Type] {
+ get { resignHandler.enabledTouchResignedClasses }
+ set { resignHandler.enabledTouchResignedClasses = newValue }
+ }
+
+ /**
+ if resignOnTouchOutside is enabled then you can customize the behavior
+ to not recognize gesture touches on some specific view subclasses.
+ Class should be kind of UIView. Default is [UIControl, UINavigationBar]
+ */
+ var touchResignedGestureIgnoreClasses: [UIView.Type] {
+ get { resignHandler.touchResignedGestureIgnoreClasses }
+ set { resignHandler.touchResignedGestureIgnoreClasses = newValue }
+ }
+
+ /**
+ Resigns currently first responder field.
+ */
+ @discardableResult
+ func resignFirstResponder() -> Bool {
+ resignHandler.resignFirstResponder()
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift
new file mode 100644
index 0000000..b304c72
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift
@@ -0,0 +1,37 @@
+//
+// IQKeyboardManager+Resign_Deprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+ @available(*, unavailable, renamed: "resignOnTouchOutside")
+ var shouldResignOnTouchOutside: Bool {
+ get { false }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift
new file mode 100644
index 0000000..74aed2c
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift
@@ -0,0 +1,103 @@
+//
+// IQKeyboardResignHandler+Internal.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardResignHandler {
+
+ func removeTextInputViewObserver() {
+ textInputViewObserver.unsubscribe(identifier: "IQKeyboardResignHandler")
+ }
+
+ func addTextInputViewObserver() {
+ textInputViewObserver.subscribe(identifier: "IQKeyboardResignHandler",
+ changeHandler: { [weak self] event, textInputView in
+ guard let self = self else { return }
+ switch event {
+ case .beginEditing:
+ resignGesture.isEnabled = privateResignOnTouchOutside()
+ textInputView.window?.addGestureRecognizer(resignGesture)
+ case .endEditing:
+ textInputView.window?.removeGestureRecognizer(resignGesture)
+ }
+ })
+ }
+
+ func privateResignOnTouchOutside() -> Bool {
+
+ guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else {
+ return resignOnTouchOutside
+ }
+
+ switch textInputView.internalResignOnTouchOutsideMode {
+ case .default:
+ guard var controller = (textInputView as UIView).iq.viewContainingController() else {
+ return resignOnTouchOutside
+ }
+
+ // If it is searchBar textField embedded in Navigation Bar
+ if (textInputView as UIView).iq.textFieldSearchBar() != nil,
+ let navController: UINavigationController = controller as? UINavigationController,
+ let topController: UIViewController = navController.topViewController {
+ controller = topController
+ }
+
+ // If viewController is in enabledTouchResignedClasses, then assuming resignOnTouchOutside is enabled.
+ let isWithEnabledClass: Bool = enabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) })
+ var isEnabled: Bool = resignOnTouchOutside || isWithEnabledClass
+
+ if isEnabled {
+
+ // If viewController is in disabledTouchResignedClasses,
+ // then assuming resignOnTouchOutside is disable.
+ if disabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) }) {
+ isEnabled = false
+ } else {
+ let classNameString: String = "\(type(of: controller.self))"
+
+ // _UIAlertControllerTextFieldViewController
+ if classNameString.contains("UIAlertController"),
+ classNameString.hasSuffix("TextFieldViewController") {
+ isEnabled = false
+ }
+ }
+ }
+ return isEnabled
+ case .enabled:
+ return true
+ case .disabled:
+ return false
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+ var internalResignOnTouchOutsideMode: IQEnableMode {
+ iq.resignOnTouchOutsideMode
+ }
+}
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift
new file mode 100644
index 0000000..2ce0667
--- /dev/null
+++ b/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift
@@ -0,0 +1,149 @@
+//
+// IQKeyboardResignHandler.swift
+// https://github.com/hackiftekhar/IQKeyboardManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+import IQTextInputViewNotification
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers internal final class IQKeyboardResignHandler: NSObject {
+
+ let textInputViewObserver: IQTextInputViewNotification = .init()
+
+ /**
+ Resigns Keyboard on touching outside of TextInputView. Default is NO.
+ */
+ public var resignOnTouchOutside: Bool = false {
+
+ didSet {
+ resignGesture.isEnabled = privateResignOnTouchOutside()
+
+ IQKeyboardManager.shared.showLog("resignOnTouchOutside: \(resignOnTouchOutside ? "Yes" : "No")")
+ }
+ }
+
+ /** TapGesture to resign keyboard on view's touch.
+ It's a readonly property and exposed only for adding/removing dependencies
+ if your added gesture does have collision with this one
+ */
+ public var resignGesture: UITapGestureRecognizer = .init()
+
+ /**
+ Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController.
+ */
+ public var disabledTouchResignedClasses: [UIViewController.Type] = [
+ UIAlertController.self,
+ UIInputViewController.self
+ ]
+
+ /**
+ Enabled classes to forcefully enable 'resignOnTouchOutside' property.
+ Class should be kind of UIViewController
+ . If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
+ */
+ public var enabledTouchResignedClasses: [UIViewController.Type] = []
+
+ /**
+ if resignOnTouchOutside is enabled then you can customize the behavior
+ to not recognize gesture touches on some specific view subclasses.
+ Class should be kind of UIView. Default is [UIControl, UINavigationBar]
+ */
+ public var touchResignedGestureIgnoreClasses: [UIView.Type] = [
+ UIControl.self,
+ UINavigationBar.self
+ ]
+
+ /**
+ Resigns currently first responder field.
+ */
+ @discardableResult
+ public func resignFirstResponder() -> Bool {
+
+ guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else {
+ return false
+ }
+
+ // Resigning first responder
+ guard textInputView.resignFirstResponder() else {
+// showLog("Refuses to resign first responder: \(textInputView)")
+ // If it refuses then becoming it as first responder again. (Bug ID: #96)
+ // If it refuses to resign then becoming it first responder again for getting notifications callback.
+ textInputView.becomeFirstResponder()
+ return false
+ }
+ return true
+ }
+
+ public override init() {
+ super.init()
+
+ resignGesture.addTarget(self, action: #selector(self.tapRecognized(_:)))
+ resignGesture.cancelsTouchesInView = false
+ resignGesture.delegate = self
+ resignGesture.isEnabled = false
+
+ addTextInputViewObserver()
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardResignHandler: UIGestureRecognizerDelegate {
+
+ /** Resigning on tap gesture. (Enhancement ID: #14)*/
+ private func tapRecognized(_ gesture: UITapGestureRecognizer) {
+
+ if gesture.state == .ended {
+
+ // Resigning currently responder textInputView.
+ resignFirstResponder()
+ }
+ }
+
+ /** Note: returning YES is guaranteed to allow simultaneous recognition.
+ returning NO is not guaranteed to prevent simultaneous recognition,
+ as the other gesture's delegate may return YES.
+ */
+ public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
+ shouldRecognizeSimultaneouslyWith
+ otherGestureRecognizer: UIGestureRecognizer) -> Bool {
+ return false
+ }
+
+ /**
+ To not detect touch events in a subclass of UIControl,
+ these may have added their own selector for specific work
+ */
+ public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
+ shouldReceive touch: UITouch) -> Bool {
+ // (Bug ID: #145)
+ // Should not recognize gesture if the clicked view is either UIControl or UINavigationBar(
-
+
-IQKeyboardManager
-
-
-
+[![LICENSE.md](https://img.shields.io/github/license/hackiftekhar/IQKeyboardManager.svg)]([https://travis-ci.org/hackiftekhar/IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/LICENSE.md))
[![Build Status](https://travis-ci.org/hackiftekhar/IQKeyboardManager.svg)](https://travis-ci.org/hackiftekhar/IQKeyboardManager)
-
-
+![Platform iOS](https://img.shields.io/badge/Platform-iOS-blue.svg?style=fla)
+[![CocoaPods](https://img.shields.io/cocoapods/v/IQKeyboardManagerSwift.svg)](http://cocoadocs.org/docsets/IQKeyboardManagerSwift)
+[![Github tag](https://img.shields.io/github/tag/hackiftekhar/iqkeyboardmanager.svg)](https://github.com/hackiftekhar/IQKeyboardManager/tags)
+
+## Big updates are coming soon!
+
+#### First of all, Thank You for using IQKeyboardManager!
+It's been 11 years since it's first release in 2013. The library has grown a lot and we have added many new features since then.
+
+#### Motivation
+Recently while working on bug fixes, I realized that in 2013 there were only 2 files IQKeyboardManager.{h,m} in Objective-C version, while now in Swift version there are 50+ files which makes the debugging a lot difficult than before. Also some of the features are rarely used in apps.
+
+#### New Idea
+I realized that some of the features are not tightly linked to each other and can be moved out of the library easily. For Example:-
+- `IQTextView` class
+- `IQKeyboardListener` class
+- `IQTextFieldViewListener` class
+- `IQReturnKeyHandler` class
+- Toolbar related features like `IQToolbar` and `IQBarButtonItem` and their support classes.
+- ...
+
+Moving above things out will make the library more lightweight and user can plug in/out features as per their needs.
+
+#### Action Plan
+I have decided to move loosly linked features out, and publish them to their separate github repo, and use them as dependencies as per requirements.
+
+Below are the action plans
+- [x] Publish [IQKeyboardCore](https://github.com/hackiftekhar/IQKeyboardCore)
+ - This contains necessary classes and functions to be used by IQKeyboardManager related libraries. Please note that you shouldn't directly install this as dependency
+- [x] Publish [IQTextView](https://github.com/hackiftekhar/IQTextView)
+ - This is purely separated a separated library now.
+ - This usually used for showing placeholder in UITextView
+- [x] Publish [IQKeyboardReturnManager](https://github.com/hackiftekhar/IQKeyboardReturnManager)
+ - This is a renamed of `IQReturnKeyHandler`. This is also separated from the library and can be used independently.
+ - This depends on `IQKeyboardCore` for `TextInputView` type confirmation.
+- [x] Publish [IQTextInputViewNotification](https://github.com/hackiftekhar/IQTextInputViewNotification)
+ - This is a renamed of `IQTextFieldViewListener`. This can be used independently to subscribe/unsubscribe for UITextView/UITextField beginEditing/endEditing events.
+ - This depends on the `IQKeyboardCore` to add some additional customized features for UITextView/UITextField.
+- [x] Publish [IQKeyboardToolbar](https://github.com/hackiftekhar/IQKeyboardToolbar)
+ - This contains toolbar related classes like IQKeyboardToolbar, IQBarButtonItem, IQTitleBarButtonItems, their configuration classes and other useful functions to add toolbar in keyboard. This can be used independently to add toolbar in keyboard.
+ - This depends on the `IQKeyboardCore` to add some additional customized features for UITextView/UITextField.
+- [x] Publish [IQKeyboardToolbarManager](https://github.com/hackiftekhar/IQKeyboardToolbarManager)
+ - This is something similar to IQKeyboardManager. This has been moved out of the library as a huge update.
+ - This depends on the `IQTextInputViewNotification` to know which textField is currently in focus.
+ - This depends on the `IQKeyboardToolbar` to add/remove toolbars over keyboard.
+- [x] Publish [IQKeyboardNotification](https://github.com/hackiftekhar/IQKeyboardNotification)
+ - This is a renamed of `IQKeyboardListener`. This can be used independently to subscribe/unsubscribe for keyboard events.
+- [ ] Publish [IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager) 7.2.0 for all the current support without any compilation error but by deprecating most of the things which are moved out of the library.
+ - This now only contains functions for handling distance between UITextView/UITextField and their useful functions.
+ - This depends on the `IQKeyboardNotification` to get keyboard notification callbacks.
+ - This depends on the `IQTextInputViewNotification` to know which textField is currently in focus.
+ - Now there are also subspecs for now as of 7.2.0, but some of them will be removed in 8.0.0 because we already have separate library for this.
+ - `IQKeyboardManagerSwift/Appearance`
+ - `IQKeyboardManagerSwift/IQKeyboardReturnKeyHandler`
+ - `IQKeyboardManagerSwift/IQKeyboardToolbarManager`
+ - `IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardToolbar`
+ - `IQKeyboardManagerSwift/IQTextView`
+ - `IQKeyboardManagerSwift/Resign`
+- [ ] Bug fixes which may have arrived due to the library segregation.
+ - We need your support on this one.
+- [ ] Publish [IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager) 8.0.0 by marking deprecated classes as unavailable.
+ - In this release we will be removing all the deprecated classes and marking some of them as unavailable for easier migration.
+
+## Introduction
While developing iOS apps, we often run into issues where the iPhone keyboard slides up and covers the `UITextField/UITextView`. `IQKeyboardManager` allows you to prevent this issue of keyboard sliding up and covering `UITextField/UITextView` without needing you to write any code or make any additional setup. To use `IQKeyboardManager` you simply need to add source files to your project.
-#### Key Features
+## Key Features
-1) `**CODELESS**, Zero Lines of Code`
+1) `One Lines of Code`
2) `Works Automatically`
@@ -31,8 +89,11 @@ While developing iOS apps, we often run into issues where the iPhone keyboard sl
## Screenshot
-[![IQKeyboardManager](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerScreenshot.png)](http://youtu.be/6nhLw6hju2A)
-[![Settings](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerSettings.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 1](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot1.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 2](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot2.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 3](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot3.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 4](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot4.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 5](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot5.png)](http://youtu.be/6nhLw6hju2A)
## GIF animation
[![IQKeyboardManager](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManager.gif)](http://youtu.be/6nhLw6hju2A)
@@ -57,41 +118,45 @@ https://www.youtube.com/playlist?list=PL_csAAO9PQ8aTL87XnueOXi3RpWE2m_8v
- If **IQKeyboardManager** conflicts with other **third-party library**, then it's **developer responsibility** to **enable/disable IQKeyboardManager** when **presenting/dismissing** third-party library UI. Third-party libraries are not responsible to handle IQKeyboardManager.
## Requirements
-[![Platform iOS](https://img.shields.io/badge/Platform-iOS-blue.svg?style=fla)]()
| | Language | Minimum iOS Target | Minimum Xcode Version |
|------------------------|----------|--------------------|-----------------------|
-| IQKeyboardManager | Obj-C | iOS 8.0 | Xcode 9 |
-| IQKeyboardManagerSwift | Swift | iOS 8.0 | Xcode 9 |
-| Demo Project | | | Xcode 11 |
+| IQKeyboardManager | Obj-C | iOS 13.0 | Xcode 13 |
+| IQKeyboardManagerSwift | Swift | iOS 13.0 | Xcode 13 |
+| Demo Project | | | Xcode 15 |
#### Swift versions support
| Swift | Xcode | IQKeyboardManagerSwift |
|-------------------|-------|------------------------|
-| 5.1, 5.0, 4.2, 4.0, 3.2, 3.0| 11 | >= 6.5.0 |
-| 5.0,4.2, 4.0, 3.2, 3.0| 10.2 | >= 6.2.1 |
+| 5.9, 5.8, 5.7, 5.6| 15 | >= 7.0.0 |
+| 5.5, 5.4, 5.3, 5.2, 5.1, 5.0, 4.2| 11 | >= 6.5.7 |
+| 5.1, 5.0, 4.2, 4.0, 3.2, 3.0| 11 | >= 6.5.0 |
+| 5.0,4.2, 4.0, 3.2, 3.0| 10.2 | >= 6.2.1 |
| 4.2, 4.0, 3.2, 3.0| 10.0 | >= 6.0.4 |
| 4.0, 3.2, 3.0 | 9.0 | 5.0.0 |
+## 7.0.0 version notes
+- In this major release, a lot of variables and functions have been moved here and there. We have mentioned most of the major things in the MIGRATION GUIDE. So please take a look to make changes in your project when upgrading to this version.
+- The 7.0.0 version adopted the latest Swift Concurrency/Actor feature and only available iOS 13.0 and above.
+- Internal keyboard management handling have been updated with a different and better approach than legacy versions. However when adopting 7.0.0, please verify if it is working as expected in your apps, if there are any serious problems with 7.0.0 please open an issue with all the details and switch back to legacy version temporarily.
+
Installation
==========================
#### Installation with CocoaPods
-[![CocoaPods](https://img.shields.io/cocoapods/v/IQKeyboardManager.svg)](http://cocoadocs.org/docsets/IQKeyboardManager)
-
***IQKeyboardManager (Objective-C):*** IQKeyboardManager is available through [CocoaPods](http://cocoapods.org). To install
it, simply add the following line to your Podfile: ([#9](https://github.com/hackiftekhar/IQKeyboardManager/issues/9))
```ruby
-pod 'IQKeyboardManager' #iOS8 and later
+pod 'IQKeyboardManager' #iOS13 and later
```
***IQKeyboardManager (Swift):*** IQKeyboardManagerSwift is available through [CocoaPods](http://cocoapods.org). To install
it, simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236))
-*Swift 5.1, 5.0, 4.2, 4.0, 3.2, 3.0 (Xcode 11)*
+*Swift 5.9, 5.8, 5.7, 5.6, 5.5 (Xcode 15)*
```ruby
pod 'IQKeyboardManagerSwift'
@@ -144,10 +209,6 @@ Run `carthage` to build the frameworks and drag the appropriate framework (`IQKe
#### Installation with Source Code
-[![Github tag](https://img.shields.io/github/tag/hackiftekhar/iqkeyboardmanager.svg)]()
-
-
-
***IQKeyboardManager (Objective-C):*** Just ***drag and drop*** `IQKeyboardManager` directory from demo project to your project. That's it.
***IQKeyboardManager (Swift):*** ***Drag and drop*** `IQKeyboardManagerSwift` directory from demo project to your project
@@ -173,21 +234,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
[Swift Package Manager(SPM)](https://swift.org/package-manager/) is Apple's dependency manager tool. It is now supported in Xcode 11. So it can be used in all appleOS types of projects. It can be used alongside other tools like CocoaPods and Carthage as well.
-To install IQKeyboardManager package into your packages, add a reference to IQKeyboardManager and a targeting release version in the dependencies section in `Package.swift` file:
-
-```swift
-import PackageDescription
-
-let package = Package(
- name: "YOUR_PROJECT_NAME",
- products: [],
- dependencies: [
- .package(url: "https://github.com/hackiftekhar/IQKeyboardManager.git", from: "6.5.0")
- ]
-)
-```
-
-To install IQKeyboardManager package via Xcode
+To install IQKeyboardManagerSwift package via Xcode
* Go to File -> Swift Packages -> Add Package Dependency...
* Then search for https://github.com/hackiftekhar/IQKeyboardManager.git
@@ -196,6 +243,7 @@ To install IQKeyboardManager package via Xcode
Migration Guide
==========================
- [IQKeyboardManager 6.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/wiki/IQKeyboardManager-6.0.0-Migration-Guide)
+- [IQKeyboardManager 7.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/wiki/IQKeyboardManager-7.0.0-Migration-Guide)
Other Links
==========================
diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift
new file mode 100644
index 0000000..0f6243d
--- /dev/null
+++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift
@@ -0,0 +1,227 @@
+//
+// IQKeyboardInfo.swift
+// https://github.com/hackiftekhar/IQKeyboardNotification
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+public struct IQKeyboardInfo: Equatable {
+ nonisolated public static func == (lhs: Self, rhs: Self) -> Bool {
+ lhs.event == rhs.event &&
+ lhs.endFrame.equalTo(rhs.endFrame)
+ }
+
+ @objc public enum Event: Int, CaseIterable {
+ case willShow
+ case didShow
+ case willChangeFrame
+ case didChangeFrame
+ case willHide
+ case didHide
+
+ @MainActor
+ public var notification: Notification.Name {
+ switch self {
+ case .willShow:
+ return UIResponder.keyboardWillShowNotification
+ case .didShow:
+ return UIResponder.keyboardDidShowNotification
+ case .willChangeFrame:
+ return UIResponder.keyboardWillChangeFrameNotification
+ case .didChangeFrame:
+ return UIResponder.keyboardDidChangeFrameNotification
+ case .willHide:
+ return UIResponder.keyboardWillHideNotification
+ case .didHide:
+ return UIResponder.keyboardDidHideNotification
+ }
+ }
+ }
+
+ public let event: Event
+
+ /// `keyboardIsLocalUserInfoKey`.
+ public let isLocal: Bool
+
+ /// `UIKeyboardFrameBeginUserInfoKey`.
+ public let beginFrame: CGRect
+
+ /// `UIKeyboardFrameEndUserInfoKey`.
+ public let endFrame: CGRect
+
+ /// `UIKeyboardAnimationDurationUserInfoKey`.
+ public let animationDuration: TimeInterval
+
+ /// `UIKeyboardAnimationCurveUserInfoKey`.
+ public let animationCurve: UIView.AnimationCurve
+
+ public var animationOptions: UIView.AnimationOptions {
+ return UIView.AnimationOptions(rawValue: UInt(animationCurve.rawValue << 16))
+ }
+
+ public var isVisible: Bool {
+ endFrame.height > 0
+ }
+
+ internal init(notification: Notification?, event: Event) {
+ self.event = event
+
+ let screenBounds: CGRect
+ if let screen: UIScreen = notification?.object as? UIScreen {
+ screenBounds = screen.bounds
+ } else {
+ screenBounds = UIScreen.main.bounds
+ }
+
+ if let info: [AnyHashable: Any] = notification?.userInfo {
+
+ if let value = info[UIResponder.keyboardIsLocalUserInfoKey] as? Bool {
+ isLocal = value
+ } else {
+ isLocal = true
+ }
+
+ // Getting keyboard animation.
+ if let curveValue: Int = info[UIResponder.keyboardAnimationCurveUserInfoKey] as? Int,
+ let curve: UIView.AnimationCurve = UIView.AnimationCurve(rawValue: curveValue) {
+ animationCurve = curve
+ } else {
+ animationCurve = .easeOut
+ }
+
+ // Getting keyboard animation duration
+ if let duration: TimeInterval = info[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval,
+ duration != 0.0 {
+ animationDuration = duration
+ } else {
+ animationDuration = 0.25
+ }
+
+ if let beginKeyboardFrame: CGRect = info[UIResponder.keyboardFrameBeginUserInfoKey] as? CGRect {
+ beginFrame = Self.getKeyboardFrame(of: beginKeyboardFrame, inScreenBounds: screenBounds)
+ } else {
+ beginFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+ }
+
+ if let endKeyboardFrame: CGRect = info[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect {
+ endFrame = Self.getKeyboardFrame(of: endKeyboardFrame, inScreenBounds: screenBounds)
+ } else {
+ endFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+ }
+ } else {
+ isLocal = true
+ animationCurve = .easeOut
+ animationDuration = 0.25
+ beginFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+ endFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+ }
+ }
+
+ @MainActor
+ public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+
+ /* ******* */
+// UIView.beginAnimations(nil, context: nil)
+// UIView.setAnimationDuration(duration)
+// UIView.setAnimationCurve(curve)
+// UIView.setAnimationBeginsFromCurrentState(true)
+// UIView.setAnimationDelegate(self)
+// UIView.setAnimationDidStop(#selector(UIViewController.keyboardAnimationDidStop(_:finished:context:)))
+//
+// keyboardStateDelegate?.keyboardTransitionAnimation(state)
+//
+// UIView.commitAnimations()
+
+ /* ******* */
+// if let timing = UIView.AnimationCurve.RawValue(exactly: animationCurve.rawValue),
+// let curve = UIView.AnimationCurve(rawValue: timing) {
+// let animator = UIViewPropertyAnimator(duration: animationDuration, curve: curve) {
+// transition()
+// }
+// animator.addCompletion { _ in
+// completion?()
+// }
+// animator.isUserInteractionEnabled = true
+// animator.startAnimation()
+// } else {
+ var animationOptions: UIView.AnimationOptions = self.animationOptions
+ animationOptions.formUnion(.allowUserInteraction)
+ animationOptions.formUnion(.beginFromCurrentState)
+ UIView.animate(withDuration: animationDuration, delay: 0,
+ options: animationOptions,
+ animations: transition,
+ completion: { _ in
+ completion?()
+ })
+// }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+private extension IQKeyboardInfo {
+ static func getKeyboardFrame(of rect: CGRect, inScreenBounds screenBounds: CGRect) -> CGRect {
+ var finalFrame: CGRect = rect
+ // If this is floating keyboard
+ if finalFrame.width < screenBounds.width,
+ finalFrame.maxY < screenBounds.height {
+ finalFrame.size = CGSize(width: finalFrame.size.width, height: 0)
+ } else {
+ // (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506)
+ // Calculating actual keyboard covered size respect to window,
+ // keyboard frame may be different when hardware keyboard is attached
+ let keyboardHeight = CGFloat.maximum(screenBounds.height - finalFrame.minY, 0)
+ finalFrame.size = CGSize(width: finalFrame.size.width, height: keyboardHeight)
+ }
+
+ return finalFrame
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@objcMembers public class IQKeyboardInfoObjC: NSObject {
+ private let wrappedValue: IQKeyboardInfo
+
+ public var event: IQKeyboardInfo.Event { wrappedValue.event }
+
+ public var isLocal: Bool { wrappedValue.isLocal }
+
+ public var beginFrame: CGRect { wrappedValue.beginFrame }
+
+ public var endFrame: CGRect { wrappedValue.endFrame }
+
+ public var animationDuration: TimeInterval { wrappedValue.animationDuration }
+
+ public var animationCurve: UIView.AnimationCurve { wrappedValue.animationCurve }
+
+ public var animationOptions: UIView.AnimationOptions { wrappedValue.animationOptions }
+
+ public var isVisible: Bool { wrappedValue.isVisible }
+
+ init(wrappedValue: IQKeyboardInfo){
+ self.wrappedValue = wrappedValue
+ }
+
+ @MainActor
+ public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+ wrappedValue.animate(alongsideTransition: transition, completion: completion)
+ }
+}
diff --git a/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift
new file mode 100644
index 0000000..ba4edb6
--- /dev/null
+++ b/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift
@@ -0,0 +1,149 @@
+//
+// IQKeyboardNotification.swift
+// https://github.com/hackiftekhar/IQKeyboardNotification
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import Combine
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardNotification: NSObject {
+
+ private var storage: Set = []
+
+ private var eventObservers: [IQKeyboardInfo.Event: [AnyHashable: SizeCompletion]] = [:]
+
+ public private(set) var oldKeyboardInfo: IQKeyboardInfo
+
+ public private(set) var keyboardInfo: IQKeyboardInfo {
+ didSet {
+ guard keyboardInfo != oldValue else { return }
+ oldKeyboardInfo = oldValue
+ sendKeyboardInfo(info: keyboardInfo)
+ }
+ }
+
+ public var isVisible: Bool {
+ keyboardInfo.isVisible
+ }
+
+ public var frame: CGRect {
+ keyboardInfo.endFrame
+ }
+
+ public override init() {
+ keyboardInfo = IQKeyboardInfo(notification: nil, event: .didHide)
+ oldKeyboardInfo = keyboardInfo
+ super.init()
+
+ // Registering for keyboard notification.
+ for event in IQKeyboardInfo.Event.allCases {
+ NotificationCenter.default.publisher(for: event.notification)
+ .map({ IQKeyboardInfo(notification: $0, event: event) })
+ .assign(to: \.keyboardInfo, on: self)
+ .store(in: &storage)
+ }
+ }
+
+ public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+ keyboardInfo.animate(alongsideTransition: transition, completion: completion)
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardNotification {
+
+ typealias SizeCompletion = (_ event: IQKeyboardInfo.Event, _ endFrame: CGRect) -> Void
+
+ func subscribe(for events: [IQKeyboardInfo.Event],
+ identifier: AnyHashable, changeHandler: @escaping SizeCompletion) {
+
+ for event in events {
+ var existingObservers: [AnyHashable: SizeCompletion] = eventObservers[event] ?? [:]
+ existingObservers[identifier] = changeHandler
+ eventObservers[event] = existingObservers
+ }
+
+ // If current event is the one user is subscribed to, then call changeHandler immediately for the first time.
+ if events.contains(keyboardInfo.event) {
+ changeHandler(keyboardInfo.event, keyboardInfo.endFrame)
+ }
+ }
+
+ func unsubscribe(for events: [IQKeyboardInfo.Event], identifier: AnyHashable) {
+
+ for event in events {
+ var existingObservers: [AnyHashable: SizeCompletion] = eventObservers[event] ?? [:]
+ existingObservers[identifier] = nil
+ eventObservers[event] = existingObservers
+ }
+ }
+
+ func isSubscribed(for event: IQKeyboardInfo.Event? = nil, identifier: AnyHashable) -> Bool {
+ if let event = event {
+ guard let observers = eventObservers[event], !observers.isEmpty else { return false }
+ return observers[identifier] != nil
+ } else {
+
+ for event in IQKeyboardInfo.Event.allCases {
+ let observers = eventObservers[event] ?? [:]
+ if observers[identifier] != nil {
+ return true
+ }
+ }
+ return false
+ }
+ }
+
+ private func sendKeyboardInfo(info: IQKeyboardInfo) {
+
+ guard let observers = eventObservers[info.event], !observers.isEmpty else { return }
+
+ let endFrame: CGRect = info.endFrame
+
+ for block in observers.values {
+ block(info.event, endFrame)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardNotification {
+
+ var oldKeyboardInfoObjc: IQKeyboardInfoObjC { IQKeyboardInfoObjC(wrappedValue: oldKeyboardInfo) }
+
+ var keyboardInfoObjc: IQKeyboardInfoObjC { IQKeyboardInfoObjC(wrappedValue: keyboardInfo) }
+
+ func subscribe(identifier: AnyHashable, changeHandler: @escaping SizeCompletion) {
+ subscribe(for: IQKeyboardInfo.Event.allCases, identifier: identifier, changeHandler: changeHandler)
+ }
+
+ func unsubscribe(identifier: AnyHashable) {
+ unsubscribe(for: IQKeyboardInfo.Event.allCases, identifier: identifier)
+ }
+
+ func isSubscribed(identifier: AnyHashable) -> Bool {
+ isSubscribed(for: nil, identifier: identifier)
+ }
+}
diff --git a/Pods/IQKeyboardNotification/LICENSE b/Pods/IQKeyboardNotification/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardNotification/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardNotification/README.md b/Pods/IQKeyboardNotification/README.md
new file mode 100644
index 0000000..243db80
--- /dev/null
+++ b/Pods/IQKeyboardNotification/README.md
@@ -0,0 +1,36 @@
+# IQKeyboardNotification
+Lightweight library to observe keyboard events with ease.
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardNotification.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardNotification)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardNotification/master/Screenshot/IQKeyboardNotificationScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardNotification is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardNotification'
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## Flow
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardNotification/master/Screenshot/FlowDiagram.jpg)
+
+## License
+
+IQKeyboardNotification is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift
new file mode 100644
index 0000000..c3894a8
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift
@@ -0,0 +1,154 @@
+//
+// IQKeyboardReturnManager+UITextFieldDelegate.swift
+// https://github.com/hackiftekhar/IQKeyboardReturnManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: UITextFieldDelegate
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardReturnManager: UITextFieldDelegate {
+
+ public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
+
+ var returnValue: Bool = true
+
+ if delegate == nil,
+ let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ if textFieldDelegate.responds(to: #selector((any UITextFieldDelegate).textFieldShouldBeginEditing(_:))) {
+ returnValue = textFieldDelegate.textFieldShouldBeginEditing?(textField) ?? false
+ }
+ }
+
+ if returnValue {
+ updateReturnKey(textInputView: textField)
+ }
+
+ return returnValue
+ }
+
+ public func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ if textFieldDelegate.responds(to: #selector((any UITextFieldDelegate).textFieldShouldEndEditing(_:))) {
+ return textFieldDelegate.textFieldShouldEndEditing?(textField) ?? false
+ }
+ }
+
+ return true
+ }
+
+ public func textFieldDidBeginEditing(_ textField: UITextField) {
+
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textFieldDidBeginEditing?(textField)
+ }
+
+ public func textFieldDidEndEditing(_ textField: UITextField) {
+
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textFieldDidEndEditing?(textField)
+ }
+
+ public func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
+
+ var aDelegate: (any UITextFieldDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+ aDelegate = model.textFieldDelegate
+ }
+ }
+
+ aDelegate?.textFieldDidEndEditing?(textField, reason: reason)
+ }
+
+ public func textField(_ textField: UITextField,
+ shouldChangeCharactersIn range: NSRange,
+ replacementString string: String) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ let selector: Selector = #selector((any UITextFieldDelegate).textField(_:shouldChangeCharactersIn:
+ replacementString:))
+ if textFieldDelegate.responds(to: selector) {
+ return textFieldDelegate.textField?(textField,
+ shouldChangeCharactersIn: range,
+ replacementString: string) ?? false
+ }
+ }
+ return true
+ }
+
+ public func textFieldShouldClear(_ textField: UITextField) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ if textFieldDelegate.responds(to: #selector((any UITextFieldDelegate).textFieldShouldClear(_:))) {
+ return textFieldDelegate.textFieldShouldClear?(textField) ?? false
+ }
+ }
+
+ return true
+ }
+
+ public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ var isReturn: Bool = true
+
+ if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+ if textFieldDelegate.responds(to: #selector((any UITextFieldDelegate).textFieldShouldReturn(_:))) {
+ isReturn = textFieldDelegate.textFieldShouldReturn?(textField) ?? false
+ }
+ }
+
+ if isReturn {
+ goToNextResponderOrResign(from: textField)
+ return true
+ } else {
+ return goToNextResponderOrResign(from: textField)
+ }
+ }
+}
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift
new file mode 100644
index 0000000..888ebbe
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift
@@ -0,0 +1,398 @@
+//
+// IQKeyboardReturnManager+UITextViewDelegate.swift
+// https://github.com/hackiftekhar/IQKeyboardReturnManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: UITextViewDelegate
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardReturnManager: UITextViewDelegate {
+
+ public func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
+
+ var returnValue: Bool = true
+
+ if delegate == nil,
+ let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+ if textViewDelegate.responds(to: #selector((any UITextViewDelegate).textViewShouldBeginEditing(_:))) {
+ returnValue = textViewDelegate.textViewShouldBeginEditing?(textView) ?? false
+ }
+ }
+
+ if returnValue {
+ updateReturnKey(textInputView: textView)
+ }
+
+ return returnValue
+ }
+
+ public func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+ if textViewDelegate.responds(to: #selector((any UITextViewDelegate).textViewShouldEndEditing(_:))) {
+ return textViewDelegate.textViewShouldEndEditing?(textView) ?? false
+ }
+ }
+
+ return true
+ }
+
+ public func textViewDidBeginEditing(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewDidBeginEditing?(textView)
+ }
+
+ public func textViewDidEndEditing(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewDidEndEditing?(textView)
+ }
+
+ public func textView(_ textView: UITextView,
+ shouldChangeTextIn range: NSRange,
+ replacementText text: String) -> Bool {
+
+ var shouldChange = true
+
+ if delegate == nil {
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+ let selector = #selector((any UITextViewDelegate).textView(_:shouldChangeTextIn:replacementText:))
+ if textViewDelegate.responds(to: selector) {
+ shouldChange = (textViewDelegate.textView?(textView,
+ shouldChangeTextIn: range,
+ replacementText: text)) ?? true
+ }
+ }
+ }
+
+ if self.dismissTextViewOnReturn, text == "\n" {
+ goToNextResponderOrResign(from: textView)
+ return false
+ }
+
+ return shouldChange
+ }
+
+ public func textViewDidChange(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewDidChange?(textView)
+ }
+
+ public func textViewDidChangeSelection(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewDidChangeSelection?(textView)
+ }
+
+ @available(iOS, deprecated: 17.0)
+ public func textView(_ aTextView: UITextView,
+ shouldInteractWith URL: URL,
+ in characterRange: NSRange,
+ interaction: UITextItemInteraction) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ let selector: Selector = #selector(textView as
+ (UITextView, URL, NSRange, UITextItemInteraction) -> Bool)
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ shouldInteractWith: URL,
+ in: characterRange,
+ interaction: interaction) ?? false
+ }
+ }
+
+ return true
+ }
+
+ @available(iOS, deprecated: 17.0)
+ public func textView(_ aTextView: UITextView,
+ shouldInteractWith textAttachment: NSTextAttachment,
+ in characterRange: NSRange,
+ interaction: UITextItemInteraction) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ let selector: Selector = #selector(textView as
+ (UITextView, NSTextAttachment, NSRange, UITextItemInteraction)
+ -> Bool)
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ shouldInteractWith: textAttachment,
+ in: characterRange,
+ interaction: interaction) ?? false
+ }
+ }
+
+ return true
+ }
+
+ @available(iOS, deprecated: 10.0)
+ public func textView(_ aTextView: UITextView,
+ shouldInteractWith URL: URL,
+ in characterRange: NSRange) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ if textViewDelegate.responds(to: #selector(textView as (UITextView, URL, NSRange) -> Bool)) {
+ return textViewDelegate.textView?(aTextView,
+ shouldInteractWith: URL,
+ in: characterRange) ?? false
+ }
+ }
+
+ return true
+ }
+
+ @available(iOS, deprecated: 10.0)
+ public func textView(_ aTextView: UITextView,
+ shouldInteractWith textAttachment: NSTextAttachment,
+ in characterRange: NSRange) -> Bool {
+
+ guard delegate == nil else { return true }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ if textViewDelegate.responds(to: #selector(textView as (UITextView, NSTextAttachment, NSRange) -> Bool)) {
+ return textViewDelegate.textView?(aTextView,
+ shouldInteractWith: textAttachment,
+ in: characterRange) ?? false
+ }
+ }
+
+ return true
+ }
+}
+
+@available(iOS 16.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardReturnManager {
+ public func textView(_ aTextView: UITextView,
+ editMenuForTextIn range: NSRange,
+ suggestedActions: [UIMenuElement]) -> UIMenu? {
+
+ guard delegate == nil else { return nil }
+
+ if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+
+ let selector: Selector = #selector(textView as
+ (UITextView, NSRange, [UIMenuElement]) -> UIMenu?)
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ editMenuForTextIn: range,
+ suggestedActions: suggestedActions)
+ }
+ }
+
+ return nil
+ }
+
+ public func textView(_ aTextView: UITextView,
+ willPresentEditMenuWith animator: any UIEditMenuInteractionAnimating) {
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(aTextView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(aTextView, willPresentEditMenuWith: animator)
+ }
+
+ public func textView(_ aTextView: UITextView,
+ willDismissEditMenuWith animator: any UIEditMenuInteractionAnimating) {
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(aTextView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(aTextView, willDismissEditMenuWith: animator)
+ }
+}
+
+#if swift(>=5.9) // Xcode 15
+@available(iOS 17.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ func textView(_ aTextView: UITextView,
+ primaryActionFor textItem: UITextItem,
+ defaultAction: UIAction) -> UIAction? {
+ guard delegate == nil else { return nil }
+
+ if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ if textViewDelegate.responds(to: #selector(textView as (UITextView, UITextItem, UIAction) -> UIAction?)) {
+ return textViewDelegate.textView?(aTextView,
+ primaryActionFor: textItem,
+ defaultAction: defaultAction)
+ }
+ }
+
+ return nil
+ }
+
+ func textView(_ aTextView: UITextView,
+ menuConfigurationFor textItem: UITextItem,
+ defaultMenu: UIMenu) -> UITextItem.MenuConfiguration? {
+ guard delegate == nil else { return nil }
+
+ if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ let selector: Selector = #selector(textView as (UITextView, UITextItem, UIMenu)
+ -> UITextItem.MenuConfiguration?)
+ if textViewDelegate.responds(to: selector) {
+ return textViewDelegate.textView?(aTextView,
+ menuConfigurationFor: textItem,
+ defaultMenu: defaultMenu)
+ }
+ }
+
+ return nil
+ }
+
+ func textView(_ textView: UITextView,
+ textItemMenuWillDisplayFor textItem: UITextItem,
+ animator: any UIContextMenuInteractionAnimating) {
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, textItemMenuWillDisplayFor: textItem, animator: animator)
+ }
+
+ func textView(_ textView: UITextView,
+ textItemMenuWillEndFor textItem: UITextItem,
+ animator: any UIContextMenuInteractionAnimating) {
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textView?(textView, textItemMenuWillEndFor: textItem, animator: animator)
+ }
+}
+#endif
+
+#if swift(>=6.0) // Xcode 16
+@available(iOS 18.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ func textViewWritingToolsWillBegin(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewWritingToolsWillBegin?(textView)
+ }
+
+ func textViewWritingToolsDidEnd(_ textView: UITextView) {
+
+ var aDelegate: (any UITextViewDelegate)? = delegate
+
+ if aDelegate == nil {
+
+ if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+ aDelegate = model.textViewDelegate
+ }
+ }
+
+ aDelegate?.textViewWritingToolsDidEnd?(textView)
+ }
+
+ func textView(_ textView: UITextView,
+ writingToolsIgnoredRangesInEnclosingRange enclosingRange: NSRange) -> [NSValue] {
+ guard delegate == nil else { return [] }
+
+ if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+ if textViewDelegate.responds(to: #selector(textView as (UITextView, NSRange) -> [NSValue])) {
+ return textViewDelegate.textView?(aTextView,
+ writingToolsIgnoredRangesInEnclosingRange: enclosingRange)
+ }
+ }
+ return []
+ }
+}
+#endif
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift
new file mode 100644
index 0000000..f8b7f29
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift
@@ -0,0 +1,277 @@
+//
+// IQKeyboardReturnManager.swift
+// https://github.com/hackiftekhar/IQKeyboardReturnManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+/**
+Manages the return key to work like next/done in a view hierarchy.
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardReturnManager: NSObject {
+
+ // MARK: Private variables
+ private var textInputViewInfoCache: [IQTextInputViewInfoModel] = []
+
+ // MARK: Settings
+
+ /**
+ Delegate of textInputView
+ */
+ public weak var delegate: (any UITextFieldDelegate & UITextViewDelegate)?
+
+ /**
+ Set the last textInputView return key type. Default is UIReturnKeyDefault.
+ */
+ public var lastTextInputViewReturnKeyType: UIReturnKeyType = .default {
+
+ didSet {
+ if let activeModel = textInputViewInfoCache.first(where: {
+ guard let textInputView = $0.textInputView else {
+ return false
+ }
+ return textInputView.isFirstResponder
+ }), let view: any IQTextInputView = activeModel.textInputView {
+ updateReturnKey(textInputView: view)
+ }
+ }
+ }
+
+ public var dismissTextViewOnReturn: Bool = false
+
+ // MARK: Initialization/De-initialization
+
+ public override init() {
+ super.init()
+ }
+
+ @available(*, unavailable, message: "Please use addResponderSubviews(of:recursive:)")
+ public init(controller: UIViewController) {
+ super.init()
+ addResponderSubviews(of: controller.view, recursive: true)
+ }
+
+ deinit {
+
+ // for model in textInputViewInfoCache {
+ // model.restore()
+ // }
+
+ textInputViewInfoCache.removeAll()
+ }
+}
+
+// MARK: Registering/Unregistering textInputView
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardReturnManager {
+
+ /**
+ Should pass TextInputView instance. Assign textInputView delegate to self, change it's returnKeyType.
+
+ @param view TextInputView object to register.
+ */
+ func add(textInputView: any IQTextInputView) {
+
+ let model = IQTextInputViewInfoModel(textInputView: textInputView)
+ textInputViewInfoCache.append(model)
+
+ if let view: UITextField = textInputView as? UITextField {
+ view.delegate = self
+ } else if let view: UITextView = textInputView as? UITextView {
+ view.delegate = self
+ }
+ }
+
+ /**
+ Should pass TextInputView instance. Restore it's textInputView delegate and it's returnKeyType.
+
+ @param view TextInputView object to unregister.
+ */
+ func remove(textInputView: any IQTextInputView) {
+
+ guard let index: Int = textInputViewCachedInfoIndex(textInputView) else { return }
+
+ let model = textInputViewInfoCache.remove(at: index)
+ model.restore()
+ }
+
+ /**
+ Add all the TextInputView responderView's.
+
+ @param view object to register all it's responder subviews.
+ */
+ func addResponderSubviews(of view: UIView, recursive: Bool) {
+
+ let textInputViews: [any IQTextInputView] = view.responderSubviews(recursive: recursive)
+
+ for view in textInputViews {
+ add(textInputView: view)
+ }
+ }
+
+ /**
+ Remove all the TextInputView responderView's.
+
+ @param view object to unregister all it's responder subviews.
+ */
+ func removeResponderSubviews(of view: UIView, recursive: Bool) {
+
+ let textInputViews: [any IQTextInputView] = view.responderSubviews(recursive: recursive)
+
+ for view in textInputViews {
+ remove(textInputView: view)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+ @discardableResult
+ func goToNextResponderOrResign(from textInputView: any IQTextInputView) -> Bool {
+
+ guard let textInfoCache: IQTextInputViewInfoModel = nextResponderFromTextInputView(textInputView),
+ let textInputView = textInfoCache.textInputView else {
+ textInputView.resignFirstResponder()
+ return true
+ }
+
+ textInputView.becomeFirstResponder()
+ return false
+ }
+}
+
+// MARK: Internal Functions
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardReturnManager {
+
+ func nextResponderFromTextInputView(_ textInputView: some IQTextInputView) -> IQTextInputViewInfoModel? {
+ guard let currentIndex: Int = textInputViewCachedInfoIndex(textInputView),
+ currentIndex < textInputViewInfoCache.count - 1 else { return nil }
+
+ let candidates = Array(textInputViewInfoCache[currentIndex+1.. Int? {
+ return textInputViewInfoCache.firstIndex {
+ guard let inputView = $0.textInputView else { return false }
+ return inputView == textInputView
+ }
+ }
+
+ func textInputViewCachedInfo(_ textInputView: some IQTextInputView) -> IQTextInputViewInfoModel? {
+ guard let index: Int = textInputViewCachedInfoIndex(textInputView) else { return nil }
+ return textInputViewInfoCache[index]
+ }
+
+ func updateReturnKey(textInputView: some IQTextInputView) {
+
+ let returnKey: UIReturnKeyType
+ if nextResponderFromTextInputView(textInputView) != nil {
+ returnKey = .next
+ } else {
+ returnKey = lastTextInputViewReturnKeyType
+ }
+
+ if textInputView.returnKeyType != returnKey {
+ // If it's the last textInputView in responder view, else next
+ textInputView.returnKeyType = returnKey
+ textInputView.reloadInputViews()
+ }
+ }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+ @available(*, unavailable, renamed: "lastTextInputViewReturnKeyType")
+ var lastTextFieldReturnKeyType: UIReturnKeyType {
+ get { .default }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "add(textInputView:)")
+ func addTextFieldView(_ textInputView: any IQTextInputView) { }
+
+ @available(*, unavailable, renamed: "remove(textInputView:)")
+ func removeTextFieldView(_ textInputView: any IQTextInputView) { }
+
+ @available(*, unavailable, renamed: "addResponderSubviews(of:recursive:)")
+ func addResponderFromView(_ view: UIView, recursive: Bool) { }
+
+ @available(*, unavailable, renamed: "removeResponderSubviews(of:recursive:)")
+ func removeResponderFromView(_ view: UIView, recursive: Bool = true) { }
+}
+// swiftlint:enable unused_setter_value
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension UIView {
+
+ func responderSubviews(recursive: Bool) -> [any IQTextInputView] {
+
+ // Array of TextInputViews.
+ var textInputViews: [any IQTextInputView] = []
+ for view in subviews {
+
+ if let view = view as? IQTextInputView {
+ textInputViews.append(view)
+ }
+ // Sometimes there are hidden or disabled views and textInputView inside them still recorded,
+ // so we added some more validations here (Bug ID: #458)
+ // Uncommented else (Bug ID: #625)
+ else if recursive, !view.subviews.isEmpty {
+ let deepResponders = view.responderSubviews(recursive: recursive)
+ textInputViews.append(contentsOf: deepResponders)
+ }
+ }
+
+ // subviews are returning in opposite order. Sorting according the frames 'y'.
+ return textInputViews.sorted(by: { (view1: any IQTextInputView, view2: any IQTextInputView) -> Bool in
+
+ let frame1: CGRect = view1.convert(view1.bounds, to: self)
+ let frame2: CGRect = view2.convert(view2.bounds, to: self)
+
+ if frame1.minY != frame2.minY {
+ return frame1.minY < frame2.minY
+ } else {
+ return frame1.minX < frame2.minX
+ }
+ })
+ }
+}
diff --git a/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift
new file mode 100644
index 0000000..c7b9099
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift
@@ -0,0 +1,56 @@
+//
+// IQTextInputViewInfoModel.swift
+// https://github.com/hackiftekhar/IQKeyboardReturnManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal final class IQTextInputViewInfoModel: NSObject {
+
+ weak var textFieldDelegate: (any UITextFieldDelegate)?
+ weak var textViewDelegate: (any UITextViewDelegate)?
+ weak var textInputView: (any IQTextInputView)?
+ let originalReturnKeyType: UIReturnKeyType
+
+ init(textInputView: any IQTextInputView) {
+ self.textInputView = textInputView
+ self.originalReturnKeyType = textInputView.returnKeyType
+ if let textInputView = textInputView as? UITextField {
+ self.textFieldDelegate = textInputView.delegate
+ } else if let textInputView = textInputView as? UITextView {
+ self.textViewDelegate = textInputView.delegate
+ }
+
+ super.init()
+ }
+
+ func restore() {
+ textInputView?.returnKeyType = originalReturnKeyType
+ if let textInputView = textInputView as? UITextField {
+ textInputView.delegate = textFieldDelegate
+ } else if let textInputView = textInputView as? UITextView {
+ textInputView.delegate = textViewDelegate
+ }
+ }
+}
diff --git a/Pods/IQKeyboardReturnManager/LICENSE b/Pods/IQKeyboardReturnManager/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardReturnManager/README.md b/Pods/IQKeyboardReturnManager/README.md
new file mode 100644
index 0000000..5524787
--- /dev/null
+++ b/Pods/IQKeyboardReturnManager/README.md
@@ -0,0 +1,68 @@
+# IQKeyboardReturnManager
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardReturnManager.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardReturnManager)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardReturnManager/master/Screenshot/IQKeyboardReturnManagerScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardReturnManager is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardReturnManager'
+```
+
+## Usage
+
+To handle keyboard return key automatically:-
+
+```swift
+import IQKeyboardReturnManager
+
+class ViewController: UIViewController {
+
+ let returnManager: IQKeyboardReturnManager = .init()
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ // This will add all textInputView of the controller and start observing for textFieldShouldReturn events
+ returnManager.addResponderSubviews(of: self.view, recursive: true)
+
+ // If you would like to dismiss the UITextView on tapping on return then add this
+ returnManager.dismissTextViewOnReturn = true
+
+ // If you would like to change last textInputView return key type to done or something else, then add this
+ returnManager.lastTextInputViewReturnKeyType = .done
+
+ // If you would like to customize the navigation between textField by your own order then add them manually
+ returnManager.add(textInputView: textField1)
+ returnManager.add(textInputView: textField2)
+ returnManager.add(textInputView: textField3)
+ returnManager.add(textInputView: textField4)
+ }
+}
+
+// IQKeyboardReturnManager will forward all delegate callbacks to you, so you can customize the decisions
+extension ViewController: UITextFieldDelegate {
+ @objc public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {...}
+}
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardReturnManager is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift
new file mode 100644
index 0000000..b289c30
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift
@@ -0,0 +1,120 @@
+//
+// IQBarButtonItem.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQBarButtonItem: UIBarButtonItem {
+
+ internal static let flexibleBarButtonItem: IQBarButtonItem = IQBarButtonItem(barButtonSystemItem: .flexibleSpace,
+ target: nil, action: nil)
+
+ public override init() {
+ super.init()
+ initialize()
+ }
+
+ public required init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+ initialize()
+ }
+
+ private func initialize() {
+
+ let states: [UIControl.State] = [.normal, .highlighted, .disabled, .focused]
+
+ for state in states {
+
+ setBackgroundImage(UIImage(), for: state, barMetrics: .default)
+ setBackgroundImage(UIImage(), for: state, style: .plain, barMetrics: .default)
+ setBackButtonBackgroundImage(UIImage(), for: state, barMetrics: .default)
+ }
+
+ setTitlePositionAdjustment(UIOffset(), for: .default)
+ setBackgroundVerticalPositionAdjustment(0, for: .default)
+ setBackButtonBackgroundVerticalPositionAdjustment(0, for: .default)
+ }
+
+ override open var tintColor: UIColor? {
+ didSet {
+
+ var textAttributes: [NSAttributedString.Key: Any] = [:]
+ textAttributes[.foregroundColor] = tintColor
+
+ if let attributes: [NSAttributedString.Key: Any] = titleTextAttributes(for: .normal) {
+ for (key, value) in attributes {
+ textAttributes[key] = value
+ }
+ }
+
+ setTitleTextAttributes(textAttributes, for: .normal)
+ }
+ }
+
+ /**
+ Boolean to know if it's a system item or custom item,
+ we are having a limitation that we cannot override a designated initializer,
+ so we are manually setting this property once in initialization
+ */
+ internal var isSystemItem: Bool = false
+
+ /**
+ Additional target & action to do get callback action.
+ Note that setting custom target & selector doesn't affect native functionality,
+ this is just an additional target to get a callback.
+
+ @param target Target object.
+ @param action Target Selector.
+ */
+ open func setTarget(_ target: AnyObject?, action: Selector?) {
+ if let target: AnyObject = target, let action: Selector = action {
+ invocation = IQInvocation(target: target, action: action)
+ } else {
+ invocation = nil
+ }
+ }
+
+ /**
+ Customized Invocation to be called when button is pressed.
+ invocation is internally created using setTarget:action: method.
+ */
+ open var invocation: IQInvocation? {
+ didSet {
+ // We have to put this condition here because if we override this function then
+ // We were getting "Cannot override '_' which has been marked unavailable" in Xcode 15
+ if let titleBarButton = self as? IQTitleBarButtonItem {
+
+ if let target = invocation?.target, let action = invocation?.action {
+ titleBarButton.isEnabled = true
+ titleBarButton.titleButton?.isEnabled = true
+ titleBarButton.titleButton?.addTarget(target, action: action, for: .touchUpInside)
+ } else {
+ titleBarButton.isEnabled = false
+ titleBarButton.titleButton?.isEnabled = false
+ titleBarButton.titleButton?.removeTarget(nil, action: nil, for: .touchUpInside)
+ }
+ }
+ }
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift
new file mode 100644
index 0000000..b12e8b1
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift
@@ -0,0 +1,96 @@
+//
+// IQBarButtonItemConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/**
+ IQBarButtonItemConfiguration for creating toolbar with bar button items
+ */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQBarButtonItemConfiguration: NSObject {
+
+ public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) {
+ self.systemItem = systemItem
+ self.image = nil
+ self.title = nil
+ self.action = action
+ super.init()
+ }
+
+ public init(image: UIImage, action: Selector? = nil) {
+ self.systemItem = nil
+ self.image = image
+ self.title = nil
+ self.action = action
+ super.init()
+ }
+
+ public init(title: String, action: Selector? = nil) {
+ self.systemItem = nil
+ self.image = nil
+ self.title = title
+ self.action = action
+ super.init()
+ }
+
+ public let systemItem: UIBarButtonItem.SystemItem? // System Item to be used to instantiate bar button.
+
+ public let image: UIImage? // Image to show on bar button item if it's not a system item.
+
+ public let title: String? // Title to show on bar button item if it's not a system item.
+
+ public var action: Selector? // action for bar button item. Usually 'doneAction:(IQBarButtonItem*)item'.
+
+ public override var accessibilityLabel: String? { didSet { } } // Accessibility related labels
+
+ public func apply(on oldBarButtonItem: IQBarButtonItem, target: AnyObject?) -> IQBarButtonItem {
+
+ var newBarButtonItem: IQBarButtonItem = oldBarButtonItem
+
+ if systemItem == nil, !oldBarButtonItem.isSystemItem {
+ newBarButtonItem.title = title
+ newBarButtonItem.accessibilityLabel = accessibilityLabel
+ newBarButtonItem.accessibilityIdentifier = newBarButtonItem.accessibilityLabel
+ newBarButtonItem.image = image
+ newBarButtonItem.target = target
+ newBarButtonItem.action = action
+ } else {
+ if let systemItem: UIBarButtonItem.SystemItem = systemItem {
+ newBarButtonItem = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: action)
+ newBarButtonItem.isSystemItem = true
+ } else if let image: UIImage = image {
+ newBarButtonItem = IQBarButtonItem(image: image, style: .plain, target: target, action: action)
+ } else {
+ newBarButtonItem = IQBarButtonItem(title: title, style: .plain, target: target, action: action)
+ }
+
+ newBarButtonItem.invocation = oldBarButtonItem.invocation
+ newBarButtonItem.accessibilityLabel = accessibilityLabel
+ newBarButtonItem.accessibilityIdentifier = oldBarButtonItem.accessibilityLabel
+ newBarButtonItem.isEnabled = oldBarButtonItem.isEnabled
+ newBarButtonItem.tag = oldBarButtonItem.tag
+ }
+ return newBarButtonItem
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift
new file mode 100644
index 0000000..95afb9f
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift
@@ -0,0 +1,42 @@
+//
+// IQInvocation.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQInvocation: NSObject {
+ public weak var target: AnyObject?
+ public let action: Selector
+
+ public init(target: AnyObject, action: Selector) {
+ self.target = target
+ self.action = action
+ }
+
+ public func invoke(from: Any) {
+
+ guard let target: AnyObject = target else { return }
+ UIApplication.shared.sendAction(action, to: target, from: from, for: UIEvent())
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift
new file mode 100644
index 0000000..0ec2ef1
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift
@@ -0,0 +1,168 @@
+//
+// IQTitleBarButtonItem.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQTitleBarButtonItem: IQBarButtonItem {
+
+ open var titleFont: UIFont? {
+
+ didSet {
+ if let titleFont: UIFont = titleFont {
+ titleButton?.titleLabel?.font = titleFont
+ } else {
+ titleButton?.titleLabel?.font = UIFont.systemFont(ofSize: 13)
+ }
+ }
+ }
+
+ override open var title: String? {
+ didSet {
+ titleButton?.setTitle(title, for: .normal)
+ updateAccessibility()
+ }
+ }
+
+ /**
+ titleColor to be used for displaying button text when displaying title (disabled state).
+ */
+ open var titleColor: UIColor? {
+
+ didSet {
+
+ if let titleColor: UIColor = titleColor {
+ titleButton?.setTitleColor(titleColor, for: .disabled)
+ } else {
+ titleButton?.setTitleColor(UIColor.lightGray, for: .disabled)
+ }
+ }
+ }
+
+ /**
+ selectableTitleColor to be used for displaying button text when button is enabled.
+ */
+ open var selectableTitleColor: UIColor? {
+
+ didSet {
+
+ if let selectableTitleColor: UIColor = selectableTitleColor {
+ titleButton?.setTitleColor(selectableTitleColor, for: .normal)
+ } else {
+ titleButton?.setTitleColor(UIColor.systemBlue, for: .normal)
+ }
+ }
+ }
+
+ internal var titleButton: UIButton?
+ private var _titleView: UIView?
+
+ override init() {
+ super.init()
+ }
+
+ public convenience init(title: String?) {
+
+ self.init(title: nil, style: .plain, target: nil, action: nil)
+
+ _titleView = UIView()
+ _titleView?.backgroundColor = UIColor.clear
+
+ titleButton = UIButton(type: .system)
+ titleButton?.isAccessibilityElement = false
+ titleButton?.isEnabled = false
+ titleButton?.titleLabel?.numberOfLines = 3
+ titleButton?.setTitleColor(UIColor.lightGray, for: .disabled)
+ titleButton?.setTitleColor(UIColor.systemBlue, for: .normal)
+ titleButton?.backgroundColor = UIColor.clear
+ titleButton?.titleLabel?.textAlignment = .center
+ titleButton?.setTitle(title, for: .normal)
+ titleFont = UIFont.systemFont(ofSize: 13.0)
+ titleButton?.titleLabel?.font = self.titleFont
+ _titleView?.addSubview(titleButton!)
+
+ let lowPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultLow.rawValue-1)
+ let highPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultHigh.rawValue-1)
+
+ _titleView?.translatesAutoresizingMaskIntoConstraints = false
+ _titleView?.setContentHuggingPriority(lowPriority, for: .vertical)
+ _titleView?.setContentHuggingPriority(lowPriority, for: .horizontal)
+ _titleView?.setContentCompressionResistancePriority(highPriority, for: .vertical)
+ _titleView?.setContentCompressionResistancePriority(highPriority, for: .horizontal)
+
+ titleButton?.translatesAutoresizingMaskIntoConstraints = false
+ titleButton?.setContentHuggingPriority(lowPriority, for: .vertical)
+ titleButton?.setContentHuggingPriority(lowPriority, for: .horizontal)
+ titleButton?.setContentCompressionResistancePriority(highPriority, for: .vertical)
+ titleButton?.setContentCompressionResistancePriority(highPriority, for: .horizontal)
+
+ let top: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .top,
+ relatedBy: .equal,
+ toItem: _titleView, attribute: .top,
+ multiplier: 1, constant: 0)
+ let bottom: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .bottom,
+ relatedBy: .equal,
+ toItem: _titleView, attribute: .bottom,
+ multiplier: 1, constant: 0)
+ let leading: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .leading,
+ relatedBy: .equal,
+ toItem: _titleView, attribute: .leading,
+ multiplier: 1, constant: 0)
+ let trailing: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .trailing,
+ relatedBy: .equal,
+ toItem: _titleView, attribute: .trailing,
+ multiplier: 1, constant: 0)
+
+ _titleView?.addConstraints([top, bottom, leading, trailing])
+
+ customView = _titleView
+ }
+
+ required public init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+ }
+
+ private func updateAccessibility() {
+ if title == nil || title?.isEmpty == true {
+ isAccessibilityElement = false
+ // Swift 6: Reference to static property 'none'
+ // is not concurrency-safe because it involves shared mutable state
+// accessibilityTraits = .none
+ accessibilityTraits = .init(rawValue: 0)
+ } else if titleButton?.isEnabled == true {
+ isAccessibilityElement = true
+ // Swift 6: Reference to static property 'button'
+ // is not concurrency-safe because it involves shared mutable state
+// accessibilityTraits = .button
+ accessibilityTraits = .init(rawValue: 1)
+ } else {
+ isAccessibilityElement = true
+
+ // Swift 6: Reference to static property 'staticText'
+ // is not concurrency-safe because it involves shared mutable state
+// accessibilityTraits = .staticText
+ accessibilityTraits = .init(rawValue: 64)
+ }
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift
new file mode 100644
index 0000000..119a958
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift
@@ -0,0 +1,344 @@
+//
+// UIView+IQKeyboardExtension.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+ static var toolbar: Int = 0
+ static var hidePlaceholder: Int = 0
+ static var placeholder: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+ // MARK: Toolbar
+
+ /**
+ Toolbar references for better customization control.
+ */
+ var toolbar: IQKeyboardToolbar {
+ var toolbar: IQKeyboardToolbar? = base?.inputAccessoryView as? IQKeyboardToolbar
+
+ if toolbar == nil, let base = base {
+ toolbar = objc_getAssociatedObject(base, &AssociatedKeys.toolbar) as? IQKeyboardToolbar
+ }
+
+ if let toolbar: IQKeyboardToolbar = toolbar {
+ return toolbar
+ } else {
+
+ let width: CGFloat = base?.window?.windowScene?.screen.bounds.width ?? 0
+
+ let frame = CGRect(origin: .zero, size: .init(width: width, height: 44))
+ let newToolbar = IQKeyboardToolbar(frame: frame)
+
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.toolbar, newToolbar, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+
+ return newToolbar
+ }
+ }
+
+ // MARK: Toolbar title
+
+ /**
+ If `hideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.
+ */
+ var hidePlaceholder: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.hidePlaceholder) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.hidePlaceholder,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ toolbar.titleBarButton.title = drawingPlaceholder
+ }
+ }
+ }
+
+ /**
+ `toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar.
+ */
+ var placeholder: String? {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.placeholder) as? String
+ }
+ return nil
+ }
+ set(newValue) {
+ if let base = base {
+ // swiftlint:disable line_length
+ objc_setAssociatedObject(base, &AssociatedKeys.placeholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ toolbar.titleBarButton.title = drawingPlaceholder
+ // swiftlint:enable line_length
+ }
+ }
+ }
+
+ /**
+ `drawingToolbarPlaceholder` will be actual text used to draw on toolbar.
+ This would either `placeholder` or `toolbarPlaceholder`.
+ */
+ var drawingPlaceholder: String? {
+
+ guard !hidePlaceholder else { return nil }
+
+ if let placeholder = placeholder,
+ !placeholder.isEmpty {
+ return placeholder
+ }
+
+ guard let placeholderable: any IQPlaceholderable = base as? (any IQPlaceholderable) else { return nil }
+
+ if let placeholder = placeholderable.attributedPlaceholder?.string,
+ !placeholder.isEmpty {
+ return placeholder
+ } else if let placeholder = placeholderable.placeholder {
+ return placeholder
+ } else {
+ return nil
+ }
+ }
+
+ // MARK: Common
+
+ func addToolbar(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration? = nil,
+ title: String?,
+ titleAccessibilityLabel: String? = nil) {
+ guard let base = base else { return }
+ // Creating a toolBar for phoneNumber keyboard
+ let toolbar: IQKeyboardToolbar = toolbar
+
+ let items: [UIBarButtonItem] = Self.constructBarButtonItems(target: target, toolbar: toolbar,
+ previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+
+ // Adding button to toolBar.
+ toolbar.items = items
+
+ switch base.keyboardAppearance {
+ case .dark:
+ toolbar.barStyle = .black
+ default:
+ toolbar.barStyle = .default
+ }
+
+ // Setting toolbar to keyboard.
+ let reloadInputViews: Bool = base.inputAccessoryView != toolbar
+ guard reloadInputViews else { return }
+
+ base.inputAccessoryView = toolbar
+
+ base.reloadInputViews()
+ }
+
+ // MARK: Right
+ func addDone(target: AnyObject?,
+ action: Selector,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+
+ addDone(target: target, action: action,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addDone(target: AnyObject?,
+ action: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+
+ let rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: action)
+
+ addToolbar(target: target, rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+ addRightButton(target: target, configuration: configuration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ addToolbar(target: target, rightConfiguration: configuration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ // MARK: Right/Left
+ func addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+ addRightLeft(target: target,
+ rightConfiguration: rightConfiguration, leftConfiguration: leftConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ addToolbar(target: target,
+ previousConfiguration: leftConfiguration, rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ // MARK: Previous/Next/Right
+
+ func addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+ addPreviousNextRight(target: target,
+ previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+
+ addToolbar(target: target,
+ previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ let title: String? = showPlaceholder ? drawingPlaceholder : nil
+ addPreviousNextDone(target: target, previousAction: previousAction, nextAction: nextAction,
+ doneAction: doneAction,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func addPreviousNextDone(target: AnyObject?,
+ previousAction: Selector, nextAction: Selector, doneAction: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+
+ let chevronUp: UIImage = UIImage(systemName: "chevron.up") ?? UIImage()
+ let chevronDown: UIImage = UIImage(systemName: "chevron.down") ?? UIImage()
+
+ let previousConfiguration = IQBarButtonItemConfiguration(image: chevronUp,
+ action: previousAction)
+ let nextConfiguration = IQBarButtonItemConfiguration(image: chevronDown,
+ action: nextAction)
+ let rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done,
+ action: doneAction)
+
+ addToolbar(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardExtension where Base: IQTextInputView {
+
+ private static func constructBarButtonItems(target: AnyObject?,
+ toolbar: IQKeyboardToolbar,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration? = nil,
+ title: String?,
+ titleAccessibilityLabel: String? = nil) -> [UIBarButtonItem] {
+ var items: [UIBarButtonItem] = []
+
+ if let previousConfiguration: IQBarButtonItemConfiguration = previousConfiguration {
+ let prev: IQBarButtonItem = previousConfiguration.apply(on: toolbar.previousBarButton, target: target)
+ toolbar.previousBarButton = prev
+ items.append(prev)
+ }
+
+ if previousConfiguration != nil, nextConfiguration != nil {
+ items.append(toolbar.fixedSpaceBarButton)
+ }
+
+ if let nextConfiguration: IQBarButtonItemConfiguration = nextConfiguration {
+ let next: IQBarButtonItem = nextConfiguration.apply(on: toolbar.nextBarButton, target: target)
+ toolbar.nextBarButton = next
+ items.append(next)
+ }
+
+ if !toolbar.additionalLeadingItems.isEmpty {
+ items.append(contentsOf: toolbar.additionalLeadingItems)
+ }
+
+ // Title bar button item
+ do {
+ // Flexible space
+ items.append(IQBarButtonItem.flexibleBarButtonItem)
+
+ // Title button
+ toolbar.titleBarButton.title = title
+ toolbar.titleBarButton.accessibilityLabel = titleAccessibilityLabel
+ toolbar.titleBarButton.accessibilityIdentifier = titleAccessibilityLabel
+
+ toolbar.titleBarButton.customView?.frame = .zero
+
+ items.append(toolbar.titleBarButton)
+
+ // Flexible space
+ items.append(IQBarButtonItem.flexibleBarButtonItem)
+ }
+
+ if !toolbar.additionalTrailingItems.isEmpty {
+ items.append(contentsOf: toolbar.additionalTrailingItems)
+ }
+
+ if let rightConfiguration: IQBarButtonItemConfiguration = rightConfiguration {
+
+ let done: IQBarButtonItem = rightConfiguration.apply(on: toolbar.doneBarButton, target: target)
+ toolbar.doneBarButton = done
+ items.append(done)
+ }
+ return items
+ }
+}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift
new file mode 100644
index 0000000..c3be1a4
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift
@@ -0,0 +1,228 @@
+//
+// UIView+IQKeyboardExtensionDeprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable line_length
+// swiftlint:disable function_parameter_count
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+ @available(*, unavailable, renamed: "iq.toolbar")
+ var keyboardToolbar: IQKeyboardToolbar {
+ get { fatalError() }
+ set {}
+ }
+
+ @available(*, unavailable, renamed: "iq.hidePlaceholder")
+ var shouldHideToolbarPlaceholder: Bool {
+ get { false }
+ set {}
+ }
+
+ @available(*, unavailable, renamed: "iq.placeholder")
+ var toolbarPlaceholder: String? {
+ get { nil }
+ set {}
+ }
+
+ @available(*, unavailable, renamed: "iq.drawingPlaceholder")
+ var drawingToolbarPlaceholder: String? {
+ get { nil }
+ set {}
+ }
+
+ @available(*, unavailable, renamed: "iq.addToolbar(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+ func addKeyboardToolbarWithTarget(target: AnyObject?,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil,
+ rightBarButtonConfiguration: IQBarButtonItemConfiguration?,
+ previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addDone(target:action:showPlaceholder:titleAccessibilityLabel:)")
+ func addDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ action: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addDone(target:action:title:titleAccessibilityLabel:)")
+ func addDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ action: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:showPlaceholder:titleAccessibilityLabel:)")
+ func addRightButtonOnKeyboardWithImage(_ image: UIImage,
+ target: AnyObject?,
+ action: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:title:titleAccessibilityLabel:)")
+ func addRightButtonOnKeyboardWithImage(_ image: UIImage,
+ target: AnyObject?,
+ action: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:showPlaceholder:titleAccessibilityLabel:)")
+ func addRightButtonOnKeyboardWithText(_ text: String,
+ target: AnyObject?,
+ action: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:title:titleAccessibilityLabel:)")
+ func addRightButtonOnKeyboardWithText(_ text: String,
+ target: AnyObject?,
+ action: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ cancelAction: Selector,
+ doneAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+ leftButtonTitle: String,
+ rightButtonTitle: String,
+ leftButtonAction: Selector,
+ rightButtonAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+ leftButtonImage: UIImage,
+ rightButtonImage: UIImage,
+ leftButtonAction: Selector,
+ rightButtonAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+ func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ cancelAction: Selector,
+ doneAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+ func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+ leftButtonTitle: String,
+ rightButtonTitle: String,
+ leftButtonAction: Selector,
+ rightButtonAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+ func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+ leftButtonImage: UIImage,
+ rightButtonImage: UIImage,
+ leftButtonAction: Selector,
+ rightButtonAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextDone(target:previousAction:nextAction:doneAction:showPlaceholder:titleAccessibilityLabel:)")
+ func addPreviousNextDone(_ target: AnyObject?,
+ previousAction: Selector,
+ nextAction: Selector,
+ doneAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextDone(target:previousAction:nextAction:doneAction:title:titleAccessibilityLabel:)")
+ func addPreviousNextDoneOnKeyboardWithTarget(_ target: AnyObject?,
+ previousAction: Selector,
+ nextAction: Selector,
+ doneAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+ rightButtonImage: UIImage,
+ previousAction: Selector,
+ nextAction: Selector,
+ rightButtonAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+ func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+ rightButtonTitle: String,
+ previousAction: Selector,
+ nextAction: Selector,
+ rightButtonAction: Selector,
+ shouldShowPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+ func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+ rightButtonImage: UIImage,
+ previousAction: Selector,
+ nextAction: Selector,
+ rightButtonAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+
+ @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+ func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+ rightButtonTitle: String,
+ previousAction: Selector,
+ nextAction: Selector,
+ rightButtonAction: Selector,
+ titleText: String?,
+ titleAccessibilityLabel: String? = nil) {
+ }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable line_length
+// swiftlint:enable function_parameter_count
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift
new file mode 100644
index 0000000..2dbcdbe
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift
@@ -0,0 +1,254 @@
+//
+// UIView+IQKeyboardExtensionObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+ var iq_toolbar: IQKeyboardToolbar { iq.toolbar }
+
+ var iq_hidePlaceholder: Bool {
+ get { iq.hidePlaceholder }
+ set(newValue) { iq.hidePlaceholder = newValue }
+ }
+
+ var iq_placeholder: String? {
+ get { iq.placeholder }
+ set(newValue) { iq.placeholder = newValue }
+ }
+
+ var iq_drawingPlaceholder: String? { iq.drawingPlaceholder }
+
+ func iq_addToolbar(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration? = nil,
+ title: String?,
+ titleAccessibilityLabel: String? = nil) {
+ iq.addToolbar(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addDone(target: AnyObject?,
+ action: Selector,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addDone(target: target, action: action, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addDone(target: AnyObject?,
+ action: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addDone(target: target, action: action, title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addRightButton(target: target, configuration: configuration, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addRightButton(target: target, configuration: configuration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration,
+ leftConfiguration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+ leftConfiguration: leftConfiguration, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration,
+ leftConfiguration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+ leftConfiguration: leftConfiguration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+ showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextDone(target: AnyObject?, previousAction: Selector,
+ nextAction: Selector, doneAction: Selector,
+ showPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextDone(target: target, previousAction: previousAction,
+ nextAction: nextAction, doneAction: doneAction,
+ showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextDone(target: AnyObject?,
+ previousAction: Selector, nextAction: Selector, doneAction: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextDone(target: target, previousAction: previousAction,
+ nextAction: nextAction, doneAction: doneAction,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+}
+
+@objc public extension UITextView {
+
+ var iq_toolbar: IQKeyboardToolbar { iq.toolbar }
+
+ var iq_hidePlaceholder: Bool {
+ get { iq.hidePlaceholder }
+ set(newValue) { iq.hidePlaceholder = newValue }
+ }
+
+ var iq_placeholder: String? {
+ get { iq.placeholder }
+ set(newValue) { iq.placeholder = newValue }
+ }
+
+ var iq_drawingPlaceholder: String? { iq.drawingPlaceholder }
+
+ func iq_addToolbar(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration? = nil,
+ title: String?,
+ titleAccessibilityLabel: String? = nil) {
+ iq.addToolbar(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addDone(target: AnyObject?,
+ action: Selector,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addDone(target: target, action: action, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addDone(target: AnyObject?,
+ action: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addDone(target: target, action: action, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addRightButton(target: target, configuration: configuration,
+ showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightButton(target: AnyObject?,
+ configuration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addRightButton(target: target, configuration: configuration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration,
+ leftConfiguration: IQBarButtonItemConfiguration,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+ leftConfiguration: leftConfiguration, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addRightLeft(target: AnyObject?,
+ rightConfiguration: IQBarButtonItemConfiguration,
+ leftConfiguration: IQBarButtonItemConfiguration,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+ leftConfiguration: leftConfiguration, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+ showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextRight(target: AnyObject?,
+ previousConfiguration: IQBarButtonItemConfiguration? = nil,
+ nextConfiguration: IQBarButtonItemConfiguration? = nil,
+ rightConfiguration: IQBarButtonItemConfiguration?,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration,
+ title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector,
+ doneAction: Selector, showPlaceholder: Bool = false,
+ titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextDone(target: target, previousAction: previousAction,
+ nextAction: nextAction,
+ doneAction: doneAction, showPlaceholder: showPlaceholder,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+
+ func iq_addPreviousNextDone(target: AnyObject?,
+ previousAction: Selector, nextAction: Selector, doneAction: Selector,
+ title: String?, titleAccessibilityLabel: String? = nil) {
+ iq.addPreviousNextDone(target: target, previousAction: previousAction,
+ nextAction: nextAction,
+ doneAction: doneAction, title: title,
+ titleAccessibilityLabel: titleAccessibilityLabel)
+ }
+}
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift
similarity index 54%
rename from Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift
rename to Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift
index 6597663..f2d78b7 100644
--- a/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift
@@ -1,39 +1,40 @@
//
-// IQToolbar.swift
-// https://github.com/hackiftekhar/IQKeyboardManager
-// Copyright (c) 2013-20 Iftekhar Qurashi.
+// IQKeyboardToolbar.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
import UIKit
-/** @abstract IQToolbar for IQKeyboardManager. */
+/** @abstract IQKeyboardToolbar. */
@available(iOSApplicationExtension, unavailable)
-@objc open class IQToolbar: UIToolbar, UIInputViewAudioFeedback {
+@MainActor
+@objcMembers open class IQKeyboardToolbar: UIToolbar {
- override init(frame: CGRect) {
+ override public init(frame: CGRect) {
super.init(frame: frame)
initialize()
}
- @objc required public init?(coder aDecoder: NSCoder) {
+ required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
@@ -59,11 +60,21 @@ import UIKit
self.backgroundColor = nil
}
+ /**
+ Additional bar buttons to show at the leading side.
+ */
+ open var additionalLeadingItems: [UIBarButtonItem] = []
+
+ /**
+ Additional bar buttons to show at the trailing side.
+ */
+ open var additionalTrailingItems: [UIBarButtonItem] = []
+
/**
Previous bar button of toolbar.
*/
private var privatePreviousBarButton: IQBarButtonItem?
- @objc open var previousBarButton: IQBarButtonItem {
+ open var previousBarButton: IQBarButtonItem {
get {
if privatePreviousBarButton == nil {
privatePreviousBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil)
@@ -80,7 +91,7 @@ import UIKit
Next bar button of toolbar.
*/
private var privateNextBarButton: IQBarButtonItem?
- @objc open var nextBarButton: IQBarButtonItem {
+ open var nextBarButton: IQBarButtonItem {
get {
if privateNextBarButton == nil {
privateNextBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil)
@@ -97,12 +108,10 @@ import UIKit
Title bar button of toolbar.
*/
private var privateTitleBarButton: IQTitleBarButtonItem?
- @objc open var titleBarButton: IQTitleBarButtonItem {
+ open var titleBarButton: IQTitleBarButtonItem {
get {
if privateTitleBarButton == nil {
privateTitleBarButton = IQTitleBarButtonItem(title: nil)
- privateTitleBarButton?.accessibilityLabel = "Title"
- privateTitleBarButton?.accessibilityIdentifier = privateTitleBarButton?.accessibilityLabel
}
return privateTitleBarButton!
}
@@ -116,7 +125,7 @@ import UIKit
Done bar button of toolbar.
*/
private var privateDoneBarButton: IQBarButtonItem?
- @objc open var doneBarButton: IQBarButtonItem {
+ open var doneBarButton: IQBarButtonItem {
get {
if privateDoneBarButton == nil {
privateDoneBarButton = IQBarButtonItem(title: nil, style: .done, target: nil, action: nil)
@@ -133,13 +142,13 @@ import UIKit
Fixed space bar button of toolbar.
*/
private var privateFixedSpaceBarButton: IQBarButtonItem?
- @objc open var fixedSpaceBarButton: IQBarButtonItem {
+ open var fixedSpaceBarButton: IQBarButtonItem {
get {
if privateFixedSpaceBarButton == nil {
privateFixedSpaceBarButton = IQBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
}
- privateFixedSpaceBarButton!.isSystemItem = true
- privateFixedSpaceBarButton!.width = 6
+ privateFixedSpaceBarButton?.isSystemItem = true
+ privateFixedSpaceBarButton?.width = 6
return privateFixedSpaceBarButton!
}
@@ -149,24 +158,28 @@ import UIKit
}
}
- @objc override open func sizeThatFits(_ size: CGSize) -> CGSize {
- var sizeThatFit = super.sizeThatFits(size)
+ override open func sizeThatFits(_ size: CGSize) -> CGSize {
+ var sizeThatFit: CGSize = super.sizeThatFits(size)
sizeThatFit.height = 44
return sizeThatFit
}
- @objc override open var tintColor: UIColor! {
+ override open var tintColor: UIColor! {
didSet {
- if let unwrappedItems = items {
- for item in unwrappedItems {
- item.tintColor = tintColor
- }
+ guard let items: [UIBarButtonItem] = items else { return }
+ for item in items {
+ item.tintColor = tintColor
}
}
}
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardToolbar: UIInputViewAudioFeedback {
- @objc open var enableInputClicksWhenVisible: Bool {
+ open var enableInputClicksWhenVisible: Bool {
return true
}
}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift
new file mode 100644
index 0000000..9f543e5
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift
@@ -0,0 +1,60 @@
+//
+// IQKeyboardToolbarPlaceholderConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// swiftlint:disable type_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarPlaceholderConfiguration: NSObject {
+
+ /**
+ If YES, then it add the textInputView's placeholder text on toolbar. Default is YES.
+ */
+ public var showPlaceholder: Bool = true
+
+ /**
+ Placeholder Font. Default is nil.
+ */
+ public var font: UIFont?
+
+ /**
+ Placeholder Color. Default is nil. Which means lightGray
+ */
+ public var color: UIColor?
+
+ /**
+ Placeholder Button Color when it's treated as button. Default is nil.
+ */
+ public var buttonColor: UIColor?
+
+ /**
+ Placeholder accessibility Label
+ */
+ public override var accessibilityLabel: String? { didSet { } }
+}
+// swiftlint:enable type_name
+
+@available(*, unavailable, renamed: "IQKeyboardToolbarPlaceholderConfiguration")
+@MainActor
+@objcMembers public final class IQToolbarPlaceholderConfiguration: NSObject {}
diff --git a/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift
new file mode 100644
index 0000000..f0ceea2
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift
@@ -0,0 +1,37 @@
+//
+// IQPlaceholderable.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public protocol IQPlaceholderable: AnyObject {
+
+ var placeholder: String? { get set }
+ var attributedPlaceholder: NSAttributedString? { get set }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextField: IQPlaceholderable { }
diff --git a/Pods/IQKeyboardToolbar/LICENSE b/Pods/IQKeyboardToolbar/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardToolbar/README.md b/Pods/IQKeyboardToolbar/README.md
new file mode 100644
index 0000000..3b60eb8
--- /dev/null
+++ b/Pods/IQKeyboardToolbar/README.md
@@ -0,0 +1,85 @@
+# IQKeyboardToolbar
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardToolbar.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardToolbar)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar)
+
+![Screenshot1](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot.png)
+![Screenshot2](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot2.png)
+![Screenshot3](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot3.png)
+![Screenshot4](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot4.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardToolbar is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardToolbar'
+```
+
+## Usage
+
+This library can be used to add toolbar to the keyboard
+
+Previous Next and Done button
+```swift
+ textField.iq.addPreviousNextDone(target: self,
+ previousAction: #selector(textField1PreviousAction),
+ nextAction: #selector(textField1NextAction),
+ doneAction: #selector(doneAction), showPlaceholder: true)
+```
+
+Previous Next and Right button with customized titles or images
+```swift
+ textField.iq.addPreviousNextRight(target: self,
+ previousConfiguration: .init(title: "Prev", action: #selector(textView1PreviousAction)),
+ nextConfiguration: .init(title: "Next", action: #selector(textView1NextAction)),
+ rightConfiguration: .init(image: UIImage(systemName: "chevron.down")!, action: #selector(doneAction)),
+ title: "Text View 1")
+```
+
+Action button
+```swift
+ textField.iq.addDone(target: self,
+ action: #selector(doneAction),
+ title: "Select Account")
+ textField.iq.toolbar.titleBarButton.setTarget(self,
+ action: #selector(selectAccount))
+```
+
+Additional leading and trailing buttons
+```swift
+ textField.iq.toolbar.additionalLeadingItems = [.init(barButtonSystemItem: .add, target: self, action: #selector(addAction))]
+ textField.iq.toolbar.additionalTrailingItems = [.init(barButtonSystemItem: .camera, target: self, action: #selector(cameraAction))]
+ textField.iq.addToolbar(target: self,
+ previousConfiguration: nil,
+ nextConfiguration: .init(title: "Next", action: #selector(doneAction)),
+ rightConfiguration: .init(title: "Finish", action: #selector(doneAction)),
+ title: "TextView 2")
+```
+
+Hide Placeholder
+```swift
+ textField1.iq.hidePlaceholder = true
+```
+
+Customized Placeholder
+```swift
+ textField1.iq.placeholder = "My Own Placeholder"
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardToolbar is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift
new file mode 100644
index 0000000..efebfb9
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift
@@ -0,0 +1,90 @@
+//
+// IQKeyboardToolbarConfiguration.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarConfiguration: NSObject {
+
+ /**
+ If YES, then uses textInputView's tintColor property,
+ otherwise tint color is default. Default is NO.
+ */
+ public var useTextInputViewTintColor: Bool = false
+
+ /**
+ This is used for toolbar.tintColor when textInputView.keyboardAppearance is UIKeyboardAppearanceDefault.
+ If useTextInputViewTintColor is YES then this property is ignored. Default is nil and uses black color.
+ */
+ public var tintColor: UIColor?
+
+ /**
+ This is used for toolbar.barTintColor. Default is nil.
+ */
+ public var barTintColor: UIColor?
+
+ /**
+ IQPreviousNextDisplayModeDefault: Show NextPrevious when there are more than 1 textInputView otherwise hide.
+ IQPreviousNextDisplayModeAlwaysHide: Do not show NextPrevious buttons in any case.
+ IQPreviousNextDisplayModeAlwaysShow: Always show nextPrevious buttons,
+ if there are more than 1 textInputView then both buttons will be visible but will be shown as disabled.
+ */
+ public var previousNextDisplayMode: IQPreviousNextDisplayMode = .default
+
+ /**
+ /**
+ IQAutoToolbarBySubviews: Creates Toolbar according to subview's hierarchy of TextInputView's in view.
+ IQAutoToolbarByTag: Creates Toolbar according to tag property of TextInputView's.
+ IQAutoToolbarByPosition: Creates Toolbar according to the y,x position
+ of textInputView in it's superview coordinate.
+
+ Default is IQAutoToolbarBySubviews.
+ */
+ AutoToolbar managing behavior. Default is IQAutoToolbarBySubviews.
+ */
+ public var manageBehavior: IQKeyboardToolbarManageBehavior = .bySubviews
+
+ /**
+ Buttons configuration displayed on the toolbar, the selector parameter is ignored in below configuration
+ */
+ public var previousBarButtonConfiguration: IQBarButtonItemConfiguration?
+ public var nextBarButtonConfiguration: IQBarButtonItemConfiguration?
+ public var doneBarButtonConfiguration: IQBarButtonItemConfiguration?
+
+ public let placeholderConfiguration: IQKeyboardToolbarPlaceholderConfiguration = .init()
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarConfiguration {
+
+ @available(*, unavailable, renamed: "useTextInputViewTintColor")
+ var useTextFieldTintColor: Bool {
+ get { fatalError() }
+ set {}
+ }
+}
+// swiftlint:enable unused_setter_value
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift
new file mode 100644
index 0000000..ee76ea3
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift
@@ -0,0 +1,68 @@
+//
+// IQKeyboardToolbarConstants.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+
+// MARK: IQKeyboardToolbarManageBehavior
+
+/**
+`IQAutoToolbarBySubviews`
+Creates Toolbar according to subview's hierarchy of textInputView's in view.
+
+`IQAutoToolbarByTag`
+Creates Toolbar according to tag property of textInputView's.
+
+`IQAutoToolbarByPosition`
+Creates Toolbar according to the y,x position of textInputView in it's superview coordinate.
+*/
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQKeyboardToolbarManageBehavior: Int {
+ case bySubviews
+ case byTag
+ case byPosition
+}
+
+@available(*, unavailable, renamed: "IQKeyboardToolbarManageBehavior")
+@objc public enum IQAutoToolbarManageBehavior: Int {
+ case bySubviews
+ case byTag
+ case byPosition
+}
+
+/**
+ `IQPreviousNextDisplayModeDefault`
+ Show NextPrevious when there are more than 1 textInputView otherwise hide.
+
+ `IQPreviousNextDisplayModeAlwaysHide`
+ Do not show NextPrevious buttons in any case.
+
+ `IQPreviousNextDisplayModeAlwaysShow`
+ Always show nextPrevious buttons,
+ if there are more than 1 textInputView then both buttons will be visible but will be shown as disabled.
+ */
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQPreviousNextDisplayMode: Int {
+ case `default`
+ case alwaysHide
+ case alwaysShow
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift
new file mode 100644
index 0000000..8953423
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift
@@ -0,0 +1,52 @@
+//
+// IQKeyboardToolbarManager+Debug
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Foundation
+
+// MARK: Debugging & Developer options
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+ func showLog(_ logString: String, indentation: Int = 0) {
+
+ guard isDebuggingEnabled else {
+ return
+ }
+
+ if indentation < 0 {
+ self.logIndentation = max(0, self.logIndentation + indentation)
+ }
+
+ var preLog: String = "IQKeyboardToolbarManager"
+ for _ in 0 ... self.logIndentation {
+ preLog += "|\t"
+ }
+
+ print(preLog + logString)
+
+ if indentation > 0 {
+ self.logIndentation += indentation
+ }
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift
new file mode 100644
index 0000000..abd7566
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift
@@ -0,0 +1,29 @@
+//
+// IQDeepResponderContainerView.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQDeepResponderContainerView: UIView {
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift
new file mode 100644
index 0000000..fc34aa0
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift
@@ -0,0 +1,183 @@
+//
+// IQKeyboardToolbarManager+Deprecated.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbar
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable identifier_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+ @available(*, unavailable, renamed: "isEnabled")
+ var enableAutoToolbar: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "playInputClicks")
+ var shouldPlayInputClicks: Bool {
+ get { false }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior")
+ var toolbarManageBehaviour: IQAutoToolbarManageBehavior {
+ get { .bySubviews }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor")
+ var shouldToolbarUsesTextFieldTintColor: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.tintColor")
+ var toolbarTintColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.barTintColor")
+ var toolbarBarTintColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode")
+ var previousNextDisplayMode: IQPreviousNextDisplayMode {
+ get { .default }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "deepResponderAllowedContainerClasses")
+ var toolbarPreviousNextAllowedClasses: [UIView.Type] {
+ get { [] }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+ var toolbarPreviousBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+ var toolbarNextBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemImage: UIImage? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemText: String? {
+ get { nil }
+ set { }
+ }
+ @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel",
+ message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+ var toolbarDoneBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel")
+ var toolbarTitleBarButtonItemAccessibilityLabel: String? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder")
+ var shouldShowToolbarPlaceholder: Bool {
+ get { false }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font")
+ var placeholderFont: UIFont? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color")
+ var placeholderColor: UIColor? {
+ get { nil }
+ set { }
+ }
+
+ @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor")
+ var placeholderButtonColor: UIColor? {
+ get { nil }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift
new file mode 100644
index 0000000..13d4c86
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift
@@ -0,0 +1,143 @@
+//
+// IQKeyboardToolbarManager+Internal.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQTextInputViewNotification
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+ /** Get all textInputView siblings of textInputView. */
+ func responderViews(of textInputView: some IQTextInputView) -> [any IQTextInputView]? {
+
+ var superConsideredView: UIView?
+
+ // If find any consider responderView in it's upper hierarchy then will get deepResponderView.
+ for allowedClass in deepResponderAllowedContainerClasses {
+ superConsideredView = (textInputView as UIView).iq.superviewOf(type: allowedClass)
+ if superConsideredView != nil {
+ break
+ }
+ }
+
+ let swiftUIHostingView: UIView? = Self.getSwiftUIHostingView(textInputView: textInputView)
+
+ // (Enhancement ID: #22)
+ // If there is a superConsideredView in view's hierarchy,
+ // then fetching all it's subview that responds.
+ // No sorting for superConsideredView, it's by subView position.
+ if let view: UIView = swiftUIHostingView {
+ return view.iq.deepResponderViews()
+ } else if let view: UIView = superConsideredView {
+ return view.iq.deepResponderViews()
+ } else { // Otherwise fetching all the siblings
+
+ let textInputViews: [any IQTextInputView] = textInputView.iq.responderSiblings()
+
+ // Sorting textInputViews according to behavior
+ switch toolbarConfiguration.manageBehavior {
+ // If autoToolbar behavior is bySubviews, then returning it.
+ case .bySubviews: return textInputViews
+
+ // If autoToolbar behavior is by tag, then sorting it according to tag property.
+ case .byTag: return textInputViews.sortedByTag()
+
+ // If autoToolbar behavior is by tag, then sorting it according to tag property.
+ case .byPosition: return textInputViews.sortedByPosition()
+ }
+ }
+ }
+
+ func privateIsEnableAutoToolbar(of textInputView: some IQTextInputView) -> Bool {
+
+ var isEnabled: Bool = isEnabled
+
+ guard var textInputViewController = (textInputView as UIView).iq.viewContainingController() else {
+ return isEnabled
+ }
+
+ // If it is searchBar textInputView embedded in Navigation Bar
+ if (textInputView as UIView).iq.textFieldSearchBar() != nil,
+ let navController: UINavigationController = textInputViewController as? UINavigationController,
+ let topController: UIViewController = navController.topViewController {
+ textInputViewController = topController
+ }
+
+ if !isEnabled, enabledToolbarClasses.contains(where: { textInputViewController.isKind(of: $0) }) {
+ isEnabled = true
+ }
+
+ if isEnabled {
+
+ // If found any toolbar disabled classes then return.
+ if disabledToolbarClasses.contains(where: { textInputViewController.isKind(of: $0) }) {
+ isEnabled = false
+ }
+
+ // Special Controllers
+ if isEnabled {
+
+ let classNameString: String = "\(type(of: textInputViewController.self))"
+
+ // _UIAlertControllerTextFieldViewController
+ if classNameString.contains("UIAlertController"),
+ classNameString.hasSuffix("TextFieldViewController") {
+ isEnabled = false
+ }
+ }
+ }
+
+ return isEnabled
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+ private static func getSwiftUIHostingView(textInputView: some IQTextInputView) -> UIView? {
+ var swiftUIHostingView: UIView?
+ let swiftUIHostingViewName: String = "UIHostingView<"
+ var superView: UIView? = textInputView.superview
+ while let aSuperview: UIView = superView {
+
+ let classNameString: String = {
+ var name: String = "\(type(of: aSuperview.self))"
+ if name.hasPrefix("_") {
+ name.removeFirst()
+ }
+ return name
+ }()
+
+ if classNameString.hasPrefix(swiftUIHostingViewName) {
+ swiftUIHostingView = aSuperview
+ break
+ }
+
+ superView = aSuperview.superview
+ }
+ return swiftUIHostingView
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift
new file mode 100644
index 0000000..5186e05
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift
@@ -0,0 +1,142 @@
+//
+// IQKeyboardToolbarManager.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQTextInputViewNotification
+import IQKeyboardCore
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarManager: NSObject {
+
+ private let textInputViewObserver: IQTextInputViewNotification = .init()
+
+ internal var textInputView: (some IQTextInputView)? {
+ textInputViewObserver.textInputView
+ }
+
+ /**
+ Returns the default singleton instance.
+ */
+ @MainActor
+ @objc public static let shared: IQKeyboardToolbarManager = .init()
+
+ /**
+ Automatic add the toolbar functionality. Default is false.
+ */
+ public var isEnabled: Bool = false {
+ didSet {
+ reloadInputViews()
+ showLog("isEnabled: \(isEnabled ? "Yes" : "NO")")
+ }
+ }
+
+ public var isDebuggingEnabled: Bool = false
+
+ /**
+ Configurations related to the toolbar display over the keyboard.
+ */
+ public let toolbarConfiguration: IQKeyboardToolbarConfiguration = .init()
+
+ // MARK: UISound handling
+
+ /**
+ If YES, then it plays inputClick sound on next/previous/done click.
+ */
+ public var playInputClicks: Bool = true
+
+ /**
+ Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes.
+ Within this scope, 'isEnabled' property is ignored. Class should be kind of UIViewController.
+ */
+ public var disabledToolbarClasses: [UIViewController.Type] = [
+ UIAlertController.self,
+ UIInputViewController.self
+ ]
+
+ /**
+ Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes.
+ Within this scope, 'isEnabled' property is ignored. Class should be kind of UIViewController.
+ If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.
+ */
+ public var enabledToolbarClasses: [UIViewController.Type] = []
+
+ /**
+ Allowed subclasses of UIView to add all inner textInputView,
+ this will allow to navigate between textInputView contains in different superview.
+ Class should be kind of UIView.
+ */
+ public var deepResponderAllowedContainerClasses: [UIView.Type] = [
+ UITableView.self,
+ UICollectionView.self,
+ IQDeepResponderContainerView.self
+ ]
+
+ internal var logIndentation = 0
+
+ internal override init() {
+ super.init()
+
+ addTextInputViewObserver()
+
+ // (Bug ID: #550)
+ // Loading IQKeyboardToolbar, IQTitleBarButtonItem, IQBarButtonItem to fix first time keyboard appearance delay
+ // If you experience exception breakpoint issue at below line then try these solutions
+ // https://stackoverflow.com/questions/27375640/all-exception-break-point-is-stopping-for-no-reason-on-simulator
+ DispatchQueue.main.async {
+ let textInputView: UITextField = UITextField()
+ textInputView.iq.addDone(target: nil, action: #selector(self.doneAction(_:)))
+ textInputView.iq.addPreviousNextDone(target: nil,
+ previousAction: #selector(self.previousAction(_:)),
+ nextAction: #selector(self.nextAction(_:)),
+ doneAction: #selector(self.doneAction(_:)))
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+ private func removeTextInputViewObserver() {
+ textInputViewObserver.unsubscribe(identifier: "IQKeyboardToolbarManager")
+ }
+
+ private func addTextInputViewObserver() {
+ textInputViewObserver.subscribe(identifier: "IQKeyboardToolbarManager",
+ changeHandler: { [weak self] event, textInputView in
+ guard let self = self else { return }
+ guard (textInputView as UIView).iq.isAlertViewTextField() == false else {
+ return
+ }
+
+ switch event {
+ case .beginEditing:
+ reloadInputViews()
+ case .endEditing:
+ removeToolbarIfRequired(of: textInputView)
+ }
+ })
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift
new file mode 100644
index 0000000..1a79819
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift
@@ -0,0 +1,210 @@
+//
+// IQKeyboardToolbarManager+Action.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+import IQKeyboardToolbar
+
+// MARK: Previous next button actions
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+ /**
+ Returns YES if can navigate to previous responder textInputView, otherwise NO.
+ */
+ var canGoPrevious: Bool {
+ // If it is not first textInputView. then it's previous object canBecomeFirstResponder.
+ guard let textInputView: any IQTextInputView = self.textInputView,
+ let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+ let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+ index > 0 else {
+ return false
+ }
+ return true
+ }
+
+ /**
+ Returns YES if can navigate to next responder textInputViews, otherwise NO.
+ */
+ var canGoNext: Bool {
+ // If it is not first textInputView. then it's previous object canBecomeFirstResponder.
+ guard let textInputView: any IQTextInputView = self.textInputView,
+ let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+ let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+ index < textInputViews.count-1 else {
+ return false
+ }
+ return true
+ }
+
+ /**
+ Navigate to previous responder textInputViews
+ */
+ @discardableResult
+ func goPrevious() -> Bool {
+
+ // If it is not first textInputView. then it's previous object becomeFirstResponder.
+ guard let textInputView: any IQTextInputView = self.textInputView,
+ let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+ let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+ index > 0 else {
+ return false
+ }
+
+ let nextTextInputView: any IQTextInputView = textInputViews[index-1]
+
+ let isAcceptAsFirstResponder: Bool = nextTextInputView.becomeFirstResponder()
+
+ // If it refuses then becoming previous textInputView as first responder again. (Bug ID: #96)
+ if !isAcceptAsFirstResponder {
+ showLog("Refuses to become first responder: \(nextTextInputView)")
+ }
+
+ return isAcceptAsFirstResponder
+ }
+
+ /**
+ Navigate to next responder textInputView.
+ */
+ @discardableResult
+ func goNext() -> Bool {
+
+ // If it is not first textInputView. then it's previous object becomeFirstResponder.
+ guard let textInputView: any IQTextInputView = self.textInputView,
+ let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+ let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+ index < textInputViews.count-1 else {
+ return false
+ }
+
+ let nextTextInputView: any IQTextInputView = textInputViews[index+1]
+
+ let isAcceptAsFirstResponder: Bool = nextTextInputView.becomeFirstResponder()
+
+ // If it refuses then becoming previous textInputView as first responder again. (Bug ID: #96)
+ if !isAcceptAsFirstResponder {
+ showLog("Refuses to become first responder: \(nextTextInputView)")
+ }
+
+ return isAcceptAsFirstResponder
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+ /** previousAction. */
+ func previousAction(_ barButton: IQBarButtonItem) {
+
+ // If user wants to play input Click sound.
+ if playInputClicks {
+ // Play Input Click Sound.
+ UIDevice.current.playInputClick()
+ }
+
+ guard canGoPrevious,
+ let textInputView: any IQTextInputView = self.textInputView else {
+ return
+ }
+
+ let isAcceptedAsFirstResponder: Bool = goPrevious()
+
+ if isAcceptedAsFirstResponder {
+ Self.sendInvokeAction(of: barButton, sender: textInputView)
+ }
+ }
+
+ /** nextAction. */
+ func nextAction(_ barButton: IQBarButtonItem) {
+
+ // If user wants to play input Click sound.
+ if playInputClicks {
+ // Play Input Click Sound.
+ UIDevice.current.playInputClick()
+ }
+
+ guard canGoNext,
+ let textInputView: any IQTextInputView = self.textInputView else {
+ return
+ }
+
+ let isAcceptedAsFirstResponder: Bool = goNext()
+
+ if isAcceptedAsFirstResponder {
+ Self.sendInvokeAction(of: barButton, sender: textInputView)
+ }
+ }
+
+ /** doneAction. Resigning current textInputView. */
+ func doneAction(_ barButton: IQBarButtonItem) {
+
+ // If user wants to play input Click sound.
+ if playInputClicks {
+ // Play Input Click Sound.
+ UIDevice.current.playInputClick()
+ }
+
+ guard let textInputView: any IQTextInputView = self.textInputView else {
+ return
+ }
+
+ // Resign textInputView.
+ let isResignedFirstResponder: Bool = textInputView.resignFirstResponder()
+
+ if isResignedFirstResponder {
+ Self.sendInvokeAction(of: barButton, sender: textInputView)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+ private static func sendInvokeAction(of barButton: IQBarButtonItem, sender: some IQTextInputView) {
+ // Handling search bar special case
+ if let searchBar: UISearchBar = sender.iq.textFieldSearchBar() {
+ switch barButton {
+ case sender.internalToolbar.nextBarButton:
+ searchBar.internalToolbar.nextBarButton.invocation?.invoke(from: searchBar)
+ case sender.internalToolbar.previousBarButton:
+ searchBar.internalToolbar.previousBarButton.invocation?.invoke(from: searchBar)
+ case sender.internalToolbar.doneBarButton:
+ searchBar.internalToolbar.doneBarButton.invocation?.invoke(from: searchBar)
+ default:
+ break
+ }
+ } else {
+ barButton.invocation?.invoke(from: sender)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+ var internalToolbar: IQKeyboardToolbar {
+ return iq.toolbar
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift
new file mode 100644
index 0000000..6fbfb72
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift
@@ -0,0 +1,269 @@
+//
+// IQKeyboardToolbarManager+Toolbar.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+ /** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */
+ func reloadInputViews() {
+
+ guard let textInputView = textInputView else { return }
+ // If enabled then adding toolbar.
+ if privateIsEnableAutoToolbar(of: textInputView) {
+ self.addToolbarIfRequired(of: textInputView)
+ } else {
+ self.removeToolbarIfRequired(of: textInputView)
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+ /**
+ Default tag for toolbar with Done button -1001
+ */
+ private static let toolbarTag = -1001
+
+ // swiftlint:disable function_body_length
+ // swiftlint:disable cyclomatic_complexity
+ /**
+ Add toolbar if it is required to add on textInputViews and it's siblings.
+ */
+ func addToolbarIfRequired(of textInputView: some IQTextInputView) {
+
+ // Either there is no inputAccessoryView or
+ // if accessoryView is not appropriate for current situation
+ // (There is Previous/Next/Done toolbar)
+ guard let siblings: [any IQTextInputView] = responderViews(of: textInputView), !siblings.isEmpty,
+ !Self.hasUserDefinedInputAccessoryView(textInputView: textInputView) else {
+ return
+ }
+
+ showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+ defer {
+ showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+ }
+
+ showLog("Found \(siblings.count) responder sibling(s)")
+ let rightConfiguration: IQBarButtonItemConfiguration = getRightConfiguration()
+
+ let isTableCollectionView: Bool
+ if (textInputView as UIView).iq.superviewOf(type: UITableView.self) != nil ||
+ (textInputView as UIView).iq.superviewOf(type: UICollectionView.self) != nil {
+ isTableCollectionView = true
+ } else {
+ isTableCollectionView = false
+ }
+
+ let previousNextDisplayMode: IQPreviousNextDisplayMode = toolbarConfiguration.previousNextDisplayMode
+
+ let havePreviousNext: Bool
+ switch previousNextDisplayMode {
+ case .default:
+ // If the textInputView is part of UITableView/UICollectionView then we should be exposing previous/next too
+ // Because at this time we don't know previous or next cell if it contains another textInputView to move.
+ if isTableCollectionView {
+ havePreviousNext = true
+ } else if siblings.count <= 1 {
+ // If only one object is found, then adding only Done button.
+ havePreviousNext = false
+ } else {
+ havePreviousNext = true
+ }
+ case .alwaysShow:
+ havePreviousNext = true
+ case .alwaysHide:
+ havePreviousNext = false
+ }
+
+ let placeholderConfig: IQKeyboardToolbarPlaceholderConfiguration = toolbarConfiguration.placeholderConfiguration
+ let titleText: String? = placeholderConfig.showPlaceholder ? textInputView.iq.drawingPlaceholder : nil
+ if havePreviousNext {
+ let prevConfiguration: IQBarButtonItemConfiguration = getPreviousConfiguration()
+ let nextConfiguration: IQBarButtonItemConfiguration = getNextConfiguration()
+
+ textInputView.iq.addToolbar(target: self,
+ previousConfiguration: prevConfiguration,
+ nextConfiguration: nextConfiguration,
+ rightConfiguration: rightConfiguration, title: titleText,
+ titleAccessibilityLabel: placeholderConfig.accessibilityLabel)
+ if isTableCollectionView {
+ // (Bug ID: #56)
+ // In case of UITableView, the next/previous buttons should always be enabled.
+ textInputView.iq.toolbar.previousBarButton.isEnabled = true
+ textInputView.iq.toolbar.nextBarButton.isEnabled = true
+ } else {
+ // If first textInputView, then previous should not be enabled.
+ if let first = siblings.first {
+ textInputView.iq.toolbar.previousBarButton.isEnabled = first != textInputView
+ } else {
+ textInputView.iq.toolbar.previousBarButton.isEnabled = false
+ }
+ // If last textInputView, then next should not be enabled.
+ if let last = siblings.last {
+ textInputView.iq.toolbar.nextBarButton.isEnabled = last != textInputView
+ } else {
+ textInputView.iq.toolbar.nextBarButton.isEnabled = false
+ }
+ }
+ } else {
+ textInputView.iq.addToolbar(target: self, rightConfiguration: rightConfiguration,
+ title: titleText,
+ titleAccessibilityLabel: placeholderConfig.accessibilityLabel)
+ }
+ // (Bug ID: #78)
+ textInputView.inputAccessoryView?.tag = IQKeyboardToolbarManager.toolbarTag
+
+ Self.applyToolbarConfiguration(textInputView: textInputView, toolbarConfiguration: toolbarConfiguration)
+ }
+ // swiftlint:enable function_body_length
+ // swiftlint:enable cyclomatic_complexity
+
+ /** Remove any toolbar if it is IQKeyboardToolbar. */
+ func removeToolbarIfRequired(of textInputView: some IQTextInputView) { // (Bug ID: #18)
+
+ guard let toolbar: IQKeyboardToolbar = textInputView.inputAccessoryView as? IQKeyboardToolbar,
+ toolbar.tag == IQKeyboardToolbarManager.toolbarTag else {
+ return
+ }
+
+ showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+ defer {
+ showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+ }
+
+ textInputView.inputAccessoryView = nil
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+ static func hasUserDefinedInputAccessoryView(textInputView: some IQTextInputView) -> Bool {
+ guard let inputAccessoryView: UIView = textInputView.inputAccessoryView,
+ inputAccessoryView.tag != IQKeyboardToolbarManager.toolbarTag else { return false }
+
+ let swiftUIAccessoryName: String = "InputAccessoryHost"
+ let classNameString: String = "\(type(of: inputAccessoryView.classForCoder))"
+
+ // If it's SwiftUI accessory view but doesn't have a height (fake accessory view), then we should
+ // add our own accessoryView otherwise, keep the SwiftUI accessoryView since user has added it from code
+ guard classNameString.hasPrefix(swiftUIAccessoryName), inputAccessoryView.subviews.isEmpty else {
+ return true
+ }
+ return false
+ }
+
+ func getRightConfiguration() -> IQBarButtonItemConfiguration {
+ let rightConfiguration: IQBarButtonItemConfiguration
+ if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.doneBarButtonConfiguration {
+ rightConfiguration = configuration
+ rightConfiguration.action = #selector(self.doneAction(_:))
+ } else {
+ rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: #selector(self.doneAction(_:)))
+ rightConfiguration.accessibilityLabel = "Done"
+ }
+ return rightConfiguration
+ }
+
+ func getPreviousConfiguration() -> IQBarButtonItemConfiguration {
+ let prevConfiguration: IQBarButtonItemConfiguration
+ if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.previousBarButtonConfiguration {
+ configuration.action = #selector(self.previousAction(_:))
+ prevConfiguration = configuration
+ } else {
+ let chevronUp: UIImage = UIImage(systemName: "chevron.up") ?? UIImage()
+ prevConfiguration = IQBarButtonItemConfiguration(image: chevronUp,
+ action: #selector(self.previousAction(_:)))
+ prevConfiguration.accessibilityLabel = "Previous"
+ }
+ return prevConfiguration
+ }
+
+ func getNextConfiguration() -> IQBarButtonItemConfiguration {
+ let nextConfiguration: IQBarButtonItemConfiguration
+ if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.nextBarButtonConfiguration {
+ configuration.action = #selector(self.nextAction(_:))
+ nextConfiguration = configuration
+ } else {
+ let chevronDown: UIImage = UIImage(systemName: "chevron.down") ?? UIImage()
+ nextConfiguration = IQBarButtonItemConfiguration(image: chevronDown,
+ action: #selector(self.nextAction(_:)))
+ nextConfiguration.accessibilityLabel = "Next"
+ }
+ return nextConfiguration
+ }
+
+ static func applyToolbarConfiguration(textInputView: some IQTextInputView,
+ toolbarConfiguration: IQKeyboardToolbarConfiguration) {
+
+ let toolbar: IQKeyboardToolbar = textInputView.iq.toolbar
+
+ // Setting toolbar tintColor // (Enhancement ID: #30)
+ if toolbarConfiguration.useTextInputViewTintColor {
+ toolbar.tintColor = textInputView.tintColor
+ } else {
+ toolbar.tintColor = toolbarConfiguration.tintColor
+ }
+
+ // Bar style according to keyboard appearance
+ switch textInputView.keyboardAppearance {
+ case .dark:
+ toolbar.barStyle = .black
+ toolbar.barTintColor = nil
+ default:
+ toolbar.barStyle = .default
+ toolbar.barTintColor = toolbarConfiguration.barTintColor
+ }
+
+ // Setting toolbar title font. // (Enhancement ID: #30)
+ guard toolbarConfiguration.placeholderConfiguration.showPlaceholder,
+ !textInputView.iq.hidePlaceholder else {
+ toolbar.titleBarButton.title = nil
+ return
+ }
+
+ // Updating placeholder font to toolbar. //(Bug ID: #148, #272)
+ if toolbar.titleBarButton.title == nil ||
+ toolbar.titleBarButton.title != textInputView.iq.drawingPlaceholder {
+ toolbar.titleBarButton.title = textInputView.iq.drawingPlaceholder
+ }
+
+ // Setting toolbar title font. // (Enhancement ID: #30)
+ toolbar.titleBarButton.titleFont = toolbarConfiguration.placeholderConfiguration.font
+
+ // Setting toolbar title color. // (Enhancement ID: #880)
+ toolbar.titleBarButton.titleColor = toolbarConfiguration.placeholderConfiguration.color
+
+ // Setting toolbar button title color. // (Enhancement ID: #880)
+ toolbar.titleBarButton.selectableTitleColor = toolbarConfiguration.placeholderConfiguration.buttonColor
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift
new file mode 100644
index 0000000..83a8b9c
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift
@@ -0,0 +1,58 @@
+//
+// Array+Sort.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+/**
+UIView.subviews sorting category.
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension Array where Element: IQTextInputView {
+
+ /**
+ Returns the array by sorting the UIView's by their tag property.
+ */
+ func sortedByTag() -> [Element] {
+
+ return sorted(by: { (obj1: Element, obj2: Element) -> Bool in
+
+ return (obj1.tag < obj2.tag)
+ })
+ }
+
+ /**
+ Returns the array by sorting the UIView's by their tag property.
+ */
+ func sortedByPosition() -> [Element] {
+
+ return sorted(by: { (obj1: Element, obj2: Element) -> Bool in
+ if obj1.frame.minY != obj2.frame.minY {
+ return obj1.frame.minY < obj2.frame.minY
+ } else {
+ return obj1.frame.minX < obj2.frame.minX
+ }
+ })
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift
new file mode 100644
index 0000000..592399e
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift
@@ -0,0 +1,179 @@
+//
+// UIView+Responders.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbarManager
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+ static var ignoreSwitchingByNextPrevious: Int = 0
+}
+
+/**
+UIView category for managing textInputView
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+ /**
+ If ignoreSwitchingByNextPrevious is true then library will ignore this textInputView
+ while moving to other textInputView using keyboard toolbar next previous buttons.
+ Default is false
+ */
+ var ignoreSwitchingByNextPrevious: Bool {
+ get {
+ if let base = base {
+ return objc_getAssociatedObject(base, &AssociatedKeys.ignoreSwitchingByNextPrevious) as? Bool ?? false
+ }
+ return false
+ }
+ set(newValue) {
+ if let base = base {
+ objc_setAssociatedObject(base, &AssociatedKeys.ignoreSwitchingByNextPrevious,
+ newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+ }
+ }
+ }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+ @available(*, unavailable, renamed: "iq.ignoreSwitchingByNextPrevious")
+ var ignoreSwitchingByNextPrevious: Bool {
+ get { false }
+ set { }
+ }
+}
+// swiftlint:enable unused_setter_value
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardExtension where Base: IQTextInputView {
+
+ /**
+ Returns all siblings of the receiver which canBecomeFirstResponder.
+ */
+ func responderSiblings() -> [any IQTextInputView] {
+
+ // Getting all siblings
+ guard let siblings: [UIView] = base?.superview?.subviews else { return [] }
+
+ // Array of textInputView.
+ var textInputViews: [any IQTextInputView] = []
+ for view in siblings {
+ if let view = view as? any IQTextInputView,
+ view == base || !view.internalIgnoreSwitchingByNextPrevious,
+ view.internalCanBecomeFirstResponder() {
+ textInputViews.append(view)
+ }
+ }
+
+ return textInputViews
+ }
+}
+
+/**
+UIView category for managing textInputView
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardExtension where Base: UIView {
+
+ /**
+ Returns all deep subViews of the receiver which canBecomeFirstResponder.
+ */
+ func deepResponderViews() -> [any IQTextInputView] {
+
+ guard let subviews: [UIView] = base?.subviews, !subviews.isEmpty else { return [] }
+
+ // Array of textInputViews.
+ var textInputViews: [any IQTextInputView] = []
+
+ for view in subviews {
+
+ if let view = view as? any IQTextInputView,
+ view == base || !view.internalIgnoreSwitchingByNextPrevious,
+ view.internalCanBecomeFirstResponder() {
+ textInputViews.append(view)
+ }
+ // Sometimes there are hidden or disabled views and textInputView inside them still recorded,
+ // so we added some more validations here (Bug ID: #458)
+ // Uncommented else (Bug ID: #625)
+ else if view.subviews.count != 0,
+ base?.isUserInteractionEnabled == true,
+ base?.isHidden == false, base?.alpha != 0.0 {
+ for deepView in view.iq.deepResponderViews() {
+ textInputViews.append(deepView)
+ }
+ }
+ }
+
+ // subviews are returning in opposite order. Sorting according the frames 'y'.
+ return textInputViews.sorted(by: { (view1: any IQTextInputView, view2: any IQTextInputView) -> Bool in
+
+ let frame1: CGRect = view1.convert(view1.bounds, to: base)
+ let frame2: CGRect = view2.convert(view2.bounds, to: base)
+
+ if frame1.minY != frame2.minY {
+ return frame1.minY < frame2.minY
+ } else {
+ return frame1.minX < frame2.minX
+ }
+ })
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardExtension where Base: IQTextInputView {
+
+ func canBecomeFirstResponder() -> Bool {
+
+ var canBecomeFirstResponder: Bool = base?.iqIsEnabled == true
+
+ if canBecomeFirstResponder {
+ canBecomeFirstResponder = base?.isUserInteractionEnabled == true &&
+ base?.isHidden == false &&
+ base?.alpha != 0.0 &&
+ !isAlertViewTextField() &&
+ textFieldSearchBar() == nil
+ }
+
+ return canBecomeFirstResponder
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+ var internalIgnoreSwitchingByNextPrevious: Bool {
+ return iq.ignoreSwitchingByNextPrevious
+ }
+ func internalCanBecomeFirstResponder() -> Bool {
+ return iq.canBecomeFirstResponder()
+ }
+}
diff --git a/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift
new file mode 100644
index 0000000..f8113e6
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift
@@ -0,0 +1,44 @@
+//
+// UIView+RespondersObjc.swift
+// https://github.com/hackiftekhar/IQKeyboardToolbar
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+ var iq_ignoreSwitchingByNextPrevious: Bool {
+ get { iq.ignoreSwitchingByNextPrevious }
+ set { iq.ignoreSwitchingByNextPrevious = newValue }
+ }
+}
+
+@objc public extension UITextView {
+
+ var iq_ignoreSwitchingByNextPrevious: Bool {
+ get { iq.ignoreSwitchingByNextPrevious }
+ set { iq.ignoreSwitchingByNextPrevious = newValue }
+ }
+}
+// swiftlint:enable identifier_name
diff --git a/Pods/IQKeyboardToolbarManager/LICENSE b/Pods/IQKeyboardToolbarManager/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQKeyboardToolbarManager/README.md b/Pods/IQKeyboardToolbarManager/README.md
new file mode 100644
index 0000000..d20fe8a
--- /dev/null
+++ b/Pods/IQKeyboardToolbarManager/README.md
@@ -0,0 +1,93 @@
+# IQKeyboardToolbarManager
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardToolbarManager.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardToolbarManager)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbarManager/master/Screenshot/IQKeyboardToolbarManagerScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardToolbarManager is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardToolbarManager'
+```
+
+## Usage
+
+Enable toolbar handling in AppDelegate
+
+```swift
+import UIKit
+import IQKeyboardToolbarManager
+
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ IQKeyboardToolbarManager.shared.isEnabled = true
+ return true
+ }
+```
+
+Cuistomize Behavior
+```swift
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.useTextInputViewTintColor = true
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor = UIColor.systemGreen
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.barTintColor = UIColor.systemYellow
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.previousNextDisplayMode = .alwaysShow
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.manageBehavior = .byPosition
+
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.previousBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.nextBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.doneBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.showPlaceholder = false
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.font = UIFont.italicSystemFont(ofSize: 14)
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.color = UIColor.systemPurple
+ IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.buttonColor = UIColor.systemBrown // This is used only if placeholder is an action button
+
+ IQKeyboardToolbarManager.shared.playInputClicks = false
+
+ IQKeyboardToolbarManager.shared.disabledToolbarClasses.append(ChatViewController.self)
+ IQKeyboardToolbarManager.shared.enabledToolbarClasses.append(LoginViewController.self)
+ IQKeyboardToolbarManager.shared.deepResponderAllowedContainerClasses.append(UIStackView.self)
+```
+
+Useful functions and variables
+```swift
+ if IQKeyboardToolbarManager.shared.canGoPrevious {
+ ...
+ }
+
+ if IQKeyboardToolbarManager.shared.canGoNext {
+ ...
+ }
+
+ IQKeyboardToolbarManager.shared.goPrevious()
+ IQKeyboardToolbarManager.shared.goNext()
+
+ IQKeyboardToolbarManager.shared.reloadInputViews() // If some textInputView hierarchy are changed on the fly then use this to reload button states
+```
+
+Useful functions and variables for TextInputView
+```swift
+ textField.iq.ignoreSwitchingByNextPrevious = false
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardToolbarManager is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift
new file mode 100644
index 0000000..4b5e4f9
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift
@@ -0,0 +1,91 @@
+//
+// IQTextInputViewInfo.swift
+// https://github.com/hackiftekhar/IQTextInputViewNotification
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public struct IQTextInputViewInfo: Equatable {
+
+ nonisolated public static func == (lhs: Self, rhs: Self) -> Bool {
+ return lhs.textInputView == rhs.textInputView &&
+ lhs.event == rhs.event
+ }
+
+ @MainActor
+ @objc public enum Event: Int {
+ case beginEditing
+ case endEditing
+
+ public var name: String {
+ switch self {
+ case .beginEditing:
+ return "BeginEditing"
+ case .endEditing:
+ return "EndEditing"
+ }
+ }
+ }
+
+ public let event: Event
+
+ public let textInputView: any IQTextInputView
+
+ internal init?(notification: Notification, event: Event) {
+ guard let view: any IQTextInputView = notification.object as? (any IQTextInputView) else {
+ return nil
+ }
+
+ self.event = event
+ textInputView = view
+ }
+}
+
+// MARK: Deprecated
+@available(iOSApplicationExtension, unavailable)
+public extension IQTextInputViewInfo {
+
+ @available(*, unavailable, renamed: "event")
+ var name: Event { event }
+
+ @available(*, unavailable, renamed: "textInputView")
+ var textFieldView: any IQTextInputView { textInputView }
+}
+
+@available(*, unavailable, renamed: "IQTextInputViewInfo")
+@MainActor
+public struct IQTextFieldViewInfo: Equatable {}
+
+@available(iOSApplicationExtension, unavailable)
+@objcMembers public class IQTextInputViewInfoObjC: NSObject {
+ private let wrappedValue: IQTextInputViewInfo
+
+ public var event: IQTextInputViewInfo.Event { wrappedValue.event }
+
+ public var textInputView: any IQTextInputView { wrappedValue.textInputView }
+
+ init(wrappedValue: IQTextInputViewInfo){
+ self.wrappedValue = wrappedValue
+ }
+}
diff --git a/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift
new file mode 100644
index 0000000..8822d39
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift
@@ -0,0 +1,182 @@
+//
+// IQTextInputViewNotification.swift
+// https://github.com/hackiftekhar/IQTextInputViewNotification
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import Combine
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQTextInputViewNotification: NSObject {
+
+ private var storage: Set = []
+
+ private var textInputViewObservers: [AnyHashable: TextInputViewCompletion] = [:]
+
+ private var findInteractionTextInputViewInfo: IQTextInputViewInfo?
+
+ public private(set) var textInputViewInfo: IQTextInputViewInfo?
+
+ public var event: IQTextInputViewInfo.Event? {
+ textInputViewInfo?.event
+ }
+
+ public var textInputView: (any IQTextInputView)? {
+ return textInputViewInfo?.textInputView
+ }
+
+ public override init() {
+ super.init()
+
+ // Registering for TextInputView notification.
+ do {
+ let beginEditingNotificationNames: [Notification.Name] = [
+ UITextField.textDidBeginEditingNotification,
+ UITextView.textDidBeginEditingNotification
+ ]
+
+ for notificationName in beginEditingNotificationNames {
+ NotificationCenter.default.publisher(for: notificationName)
+ .compactMap({ IQTextInputViewInfo(notification: $0, event: .beginEditing) })
+ .sink(receiveValue: { [weak self] info in
+ guard let self = self else { return }
+ self.didBeginEditing(info: info)
+ })
+ .store(in: &storage)
+ }
+ }
+
+ do {
+ let endEditingNotificationNames: [Notification.Name] = [
+ UITextField.textDidEndEditingNotification,
+ UITextView.textDidEndEditingNotification
+ ]
+
+ for notificationName in endEditingNotificationNames {
+ NotificationCenter.default.publisher(for: notificationName)
+ .compactMap({ IQTextInputViewInfo(notification: $0, event: .endEditing) })
+ .sink(receiveValue: { [weak self] info in
+ guard let self = self else { return }
+ self.didEndEditing(info: info)
+ })
+ .store(in: &storage)
+ }
+ }
+ }
+
+ private func didBeginEditing(info: IQTextInputViewInfo) {
+
+ if #available(iOS 16.0, *),
+ let findInteractionTextInputViewInfo = findInteractionTextInputViewInfo,
+ findInteractionTextInputViewInfo.textInputView.iqFindInteraction?.isFindNavigatorVisible == true {
+ // // This means the this didBeginEditing call comes due to find interaction
+ textInputViewInfo = findInteractionTextInputViewInfo
+ sendEvent(info: findInteractionTextInputViewInfo)
+ } else if textInputViewInfo != info {
+ textInputViewInfo = info
+ findInteractionTextInputViewInfo = nil
+ sendEvent(info: info)
+ } else {
+ findInteractionTextInputViewInfo = nil
+ }
+ }
+
+ private func didEndEditing(info: IQTextInputViewInfo) {
+
+ if textInputViewInfo != info {
+ if #available(iOS 16.0, *),
+ info.textInputView.iqIsFindInteractionEnabled {
+ findInteractionTextInputViewInfo = textInputViewInfo
+ } else {
+ findInteractionTextInputViewInfo = nil
+ }
+ textInputViewInfo = info
+ sendEvent(info: info)
+ textInputViewInfo = nil
+ }
+ }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQTextInputViewNotification {
+
+ typealias TextInputViewCompletion = (_ event: IQTextInputViewInfo.Event,
+ _ textInputView: any IQTextInputView) -> Void
+
+ func subscribe(identifier: AnyHashable, changeHandler: @escaping TextInputViewCompletion) {
+ textInputViewObservers[identifier] = changeHandler
+
+ if let textInputViewInfo = textInputViewInfo {
+ changeHandler(textInputViewInfo.event, textInputViewInfo.textInputView)
+ }
+ }
+
+ func unsubscribe(identifier: AnyHashable) {
+ textInputViewObservers[identifier] = nil
+ }
+
+ func isSubscribed(identifier: AnyHashable) -> Bool {
+ return textInputViewObservers[identifier] != nil
+ }
+
+ @nonobjc
+ private func sendEvent(info: IQTextInputViewInfo) {
+
+ for block in textInputViewObservers.values {
+ block(info.event, info.textInputView)
+ }
+ }
+}
+
+// MARK: Deprecated
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQTextInputViewNotification {
+
+ @available(*, unavailable, renamed: "textInputViewInfo")
+ var textFieldViewInfo: IQTextInputViewInfo? { textInputViewInfo }
+
+ @available(*, unavailable, renamed: "textInputView")
+ var textFieldView: (some IQTextInputView)? { textInputView }
+
+ @available(*, unavailable, renamed: "subscribe(identifier:changeHandler:)")
+ func registerTextFieldViewChange(identifier: AnyHashable, changeHandler: @escaping TextInputViewCompletion) {}
+
+ @available(*, unavailable, renamed: "unsubscribe(identifier:)")
+ func unregisterSizeChange(identifier: AnyHashable) {}
+}
+
+@available(*, unavailable, renamed: "IQTextInputViewNotification")
+@MainActor
+@objcMembers public final class IQTextFieldViewListener: NSObject {}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQTextInputViewNotification {
+
+ var textInputViewInfoObjc: IQTextInputViewInfoObjC? {
+ guard let textInputViewInfo = textInputViewInfo else { return nil }
+ return IQTextInputViewInfoObjC(wrappedValue: textInputViewInfo)
+ }
+}
diff --git a/Pods/IQTextInputViewNotification/LICENSE b/Pods/IQTextInputViewNotification/LICENSE
new file mode 100644
index 0000000..4440a40
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2024 hackiftekhar
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/Pods/IQTextInputViewNotification/README.md b/Pods/IQTextInputViewNotification/README.md
new file mode 100644
index 0000000..3926512
--- /dev/null
+++ b/Pods/IQTextInputViewNotification/README.md
@@ -0,0 +1,66 @@
+# IQTextInputViewNotification
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQTextInputViewNotification.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQTextInputViewNotification)
+[![Version](https://img.shields.io/cocoapods/v/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification)
+[![License](https://img.shields.io/cocoapods/l/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification)
+[![Platform](https://img.shields.io/cocoapods/p/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextInputViewNotification/master/Screenshot/IQTextInputViewNotificationScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQTextInputViewNotification is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQTextInputViewNotification'
+```
+
+## Usage
+
+To observe textInputView becomeFirstResponder and resignFirstResponder changes, subscribe to the textInputView events:-
+
+```swift
+import IQTextInputViewNotification
+
+class ViewController: UIViewController {
+
+ private let textInputViewObserver: IQTextInputViewNotification = .init()
+
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+
+ // Subscribe
+ textInputViewObserver.subscribe(identifier: "YOUR_UNIQUE_IDENTIFIER") {info in
+ print(info.event.name) // BeginEditing or EndEditing event
+ print(info.textInputView) // TextInputView which begin editing or end editing
+ // Write your own logic here based on event
+ }
+ }
+
+ override func viewWillDisappear(_ animated: Bool) {
+ super.viewWillDisappear(animated)
+
+ // Unsubscribe
+ textInputViewObserver.unsubscribe(identifier: "YOUR_UNIQUE_IDENTIFIER")
+ }
+}
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## Flow
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextInputViewNotification/master/Screenshot/FlowDiagram.jpg)
+
+## License
+
+IQTextInputViewNotification is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy b/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy
new file mode 100644
index 0000000..9021190
--- /dev/null
+++ b/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy
@@ -0,0 +1,14 @@
+
+
+
+
+ NSPrivacyAccessedAPITypes
+
+ NSPrivacyTrackingDomains
+
+ NSPrivacyCollectedDataTypes
+
+ NSPrivacyTracking
+
+
+
diff --git a/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift b/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift
new file mode 100644
index 0000000..1cf3954
--- /dev/null
+++ b/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift
@@ -0,0 +1,29 @@
+//
+// IQTextView.swift
+// https://github.com/hackiftekhar/IQTextView
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQTextView: IQPlaceholderable { }
diff --git a/Pods/IQTextView/IQTextView/Classes/IQTextView.swift b/Pods/IQTextView/IQTextView/Classes/IQTextView.swift
new file mode 100644
index 0000000..9c49e51
--- /dev/null
+++ b/Pods/IQTextView/IQTextView/Classes/IQTextView.swift
@@ -0,0 +1,193 @@
+//
+// IQTextView.swift
+// https://github.com/hackiftekhar/IQTextView
+// Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import UIKit
+
+/** @abstract UITextView with placeholder support */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQTextView: UITextView {
+
+ required public init?(coder aDecoder: NSCoder) {
+ super.init(coder: aDecoder)
+ setup()
+ }
+
+ override public init(frame: CGRect, textContainer: NSTextContainer?) {
+ super.init(frame: frame, textContainer: textContainer)
+ setup()
+ }
+
+ override open func awakeFromNib() {
+ super.awakeFromNib()
+ setup()
+ }
+
+ private func setup() {
+ NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder),
+ name: UITextView.textDidChangeNotification, object: self)
+
+ do {
+ placeholderLabel.frame = placeholderExpectedFrame
+ placeholderLabel.autoresizingMask = [.flexibleWidth, .flexibleHeight]
+ placeholderLabel.lineBreakMode = .byWordWrapping
+ placeholderLabel.numberOfLines = 0
+ placeholderLabel.font = self.font
+ placeholderLabel.textAlignment = self.textAlignment
+ placeholderLabel.backgroundColor = UIColor.clear
+ placeholderLabel.isAccessibilityElement = false
+ placeholderLabel.textColor = UIColor.placeholderText
+ self.addSubview(placeholderLabel)
+ refreshPlaceholder()
+ }
+ }
+
+ private var placeholderInsets: UIEdgeInsets {
+ let top: CGFloat = self.textContainerInset.top
+ let left: CGFloat = self.textContainerInset.left + self.textContainer.lineFragmentPadding
+ let bottom: CGFloat = self.textContainerInset.bottom
+ let right: CGFloat = self.textContainerInset.right + self.textContainer.lineFragmentPadding
+ return UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
+ }
+
+ private var placeholderExpectedFrame: CGRect {
+ let insets: UIEdgeInsets = self.placeholderInsets
+ let maxWidth: CGFloat = self.frame.width-insets.left-insets.right
+ let size: CGSize = CGSize(width: maxWidth, height: self.frame.height-insets.top-insets.bottom)
+ let expectedSize: CGSize = placeholderLabel.sizeThatFits(size)
+
+ return CGRect(x: insets.left, y: insets.top, width: maxWidth, height: expectedSize.height)
+ }
+
+ public let placeholderLabel: UILabel = .init()
+
+ /** @abstract To set textView's placeholder text color. */
+ @IBInspectable open var placeholderTextColor: UIColor? {
+
+ get {
+ return placeholderLabel.textColor
+ }
+
+ set {
+ placeholderLabel.textColor = newValue
+ }
+ }
+
+ /** @abstract To set textView's placeholder text. Default is nil. */
+ @IBInspectable open var placeholder: String? {
+
+ get {
+ return placeholderLabel.text
+ }
+
+ set {
+ placeholderLabel.text = newValue
+ refreshPlaceholder()
+ }
+ }
+
+ /** @abstract To set textView's placeholder attributed text. Default is nil. */
+ open var attributedPlaceholder: NSAttributedString? {
+ get {
+ return placeholderLabel.attributedText
+ }
+
+ set {
+ placeholderLabel.attributedText = newValue
+ refreshPlaceholder()
+ }
+ }
+
+ open override func layoutSubviews() {
+ super.layoutSubviews()
+
+ placeholderLabel.frame = placeholderExpectedFrame
+ }
+
+ @objc private func refreshPlaceholder() {
+
+ let text: String = text ?? attributedText?.string ?? ""
+ placeholderLabel.alpha = text.isEmpty ? 1 : 0
+ }
+
+ open override var text: String! {
+
+ didSet {
+ refreshPlaceholder()
+ }
+ }
+
+ open override var attributedText: NSAttributedString! {
+
+ didSet {
+ refreshPlaceholder()
+ }
+ }
+
+ open override var font: UIFont? {
+
+ didSet {
+
+ if let font: UIFont = font {
+ placeholderLabel.font = font
+ } else {
+ placeholderLabel.font = UIFont.systemFont(ofSize: 12)
+ }
+ }
+ }
+
+ open override var textAlignment: NSTextAlignment {
+ didSet {
+ placeholderLabel.textAlignment = textAlignment
+ }
+ }
+
+ open override var intrinsicContentSize: CGSize {
+ guard !hasText else {
+ return super.intrinsicContentSize
+ }
+
+ var newSize: CGSize = super.intrinsicContentSize
+ let placeholderInsets: UIEdgeInsets = self.placeholderInsets
+ newSize.height = placeholderExpectedFrame.height + placeholderInsets.top + placeholderInsets.bottom
+
+ return newSize
+ }
+
+ open override func caretRect(for position: UITextPosition) -> CGRect {
+ var originalRect = super.caretRect(for: position)
+
+ // When placeholder is visible and text alignment is centered
+ guard placeholderLabel.alpha == 1 && self.textAlignment == .center else { return originalRect }
+
+ // Calculate the width of the placeholder text
+ let font = placeholderLabel.font ?? UIFont.systemFont(ofSize: UIFont.systemFontSize)
+ let textSize = placeholderLabel.text?.size(withAttributes: [.font: font]) ?? .zero
+ // Calculate the starting x position of the centered placeholder text
+ let centeredTextX = (self.bounds.size.width - textSize.width) / 2
+ // Update the caret position to match the starting x position of the centered text
+ originalRect.origin.x = centeredTextX
+
+ return originalRect
+ }
+}
diff --git a/Pods/IQTextView/LICENSE b/Pods/IQTextView/LICENSE
new file mode 100644
index 0000000..5d8eb96
--- /dev/null
+++ b/Pods/IQTextView/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Pods/IQTextView/README.md b/Pods/IQTextView/README.md
new file mode 100644
index 0000000..417325e
--- /dev/null
+++ b/Pods/IQTextView/README.md
@@ -0,0 +1,48 @@
+# IQTextView
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQTextView.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQTextView)
+[![Version](https://img.shields.io/cocoapods/v/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView)
+[![License](https://img.shields.io/cocoapods/l/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView)
+[![Platform](https://img.shields.io/cocoapods/p/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextView/master/Screenshot/IQTextViewScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQTextView is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQTextView'
+```
+
+## Usage
+
+You can set any UITextView class to IQTextView and then you can change the placeholder and placeholderTextColor from the storyboard
+
+To change them via code, you may have to set them programmatically
+```swift
+textView.placeholderTextColor = UIColor.lightGray
+textView.placeholder = "Enter your message here..."
+```
+
+To work this with IQKeyboardToolbarManager to show placeholder in toolbar, you may have to confirm IQPlaceholderable manually in your code
+```swift
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQTextView: IQPlaceholderable { }
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQTextView is available under the MIT license. See the LICENSE file for more info.
diff --git a/Pods/Local Podspecs/VideoSDKRTC.podspec.json b/Pods/Local Podspecs/VideoSDKRTC.podspec.json
index 7370a63..941daff 100644
--- a/Pods/Local Podspecs/VideoSDKRTC.podspec.json
+++ b/Pods/Local Podspecs/VideoSDKRTC.podspec.json
@@ -1,6 +1,6 @@
{
"name": "VideoSDKRTC",
- "version": "2.1.0",
+ "version": "2.1.9",
"summary": "Interactive Video API Experiences for Develoeprs.",
"description": "Video sdk enables opportunity to integrate immersive video experiences into your application.",
"homepage": "https://github.com/videosdk-live/videosdk-rtc-ios-sdk",
@@ -13,17 +13,21 @@
},
"source": {
"git": "https://github.com/videosdk-live/videosdk-rtc-ios-sdk.git",
- "tag": "v2.1.0"
+ "tag": "v2.1.9"
},
"swift_versions": "5.0",
"platforms": {
- "ios": "12.0"
+ "ios": "13.0"
+ },
+ "dependencies": {
+ "Socket.IO-Client-Swift": [
+ "16.1.1"
+ ]
},
"vendored_frameworks": [
"Frameworks/VideoSDKRTC.xcframework",
"Frameworks/Mediasoup.xcframework",
- "Frameworks/WebRTC.xcframework",
- "Frameworks/VideosdkWebSocket.xcframework"
+ "Frameworks/WebRTC.xcframework"
],
"xcconfig": {
"CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES": "YES",
diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock
index d15b72c..55fa858 100644
--- a/Pods/Manifest.lock
+++ b/Pods/Manifest.lock
@@ -2,10 +2,53 @@ PODS:
- InputBarAccessoryView (5.5.0):
- InputBarAccessoryView/Core (= 5.5.0)
- InputBarAccessoryView/Core (5.5.0)
- - IQKeyboardManagerSwift (6.5.16)
+ - IQKeyboardCore (1.0.5)
+ - IQKeyboardManagerSwift (8.0.0):
+ - IQKeyboardManagerSwift/Appearance (= 8.0.0)
+ - IQKeyboardManagerSwift/Core (= 8.0.0)
+ - IQKeyboardManagerSwift/IQKeyboardReturnManager (= 8.0.0)
+ - IQKeyboardManagerSwift/IQKeyboardToolbarManager (= 8.0.0)
+ - IQKeyboardManagerSwift/IQTextView (= 8.0.0)
+ - IQKeyboardManagerSwift/Resign (= 8.0.0)
+ - IQKeyboardManagerSwift/Appearance (8.0.0):
+ - IQKeyboardManagerSwift/Core
+ - IQKeyboardManagerSwift/Core (8.0.0):
+ - IQKeyboardNotification
+ - IQTextInputViewNotification
+ - IQKeyboardManagerSwift/IQKeyboardReturnManager (8.0.0):
+ - IQKeyboardReturnManager
+ - IQKeyboardManagerSwift/IQKeyboardToolbarManager (8.0.0):
+ - IQKeyboardManagerSwift/Core
+ - IQKeyboardToolbarManager
+ - IQKeyboardManagerSwift/IQTextView (8.0.0):
+ - IQTextView
+ - IQKeyboardManagerSwift/Resign (8.0.0):
+ - IQKeyboardManagerSwift/Core
+ - IQKeyboardNotification (1.0.3)
+ - IQKeyboardReturnManager (1.0.4):
+ - IQKeyboardCore (= 1.0.5)
+ - IQKeyboardToolbar (1.1.1):
+ - IQKeyboardCore
+ - IQKeyboardToolbar/Core (= 1.1.1)
+ - IQKeyboardToolbar/Core (1.1.1):
+ - IQKeyboardCore
+ - IQKeyboardToolbar/Placeholderable
+ - IQKeyboardToolbar/Placeholderable (1.1.1):
+ - IQKeyboardCore
+ - IQKeyboardToolbarManager (1.1.2):
+ - IQKeyboardToolbar
+ - IQTextInputViewNotification
+ - IQTextInputViewNotification (1.0.8):
+ - IQKeyboardCore
+ - IQTextView (1.0.5):
+ - IQKeyboardToolbar/Placeholderable
- MessageKit (3.8.0):
- InputBarAccessoryView (~> 5.5.0)
- - VideoSDKRTC (2.1.0)
+ - Socket.IO-Client-Swift (16.1.1):
+ - Starscream (~> 4.0.8)
+ - Starscream (4.0.8)
+ - VideoSDKRTC (2.1.9):
+ - Socket.IO-Client-Swift (= 16.1.1)
DEPENDENCIES:
- IQKeyboardManagerSwift
@@ -15,8 +58,17 @@ DEPENDENCIES:
SPEC REPOS:
trunk:
- InputBarAccessoryView
+ - IQKeyboardCore
- IQKeyboardManagerSwift
+ - IQKeyboardNotification
+ - IQKeyboardReturnManager
+ - IQKeyboardToolbar
+ - IQKeyboardToolbarManager
+ - IQTextInputViewNotification
+ - IQTextView
- MessageKit
+ - Socket.IO-Client-Swift
+ - Starscream
EXTERNAL SOURCES:
VideoSDKRTC:
@@ -24,15 +76,24 @@ EXTERNAL SOURCES:
CHECKOUT OPTIONS:
VideoSDKRTC:
- :commit: 915455b5395e243a620c315d49b650c1884216a0
+ :commit: aedc4a2ca0407d35961be509309e45e6b7aa8ea9
:git: https://github.com/videosdk-live/videosdk-rtc-ios-sdk.git
SPEC CHECKSUMS:
InputBarAccessoryView: 1d7b0a672b36e370f01f264b3907ef39d03328e3
- IQKeyboardManagerSwift: 12d89768845bb77b55cc092ecc2b1f9370f06b76
+ IQKeyboardCore: 28c8bf3bcd8ba5aa1570b318cbc4da94b861711e
+ IQKeyboardManagerSwift: 0c6fbbaa2e60739e48d7cf59f25661471a7a3a65
+ IQKeyboardNotification: d7382c4466c5a5adef92c7452ebf861b36050088
+ IQKeyboardReturnManager: 972be48528ce9e7508ab3ab15ac7efac803f17f5
+ IQKeyboardToolbar: d4bdccfb78324aec2f3920659c77bb89acd33312
+ IQKeyboardToolbarManager: 6f4072ac620c2572d4af8c09f42a801f3e4909f7
+ IQTextInputViewNotification: f5e954d8881fd9808b744e49e024cc0d4bcfe572
+ IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
MessageKit: a1ba0c69ebead94029867853eb44dd05b9b3f453
- VideoSDKRTC: 42abab38e8bb4dd5c9ad5d23415cf5e0ce87908b
+ Socket.IO-Client-Swift: 3614bea82ba005df1c2ff01154f4004993e05ad7
+ Starscream: 19b5533ddb925208db698f0ac508a100b884a1b9
+ VideoSDKRTC: 679cdce8548a9de7b8328fc4d880102f29c31057
-PODFILE CHECKSUM: 9a6c26d40d9f65335d130d844a4f98bb47161e02
+PODFILE CHECKSUM: 1014d5c5fdb18889deee645f7a165d4898c12f61
COCOAPODS: 1.15.2
diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj
index 6260a91..33c57b7 100644
--- a/Pods/Pods.xcodeproj/project.pbxproj
+++ b/Pods/Pods.xcodeproj/project.pbxproj
@@ -9,399 +9,1030 @@
/* Begin PBXAggregateTarget section */
B6E2C457741647223A51766707CCB8CA /* VideoSDKRTC */ = {
isa = PBXAggregateTarget;
- buildConfigurationList = 68EA2DFD82B4B4FF95F5005196F7CA15 /* Build configuration list for PBXAggregateTarget "VideoSDKRTC" */;
+ buildConfigurationList = 986A717B141196F0913F8D4B8C29BA71 /* Build configuration list for PBXAggregateTarget "VideoSDKRTC" */;
buildPhases = (
- 9E499AE4D128F431117E2C37077221F5 /* [CP] Copy XCFrameworks */,
+ 19E5AC097CDFFAE87CEF7C4FDCBF1B39 /* [CP] Copy XCFrameworks */,
);
dependencies = (
+ 3B652D5305360FAD4B40719789F63C0B /* PBXTargetDependency */,
);
name = VideoSDKRTC;
};
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
- 0150BEE0E308862F44F065F970682256 /* InputBarAccessoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 764038EAAB0193D2CB6F5739C5CC2215 /* InputBarAccessoryView.swift */; };
- 042E348977C5609373D0C0DF117348BC /* LocationMessageSnapshotOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF5A30ED9692EA16440908EC9B022A06 /* LocationMessageSnapshotOptions.swift */; };
- 055D2A9CEC22083FDB3201CC672078FE /* InputBarAccessoryView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A36AE9AA6C36DBFC0519F1F0B56A347D /* InputBarAccessoryView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 05C962C43A5B96C3973BCD74EEE080BC /* InputBarAccessoryView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 054BB95F1C6127DEA05615B615975440 /* InputBarAccessoryView-dummy.m */; };
- 05E3FC2B52A47023573273A44ADC5097 /* MessageKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7334926BC880D499A847F8911920860 /* MessageKind.swift */; };
- 0635FA92B665BD403A496FCB2A0F5070 /* MessagesViewController+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A0924FD3C0057DC5A7C0E9F7292D95 /* MessagesViewController+Menu.swift */; };
- 07F83DE63FB5CC8015F48F7B9B800B6F /* IQPreviousNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26D082CAC1129CDF36243BCCF98B2A0E /* IQPreviousNextView.swift */; };
- 07FB758F9FA9070136DFE376326225FB /* TypingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 808272F7C43F8F467937F4F0501A5E8F /* TypingIndicator.swift */; };
- 07FD274BC01F578C7B37989F79350C1E /* IQToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593F92587C692CA0F018DCC20115ADC6 /* IQToolbar.swift */; };
- 0874E6176184E3A1C3E8AB158AE5E98B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 840FA0B75AF62912A30DDC66B647ED98 /* CoreGraphics.framework */; };
- 089BFD4BBF9FEB230B089D0554316C85 /* InputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B6F5689A58EA51A26E63A7AE770CA3F /* InputItem.swift */; };
- 109C9BE1C2C69C551847C4F6F74A42FD /* InputStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 531F5C194C14C630C0326589B2A8F647 /* InputStackView.swift */; };
- 117C7750377EA6BD5E4E0857154B1DCF /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEDEA9B65792F4D17CC5AB59660B790E /* Avatar.swift */; };
- 11F53F3C55B3F5155F0F6B7176847F48 /* AudioMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EA77D283BA8805FB3B062FF49F849B /* AudioMessageCell.swift */; };
- 130270BF18FDBA1DFF67247E42AC661B /* LinkItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 288E14CFD5BE2494A4D330FD85C7CDE4 /* LinkItem.swift */; };
- 13A9538CEAE41482692C6222E4EED578 /* SeparatorLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3620760EFB3C0C886A05DD8FD2E8B80 /* SeparatorLine.swift */; };
- 16854A9A19CEFC25255F37BDD64611E1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CB5DCABF4CA1445EAC18D9D21D494407 /* Assets.xcassets */; };
- 16B1FCC8B3E6548AC3BD48A789AC4EB1 /* NSMutableAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E9E1C25BC27113F020D404B30533B7C /* NSMutableAttributedString+Extensions.swift */; };
- 16E5F9C7FE2C499D21F3E7AF1FFC2FA7 /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 731C0EC9679CB7C9AC544DE6F8568B36 /* IQKeyboardManager.swift */; };
- 17758957331DBB7ECD7209FFC47CA0F0 /* NSAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88DEDC7D751C475E1438849BF7F77429 /* NSAttributedString+Extensions.swift */; };
- 19C5CA44D4D4D5B711D33A73525D453F /* IQUIView+IQKeyboardToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 562408E478086D76CB2DF1E7CF482923 /* IQUIView+IQKeyboardToolbar.swift */; };
- 19E44D30E076F0B5CA0E0BFD2BD49D49 /* ContactMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A5B724D2835C61082AB45F2A595D158 /* ContactMessageCell.swift */; };
- 1B4B180E84924CF99663817A2AFFAA92 /* IQKeyboardManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009A6B28E935276EF732E71F8A9DFEB5 /* IQKeyboardManager+Debug.swift */; };
- 1F07CD00DAB2C71328F2272948BEE6DF /* MessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0595FD1D91FDB06DDC97C12E417FD7D3 /* MessageCollectionViewCell.swift */; };
- 223FCDD04952F55E6109D4EAEFF842E7 /* HorizontalEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6EBD9E10D3CDFA395E791B875069FA /* HorizontalEdgeInsets.swift */; };
- 24B7C51D8C39B63D49955310DA7CBC09 /* KeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6929EF815BB6FAAB0906A1049EDFDE72 /* KeyboardNotification.swift */; };
- 253D4D16339656D8DC1DFCBB87D8D743 /* Bundle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C9AA591345CA92494BF8F3259B3494 /* Bundle+Extensions.swift */; };
- 264C0786A50ACE1F63685AB3A0F9E502 /* AttachmentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AEFE766F01AA66FAA1C2298E08D2F24 /* AttachmentCell.swift */; };
- 2E4645AB051B3733FC442943D130CCAD /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 553CC51F895CE213A584B5F5A24D1FEA /* UIView+Extensions.swift */; };
- 2E6117633368A574BA6DB49E2A2B2C2A /* MessageCellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3C30560E291DE6579D41DFE93508A7C /* MessageCellDelegate.swift */; };
- 2E691D770899DB7A2AA4F29960F4E9C2 /* HorizontalEdgePadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2973CBF3AF4693CE305163784D300B43 /* HorizontalEdgePadding.swift */; };
- 37167AF5B65486E3BCAAEAA6F71C7793 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EF3DE9894454F508B7CCAF547EC5AF4 /* MessagesViewController.swift */; };
- 373502D50A1B2266D86409E19EC46DDB /* IQTitleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03FFB6EA53FB5027872977531188F21 /* IQTitleBarButtonItem.swift */; };
- 376DC9E1C0C13E4F71036F4FA9AF04F3 /* MessageContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D37A31757D3D8EA64D521F136FCB1CD /* MessageContainerView.swift */; };
- 3813D9E11E747BC2F23B238A38789C70 /* MessagesCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 917EF29634B0D0A0F85557943728436A /* MessagesCollectionViewFlowLayout.swift */; };
- 38EF69E90335640AA82CED02BE2C3F37 /* AutocompleteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E989DF2954D6E4F10D0B324F39C8D10A /* AutocompleteCell.swift */; };
- 40BF9F285D93F430F5C6FA9D091895FF /* MessageKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 522D4D4E61CB5E016942334FDDEE52E0 /* MessageKit-dummy.m */; };
- 41A536E6CE1C85116A756B710B2C660B /* IQKeyboardManagerConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A852D434848A72CD8B9ED4953FB79BF /* IQKeyboardManagerConstants.swift */; };
- 42575A6779930D6A5E531EAD5D85C916 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B60E1DC78386AB93392F129437C49E /* String+Extensions.swift */; };
- 470342048FEE155D6BA06A4AE9336D15 /* CellSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B753A1486429F7A3037359E69A99B807 /* CellSizeCalculator.swift */; };
- 48CF9B9B730B717AFECE52D0F5D73C31 /* MessageKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A2179BAEFE5140F3832620673958760 /* MessageKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 49ADE1D71C1E5A9E685035E2E249DFFE /* MessageContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7D8214FFA16DA8C424400017E005AB8 /* MessageContentCell.swift */; };
- 4F1388442A5D641DD1EDB5F4102FBDFC /* Pods-VideoSDKRTC_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CC59B637BCC822F3D9171E8E6A452375 /* Pods-VideoSDKRTC_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 4F255962BBB302F88098F4566F82D0FE /* InputBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79140A4B7F71064DBCFBBF67BF895A62 /* InputBarViewController.swift */; };
- 506C1EE2968687F178BB2DFA34D185CE /* IQKeyboardReturnKeyHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0A5D9783FB210177CAF03A650706C6 /* IQKeyboardReturnKeyHandler.swift */; };
- 52EF61F82197FFDB9CBF1A8F983C9E80 /* AttachmentManagerDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86F6ECA1488B60F4B23A29DDE05C7F52 /* AttachmentManagerDataSource.swift */; };
- 54AB2693A5355615919952682864F1A3 /* AutocompleteSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929D4C87F10AABA95DEB0F8BEA784E4C /* AutocompleteSession.swift */; };
- 5E1A59003812F6F576CC8BA658AB3A5E /* LinkPreviewMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A311DCD364BBCBEEF4F5D5E29449C62 /* LinkPreviewMessageCell.swift */; };
- 5E8E9469BF126E918EADF79EC4BB5CA2 /* IQUIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FA29EC7D5F1BA27D7E7B07252052237 /* IQUIView+Hierarchy.swift */; };
- 647D16586EBBE25158E3FD684541A1DD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79CF7D56C5D50C18B2EA0ED106D998C7 /* Foundation.framework */; };
- 659FFD21C9AC4D5DC6C44FD31B2E31AF /* PlayButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AB7F1C1EECD41E941DA8F10EEE809AF /* PlayButtonView.swift */; };
- 6735E4B11C64D20B4E05A92811F5A721 /* IQKeyboardManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98F2E8E1FB8656274167BDBEDC1833F1 /* IQKeyboardManager+Internal.swift */; };
- 67B54BF2096D8456D2927FE7A3816B97 /* BubbleCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16E853DBAE36CEC5241CB271316F2D6A /* BubbleCircle.swift */; };
- 6948483D08757DDE2B7AEDE5C543D6E0 /* MessageReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E41F02492A380EE040ABD4A4254C2D7C /* MessageReusableView.swift */; };
- 6D1C0D9C83D7448523857A9A340C581E /* MessagesLayoutDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D22BAF60CE3CFDCA3755C84ADBF4DD3 /* MessagesLayoutDelegate.swift */; };
- 6DA64C3E212EC855C1441256CD3A9910 /* KeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE7801CE7E06398DDA59C566BA0AFDF /* KeyboardManager.swift */; };
- 6FE6B5B2BFA491701775879400484324 /* MessageKitError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B320B773D68AA37F217606E992EACDB /* MessageKitError.swift */; };
- 733FEA3AF643F6965FDBD89960271D48 /* Sender.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8268F8D29775BB15037927EF8FA10B /* Sender.swift */; };
- 75EE372C41C57457401E58A4E26518F0 /* MessagesCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA7A86434D30E41EA1FD64BC93D5A0BE /* MessagesCollectionView.swift */; };
- 77B6DF1F34EF711DF60F166B399F8C65 /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBE345E1D66C440C8774D6400571C396 /* UIEdgeInsets+Extensions.swift */; };
- 7979BD4351214C0692D8D3E54B529269 /* MessageKind+textMessageKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = B489A767FFE382F8BE9D4D2A96E17F4E /* MessageKind+textMessageKind.swift */; };
- 7AE4531FA7B18AACB49E6B3476D02E91 /* MessageLabelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B634E1AE51A47EBD622CE2469AD1D560 /* MessageLabelDelegate.swift */; };
- 7E59ABF8A1AC8F61FEFB9B8C72EFB9E5 /* IQKeyboardManager+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8943EF47C933AF495C3A8AFB55F69A0 /* IQKeyboardManager+Position.swift */; };
- 7EF25C2977B6E96AD961EF6CA8A1C850 /* MessageKitDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1184696D328CD7F24E4D0156427EC4F8 /* MessageKitDateFormatter.swift */; };
- 7F4225C8ABDC5B8357F8F8226DEF4B42 /* MessagesDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D40E6334EBE61C03CD871D7C067731 /* MessagesDataSource.swift */; };
- 82A5D6DF661BE30734311C03484EAEAA /* MessageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EA0B1753F4E86B8D53EA267430B1CC5 /* MessageType.swift */; };
- 854D5A9C5162707A9EDB353C4F328611 /* UIImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 924D679B19DAE404A6489E633C24A7C4 /* UIImage+Extensions.swift */; };
- 85DD481174AFB62D505FAE5F220A7B85 /* MediaItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28D35D8CE56497B77937E4AB44B0B38F /* MediaItem.swift */; };
- 86EAE4826F58B7977628A0457DD7ECBC /* AccessoryPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0211F583FAC624D77AD1F162EBB7C78E /* AccessoryPosition.swift */; };
- 8883463A8D48D0A77BB6781BCB564B07 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04D60AC13D33197690A05C641925DDDA /* UIKit.framework */; };
- 8ADFB9D428B01F05BF62C9EF6DE0A68D /* AutocompleteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A406831EBE9EF7A35E401EC8FD08F81 /* AutocompleteManager.swift */; };
- 8B588D0BFB5EA2E147FF5DDA0ED27DD5 /* TypingIndicatorCellSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB47F088736CE8402D9733C8510C5BDB /* TypingIndicatorCellSizeCalculator.swift */; };
- 8FC2E6F660BBCEA98C5C0BB035EA9C79 /* MessageKit+Availability.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8D94FD77BC8D10A17B60186481F9543 /* MessageKit+Availability.swift */; };
- 930B495B7A3197730A016E2339A4CBA7 /* IQKeyboardManagerSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 769C02BC00ACF85DB15132D9DA6CC94C /* IQKeyboardManagerSwift-dummy.m */; };
- 9507527DC84E2132EA44AB4003128B88 /* InsetLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9998A629618689CDEC7B245829A56AE /* InsetLabel.swift */; };
- 95431E4952220FCE7BB44B24190932BD /* ImageAttachmentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5AE75D515B2E39FA097ACCEB31722F /* ImageAttachmentCell.swift */; };
- 9586A06B4069D293D1FBE92216B71C87 /* InputTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD3A8805E0359CC4E95B544094B23669 /* InputTextView.swift */; };
- 95AA94E37A03B4BDD49847490ECC905E /* TypingBubble.swift in Sources */ = {isa = PBXBuildFile; fileRef = F464784540CDFD10AB15EA23B399922E /* TypingBubble.swift */; };
- 96C9A000C763215AEF5CB0558023F820 /* LinkPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E601E0FFCEFF4A62449568BDE86E338 /* LinkPreviewView.swift */; };
- 97EA46DA072EC4FD4D831606095B92C1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04D60AC13D33197690A05C641925DDDA /* UIKit.framework */; };
- 98D4FCF9E8F23E3036D26D550C9616C2 /* UIView+AutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE68A7EFCCABF911609B66F8D22C55A5 /* UIView+AutoLayout.swift */; };
- 99512793ECB6E3613FE52F25A0507F3E /* NSConstraintLayoutSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7272F0C9CE6B2F42E73F40D600B97E2 /* NSConstraintLayoutSet.swift */; };
- 99921FE663FCE75D4C4E7A936007CEB4 /* AudioMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D20D627604A280409D033445AA5C6476 /* AudioMessageSizeCalculator.swift */; };
- 9BD40DA6CD5E04CEA92057F597A2BFC3 /* AutocompleteCompletion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5D0D7036F12DA54D5375690352DBA47 /* AutocompleteCompletion.swift */; };
- 9BEA0E4B8456D9E3909859ADC1C65A28 /* InputBarAccessoryView+Availability.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD072F0D73582F97E1FEA0333E7B6A19 /* InputBarAccessoryView+Availability.swift */; };
- 9C2584A9CCF8CA6C9DF2AD79DB831E70 /* IQKeyboardManager+UIKeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A2C29C7F1CAC0E623F5AFA313AA5B17 /* IQKeyboardManager+UIKeyboardNotification.swift */; };
- 9C292E2C761CB97ACD00F95FA4D60E85 /* IQKeyboardManager+OrientationNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0FB6ED8AF7A15686F1E1A6D19F48D01 /* IQKeyboardManager+OrientationNotification.swift */; };
- 9E4E278A3C1543798E1912699886023E /* IQKeyboardManager+UITextFieldViewNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6619A6A67C53A6B104DC88DC7D430CA5 /* IQKeyboardManager+UITextFieldViewNotification.swift */; };
- A2B7CE0D25CC8D745E482CF206157A52 /* MessagesViewController+Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72B074EF336FE90C918FFBA335D55AFB /* MessagesViewController+Keyboard.swift */; };
- A2BE0FAB2348259244A4647AA96C3BD5 /* TextMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3F59B36D35BFC4A91F52E9D7799BA44 /* TextMessageSizeCalculator.swift */; };
- A43BFACBF159516ED4AC72EB1376DB7E /* MessageStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA772B0C71E179DF820AD86B651B15D /* MessageStyle.swift */; };
- A4DC2EAB0B7D2FE8F786329B11C04D82 /* InputBarAccessoryViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79DCDCEEAF977077EFE4FA6B38CBEE04 /* InputBarAccessoryViewDelegate.swift */; };
- A50A72FCD270217D99ECA1D2700CFAD4 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 114F69E7DD00E39F903F86CC6EA841C6 /* PrivacyInfo.xcprivacy */; };
- A8C0CBBC63C39A8C10083CBCA172F7CF /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A42DBD2F42D55606EEBA514009498B87 /* QuartzCore.framework */; };
- A8DD3F39B4D1F0C7B11866484A03336E /* IQInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2ADEBC02A8D7714E56B36D9AE2F0347 /* IQInvocation.swift */; };
- AAC2529A1B4F4832A052B348C5093018 /* IQUIScrollView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62139DCBA3CC67FD2E57BE20D6C1D138 /* IQUIScrollView+Additions.swift */; };
- AB651DB3A97A623234B6544AD030406A /* IQNSArray+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08AD6F95D40811D7E0BAC3EBA4D1203C /* IQNSArray+Sort.swift */; };
- AC5F2F46B95717F1FCBF4AC1E0556E81 /* NSConstraintLayoutSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 480595B7EB4963C3CFCD7BBCDCFBC73D /* NSConstraintLayoutSet.swift */; };
- AECD1E4E81FDC1ADB79FE33B54BF1B00 /* LocationMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72C96168350F92945B513B3B5DEC81E3 /* LocationMessageCell.swift */; };
- B0911438C3F47B44D3F0C9E03FFB1840 /* TextMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B886343AC6ED04CE8CECACCD44E759E3 /* TextMessageCell.swift */; };
- B0CB5FB63262E1A67317045B8960F363 /* IQBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6029BC49787390EEE4F2679F946CC5C /* IQBarButtonItem.swift */; };
- B19C5DEF3FB06B25664FE836FB885246 /* CGRect+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B99D470382C5C9CEDBA04256CA7C1CD /* CGRect+Extensions.swift */; };
- B46A36CA19ED6C09341D8E4031F66D5C /* IQUIViewController+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6408E47FDDF35D41EC0CFE9A48B1B0 /* IQUIViewController+Additions.swift */; };
- BDAD667B60A9D9981738646851C825A0 /* IQKeyboardManager+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 816F1A5B831F6810CAADA69E18D0DDE2 /* IQKeyboardManager+Toolbar.swift */; };
- BDB5AE7EE3453F907E314D0182F02B17 /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76646FDD138158653294A8617A54E207 /* UIColor+Extensions.swift */; };
- BDEFDEE59D199B2DFB5BE4815675AED5 /* Pods-VideoSDKRTC_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 78454B04E3B0C3056579166BAE1C939F /* Pods-VideoSDKRTC_Example-dummy.m */; };
- BE179B99E0E8106DAF660F4EADD3F57E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79CF7D56C5D50C18B2EA0ED106D998C7 /* Foundation.framework */; };
- BE60EC19FCBB8F301081E9C31BB85F3E /* IQUITextFieldView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 397F270FD3A331FBAFF82C35BE40DA66 /* IQUITextFieldView+Additions.swift */; };
- BE7D2E494D163136F592DC6747595BF8 /* LabelAlignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = F274816424CB34169FD10B5900AAF98D /* LabelAlignment.swift */; };
- BF51F0E89BF73D101E7402B78F5B8704 /* LinkPreviewFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18262D257610F2B477F25CA108DBCE47 /* LinkPreviewFonts.swift */; };
- C14BB4753866F9698DEDD9571E0C7451 /* AutocompleteManagerDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBF8E02A15A0ED54F2EF3584C8DFAFFD /* AutocompleteManagerDataSource.swift */; };
- C22BC9F65B58C833BE5ABB49E4E29475 /* SenderType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B89A002F44FCEADC029B4AD6C4761F /* SenderType.swift */; };
- C764551976629035BC3B68DB5CCFF313 /* MessageInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CBF029A8CA6761F88581D7049C1048E /* MessageInputBar.swift */; };
- D0DF994786BCEC54939BC8216B42FBC4 /* IQTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AF5BD57509BAA412FE57DC242CA67DF /* IQTextView.swift */; };
- D16B01041368AC24C33A1462B5BF720F /* ContactItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68B71A1231B65F2941ECDB67BC911737 /* ContactItem.swift */; };
- D48AE26E5ECCDA78E743D26A40441009 /* NSNotification+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5C6D72B03B7F87B0CDDABB5C8F2298B /* NSNotification+Extensions.swift */; };
- D4E2EAD773A30B252B6AD6B99A7490F4 /* IQKeyboardManagerSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D05656E6082B5E1307C102F0FC3F8FAC /* IQKeyboardManagerSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
- D4F11BE426B5B6B54C81072ADD45679F /* AutocompleteManagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9B4737FDFDB28D93E754885AB316288 /* AutocompleteManagerDelegate.swift */; };
- D6B0228F50454CDD91EAA91CEA2F8CCB /* AttachmentManagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2034F83B5D111673C1CD8A0A91BD52D3 /* AttachmentManagerDelegate.swift */; };
- D7359CAD4CE43EB82A471CB49D75561F /* KeyboardEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DBCD29F4C6C94FF82FEDC7760756546 /* KeyboardEvent.swift */; };
- DC2C9F2C0E684FCB2A7C5A2B2C9F25C2 /* MessagesDisplayDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A394C7167434947CBBA9BD7DDDA45849 /* MessagesDisplayDelegate.swift */; };
- DF1966FAF8F1D6497B03AEB1C3A8343F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79CF7D56C5D50C18B2EA0ED106D998C7 /* Foundation.framework */; };
- E04BD9089649C8BE35F824CB1D4E3546 /* AttachmentsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB01ED47A59538E10F3A2B49DCA4470E /* AttachmentsView.swift */; };
- E06AADA7C0F8D9602461175C8EE06492 /* UITextView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBE3876AB68E71DBA63085A1B6AFE90E /* UITextView+Extensions.swift */; };
- E3D24B98739A3B5D135BFF54F6456264 /* MessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC9E26F6C35568754B865078A4FBE431 /* MessageSizeCalculator.swift */; };
- E4F914EABC4237F7CBD0FA0B59B6E663 /* InputPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B09B671F8B9EC6292659CB51B9F64D /* InputPlugin.swift */; };
- E568019FA05750CBD276BFD333E5A0F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79CF7D56C5D50C18B2EA0ED106D998C7 /* Foundation.framework */; };
- E6B21E5A65DC8A04C601F97EF159E4DA /* LocationItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6C4CDBB8BB93DB036DDA2CA5405310 /* LocationItem.swift */; };
- E74FB1FFD20FE78D9B342F7335701F12 /* MessagesCollectionViewLayoutAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F04AE3B61B00D98D9504B22523759FB /* MessagesCollectionViewLayoutAttributes.swift */; };
- E79141DA3EB3A16BDB46A2126C84A5B1 /* AvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B80A85408784B03701AA95E06C03F93 /* AvatarView.swift */; };
- EC0F62E46CE28D2ECB3D22C201673840 /* MediaMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AB25B52D9A74D7AA9433D31560F30B6 /* MediaMessageCell.swift */; };
- EC507F6F2FFF53A9EDF19CC8161E624C /* InputBarSendButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 551FA7C0DBB7448D878A3C762613EC2B /* InputBarSendButton.swift */; };
- EC9823505BE2522605A9417C3FCB3CB7 /* AudioItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99281D07C92783F9A434680F2EA6439E /* AudioItem.swift */; };
- ECAA15FA3C4560E3287F2226EC8C1ECF /* IQKeyboardManagerConstantsInternal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 864C83AB7D568AD741C2CAFFED0C7390 /* IQKeyboardManagerConstantsInternal.swift */; };
- EE7B8E59DE2447D8B6EC043CC10FBBC5 /* TypingIndicatorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E10E9652DCBEE448386928DD1108A06 /* TypingIndicatorCell.swift */; };
- EED9C7723F8EE87862911342058FCD81 /* ContactMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83D1C3F2CE16EDB56426810CA01D159C /* ContactMessageSizeCalculator.swift */; };
- F1B91B85BB35FE543E8771278D484A98 /* AttachmentManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3DF988A796152639CA2F5CD6F2EF1B8 /* AttachmentManager.swift */; };
- F47587932A67D8E3820DAFD9A0E1995E /* IQPlaceholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6952796EFE5FD323D7323DD089F1E452 /* IQPlaceholderable.swift */; };
- F52680B2207836467A8D6EEFB543008D /* InputBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AE7A40568D041FE92D9CAD0A2E29BE2 /* InputBarButtonItem.swift */; };
- F54B3DE6270C3BC7EB937F96A99D48B6 /* MediaMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7DC167AF67701A8203568B72BA97828 /* MediaMessageSizeCalculator.swift */; };
- F6AB46489F5D38C7870577D939B281A1 /* LocationMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F3E9262D11EB79AC273DD406006C288 /* LocationMessageSizeCalculator.swift */; };
- F6D3196B2F8988001A3C02242393957C /* LinkPreviewMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9138EC4AC165D65DE421918AC9B5C1F2 /* LinkPreviewMessageSizeCalculator.swift */; };
- FACE4172C54AB6DA15F92BAAEF2CB893 /* DetectorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17A63CC61336A02B03DCD6F1977702A7 /* DetectorType.swift */; };
- FC33245173BB6F5766A60B58C96E27D8 /* MessageLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CEE88E9175A292CDF95E95D7A291F08 /* MessageLabel.swift */; };
- FEF28A586EAD9B93BD14EEF0505D478F /* AutocompleteTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E0223E3EE6134A29B79F4EEBF2BED5A /* AutocompleteTableView.swift */; };
- FF3963833DF1671A4B04AFFBACDADA57 /* AvatarPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = A041357442807CBA4B87C4D5CCAAD3C3 /* AvatarPosition.swift */; };
+ 004A1A668BB92405B3EA1D277402A5ED /* SocketIOClientConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40243AAA9D762DD7DA6DF9D34A1CCA02 /* SocketIOClientConfiguration.swift */; };
+ 0150BEE0E308862F44F065F970682256 /* InputBarAccessoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53FDBFF31538362E32BB21A8E019E008 /* InputBarAccessoryView.swift */; };
+ 041482AF93966B8B01C345537880D21B /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3779FC458859BB017510B4305DF21FC8 /* Combine.framework */; };
+ 042E348977C5609373D0C0DF117348BC /* LocationMessageSnapshotOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CE328CF196F0F12173B77414EB4CA90 /* LocationMessageSnapshotOptions.swift */; };
+ 055D2A9CEC22083FDB3201CC672078FE /* InputBarAccessoryView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B81D684926606FF43C023094C37B7B65 /* InputBarAccessoryView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 05C962C43A5B96C3973BCD74EEE080BC /* InputBarAccessoryView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 90026350A5EE3DF343F10314EA961D86 /* InputBarAccessoryView-dummy.m */; };
+ 05E3FC2B52A47023573273A44ADC5097 /* MessageKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9076D155AFDE0D2A183A7FD8184712B /* MessageKind.swift */; };
+ 0635FA92B665BD403A496FCB2A0F5070 /* MessagesViewController+Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = B211BE94F1904D95486738102ECC92BB /* MessagesViewController+Menu.swift */; };
+ 06EAC2929F471AB3FC5251D2121B5385 /* IQKeyboardManager+ActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46D3BBDDFE85EAA5E7988D79686F05D7 /* IQKeyboardManager+ActiveConfiguration.swift */; };
+ 071E941EF0605F363BF90EB2E26D5ECB /* SocketStringReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D252D4883E3FC6B95A5DFBF026D7203 /* SocketStringReader.swift */; };
+ 073272CF5C16B43A6FC293AA259A277E /* IQKeyboardManager+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = E85A96994CB411EDD4CB9B5CC1C3B43C /* IQKeyboardManager+Appearance.swift */; };
+ 07FB758F9FA9070136DFE376326225FB /* TypingIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D1548D9491959B1A19F368A77D9AA3D /* TypingIndicator.swift */; };
+ 089BFD4BBF9FEB230B089D0554316C85 /* InputItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3BB127CAAD5000BA555C95ACD82F8EF /* InputItem.swift */; };
+ 0CBB5D8D2FBDECF822C070207C89A804 /* IQKeyboardReturnManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ADAE14E6A1E41A108FCBADDB6161D770 /* IQKeyboardReturnManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 0E474E09BB2942ACE64A96CF4298B5F9 /* IQKeyboardManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF13C9DB6181D9120F368F9CFCEA1AAB /* IQKeyboardManager+Deprecated.swift */; };
+ 0EAAED458550C9DD9803EF1BE0335CBD /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 4A69D8AAF12050BE2426E2E0BB5472FF /* PrivacyInfo.xcprivacy */; };
+ 0F30B4FC130580DC09573B504BBEECCA /* SocketEnginePacketType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D066B0930E090F3AFE90D422A300EA23 /* SocketEnginePacketType.swift */; };
+ 0F6EB0BD79BF4203AB4FFFACAAA2D76C /* IQKeyboardConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDC06CEA80D20BD94B61E3E67F1B11CE /* IQKeyboardConstants.swift */; };
+ 104088BE75750C8CB33AA60EEFDCB079 /* Pods-VideoSDKRTC_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 78454B04E3B0C3056579166BAE1C939F /* Pods-VideoSDKRTC_Example-dummy.m */; };
+ 109C9BE1C2C69C551847C4F6F74A42FD /* InputStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 489963D67621C3B876749708D3085CC1 /* InputStackView.swift */; };
+ 11089BE32C6298EDD3D30695F482A631 /* IQTextInputViewNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41916174325AC8DA87DA6F9466A75CF1 /* IQTextInputViewNotification.swift */; };
+ 117C7750377EA6BD5E4E0857154B1DCF /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3508AA916AFBE8A39BD603037D165C44 /* Avatar.swift */; };
+ 11E68E94F17545E19187B788E3981862 /* IQKeyboardReturnManager+UITextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84AF8EF00135AB32D33F8145939D5715 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */; };
+ 11F53F3C55B3F5155F0F6B7176847F48 /* AudioMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54D5BE26AE8FB28A441C81D437F29A1F /* AudioMessageCell.swift */; };
+ 130270BF18FDBA1DFF67247E42AC661B /* LinkItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0443ABC62AED4A4BF1CCDA51A8C5F15 /* LinkItem.swift */; };
+ 13A9538CEAE41482692C6222E4EED578 /* SeparatorLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE496F0FB673BDA87CF417837F57876 /* SeparatorLine.swift */; };
+ 16854A9A19CEFC25255F37BDD64611E1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B234E493C55C9E1F256B0774055CCC1D /* Assets.xcassets */; };
+ 16B1FCC8B3E6548AC3BD48A789AC4EB1 /* NSMutableAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6F49899EFAB926415A9C77D575B7844 /* NSMutableAttributedString+Extensions.swift */; };
+ 173A8A44A0E64636EBAB0196B868690C /* UIView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ADA7C53EC60DA8B85CFA51D21D4CA14 /* UIView+IQKeyboardManagerExtensionObjc.swift */; };
+ 1748FDE1193AF87FD1814BEE6DCAD574 /* WebSocketServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 908C78987E880B0F878EB66910F3037C /* WebSocketServer.swift */; };
+ 17758957331DBB7ECD7209FFC47CA0F0 /* NSAttributedString+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8241B096653F59D247AB461590ACCAA /* NSAttributedString+Extensions.swift */; };
+ 1900E69639BBC6B094DF6A907727F8AE /* IQKeyboardManagerSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F5F13F36ED0C731B25517206AD031444 /* IQKeyboardManagerSwift-dummy.m */; };
+ 19E44D30E076F0B5CA0E0BFD2BD49D49 /* ContactMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E229E67E03792BDA34423DCDE823F959 /* ContactMessageCell.swift */; };
+ 1BAAA501DCB8B571FDCFB1361024D2B1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ 1D4EC213BEEA7345EE38F9DA95F57B7A /* WSCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 260DEA8EC0C0DAA26B0CF483BB04DB83 /* WSCompression.swift */; };
+ 1D605BDC0C094F840D349924F7387B00 /* IQKeyboardReturnManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C2A1C9B42FE2CC096963F28981CACA2 /* IQKeyboardReturnManager-dummy.m */; };
+ 1D978D7B430BF4470388D7ECDB91C60A /* FoundationTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA77DD6A0B4F47FD91F5A0339E093516 /* FoundationTransport.swift */; };
+ 1DBC60524415B2FE86256F7100219868 /* UIScrollView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57C226E19146357A9D7CD958EAAB52DD /* UIScrollView+IQKeyboardManagerExtension.swift */; };
+ 1F07CD00DAB2C71328F2272948BEE6DF /* MessageCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDEAB5751054581F5E3CBE57CBE035F2 /* MessageCollectionViewCell.swift */; };
+ 223FCDD04952F55E6109D4EAEFF842E7 /* HorizontalEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 733B301EAB503165DCF89A94D08216E2 /* HorizontalEdgeInsets.swift */; };
+ 225B696BC3F2B7E17572771B7DFEFF79 /* UITableView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B80BD4EFBF71B464548A6C8F32FCDE /* UITableView+IndexPaths.swift */; };
+ 229B3B7758A6693D2F22F0AF8925CF15 /* FrameCollector.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2E794009B7281340A4C39CEDB4AB5BC /* FrameCollector.swift */; };
+ 24B7C51D8C39B63D49955310DA7CBC09 /* KeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E57FD1293B158F5A13A12CD006387C /* KeyboardNotification.swift */; };
+ 24D769148AC8D0359446733FF11A03F8 /* Socket.IO-Client-Swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C90931D4EBDF5C1645C80A2891FDECCE /* Socket.IO-Client-Swift-dummy.m */; };
+ 253D4D16339656D8DC1DFCBB87D8D743 /* Bundle+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C1F28697D4FD96575D661E8AE054A9C /* Bundle+Extensions.swift */; };
+ 2592BC4FFCFCC0A87FF44236FBE7F8F2 /* IQKeyboardToolbarManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9797D4FAC55C6AC0B51129649969F1A7 /* IQKeyboardToolbarManager-dummy.m */; };
+ 25C0912388AEB383B4A6B4D2BA14D294 /* Starscream-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F80DE9CA61525930AFEC4FFC0BD79DB /* Starscream-dummy.m */; };
+ 264C0786A50ACE1F63685AB3A0F9E502 /* AttachmentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFA50A223ACEF5F1894C917264DA6912 /* AttachmentCell.swift */; };
+ 269E0226F9522330CBD6237F777959B0 /* UIView+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69DBFD69F5BA4853521E42EA2BDF9FB0 /* UIView+Resign.swift */; };
+ 29B1B02381FD7954DA767525DF0ABACD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ 2AF46FFF169AE2AA4DB08D88FA001A29 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = F91FB40D7CE2A6394CDF8ACDF9E73FB3 /* WebSocket.swift */; };
+ 2B5219E6EF6DAEED42818E56540D176B /* IQKeyboardManager+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2407D2099207E4A2F2F02CCF13DAFAD1 /* IQKeyboardManager+Position.swift */; };
+ 2E4645AB051B3733FC442943D130CCAD /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CC39208A6B02A095965462DAD2D0809 /* UIView+Extensions.swift */; };
+ 2E6117633368A574BA6DB49E2A2B2C2A /* MessageCellDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAC9CE1466B3F1DE53B18E0ED7DCE1EE /* MessageCellDelegate.swift */; };
+ 2E691D770899DB7A2AA4F29960F4E9C2 /* HorizontalEdgePadding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0580E2D09D501DDBB2FCA8AC7BD519D6 /* HorizontalEdgePadding.swift */; };
+ 2F8C17385AC147A2B8C48911398CB997 /* IQTextView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FA215518CF351D630BF9D342F5C41321 /* IQTextView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 2FBDB52DEF555EB85612AC693639DB3B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ 2FCF1047F456CBD92E197C348AFA71D1 /* IQTitleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04088A96979C4B33438E6318CFC29F91 /* IQTitleBarButtonItem.swift */; };
+ 334A520EE4A3ADB1C99CCCD8D90D77FC /* FoundationHTTPServerHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8532EBCEF9D023016B2AB78B05602B56 /* FoundationHTTPServerHandler.swift */; };
+ 342D95ECA552281791E87DBF5F9AE93F /* IQKeyboardAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 467544DD91FAB67DBD2E8E61727E9B15 /* IQKeyboardAppearanceConfiguration.swift */; };
+ 349DEA0690A855A8604F12D74377BBB0 /* IQKeyboardManager+ToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8F235C8666C47206F520F419ECC2CB6 /* IQKeyboardManager+ToolbarManager.swift */; };
+ 35BE3128C57FE1733496DCC6BB43EE05 /* WSEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31C7DBB735D06DA34EE20DCB6E8C6622 /* WSEngine.swift */; };
+ 37167AF5B65486E3BCAAEAA6F71C7793 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23D5208D7A90DFF4E3A1FD49355E42D4 /* MessagesViewController.swift */; };
+ 376DC9E1C0C13E4F71036F4FA9AF04F3 /* MessageContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25E9D599EE66251F4D26CE294967CE9 /* MessageContainerView.swift */; };
+ 37A1BAE9C49A70266BE6D7181BA23662 /* IQTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E685EB5F9C179BD5EA94F757DA8ADC4 /* IQTextView.swift */; };
+ 3813D9E11E747BC2F23B238A38789C70 /* MessagesCollectionViewFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 608F6F41A9391F60898174E49FDE5178 /* MessagesCollectionViewFlowLayout.swift */; };
+ 389871BAC564F6E24076308772F14596 /* SocketIOClientOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535B9430EEF5DB59D9C5042545258479 /* SocketIOClientOption.swift */; };
+ 38EF69E90335640AA82CED02BE2C3F37 /* AutocompleteCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66C0B78D2D42218C0C4116FD4F2EADE5 /* AutocompleteCell.swift */; };
+ 39758826443820FB0C538E55BC13AF78 /* IQKeyboardResignHandler+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D8887D059B53A7343848ACAF4DE9A7 /* IQKeyboardResignHandler+Internal.swift */; };
+ 3AD2F1A8440BCFFD915240707D66DFA3 /* Engine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55CB4BC3A6B1E3017CD3F4D5A97BB9F4 /* Engine.swift */; };
+ 3BADFFB8E33D5ED2634652C6220F26B7 /* IQKeyboardManagerSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8D1EA553B490CF8D958F5782C1F22C26 /* IQKeyboardManagerSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3C1D05EADEE7DC367C0F4140EF049413 /* Pods-VideoSDKRTC_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CC59B637BCC822F3D9171E8E6A452375 /* Pods-VideoSDKRTC_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 3D38E4897AD37386A52C0B5DBD7F1DD9 /* TCPTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25C603B93664E041D4C6E62732A80075 /* TCPTransport.swift */; };
+ 3DF7B625B61D9FC446DE41C776AE8447 /* IQKeyboardAppearanceManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1D4288F5B516D61A7C87AA31C682F3 /* IQKeyboardAppearanceManager+Internal.swift */; };
+ 3E2F556C2423154B2578D99BDBCE1547 /* SocketTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A545CA82C1AE5A8895E9BE0EF5F3763 /* SocketTypes.swift */; };
+ 3FCCE451478396A4C3B54BCBE273187F /* IQKeyboardManager+Resign_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4652329F70165804C022939CC1D294C5 /* IQKeyboardManager+Resign_Deprecated.swift */; };
+ 403C5B600E28007CA2BC73520EC3CCC3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ 40AEC03CED4F07A4B6609CD879907C18 /* Framer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5B832325B12C18A4A6782AF9AAD9D7D /* Framer.swift */; };
+ 40BF9F285D93F430F5C6FA9D091895FF /* MessageKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FCDD893640156970C71432ECA83E7CD /* MessageKit-dummy.m */; };
+ 42575A6779930D6A5E531EAD5D85C916 /* String+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 301A5358EA16752CF8808E14FC7D9F32 /* String+Extensions.swift */; };
+ 435AA328CAB2170EFEBD37FE82630BC0 /* IQTextInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E09DE4FD36501BB307F076E1850BE980 /* IQTextInputView.swift */; };
+ 4564CFD197C27B5D72E387081288DA96 /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3779FC458859BB017510B4305DF21FC8 /* Combine.framework */; };
+ 46C78AB5B761167609D81ACCF4996BD9 /* IQTextInputViewNotification-IQTextInputViewNotification in Resources */ = {isa = PBXBuildFile; fileRef = F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */; };
+ 470342048FEE155D6BA06A4AE9336D15 /* CellSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194F8F37043A292949E5158B1EDF7568 /* CellSizeCalculator.swift */; };
+ 479AE49E6D9B5A0321034385BF38B895 /* IQKeyboardReturnManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D423A7778AE83C4B70585237373C8C4B /* IQKeyboardReturnManager.swift */; };
+ 48CF9B9B730B717AFECE52D0F5D73C31 /* MessageKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F09A61B9A4DA30A9C94D3134E7B216DA /* MessageKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 49ADE1D71C1E5A9E685035E2E249DFFE /* MessageContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ADDD8EF3B507D20F6FF315DA6CB9735 /* MessageContentCell.swift */; };
+ 4DB271C0FC622F52E9E50A85EF546279 /* IQKeyboardToolbar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 45C61F3652C3C61CE41B25809D20C1AC /* IQKeyboardToolbar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 4DF6FBD193295A391C2B3F0DE28C6D56 /* UIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B583DECF0053B732418893DB172C7D24 /* UIView+Hierarchy.swift */; };
+ 4F255962BBB302F88098F4566F82D0FE /* InputBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6279D94358BB7E5322E5AAB7A0F8A870 /* InputBarViewController.swift */; };
+ 4FC97E4C0A8E909EAE09635413401794 /* UIView+Responders.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3E3D2383F6C751C321673C9AF3CF58C /* UIView+Responders.swift */; };
+ 51680D45A0B7DEC9FCE87F5F44902310 /* IQKeyboardToolbarManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0497170C3D1F807A598AC190383085A8 /* IQKeyboardToolbarManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 51BA440419222E73C76B09C57E2F0C60 /* NativeEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53A1289835E88AFDCABA55E6D695B07 /* NativeEngine.swift */; };
+ 52EF61F82197FFDB9CBF1A8F983C9E80 /* AttachmentManagerDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5156A6895C80A09CFFC474FF2B0BC5A /* AttachmentManagerDataSource.swift */; };
+ 549284EAC23627CE3BED20D846F8581A /* IQScrollViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E24C2330BF4EA04710E2202DCF7CDC6 /* IQScrollViewConfiguration.swift */; };
+ 54AB2693A5355615919952682864F1A3 /* AutocompleteSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077613EF4DACC9FA2DDB5B93023C9A65 /* AutocompleteSession.swift */; };
+ 56CD74B9785D045CB4C8247219ACF9E7 /* SocketAnyEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = F039C35DA9D2A26698144A7DE9E160FA /* SocketAnyEvent.swift */; };
+ 5731F67E8F3A6AAB584BCDD564C5F176 /* IQKeyboardToolbarConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11C30DA592AACB8011EA6D06AC7774B8 /* IQKeyboardToolbarConfiguration.swift */; };
+ 57BD152F0AFD16AEE307348EA71EEBEE /* SocketIOClientSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = F04BACA7E44A4EA9FB30FC3D45600FD6 /* SocketIOClientSpec.swift */; };
+ 5B643F60243CE70D21F4DCD109982D8D /* Starscream-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F4F4FCD571324C3AAFEADB5AE28E1B2D /* Starscream-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 5C9CA112544138E306CF32A92FD351C7 /* SocketAckEmitter.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC2DD3F1B3A6B7DC4107BE87B0C8FC8D /* SocketAckEmitter.swift */; };
+ 5CEA385757E370E7505660311E97AFFB /* FoundationHTTPHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = EACB99ADD7ED853CBCEAA485225D46E7 /* FoundationHTTPHandler.swift */; };
+ 5D423BA4525F41B600446A5F5CC88B71 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = D244C8B0C13063CA87D7F01D74F2CD3E /* Server.swift */; };
+ 5D4E539EF32F5FD1479E807E5AD8D483 /* IQKeyboardInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CC29FB84BA0495CA09071C3F8F16A5 /* IQKeyboardInfo.swift */; };
+ 5D9536E3EFE98C84E1804F519880FA78 /* IQKeyboardToolbarManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B692131B41650595E1FBAFE1F7A164A /* IQKeyboardToolbarManager+Deprecated.swift */; };
+ 5E1A59003812F6F576CC8BA658AB3A5E /* LinkPreviewMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7AEE1E5D751E7467D08AA06E9941F33 /* LinkPreviewMessageCell.swift */; };
+ 652287C0D15C0A1F69421A01F780FDE5 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = AE05365B5E48EB0C938577C139B562E9 /* PrivacyInfo.xcprivacy */; };
+ 6569AC84BECC70DEC91243830C83FC60 /* IQKeyboardManager+Appearance_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 385153C3681ED67BE7D98F1511CBE9C9 /* IQKeyboardManager+Appearance_Deprecated.swift */; };
+ 659FFD21C9AC4D5DC6C44FD31B2E31AF /* PlayButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF7D02FD0286684FA3B5B6F0F5A8DF5E /* PlayButtonView.swift */; };
+ 66D2EFDA717BF9329AB862519D23D1E3 /* IQKeyboardToolbarConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 005A5EC9A759D4D5C73921E90C952518 /* IQKeyboardToolbarConstants.swift */; };
+ 670733AC4E5E831AC60FB61F3435E58E /* SocketEngineClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0319DA76119A4D1ECB936D626A844C89 /* SocketEngineClient.swift */; };
+ 670FCA40C5BAE3EDD25D2A314448D36F /* IQBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D25B42E61CFC52E3EE2DCBFD15DBF295 /* IQBarButtonItem.swift */; };
+ 6714C64E30BA5DAE7FEB928BB30DA6C7 /* IQKeyboardReturnManager-IQKeyboardReturnManager in Resources */ = {isa = PBXBuildFile; fileRef = 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */; };
+ 671B7EAF2173B12CE0B1C7F5E2F4B5C1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ 673E2328C7F91D2116A24E1D202A0BA8 /* UIViewController+ParentContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = B309912AED676A55EBCA30C8859F95A5 /* UIViewController+ParentContainer.swift */; };
+ 67B54BF2096D8456D2927FE7A3816B97 /* BubbleCircle.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFD44478F437843E78CFF4DBC3ADB366 /* BubbleCircle.swift */; };
+ 68E2C684A94D9849DB7F03D9596C6946 /* IQKeyboardNotification-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4012B08746AE2E3AB28CCFEA0A6EDEFB /* IQKeyboardNotification-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 6948483D08757DDE2B7AEDE5C543D6E0 /* MessageReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B55CF8B68AA4FBA499ACEE6273C6969 /* MessageReusableView.swift */; };
+ 6B2A603A7A9A5236DBBE8001ABEF1A95 /* IQTextView+Placeholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0212E42F7145BD34CA23CAD82FFB345 /* IQTextView+Placeholderable.swift */; };
+ 6CF34AD0318BB785FE919E39E0C09365 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = D2FA6425CC7DEE4833D637767A9EF099 /* PrivacyInfo.xcprivacy */; };
+ 6D1C0D9C83D7448523857A9A340C581E /* MessagesLayoutDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12F1F661D18F7358EDD6EB4E938DB2DA /* MessagesLayoutDelegate.swift */; };
+ 6D4C90A15227D7F2FF7FDCD82AA3BB2F /* Starscream-Starscream_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = 90DF440CB562947BB255E9A3E9B29568 /* Starscream-Starscream_Privacy */; };
+ 6DA64C3E212EC855C1441256CD3A9910 /* KeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1CB6582895EEA5E88916B5802357BFF /* KeyboardManager.swift */; };
+ 6F43984841EE84B6FE86D88A1EDBABDF /* UIView+ParentObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EFE454AFE5D1E58E79D130FD9BEA40F /* UIView+ParentObjc.swift */; };
+ 6FE6B5B2BFA491701775879400484324 /* MessageKitError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651A4582189EE6452E1689302BD3F58D /* MessageKitError.swift */; };
+ 717C359EECC82B08DA46B004D36D8526 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ 733FEA3AF643F6965FDBD89960271D48 /* Sender.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52A11D6BF6C9078DB67C43C8763D3A8 /* Sender.swift */; };
+ 73FF2101C75217119F6540862523F8EF /* IQKeyboardManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FB243B020BB8E680B9B69DD50EB8676 /* IQKeyboardManager+Debug.swift */; };
+ 740686E21B290AF25668C2D2EC0AB85A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ 75947476C1781DC880925C3BA70DED09 /* IQKeyboardResignHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C05A9029B0A981E3C62927EAA712EFFC /* IQKeyboardResignHandler.swift */; };
+ 75EE372C41C57457401E58A4E26518F0 /* MessagesCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 289388963598D5C48E293FDFE6135EA2 /* MessagesCollectionView.swift */; };
+ 769DA7C9410332BD82A9B62B857328E7 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 613526F352CBDF018DFEE591C6D60DC4 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */; };
+ 77B6DF1F34EF711DF60F166B399F8C65 /* UIEdgeInsets+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F6BFE2AF39AA84BFD49CB3E0379B3B3 /* UIEdgeInsets+Extensions.swift */; };
+ 7979BD4351214C0692D8D3E54B529269 /* MessageKind+textMessageKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6C9E486354F00F736847F3C716C1F33 /* MessageKind+textMessageKind.swift */; };
+ 7AE4531FA7B18AACB49E6B3476D02E91 /* MessageLabelDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 418DA52B71B9C3CE3BADCC0C207CA44A /* MessageLabelDelegate.swift */; };
+ 7BEA5744C526DA44B0B5AA778732AC5D /* IQActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B800AEF4AEE3AB7FA7F55BFE52503B20 /* IQActiveConfiguration.swift */; };
+ 7EF25C2977B6E96AD961EF6CA8A1C850 /* MessageKitDateFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A985EC40E19F571BB75F312981A3F33 /* MessageKitDateFormatter.swift */; };
+ 7F4225C8ABDC5B8357F8F8226DEF4B42 /* MessagesDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B565EA893F397E957457E84BA9EE2472 /* MessagesDataSource.swift */; };
+ 80ADBB6348C8B3E53C1E76E27C2E7997 /* IQTextInputViewInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F0F18872AD12CCA59A4B96110662903 /* IQTextInputViewInfoModel.swift */; };
+ 817610ECDF2308060D30B320CE73F7D8 /* SocketPacket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9967CD48977B16A076F4CDE4A62AD630 /* SocketPacket.swift */; };
+ 82A5D6DF661BE30734311C03484EAEAA /* MessageType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A4E919F460551CDA7A9E07662F9DF3 /* MessageType.swift */; };
+ 83F37B94DE31899C12A274AD596FC02A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ 8514A3F6D80847A93A80B9917D97F02A /* HTTPHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D60F565CE0452AAFEACB22F1266358C /* HTTPHandler.swift */; };
+ 854D5A9C5162707A9EDB353C4F328611 /* UIImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CE239362B3100AA96EA71B35A49D6C4 /* UIImage+Extensions.swift */; };
+ 85DD481174AFB62D505FAE5F220A7B85 /* MediaItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F822AFBDBE639FD0F660B31369DD3925 /* MediaItem.swift */; };
+ 86EAE4826F58B7977628A0457DD7ECBC /* AccessoryPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8962B2CE0EE017A6BF5745489C85754 /* AccessoryPosition.swift */; };
+ 87220744D4084D23170E147A4365D0E6 /* IQKeyboardNotification-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F8A7072F856D170199BD28E235EE018 /* IQKeyboardNotification-dummy.m */; };
+ 876222A8F484B25A1023B1216A24A429 /* IQKeyboardToolbarPlaceholderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B065C81AE4A51086C0E8D93DF4DD0261 /* IQKeyboardToolbarPlaceholderConfiguration.swift */; };
+ 88357BA5932DA2FDCBEC79693AC503E5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ 8883463A8D48D0A77BB6781BCB564B07 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ 88932B15581418BA5BCC558B90514F51 /* FoundationSecurity.swift in Sources */ = {isa = PBXBuildFile; fileRef = E805743D6268A2A0493B1E4254946C20 /* FoundationSecurity.swift */; };
+ 89DB9B76C5E0D85496792FB00D35260C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ 89E8CFC1B707520CB0DA0FF676F9742A /* IQBarButtonItemConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65324709503F60CC6770F2003595E60A /* IQBarButtonItemConfiguration.swift */; };
+ 8ADFB9D428B01F05BF62C9EF6DE0A68D /* AutocompleteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F29BA23B077CC7AC8964E1F28C187638 /* AutocompleteManager.swift */; };
+ 8B588D0BFB5EA2E147FF5DDA0ED27DD5 /* TypingIndicatorCellSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A97E8105D30648515F8A2A3AF0AFDF0 /* TypingIndicatorCellSizeCalculator.swift */; };
+ 8BFED9CD8C13DDE65299B420A580BD35 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = EC3083B91500F23EC16124FAD58913D2 /* PrivacyInfo.xcprivacy */; };
+ 8C9E5C971AC9D40AD179F9DBF55F5599 /* UIView+ResignObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9C21ED4B610CF0890F1595E41744265 /* UIView+ResignObjc.swift */; };
+ 8CF47CF4EB276B0C83EA9AD73442A507 /* SocketParsable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 439A68A29858CFB377CEE48DECED792B /* SocketParsable.swift */; };
+ 8FC2E6F660BBCEA98C5C0BB035EA9C79 /* MessageKit+Availability.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FD0F4A26DD86509A0087F230E5FEF8 /* MessageKit+Availability.swift */; };
+ 9177361BEDE955669669BAE4CCC542CB /* IQKeyboardManager+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA7F14E286FECEA14B722650264E7C8E /* IQKeyboardManager+Resign.swift */; };
+ 942426CB5468E63578281B118E50D67C /* IQTextInputViewNotification-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DEA7BF586B9451E9010BB023913B8390 /* IQTextInputViewNotification-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ 946F7939F0AE541F4C38EEB1EB6B55A6 /* UIView+Parent.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3E783BD03060088AEC6B3DA62AABBB1 /* UIView+Parent.swift */; };
+ 9507527DC84E2132EA44AB4003128B88 /* InsetLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11EEAE93DA5DF32D8654B2D9787D17EF /* InsetLabel.swift */; };
+ 953C8150CFDD8CEA686F0ECA8D0AFE3F /* IQKeyboardCore-IQKeyboardCore in Resources */ = {isa = PBXBuildFile; fileRef = 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */; };
+ 95431E4952220FCE7BB44B24190932BD /* ImageAttachmentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDD9BFF0D5B80B44B3424D8BFC9EAB7D /* ImageAttachmentCell.swift */; };
+ 957C3CF88DE7C5D743D01794B2564EB7 /* IQKeyboardToolbarManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = A039A24354851B95F79D2DDF1466CF25 /* IQKeyboardToolbarManager+Internal.swift */; };
+ 9586A06B4069D293D1FBE92216B71C87 /* InputTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD1354CE4FBE5AE145EBF06D3F16ACD /* InputTextView.swift */; };
+ 95AA94E37A03B4BDD49847490ECC905E /* TypingBubble.swift in Sources */ = {isa = PBXBuildFile; fileRef = 963C95887B7CADB2C819781C537560E2 /* TypingBubble.swift */; };
+ 96C9A000C763215AEF5CB0558023F820 /* LinkPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A04C3BE804604AA9AA4AD2C1405D183C /* LinkPreviewView.swift */; };
+ 974E9109BB469200F39E06B07D19E12C /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5964ECD76ED5E9FB05D7D92B5AF6C7CB /* IQKeyboardManager.swift */; };
+ 97A1562C2C422BE08464AFE8AC43D1B7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ 98D4FCF9E8F23E3036D26D550C9616C2 /* UIView+AutoLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8C58C1572B5C7384B9C6AAB9FC8234D /* UIView+AutoLayout.swift */; };
+ 99512793ECB6E3613FE52F25A0507F3E /* NSConstraintLayoutSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9204B9006D4EEFFDC320AC23C378E347 /* NSConstraintLayoutSet.swift */; };
+ 99921FE663FCE75D4C4E7A936007CEB4 /* AudioMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8155DF29534DBC6F3A889A361EE368FA /* AudioMessageSizeCalculator.swift */; };
+ 9BD40DA6CD5E04CEA92057F597A2BFC3 /* AutocompleteCompletion.swift in Sources */ = {isa = PBXBuildFile; fileRef = F39F3863B1691B075F30F544405C8E4B /* AutocompleteCompletion.swift */; };
+ 9BEA0E4B8456D9E3909859ADC1C65A28 /* InputBarAccessoryView+Availability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B610F227C9B961524A446BF80303A83 /* InputBarAccessoryView+Availability.swift */; };
+ 9D8ED63BD8B81028E3D5FD8CA93079B9 /* SocketEngineWebsocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53B4469257EB4087007D11A5063C8896 /* SocketEngineWebsocket.swift */; };
+ A01002B89649C1D5DF116D7E4CFC7717 /* IQKeyboardManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A2DB2898AAAB5CAE919C9E3153067BB /* IQKeyboardManager+Internal.swift */; };
+ A04723C7D8EC45964EE5C028E2F399CF /* StringHTTPHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D25C1CCDAB244CED702E0AF11E6F31 /* StringHTTPHandler.swift */; };
+ A2B7CE0D25CC8D745E482CF206157A52 /* MessagesViewController+Keyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FC25597B47CD537DC420619C4161C9C /* MessagesViewController+Keyboard.swift */; };
+ A2BE0FAB2348259244A4647AA96C3BD5 /* TextMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC6C8D20DB3B9A8CDF32ED8E33CBCC42 /* TextMessageSizeCalculator.swift */; };
+ A43BFACBF159516ED4AC72EB1376DB7E /* MessageStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA5505819EEDC614CECDC4C3CA6293F3 /* MessageStyle.swift */; };
+ A4DC2EAB0B7D2FE8F786329B11C04D82 /* InputBarAccessoryViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF0CCC7A760DD1160CB85705837AF142 /* InputBarAccessoryViewDelegate.swift */; };
+ A5B79A8502C5F75786F9423737A408DF /* UIView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73C94B08E5E8A6753D68C5A5C6731ED7 /* UIView+IQKeyboardManagerExtension.swift */; };
+ A6AE6AF4FE91D536B380E464A4E1C172 /* Security.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82E4E2A8D2B90ED5ED67F286151BB155 /* Security.swift */; };
+ AB665AF105F320606027E98785BCD064 /* UIView+IQKeyboardExtensionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = E20AFF4D399A5E45BB7531BF16AA42E4 /* UIView+IQKeyboardExtensionDeprecated.swift */; };
+ ABED5D4307DC2BC0798178A5B603ECAF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ AC5F2F46B95717F1FCBF4AC1E0556E81 /* NSConstraintLayoutSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A80A173B837A240DD36D4467A0E74BA /* NSConstraintLayoutSet.swift */; };
+ AECD1E4E81FDC1ADB79FE33B54BF1B00 /* LocationMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB18366A891CC5695E86B982BBCAB26C /* LocationMessageCell.swift */; };
+ AF8A799321B9F28D8C728712C4990679 /* SocketIOClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8B4F4FD7AF6D41DD589FA08ACB546E /* SocketIOClient.swift */; };
+ AFD7FD8B8DFCC0E0482B8D91F9DEEFED /* IQKeyboardToolbar-IQKeyboardToolbar in Resources */ = {isa = PBXBuildFile; fileRef = A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */; };
+ B00670859A1ED2DD50DD7EF08B6EF1B7 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift in Resources */ = {isa = PBXBuildFile; fileRef = 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */; };
+ B0271CC33C9DEF6B34DEC8B042E730C9 /* IQKeyboardAppearanceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90AC335E6377188435CBB0EF667BD039 /* IQKeyboardAppearanceManager.swift */; };
+ B0911438C3F47B44D3F0C9E03FFB1840 /* TextMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6AB9B11EB5ED43719082F2F19328A2A /* TextMessageCell.swift */; };
+ B119CE8AD1278F67856D78C4884FFAE1 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager in Resources */ = {isa = PBXBuildFile; fileRef = 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */; };
+ B17063662B13D10ACE5C265FE3510B03 /* UIView+IQKeyboardExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B0C04C073A80821F01D2ACFD7CB767 /* UIView+IQKeyboardExtensionObjc.swift */; };
+ B19C5DEF3FB06B25664FE836FB885246 /* CGRect+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DD76C60CE4E66FD299AEBAF29B3237E /* CGRect+Extensions.swift */; };
+ B79DC1C55198D65A71E8C482C3F2FB02 /* IQKeyboardNotification-IQKeyboardNotification in Resources */ = {isa = PBXBuildFile; fileRef = 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */; };
+ B8ED90C0457F5290FD7ECFC7E5B6E226 /* IQKeyboardToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C797492F8B846067C39CA9F50B888B2 /* IQKeyboardToolbar.swift */; };
+ BA264EC0A68A9ADBBC0869194D1CA8A7 /* IQKeyboardCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 96730F30815D0EEC1D3C2071A13BC1F0 /* IQKeyboardCore-dummy.m */; };
+ BB4B0F67823695A93267D4112588034E /* Array+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35CD62229F3D034E8743BD15A24C579D /* Array+Sort.swift */; };
+ BC2D261F702F99B15E2325B530CFEDBC /* IQKeyboardReturnManager+UITextViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC8DB0034FFC90D02F68C3D1D77ED14 /* IQKeyboardReturnManager+UITextViewDelegate.swift */; };
+ BC3452687BAC4EDE378BAF24EA961070 /* Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = D71A4C075B33A70F2DDCD9F5E3A01A9C /* Compression.swift */; };
+ BD5D2C71C739133195B7A2BA1F2809FE /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3A17776A0AB19E8A0BDF55E45D0F5D4D /* PrivacyInfo.xcprivacy */; };
+ BDB5AE7EE3453F907E314D0182F02B17 /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEA5706B177F9FD27587D1FDFBF874AC /* UIColor+Extensions.swift */; };
+ BE179B99E0E8106DAF660F4EADD3F57E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ BE7D2E494D163136F592DC6747595BF8 /* LabelAlignment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 203222FAA2B1484BB2929306A7CB48A1 /* LabelAlignment.swift */; };
+ BF51F0E89BF73D101E7402B78F5B8704 /* LinkPreviewFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DC9EE0DEEE71EFC6F0DDE630C73D77D /* LinkPreviewFonts.swift */; };
+ BF7020644FFFF078CF9785A01A55363F /* SocketExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28A78E491AE45CB0E5735D718CAFDC98 /* SocketExtensions.swift */; };
+ C0BF300CFD54E25F7F1541882378EB1A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ C0D5DB50FDA16D6E7708423618B53DCE /* UIView+RespondersObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C31B5449A5C286DE26DAD1B5FE25C65 /* UIView+RespondersObjc.swift */; };
+ C0F87D8B0025074C6664A4DC1E8F680C /* IQRootControllerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74E22D78489209FBD5A99F9FC9BD14F7 /* IQRootControllerConfiguration.swift */; };
+ C14BB4753866F9698DEDD9571E0C7451 /* AutocompleteManagerDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42343CCBB345EBEB95DB37E2545E2F23 /* AutocompleteManagerDataSource.swift */; };
+ C1E6A06FBB341E783EE55402D4EC5AAE /* SocketAckManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37071278C6F05285283A9BF65B57C817 /* SocketAckManager.swift */; };
+ C22BC9F65B58C833BE5ABB49E4E29475 /* SenderType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C61838828FAED85631F3416CBCD3F734 /* SenderType.swift */; };
+ C2BA8B17E07B8E203A9599F2201BD041 /* IQDeepResponderContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BA6BD39C6DEB0237BF29162D3E0AD6B /* IQDeepResponderContainerView.swift */; };
+ C55D80FEA6509CF2A5F995E112F624E3 /* IQKeyboardManager+ToolbarManagerDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB87A2E929DC5DD80CE359A85E88E221 /* IQKeyboardManager+ToolbarManagerDeprecated.swift */; };
+ C764551976629035BC3B68DB5CCFF313 /* MessageInputBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 938EF4CDEF81049772CD2AD9C59A51F4 /* MessageInputBar.swift */; };
+ C7F5F578ED0B275CE60142C6DCD0097E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = BC1379620DFB369038C03C7C91BE09C6 /* PrivacyInfo.xcprivacy */; };
+ C8810AAA79F54037A40BD4D08CD5C00C /* IQKeyboardToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA06C1E6247357EFE20AB56AD33497C /* IQKeyboardToolbarManager.swift */; };
+ CB135F095D0FE46A74587DF2F7D2C93D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ CB31D13920C1AF516DBDBDB8750904D8 /* SocketRawView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAA9E60DF1C25128681366E0A03625ED /* SocketRawView.swift */; };
+ CCD799681F080A5DBD48C28D73DF5D0D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ CF9D1CD16CE03675DF085D06963E1213 /* SocketEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7103BA33D0EF82F8753FFA5F1A794ED /* SocketEngine.swift */; };
+ D0EEA73AFB87932584FBBB9F50B03B6E /* IQKeyboardToolbarManager+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E39D74B8690F4BDBD03734AFFB80513 /* IQKeyboardToolbarManager+Toolbar.swift */; };
+ D13AC8203CCEF9A65F94265030023950 /* UIView+IQKeyboardExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C10F4DED71C0ABE08B4DAA055738165 /* UIView+IQKeyboardExtension.swift */; };
+ D16B01041368AC24C33A1462B5BF720F /* ContactItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E01B0BBB125BA7F45F11448040E711C /* ContactItem.swift */; };
+ D48AE26E5ECCDA78E743D26A40441009 /* NSNotification+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C50E69DF4A8947DE66309723BD591CA /* NSNotification+Extensions.swift */; };
+ D4F11BE426B5B6B54C81072ADD45679F /* AutocompleteManagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 670259C41289D1489932D23FC9C24832 /* AutocompleteManagerDelegate.swift */; };
+ D66A6E12872A4EA9B761C54DB1C6A508 /* IQKeyboardCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CEF0B38CCE71FA32E460A4B8FF590AD2 /* IQKeyboardCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ D6B0228F50454CDD91EAA91CEA2F8CCB /* AttachmentManagerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 758A1AE725D2B52779D0B0C8E4AAF624 /* AttachmentManagerDelegate.swift */; };
+ D6DE6740960DD43B75B79176E558FC92 /* SocketEngineSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71B8A50BE53EF5AD7DDD9AA35D400F8B /* SocketEngineSpec.swift */; };
+ D7359CAD4CE43EB82A471CB49D75561F /* KeyboardEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D62C102F4106BBD963207F15C785085E /* KeyboardEvent.swift */; };
+ D7C4E5180E2A156C0C37C07F55F433F2 /* IQPlaceholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CEE5A564AAB50A106317F59DB4AFDC0 /* IQPlaceholderable.swift */; };
+ DB569FE3BFD80005DBDAAD6FC95BB238 /* Socket.IO-Client-Swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 75C846518E523ED197CAD7ED7DF2057A /* Socket.IO-Client-Swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ DC2C9F2C0E684FCB2A7C5A2B2C9F25C2 /* MessagesDisplayDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 294C6B828600B3521F24E3C62C8B5047 /* MessagesDisplayDelegate.swift */; };
+ DC79D737822865A21CA8F3B41BECD175 /* SocketEventHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06C5FE0E92F02E2A852DD46C1F8A1A7F /* SocketEventHandler.swift */; };
+ DDF78721510F7E4C4408530071E90151 /* IQKeyboardToolbarManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F5CA929B23FCD5F023D2D63C7373C47 /* IQKeyboardToolbarManager+Debug.swift */; };
+ E04B36EEFCD8B7E8CD112E47F8763B3A /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 5C5ADC56FA4C5F8E8623DE1AA5996821 /* PrivacyInfo.xcprivacy */; };
+ E04BD9089649C8BE35F824CB1D4E3546 /* AttachmentsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C98F62B92BDDE799BE4261F30EE2711 /* AttachmentsView.swift */; };
+ E06AADA7C0F8D9602461175C8EE06492 /* UITextView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCE0B62E4172213C3B395A27C7C7E627 /* UITextView+Extensions.swift */; };
+ E0789BDEF9B6BBAFDEC98DE93CDD36BB /* IQTextView-IQTextView in Resources */ = {isa = PBXBuildFile; fileRef = 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */; };
+ E1CBD1205E408456DC9398CE34124859 /* IQTextInputViewInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50793974A305527F60217520860581CB /* IQTextInputViewInfo.swift */; };
+ E25B3F06A8C31501370E93F10DFD9C75 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 7C5C99DA8EB49E8016C03D3C9760F7EF /* PrivacyInfo.xcprivacy */; };
+ E3D24B98739A3B5D135BFF54F6456264 /* MessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F0AFAECD6D672E3226B8AD170C4B0D1 /* MessageSizeCalculator.swift */; };
+ E4F914EABC4237F7CBD0FA0B59B6E663 /* InputPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F1FCFD58B37EB860DC3A3824549D3A2 /* InputPlugin.swift */; };
+ E4FB315839CD71C0A3C0F505C6E82519 /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15CD601723AD6B749827605295DE8419 /* Data+Extensions.swift */; };
+ E568019FA05750CBD276BFD333E5A0F3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ E6B21E5A65DC8A04C601F97EF159E4DA /* LocationItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E184E333B7C3C84737660D7DE1481EE /* LocationItem.swift */; };
+ E74FB1FFD20FE78D9B342F7335701F12 /* MessagesCollectionViewLayoutAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA66CCEEC8C6A7E165942E79F278A93E /* MessagesCollectionViewLayoutAttributes.swift */; };
+ E79141DA3EB3A16BDB46A2126C84A5B1 /* AvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47197E1FD15BA878F506DDB4228DF0BB /* AvatarView.swift */; };
+ EAE52C13F93B0C35309D1BA284D90F7F /* SocketIOStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59F9A3BA4CD3A76882F0B6950DC43D51 /* SocketIOStatus.swift */; };
+ EB1A31FCAD64FDDC739D5B9C99BE62F3 /* UICollectionView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3712D6750C4686D1359F7A7BEF050E7C /* UICollectionView+IndexPaths.swift */; };
+ EB84943BAB8926948529140897A0BA1C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ EC0F62E46CE28D2ECB3D22C201673840 /* MediaMessageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C54C4A56AD343BA3E21DF95BCD0A3FB /* MediaMessageCell.swift */; };
+ EC507F6F2FFF53A9EDF19CC8161E624C /* InputBarSendButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9BEFF5EC5378B9734A0AEC293E7406B /* InputBarSendButton.swift */; };
+ EC9823505BE2522605A9417C3FCB3CB7 /* AudioItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75AAC64397EA9CC5A27AA9E291EC8557 /* AudioItem.swift */; };
+ EC9ADD5A3B7653A4F176FD19C49646F4 /* Transport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D990A4A50FD6F36CCEB6EB30B11DA71B /* Transport.swift */; };
+ EE7B8E59DE2447D8B6EC043CC10FBBC5 /* TypingIndicatorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B2812A2AA753F833E47596138C88A37 /* TypingIndicatorCell.swift */; };
+ EED9C7723F8EE87862911342058FCD81 /* ContactMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39B9DD226355EA4380CFFBC2264FA722 /* ContactMessageSizeCalculator.swift */; };
+ EF108FDDFCE92069F18E898899B486AE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ EF755F39742ED8B1C61C11CB45E1B7CC /* SocketManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17AB8EF60A6BF05948294FF8545E902C /* SocketManager.swift */; };
+ F04331FE7D687A519E1AE84E1FBFED47 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 39D39E0C2C9393F4719368076F3A39F4 /* PrivacyInfo.xcprivacy */; };
+ F1B91B85BB35FE543E8771278D484A98 /* AttachmentManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48A89EBD213E4C29550F0C7E65653054 /* AttachmentManager.swift */; };
+ F2B7042415A6C000AAD567B1784BB623 /* IQKeyboardToolbarManager+Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7690CB34AE32E1342B97EBD7AC8CC42 /* IQKeyboardToolbarManager+Action.swift */; };
+ F2E075E03ACF636649022AC4D3F8224A /* IQKeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = E35022F8A897ACAB538CA0719B23F5F0 /* IQKeyboardNotification.swift */; };
+ F40D881AA52F81CB5C81D000942B493E /* IQKeyboardExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65605BC9E935D60C3F5DFA0BF1D6436D /* IQKeyboardExtended.swift */; };
+ F4BD2148FD9A76AC317239583EA6222C /* SocketLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A83C007F1735E511EFDB481174A6CC7 /* SocketLogger.swift */; };
+ F52680B2207836467A8D6EEFB543008D /* InputBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4711D75A9C3455DCF68F00072E2BDF72 /* InputBarButtonItem.swift */; };
+ F54B3DE6270C3BC7EB937F96A99D48B6 /* MediaMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 423FD223D3086C32D2D8AE8A363A94C6 /* MediaMessageSizeCalculator.swift */; };
+ F6AB46489F5D38C7870577D939B281A1 /* LocationMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C89A881750CD19F801DEF49269AAFB63 /* LocationMessageSizeCalculator.swift */; };
+ F6D3196B2F8988001A3C02242393957C /* LinkPreviewMessageSizeCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 777C27DDF65B45F1B0CD4D511458C32E /* LinkPreviewMessageSizeCalculator.swift */; };
+ F7610C87D81EC40DEAB7BBC6894E1946 /* SocketManagerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD07D13166AA93F7BFF1D28C39F17EDA /* SocketManagerSpec.swift */; };
+ F90BE97FB57CD87C99ACC4F703993708 /* IQTextView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B40C43AFC410804AB30D7AA69EF25DC6 /* IQTextView-dummy.m */; };
+ F9C7076BF995F5973D94702A8C685065 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */; };
+ F9DD27631D2014C4CE38B8AD2BE79AAF /* IQTextInputViewNotification-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6241EEE4F83F805A4AB9C2D43DFFBA0A /* IQTextInputViewNotification-dummy.m */; };
+ F9FEDDF463532B11E0308BA9C755265F /* IQKeyboardToolbar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FFD67C073AB7CA07FE44FCED12A08A2 /* IQKeyboardToolbar-dummy.m */; };
+ FACE4172C54AB6DA15F92BAAEF2CB893 /* DetectorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EF18210B895E2F62D0F5B7FAA698F9F /* DetectorType.swift */; };
+ FC33245173BB6F5766A60B58C96E27D8 /* MessageLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 282A1BA331D798950E5C6345C29FD780 /* MessageLabel.swift */; };
+ FE3E4FA1C40B90573AEAD69AF357D430 /* SocketEnginePollable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91D4D3CBF521AE91D26519ECEABEBB1F /* SocketEnginePollable.swift */; };
+ FE477B7BE7FCAEC2A97011890D8CAA10 /* IQInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B45E5B1D6903FEB3844864FA5CE17C9C /* IQInvocation.swift */; };
+ FEF28A586EAD9B93BD14EEF0505D478F /* AutocompleteTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E782436CDC40A86A696D86D6DF3C377 /* AutocompleteTableView.swift */; };
+ FF07043D49B7438D76595A36BBB9213E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */; };
+ FF3963833DF1671A4B04AFFBACDADA57 /* AvatarPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = C00E84D6D0BDB72FACA7C55630CA2093 /* AvatarPosition.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
- 4B4E0D3314C43188B008FBAC3F253BFE /* PBXContainerItemProxy */ = {
+ 02E84FF3AB36FD2E05A514E4443F8EE5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = 2D834CBBD351637528FA6B93E42745DC;
- remoteInfo = MessageKit;
+ remoteGlobalIDString = A26E6FD851C20D652B2755C1464A9990;
+ remoteInfo = IQKeyboardNotification;
+ };
+ 0FF4DBB61BBBDE7980C09D67CE45CC25 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+ remoteInfo = IQKeyboardCore;
+ };
+ 11DB44084886B6ABABFA5FE9FEF5E647 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E;
+ remoteInfo = "IQKeyboardManagerSwift-IQKeyboardManagerSwift";
+ };
+ 1F0A0426DF3F7D24F5DEAFCE42AAED50 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = EEE261386011CDF271BE289F73FF5959;
+ remoteInfo = "IQKeyboardCore-IQKeyboardCore";
+ };
+ 25B88CE8692E89F0098DE18EC3FF9335 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A44D85440C5D58BC5C4D70A539C5EEF0;
+ remoteInfo = "Socket.IO-Client-Swift";
+ };
+ 26925E6B9DB684BD12116FBC37A2A1B3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = B247F77A0CD5E19C8187A9BA1EB58C09;
+ remoteInfo = "IQKeyboardToolbar-IQKeyboardToolbar";
+ };
+ 28A21C42FBE159A0E90158F5591D1B5E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9B78EE4AF6AE03E79D88886319853FF7;
+ remoteInfo = Starscream;
+ };
+ 2E5D2BD2CD66253E8E0BD16D1C1992EF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 020993F16DA5986DACE118349EBCE9E5;
+ remoteInfo = IQKeyboardToolbarManager;
+ };
+ 2E9A174E88D0B44FB5948A523F1A9395 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 7C5613175BBC4BF67E36DB4FBEBC01D0;
+ remoteInfo = "IQKeyboardToolbarManager-IQKeyboardToolbarManager";
+ };
+ 302FC53D9B85D81BBE44660132BB8215 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9B78EE4AF6AE03E79D88886319853FF7;
+ remoteInfo = Starscream;
+ };
+ 306FFF782370D29D33B349F9E5E66589 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+ remoteInfo = IQKeyboardToolbar;
+ };
+ 3420A4ADDA08CBB4160B9E8A85A20C5C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+ remoteInfo = IQKeyboardCore;
+ };
+ 3747C6F25E6AF366775220A5410E71E6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+ remoteInfo = IQKeyboardCore;
+ };
+ 393D84727512C8A8EFF5F6ABE5227253 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = B490E7485944099E16C9CBD79119D1D4;
+ remoteInfo = IQKeyboardManagerSwift;
};
- 6110EE9E7165B8A37EF4DAC74698DBE0 /* PBXContainerItemProxy */ = {
+ 4AD1FAA42FFF6EEABD09ECAC890A2E79 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = C8C39DD486923E3933801D232041B590;
remoteInfo = InputBarAccessoryView;
};
- 732707AFC5F3D4C42D45F31EE8D119BA /* PBXContainerItemProxy */ = {
+ 4C6EDD4A2120AD9A73B97725552D26C3 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+ remoteInfo = IQKeyboardToolbar;
+ };
+ 4EEF99AC4FA3828532D641950236D3E6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 4502C7427440BEB17A50C0BF6E638A85;
+ remoteInfo = "IQTextInputViewNotification-IQTextInputViewNotification";
+ };
+ 61997446DA9084F285B50335A6517FCE /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 12890DE3ABBC2CA295E108358D85EE69;
+ remoteInfo = IQTextView;
+ };
+ 63695D3BD4DDDD3CFD2A82CC4B1C9C58 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = B6E2C457741647223A51766707CCB8CA;
remoteInfo = VideoSDKRTC;
};
- 9B50FF3B072F66721AEEB6D694F5B046 /* PBXContainerItemProxy */ = {
+ 6E1AD3B5ED7384F02013FDBB95BA3AC1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
- remoteGlobalIDString = B490E7485944099E16C9CBD79119D1D4;
- remoteInfo = IQKeyboardManagerSwift;
+ remoteGlobalIDString = 0981F89DB5DA3FFCFFEBDE1F56287054;
+ remoteInfo = IQKeyboardReturnManager;
+ };
+ 744F0982CC55992AC71434649F67B317 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 020993F16DA5986DACE118349EBCE9E5;
+ remoteInfo = IQKeyboardToolbarManager;
+ };
+ 7CC790750B0F2C29848FA5EBB9C00AA0 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 771210E06FA095D070EFB58429312B8F;
+ remoteInfo = "Starscream-Starscream_Privacy";
+ };
+ 7E99E3716A74801EBAC88E8A73338CAE /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+ remoteInfo = IQTextInputViewNotification;
+ };
+ 7EF317FF31B1C75238D2D780E40073EF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 88810798DA63A2F6611B0970EA276DEC;
+ remoteInfo = "IQKeyboardReturnManager-IQKeyboardReturnManager";
};
- AC164C6A0632B2A682EA6C15F0BD8873 /* PBXContainerItemProxy */ = {
+ 804D10F50EA0C68FBA70885EE00B7A7F /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = C8C39DD486923E3933801D232041B590;
remoteInfo = InputBarAccessoryView;
};
+ 86CB7875FC91D7A7AE374266A75156F5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+ remoteInfo = IQTextInputViewNotification;
+ };
+ A038251019E08AC2FE252A5369C5B43D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A6602BCAA6F4F932A586C41D0B7E019C;
+ remoteInfo = "IQTextView-IQTextView";
+ };
+ AA5DC9071D8F423080A2DD955388785A /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+ remoteInfo = IQKeyboardToolbar;
+ };
+ AC4983E29E88CE2CBDFAAB7B5AFBD661 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 12890DE3ABBC2CA295E108358D85EE69;
+ remoteInfo = IQTextView;
+ };
+ B9937E9A7EA04D0BF3B16F322C463E3B /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 0981F89DB5DA3FFCFFEBDE1F56287054;
+ remoteInfo = IQKeyboardReturnManager;
+ };
+ CCA5E2FD346506873356C1D5F14540E9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+ remoteInfo = IQKeyboardCore;
+ };
+ D9F0547124B6FE2605255446F61B3AF9 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 2D834CBBD351637528FA6B93E42745DC;
+ remoteInfo = MessageKit;
+ };
+ DEE98D38B2A60CAE0EC55BA71CD4405C /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A44D85440C5D58BC5C4D70A539C5EEF0;
+ remoteInfo = "Socket.IO-Client-Swift";
+ };
+ E073822B01A6D2F75128F83F13DD7468 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 2B8FF445A5162845FAB9EC00FC92B694;
+ remoteInfo = "IQKeyboardNotification-IQKeyboardNotification";
+ };
+ F40F02F228BAE6194B8A659882F4F396 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A26E6FD851C20D652B2755C1464A9990;
+ remoteInfo = IQKeyboardNotification;
+ };
+ F9377DEDB01AB0670DA62C944EDBD367 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+ remoteInfo = IQTextInputViewNotification;
+ };
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
- 009A6B28E935276EF732E71F8A9DFEB5 /* IQKeyboardManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Debug.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager+Debug.swift"; sourceTree = ""; };
- 0211F583FAC624D77AD1F162EBB7C78E /* AccessoryPosition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AccessoryPosition.swift; path = Sources/Models/AccessoryPosition.swift; sourceTree = ""; };
- 04D60AC13D33197690A05C641925DDDA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
- 054BB95F1C6127DEA05615B615975440 /* InputBarAccessoryView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "InputBarAccessoryView-dummy.m"; sourceTree = ""; };
- 0595FD1D91FDB06DDC97C12E417FD7D3 /* MessageCollectionViewCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageCollectionViewCell.swift; path = Sources/Views/Cells/MessageCollectionViewCell.swift; sourceTree = ""; };
- 08AD6F95D40811D7E0BAC3EBA4D1203C /* IQNSArray+Sort.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQNSArray+Sort.swift"; path = "IQKeyboardManagerSwift/Categories/IQNSArray+Sort.swift"; sourceTree = ""; };
- 0A5B724D2835C61082AB45F2A595D158 /* ContactMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContactMessageCell.swift; path = Sources/Views/Cells/ContactMessageCell.swift; sourceTree = ""; };
- 0E9E1C25BC27113F020D404B30533B7C /* NSMutableAttributedString+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSMutableAttributedString+Extensions.swift"; path = "Sources/Extensions/NSMutableAttributedString+Extensions.swift"; sourceTree = ""; };
- 114F69E7DD00E39F903F86CC6EA841C6 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardManagerSwift/PrivacyInfo.xcprivacy; sourceTree = ""; };
- 1184696D328CD7F24E4D0156427EC4F8 /* MessageKitDateFormatter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageKitDateFormatter.swift; path = Sources/Models/MessageKitDateFormatter.swift; sourceTree = ""; };
- 14CFDFA9A75FC20E8F8A1F622C2447DA /* InputBarAccessoryView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "InputBarAccessoryView-Info.plist"; sourceTree = ""; };
- 153C61527061AB00AF5E1674155F4D77 /* IQKeyboardManagerSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.debug.xcconfig; sourceTree = ""; };
+ 005A5EC9A759D4D5C73921E90C952518 /* IQKeyboardToolbarConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarConstants.swift; path = IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift; sourceTree = ""; };
+ 0319DA76119A4D1ECB936D626A844C89 /* SocketEngineClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineClient.swift; path = Source/SocketIO/Engine/SocketEngineClient.swift; sourceTree = ""; };
+ 0341BBD73224544A4E1F455650C76C52 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+ 04088A96979C4B33438E6318CFC29F91 /* IQTitleBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTitleBarButtonItem.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift; sourceTree = ""; };
+ 048B3B6E25C9408F70FC1BE67EB75421 /* Starscream-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Starscream-Info.plist"; sourceTree = ""; };
+ 0497170C3D1F807A598AC190383085A8 /* IQKeyboardToolbarManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbarManager-umbrella.h"; sourceTree = ""; };
+ 0580E2D09D501DDBB2FCA8AC7BD519D6 /* HorizontalEdgePadding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalEdgePadding.swift; path = Sources/Models/HorizontalEdgePadding.swift; sourceTree = ""; };
+ 06C5FE0E92F02E2A852DD46C1F8A1A7F /* SocketEventHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEventHandler.swift; path = Source/SocketIO/Client/SocketEventHandler.swift; sourceTree = ""; };
+ 06E5B413FEA5A600D76636DA132F8FB9 /* IQTextInputViewNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQTextInputViewNotification; path = IQTextInputViewNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 077613EF4DACC9FA2DDB5B93023C9A65 /* AutocompleteSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutocompleteSession.swift; path = Sources/Plugins/AutocompleteManager/Models/AutocompleteSession.swift; sourceTree = ""; };
+ 0A2DB2898AAAB5CAE919C9E3153067BB /* IQKeyboardManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Internal.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift"; sourceTree = ""; };
+ 0A620A09F6B11EF9C51C63B405D07E73 /* IQTextInputViewNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextInputViewNotification.debug.xcconfig; sourceTree = ""; };
+ 0A97E8105D30648515F8A2A3AF0AFDF0 /* TypingIndicatorCellSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TypingIndicatorCellSizeCalculator.swift; path = Sources/Layout/TypingIndicatorCellSizeCalculator.swift; sourceTree = ""; };
+ 0B2812A2AA753F833E47596138C88A37 /* TypingIndicatorCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TypingIndicatorCell.swift; path = Sources/Views/Cells/TypingIndicatorCell.swift; sourceTree = ""; };
+ 0B55CF8B68AA4FBA499ACEE6273C6969 /* MessageReusableView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageReusableView.swift; path = Sources/Views/HeadersFooters/MessageReusableView.swift; sourceTree = ""; };
+ 0C98F62B92BDDE799BE4261F30EE2711 /* AttachmentsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttachmentsView.swift; path = Sources/Plugins/AttachmentManager/Views/AttachmentsView.swift; sourceTree = ""; };
+ 0DFD4541FF9DAA31A2FC2A7F6D03ED22 /* IQTextView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQTextView; path = IQTextView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 0E790152CBE882670BDE506F3147E289 /* MessageKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MessageKit.modulemap; sourceTree = ""; };
+ 0F0F18872AD12CCA59A4B96110662903 /* IQTextInputViewInfoModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewInfoModel.swift; path = IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift; sourceTree = ""; };
+ 109DC0478ABBB885F684071F1F718C1F /* VideoSDKRTC.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = VideoSDKRTC.debug.xcconfig; sourceTree = ""; };
+ 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardReturnManager-IQKeyboardReturnManager"; path = IQKeyboardReturnManager.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 11C30DA592AACB8011EA6D06AC7774B8 /* IQKeyboardToolbarConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarConfiguration.swift; path = IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift; sourceTree = ""; };
+ 11EEAE93DA5DF32D8654B2D9787D17EF /* InsetLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InsetLabel.swift; path = Sources/Views/InsetLabel.swift; sourceTree = ""; };
+ 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardNotification-IQKeyboardNotification"; path = IQKeyboardNotification.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 12E745632178F275BED15FFF60E87552 /* WebRTC.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = WebRTC.xcframework; path = Frameworks/WebRTC.xcframework; sourceTree = ""; };
+ 12F1F661D18F7358EDD6EB4E938DB2DA /* MessagesLayoutDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessagesLayoutDelegate.swift; path = Sources/Protocols/MessagesLayoutDelegate.swift; sourceTree = ""; };
+ 15848DEC7727A809830E7F6FC1B6CE0F /* IQKeyboardReturnManager */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardReturnManager; path = IQKeyboardReturnManager.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 159B49503ACD85FDEC43B64B841A1FE8 /* IQTextInputViewNotification.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQTextInputViewNotification.modulemap; sourceTree = ""; };
15A68A8F33BD9EB9AFD02465B0418BCF /* MessageKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = MessageKit; path = MessageKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 16E853DBAE36CEC5241CB271316F2D6A /* BubbleCircle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BubbleCircle.swift; path = Sources/Views/BubbleCircle.swift; sourceTree = ""; };
- 17A63CC61336A02B03DCD6F1977702A7 /* DetectorType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DetectorType.swift; path = Sources/Models/DetectorType.swift; sourceTree = ""; };
- 18262D257610F2B477F25CA108DBCE47 /* LinkPreviewFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinkPreviewFonts.swift; path = Sources/Models/LinkPreviewFonts.swift; sourceTree = ""; };
- 1A311DCD364BBCBEEF4F5D5E29449C62 /* LinkPreviewMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinkPreviewMessageCell.swift; path = Sources/Views/Cells/LinkPreviewMessageCell.swift; sourceTree = ""; };
- 1AF5BD57509BAA412FE57DC242CA67DF /* IQTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextView.swift; path = IQKeyboardManagerSwift/IQTextView/IQTextView.swift; sourceTree = ""; };
- 1CEE88E9175A292CDF95E95D7A291F08 /* MessageLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageLabel.swift; path = Sources/Views/MessageLabel.swift; sourceTree = ""; };
- 1DBCD29F4C6C94FF82FEDC7760756546 /* KeyboardEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KeyboardEvent.swift; path = Sources/KeyboardManager/KeyboardEvent.swift; sourceTree = ""; };
- 1F3E9262D11EB79AC273DD406006C288 /* LocationMessageSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocationMessageSizeCalculator.swift; path = Sources/Layout/LocationMessageSizeCalculator.swift; sourceTree = ""; };
- 2034F83B5D111673C1CD8A0A91BD52D3 /* AttachmentManagerDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttachmentManagerDelegate.swift; path = Sources/Plugins/AttachmentManager/Protocols/AttachmentManagerDelegate.swift; sourceTree = ""; };
+ 15CD601723AD6B749827605295DE8419 /* Data+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Extensions.swift"; path = "Sources/DataBytes/Data+Extensions.swift"; sourceTree = ""; };
+ 16CF1F79712C0B416D64C535F816F345 /* MessageKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MessageKit-Info.plist"; sourceTree = ""; };
+ 170869E99BEDE32F1308541FDD67190E /* IQKeyboardToolbarManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardToolbarManager.modulemap; sourceTree = ""; };
+ 17AB8EF60A6BF05948294FF8545E902C /* SocketManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketManager.swift; path = Source/SocketIO/Manager/SocketManager.swift; sourceTree = ""; };
+ 194F8F37043A292949E5158B1EDF7568 /* CellSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CellSizeCalculator.swift; path = Sources/Layout/CellSizeCalculator.swift; sourceTree = ""; };
+ 19A4E919F460551CDA7A9E07662F9DF3 /* MessageType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageType.swift; path = Sources/Protocols/MessageType.swift; sourceTree = ""; };
+ 1CE328CF196F0F12173B77414EB4CA90 /* LocationMessageSnapshotOptions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocationMessageSnapshotOptions.swift; path = Sources/Models/LocationMessageSnapshotOptions.swift; sourceTree = ""; };
+ 1E775CFC32DDDFAE854CB1F64B663FE0 /* IQKeyboardReturnManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardReturnManager.release.xcconfig; sourceTree = ""; };
+ 1F6BFE2AF39AA84BFD49CB3E0379B3B3 /* UIEdgeInsets+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIEdgeInsets+Extensions.swift"; path = "Sources/Extensions/UIEdgeInsets+Extensions.swift"; sourceTree = ""; };
+ 1FB243B020BB8E680B9B69DD50EB8676 /* IQKeyboardManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Debug.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift"; sourceTree = ""; };
+ 203222FAA2B1484BB2929306A7CB48A1 /* LabelAlignment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LabelAlignment.swift; path = Sources/Models/LabelAlignment.swift; sourceTree = ""; };
21F2DE2F171D3A8DEEC6355B3708E50A /* Pods-VideoSDKRTC_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-VideoSDKRTC_Example.debug.xcconfig"; sourceTree = ""; };
- 23348B7921D88C28643B9F09E793B99C /* InputBarAccessoryView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = InputBarAccessoryView.debug.xcconfig; sourceTree = ""; };
- 2443228DF549456C9F5B57D3483A5286 /* IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardManagerSwift-Info.plist"; sourceTree = ""; };
- 26D082CAC1129CDF36243BCCF98B2A0E /* IQPreviousNextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPreviousNextView.swift; path = IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift; sourceTree = ""; };
- 288E14CFD5BE2494A4D330FD85C7CDE4 /* LinkItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinkItem.swift; path = Sources/Protocols/LinkItem.swift; sourceTree = ""; };
- 28D35D8CE56497B77937E4AB44B0B38F /* MediaItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MediaItem.swift; path = Sources/Protocols/MediaItem.swift; sourceTree = ""; };
- 2973CBF3AF4693CE305163784D300B43 /* HorizontalEdgePadding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalEdgePadding.swift; path = Sources/Models/HorizontalEdgePadding.swift; sourceTree = ""; };
- 2A852D434848A72CD8B9ED4953FB79BF /* IQKeyboardManagerConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManagerConstants.swift; path = IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift; sourceTree = ""; };
- 2AEFE766F01AA66FAA1C2298E08D2F24 /* AttachmentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttachmentCell.swift; path = Sources/Plugins/AttachmentManager/Views/AttachmentCell.swift; sourceTree = ""; };
- 2B6F5689A58EA51A26E63A7AE770CA3F /* InputItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputItem.swift; path = Sources/Protocols/InputItem.swift; sourceTree = ""; };
- 2B80A85408784B03701AA95E06C03F93 /* AvatarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AvatarView.swift; path = Sources/Views/AvatarView.swift; sourceTree = ""; };
- 2E0223E3EE6134A29B79F4EEBF2BED5A /* AutocompleteTableView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutocompleteTableView.swift; path = Sources/Plugins/AutocompleteManager/Views/AutocompleteTableView.swift; sourceTree = ""; };
- 30D40E6334EBE61C03CD871D7C067731 /* MessagesDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessagesDataSource.swift; path = Sources/Protocols/MessagesDataSource.swift; sourceTree = ""; };
- 397F270FD3A331FBAFF82C35BE40DA66 /* IQUITextFieldView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUITextFieldView+Additions.swift"; path = "IQKeyboardManagerSwift/Categories/IQUITextFieldView+Additions.swift"; sourceTree = ""; };
- 3992BE51CDD2C19352D712D47658C746 /* IQKeyboardManagerSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.release.xcconfig; sourceTree = ""; };
- 3AB25B52D9A74D7AA9433D31560F30B6 /* MediaMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MediaMessageCell.swift; path = Sources/Views/Cells/MediaMessageCell.swift; sourceTree = ""; };
- 3AB7F1C1EECD41E941DA8F10EEE809AF /* PlayButtonView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PlayButtonView.swift; path = Sources/Views/PlayButtonView.swift; sourceTree = ""; };
- 3C0A5D9783FB210177CAF03A650706C6 /* IQKeyboardReturnKeyHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardReturnKeyHandler.swift; path = IQKeyboardManagerSwift/IQKeyboardReturnKeyHandler.swift; sourceTree = ""; };
- 41A7FA9A829748836234C6FFB2878982 /* MessageKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = MessageKit.modulemap; sourceTree = ""; };
+ 23D5208D7A90DFF4E3A1FD49355E42D4 /* MessagesViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessagesViewController.swift; path = Sources/Controllers/MessagesViewController.swift; sourceTree = ""; };
+ 2407D2099207E4A2F2F02CCF13DAFAD1 /* IQKeyboardManager+Position.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Position.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift"; sourceTree = ""; };
+ 25C603B93664E041D4C6E62732A80075 /* TCPTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TCPTransport.swift; path = Sources/Transport/TCPTransport.swift; sourceTree = ""; };
+ 260DEA8EC0C0DAA26B0CF483BB04DB83 /* WSCompression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WSCompression.swift; path = Sources/Compression/WSCompression.swift; sourceTree = ""; };
+ 282A1BA331D798950E5C6345C29FD780 /* MessageLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageLabel.swift; path = Sources/Views/MessageLabel.swift; sourceTree = ""; };
+ 289388963598D5C48E293FDFE6135EA2 /* MessagesCollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessagesCollectionView.swift; path = Sources/Views/MessagesCollectionView.swift; sourceTree = ""; };
+ 28A78E491AE45CB0E5735D718CAFDC98 /* SocketExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketExtensions.swift; path = Source/SocketIO/Util/SocketExtensions.swift; sourceTree = ""; };
+ 294C6B828600B3521F24E3C62C8B5047 /* MessagesDisplayDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessagesDisplayDelegate.swift; path = Sources/Protocols/MessagesDisplayDelegate.swift; sourceTree = ""; };
+ 2B610F227C9B961524A446BF80303A83 /* InputBarAccessoryView+Availability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "InputBarAccessoryView+Availability.swift"; path = "Sources/Supporting/InputBarAccessoryView+Availability.swift"; sourceTree = ""; };
+ 2CC39208A6B02A095965462DAD2D0809 /* UIView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Extensions.swift"; path = "Sources/Extensions/UIView+Extensions.swift"; sourceTree = ""; };
+ 2CFBFC5D902EFE49A78A9C1FEFFEB66A /* Socket.IO-Client-Swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Socket.IO-Client-Swift-prefix.pch"; sourceTree = ""; };
+ 2D252D4883E3FC6B95A5DFBF026D7203 /* SocketStringReader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketStringReader.swift; path = Source/SocketIO/Util/SocketStringReader.swift; sourceTree = ""; };
+ 2DD76C60CE4E66FD299AEBAF29B3237E /* CGRect+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Extensions.swift"; path = "Sources/Extensions/CGRect+Extensions.swift"; sourceTree = ""; };
+ 2E51D31587F08998B460E85859501510 /* MessageKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MessageKit.release.xcconfig; sourceTree = ""; };
+ 2EF18210B895E2F62D0F5B7FAA698F9F /* DetectorType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DetectorType.swift; path = Sources/Models/DetectorType.swift; sourceTree = ""; };
+ 2F08422F85D270D086EDB408AD4B67DE /* IQKeyboardManagerSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.debug.xcconfig; sourceTree = ""; };
+ 301A5358EA16752CF8808E14FC7D9F32 /* String+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Extensions.swift"; path = "Sources/Extensions/String+Extensions.swift"; sourceTree = ""; };
+ 31C7DBB735D06DA34EE20DCB6E8C6622 /* WSEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WSEngine.swift; path = Sources/Engine/WSEngine.swift; sourceTree = ""; };
+ 3291E91E8D1D4219E5401927E8DAA43F /* IQKeyboardReturnManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardReturnManager-Info.plist"; sourceTree = ""; };
+ 331EB9A177DD3A7F4427D605DFFF039A /* ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist"; sourceTree = ""; };
+ 3508AA916AFBE8A39BD603037D165C44 /* Avatar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Avatar.swift; path = Sources/Models/Avatar.swift; sourceTree = ""; };
+ 35CD62229F3D034E8743BD15A24C579D /* Array+Sort.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+Sort.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift"; sourceTree = ""; };
+ 37071278C6F05285283A9BF65B57C817 /* SocketAckManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketAckManager.swift; path = Source/SocketIO/Ack/SocketAckManager.swift; sourceTree = ""; };
+ 3712D6750C4686D1359F7A7BEF050E7C /* UICollectionView+IndexPaths.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UICollectionView+IndexPaths.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift"; sourceTree = ""; };
+ 3779FC458859BB017510B4305DF21FC8 /* Combine.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Combine.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Combine.framework; sourceTree = DEVELOPER_DIR; };
+ 37CC29FB84BA0495CA09071C3F8F16A5 /* IQKeyboardInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardInfo.swift; path = IQKeyboardNotification/Classes/IQKeyboardInfo.swift; sourceTree = ""; };
+ 385153C3681ED67BE7D98F1511CBE9C9 /* IQKeyboardManager+Appearance_Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Appearance_Deprecated.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift"; sourceTree = ""; };
+ 38D25C1CCDAB244CED702E0AF11E6F31 /* StringHTTPHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StringHTTPHandler.swift; path = Sources/Framer/StringHTTPHandler.swift; sourceTree = ""; };
+ 39B9DD226355EA4380CFFBC2264FA722 /* ContactMessageSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContactMessageSizeCalculator.swift; path = Sources/Layout/ContactMessageSizeCalculator.swift; sourceTree = ""; };
+ 39D39E0C2C9393F4719368076F3A39F4 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 39FE2F4457BDF283319B14D77AA01D2B /* Starscream.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Starscream.modulemap; sourceTree = ""; };
+ 3A17776A0AB19E8A0BDF55E45D0F5D4D /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 3B3A4C26E5AF112EE783A52D65929657 /* IQKeyboardCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardCore.release.xcconfig; sourceTree = ""; };
+ 3D60F565CE0452AAFEACB22F1266358C /* HTTPHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPHandler.swift; path = Sources/Framer/HTTPHandler.swift; sourceTree = ""; };
+ 3DC8DB0034FFC90D02F68C3D1D77ED14 /* IQKeyboardReturnManager+UITextViewDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnManager+UITextViewDelegate.swift"; path = "IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift"; sourceTree = ""; };
+ 3E70E7DBD3EA18D12986E980F8B4CBCF /* IQKeyboardToolbar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardToolbar-Info.plist"; sourceTree = ""; };
+ 3F80DE9CA61525930AFEC4FFC0BD79DB /* Starscream-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Starscream-dummy.m"; sourceTree = ""; };
+ 3F8A7072F856D170199BD28E235EE018 /* IQKeyboardNotification-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardNotification-dummy.m"; sourceTree = ""; };
+ 4012B08746AE2E3AB28CCFEA0A6EDEFB /* IQKeyboardNotification-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardNotification-umbrella.h"; sourceTree = ""; };
+ 40243AAA9D762DD7DA6DF9D34A1CCA02 /* SocketIOClientConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClientConfiguration.swift; path = Source/SocketIO/Client/SocketIOClientConfiguration.swift; sourceTree = ""; };
+ 418DA52B71B9C3CE3BADCC0C207CA44A /* MessageLabelDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageLabelDelegate.swift; path = Sources/Protocols/MessageLabelDelegate.swift; sourceTree = ""; };
+ 41916174325AC8DA87DA6F9466A75CF1 /* IQTextInputViewNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewNotification.swift; path = IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift; sourceTree = ""; };
+ 42343CCBB345EBEB95DB37E2545E2F23 /* AutocompleteManagerDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutocompleteManagerDataSource.swift; path = Sources/Plugins/AutocompleteManager/Protocols/AutocompleteManagerDataSource.swift; sourceTree = ""; };
+ 423FD223D3086C32D2D8AE8A363A94C6 /* MediaMessageSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MediaMessageSizeCalculator.swift; path = Sources/Layout/MediaMessageSizeCalculator.swift; sourceTree = ""; };
42B167DA3BBB40172536AFE17B1D39AF /* Pods-VideoSDKRTC_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-VideoSDKRTC_Example.modulemap"; sourceTree = ""; };
- 44B8C9FCCE33414AB83BD3FE4709A72E /* MessageKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MessageKit.debug.xcconfig; sourceTree = ""; };
- 480595B7EB4963C3CFCD7BBCDCFBC73D /* NSConstraintLayoutSet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSConstraintLayoutSet.swift; path = Sources/Models/NSConstraintLayoutSet.swift; sourceTree = ""; };
- 4A2179BAEFE5140F3832620673958760 /* MessageKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MessageKit-umbrella.h"; sourceTree = ""; };
- 4A2C29C7F1CAC0E623F5AFA313AA5B17 /* IQKeyboardManager+UIKeyboardNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+UIKeyboardNotification.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager+UIKeyboardNotification.swift"; sourceTree = ""; };
- 4B99D470382C5C9CEDBA04256CA7C1CD /* CGRect+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CGRect+Extensions.swift"; path = "Sources/Extensions/CGRect+Extensions.swift"; sourceTree = ""; };
- 4E319E80E0104236B69BD0BDE4076F30 /* InputBarAccessoryView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = InputBarAccessoryView.modulemap; sourceTree = ""; };
- 4FE7801CE7E06398DDA59C566BA0AFDF /* KeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KeyboardManager.swift; path = Sources/KeyboardManager/KeyboardManager.swift; sourceTree = ""; };
- 522D4D4E61CB5E016942334FDDEE52E0 /* MessageKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "MessageKit-dummy.m"; sourceTree = ""; };
- 531F5C194C14C630C0326589B2A8F647 /* InputStackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputStackView.swift; path = Sources/Views/InputStackView.swift; sourceTree = ""; };
- 551FA7C0DBB7448D878A3C762613EC2B /* InputBarSendButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputBarSendButton.swift; path = Sources/Controls/InputBarSendButton.swift; sourceTree = ""; };
- 553CC51F895CE213A584B5F5A24D1FEA /* UIView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Extensions.swift"; path = "Sources/Extensions/UIView+Extensions.swift"; sourceTree = ""; };
+ 439A68A29858CFB377CEE48DECED792B /* SocketParsable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketParsable.swift; path = Source/SocketIO/Parse/SocketParsable.swift; sourceTree = ""; };
+ 45C61F3652C3C61CE41B25809D20C1AC /* IQKeyboardToolbar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbar-umbrella.h"; sourceTree = ""; };
+ 4623FDCE4D19A9C336996CAAA482FDBE /* InputBarAccessoryView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "InputBarAccessoryView-prefix.pch"; sourceTree = ""; };
+ 463A41C6C9FF0EBF82AB2DEDF260D644 /* IQTextInputViewNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextInputViewNotification.release.xcconfig; sourceTree = ""; };
+ 4652329F70165804C022939CC1D294C5 /* IQKeyboardManager+Resign_Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Resign_Deprecated.swift"; path = "IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift"; sourceTree = ""; };
+ 467544DD91FAB67DBD2E8E61727E9B15 /* IQKeyboardAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardAppearanceConfiguration.swift; path = IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift; sourceTree = ""; };
+ 46D3BBDDFE85EAA5E7988D79686F05D7 /* IQKeyboardManager+ActiveConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ActiveConfiguration.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift"; sourceTree = ""; };
+ 4711D75A9C3455DCF68F00072E2BDF72 /* InputBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputBarButtonItem.swift; path = Sources/Controls/InputBarButtonItem.swift; sourceTree = ""; };
+ 47197E1FD15BA878F506DDB4228DF0BB /* AvatarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AvatarView.swift; path = Sources/Views/AvatarView.swift; sourceTree = ""; };
+ 475E2CD956406FFA07FF509269C9EEF2 /* IQKeyboardReturnManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardReturnManager.modulemap; sourceTree = ""; };
+ 489963D67621C3B876749708D3085CC1 /* InputStackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputStackView.swift; path = Sources/Views/InputStackView.swift; sourceTree = ""; };
+ 48A89EBD213E4C29550F0C7E65653054 /* AttachmentManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttachmentManager.swift; path = Sources/Plugins/AttachmentManager/AttachmentManager.swift; sourceTree = ""; };
+ 49C2AFC973DCE9C74EA14F67D3772671 /* IQKeyboardCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardCore-Info.plist"; sourceTree = ""; };
+ 4A69D8AAF12050BE2426E2E0BB5472FF /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 4A83C007F1735E511EFDB481174A6CC7 /* SocketLogger.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketLogger.swift; path = Source/SocketIO/Util/SocketLogger.swift; sourceTree = ""; };
+ 4AB8A10DBB8C33024CA01F45C90CF06D /* IQTextView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextView.debug.xcconfig; sourceTree = ""; };
+ 4ADDD8EF3B507D20F6FF315DA6CB9735 /* MessageContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageContentCell.swift; path = Sources/Views/Cells/MessageContentCell.swift; sourceTree = ""; };
+ 4C4B5AE01E549A4DA143C9776C6D36BD /* Socket.IO-Client-Swift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Socket.IO-Client-Swift-Info.plist"; sourceTree = ""; };
+ 4CD1354CE4FBE5AE145EBF06D3F16ACD /* InputTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputTextView.swift; path = Sources/Views/InputTextView.swift; sourceTree = ""; };
+ 4E6DAC26F764269198F14DB875AB89AB /* ResourceBundle-IQTextView-IQTextView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQTextView-IQTextView-Info.plist"; sourceTree = ""; };
+ 4E782436CDC40A86A696D86D6DF3C377 /* AutocompleteTableView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutocompleteTableView.swift; path = Sources/Plugins/AutocompleteManager/Views/AutocompleteTableView.swift; sourceTree = ""; };
+ 4F5CA929B23FCD5F023D2D63C7373C47 /* IQKeyboardToolbarManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Debug.swift"; path = "IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift"; sourceTree = ""; };
+ 50793974A305527F60217520860581CB /* IQTextInputViewInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewInfo.swift; path = IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift; sourceTree = ""; };
+ 50C0B0879B7086918A819F704BF40B4B /* Socket.IO-Client-Swift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Socket.IO-Client-Swift"; path = SocketIO.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 50F80BCB3EE1CAA48271C23954E4CE37 /* IQTextView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextView.release.xcconfig; sourceTree = ""; };
+ 52E8EDFAD37A554B992FEEBB85AFE7A0 /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; sourceTree = ""; };
+ 535B9430EEF5DB59D9C5042545258479 /* SocketIOClientOption.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClientOption.swift; path = Source/SocketIO/Client/SocketIOClientOption.swift; sourceTree = ""; };
+ 53B4469257EB4087007D11A5063C8896 /* SocketEngineWebsocket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineWebsocket.swift; path = Source/SocketIO/Engine/SocketEngineWebsocket.swift; sourceTree = ""; };
+ 53B80BD4EFBF71B464548A6C8F32FCDE /* UITableView+IndexPaths.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+IndexPaths.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift"; sourceTree = ""; };
+ 53E57FD1293B158F5A13A12CD006387C /* KeyboardNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KeyboardNotification.swift; path = Sources/KeyboardManager/KeyboardNotification.swift; sourceTree = ""; };
+ 53FDBFF31538362E32BB21A8E019E008 /* InputBarAccessoryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputBarAccessoryView.swift; path = Sources/InputBarAccessoryView.swift; sourceTree = ""; };
+ 54D5BE26AE8FB28A441C81D437F29A1F /* AudioMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AudioMessageCell.swift; path = Sources/Views/Cells/AudioMessageCell.swift; sourceTree = ""; };
55A4822938409AFD8F3B649F5F55EA37 /* Pods-VideoSDKRTC_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-VideoSDKRTC_Example-Info.plist"; sourceTree = ""; };
- 562408E478086D76CB2DF1E7CF482923 /* IQUIView+IQKeyboardToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIView+IQKeyboardToolbar.swift"; path = "IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift"; sourceTree = ""; };
- 57057D9994410CECEE02A8DD69E19012 /* MessageKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MessageKit.release.xcconfig; sourceTree = ""; };
- 593F92587C692CA0F018DCC20115ADC6 /* IQToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbar.swift; path = IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift; sourceTree = ""; };
- 5EA0B1753F4E86B8D53EA267430B1CC5 /* MessageType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageType.swift; path = Sources/Protocols/MessageType.swift; sourceTree = ""; };
- 62139DCBA3CC67FD2E57BE20D6C1D138 /* IQUIScrollView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIScrollView+Additions.swift"; path = "IQKeyboardManagerSwift/Categories/IQUIScrollView+Additions.swift"; sourceTree = ""; };
- 6619A6A67C53A6B104DC88DC7D430CA5 /* IQKeyboardManager+UITextFieldViewNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+UITextFieldViewNotification.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager+UITextFieldViewNotification.swift"; sourceTree = ""; };
- 67B60E1DC78386AB93392F129437C49E /* String+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Extensions.swift"; path = "Sources/Extensions/String+Extensions.swift"; sourceTree = ""; };
- 68B71A1231B65F2941ECDB67BC911737 /* ContactItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContactItem.swift; path = Sources/Protocols/ContactItem.swift; sourceTree = ""; };
- 6929EF815BB6FAAB0906A1049EDFDE72 /* KeyboardNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KeyboardNotification.swift; path = Sources/KeyboardManager/KeyboardNotification.swift; sourceTree = ""; };
- 6952796EFE5FD323D7323DD089F1E452 /* IQPlaceholderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPlaceholderable.swift; path = IQKeyboardManagerSwift/IQTextView/IQPlaceholderable.swift; sourceTree = ""; };
- 69B199C4CCB4C8084AC5A51B6644664D /* MessageKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "MessageKit-Info.plist"; sourceTree = ""; };
+ 55CB4BC3A6B1E3017CD3F4D5A97BB9F4 /* Engine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Engine.swift; path = Sources/Engine/Engine.swift; sourceTree = ""; };
+ 57C226E19146357A9D7CD958EAAB52DD /* UIScrollView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+IQKeyboardManagerExtension.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift"; sourceTree = ""; };
+ 58DAB91268A343ED17ADDE33166CA63A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+ 5964ECD76ED5E9FB05D7D92B5AF6C7CB /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift; sourceTree = ""; };
+ 59F9A3BA4CD3A76882F0B6950DC43D51 /* SocketIOStatus.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOStatus.swift; path = Source/SocketIO/Client/SocketIOStatus.swift; sourceTree = ""; };
+ 5A38E7D315A22ED099D82B2E8EAEA29B /* ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist"; sourceTree = ""; };
+ 5AC382ACD7143785B6C1618CCE66751C /* Mediasoup.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; name = Mediasoup.xcframework; path = Frameworks/Mediasoup.xcframework; sourceTree = ""; };
+ 5C31B5449A5C286DE26DAD1B5FE25C65 /* UIView+RespondersObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+RespondersObjc.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift"; sourceTree = ""; };
+ 5C5ADC56FA4C5F8E8623DE1AA5996821 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 5E39D74B8690F4BDBD03734AFFB80513 /* IQKeyboardToolbarManager+Toolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Toolbar.swift"; path = "IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift"; sourceTree = ""; };
+ 5EFE454AFE5D1E58E79D130FD9BEA40F /* UIView+ParentObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+ParentObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift"; sourceTree = ""; };
+ 5F81F97211749AB966D595E0EDA79913 /* IQKeyboardManagerSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManagerSwift.modulemap; sourceTree = ""; };
+ 5FFD67C073AB7CA07FE44FCED12A08A2 /* IQKeyboardToolbar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardToolbar-dummy.m"; sourceTree = ""; };
+ 608F6F41A9391F60898174E49FDE5178 /* MessagesCollectionViewFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessagesCollectionViewFlowLayout.swift; path = Sources/Layout/MessagesCollectionViewFlowLayout.swift; sourceTree = ""; };
+ 613526F352CBDF018DFEE591C6D60DC4 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+IQKeyboardManagerExtensionObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift"; sourceTree = ""; };
+ 6241EEE4F83F805A4AB9C2D43DFFBA0A /* IQTextInputViewNotification-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQTextInputViewNotification-dummy.m"; sourceTree = ""; };
+ 6279D94358BB7E5322E5AAB7A0F8A870 /* InputBarViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputBarViewController.swift; path = Sources/ViewControllers/InputBarViewController.swift; sourceTree = ""; };
+ 651A4582189EE6452E1689302BD3F58D /* MessageKitError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageKitError.swift; path = Sources/Models/MessageKitError.swift; sourceTree = ""; };
+ 65324709503F60CC6770F2003595E60A /* IQBarButtonItemConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItemConfiguration.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift; sourceTree = ""; };
+ 654B30A3B37DF5FA3128CE233C81E56B /* IQKeyboardCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardCore.debug.xcconfig; sourceTree = ""; };
+ 65605BC9E935D60C3F5DFA0BF1D6436D /* IQKeyboardExtended.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardExtended.swift; path = IQKeyboardCore/Classes/IQKeyboardExtended.swift; sourceTree = ""; };
+ 66C0B78D2D42218C0C4116FD4F2EADE5 /* AutocompleteCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutocompleteCell.swift; path = Sources/Plugins/AutocompleteManager/Views/AutocompleteCell.swift; sourceTree = ""; };
+ 670259C41289D1489932D23FC9C24832 /* AutocompleteManagerDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutocompleteManagerDelegate.swift; path = Sources/Plugins/AutocompleteManager/Protocols/AutocompleteManagerDelegate.swift; sourceTree = ""; };
+ 68B6E7887BFFE64B944DFB64BE076D1A /* InputBarAccessoryView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = InputBarAccessoryView.release.xcconfig; sourceTree = ""; };
69CE4CD37F22682781DE112B83BEFCCE /* Pods-VideoSDKRTC_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-VideoSDKRTC_Example-frameworks.sh"; sourceTree = ""; };
- 6CBF029A8CA6761F88581D7049C1048E /* MessageInputBar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageInputBar.swift; path = Sources/Supporting/MessageInputBar.swift; sourceTree = ""; };
- 6D37A31757D3D8EA64D521F136FCB1CD /* MessageContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageContainerView.swift; path = Sources/Views/MessageContainerView.swift; sourceTree = ""; };
- 6F25A0115FB9BA9B9AF88359BB253457 /* VideoSDKRTC-xcframeworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "VideoSDKRTC-xcframeworks.sh"; sourceTree = ""; };
- 6FA29EC7D5F1BA27D7E7B07252052237 /* IQUIView+Hierarchy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIView+Hierarchy.swift"; path = "IQKeyboardManagerSwift/Categories/IQUIView+Hierarchy.swift"; sourceTree = ""; };
- 72B074EF336FE90C918FFBA335D55AFB /* MessagesViewController+Keyboard.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "MessagesViewController+Keyboard.swift"; path = "Sources/Controllers/MessagesViewController+Keyboard.swift"; sourceTree = ""; };
- 72C96168350F92945B513B3B5DEC81E3 /* LocationMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LocationMessageCell.swift; path = Sources/Views/Cells/LocationMessageCell.swift; sourceTree = ""; };
- 731C0EC9679CB7C9AC544DE6F8568B36 /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager.swift; sourceTree = ""; };
- 764038EAAB0193D2CB6F5739C5CC2215 /* InputBarAccessoryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputBarAccessoryView.swift; path = Sources/InputBarAccessoryView.swift; sourceTree = ""; };
- 76646FDD138158653294A8617A54E207 /* UIColor+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Extensions.swift"; path = "Sources/Extensions/UIColor+Extensions.swift"; sourceTree = ""; };
- 769C02BC00ACF85DB15132D9DA6CC94C /* IQKeyboardManagerSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManagerSwift-dummy.m"; sourceTree = ""; };
+ 69DBFD69F5BA4853521E42EA2BDF9FB0 /* UIView+Resign.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Resign.swift"; path = "IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+Resign.swift"; sourceTree = ""; };
+ 6C10F4DED71C0ABE08B4DAA055738165 /* UIView+IQKeyboardExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtension.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift"; sourceTree = ""; };
+ 6C54C4A56AD343BA3E21DF95BCD0A3FB /* MediaMessageCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MediaMessageCell.swift; path = Sources/Views/Cells/MediaMessageCell.swift; sourceTree = ""; };
+ 6D3565AC9C1CD7DEE7B7B86715BD619F /* IQTextView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQTextView.modulemap; sourceTree = ""; };
+ 6DC9EE0DEEE71EFC6F0DDE630C73D77D /* LinkPreviewFonts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinkPreviewFonts.swift; path = Sources/Models/LinkPreviewFonts.swift; sourceTree = ""; };
+ 6E24C2330BF4EA04710E2202DCF7CDC6 /* IQScrollViewConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQScrollViewConfiguration.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift; sourceTree = ""; };
+ 6E479173EDFF90FABD591BBA6280BBB2 /* ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist"; sourceTree = ""; };
+ 6E4B7D7138C14EC0A6B19096F95E0AEA /* IQKeyboardManagerSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.release.xcconfig; sourceTree = ""; };
+ 6E685EB5F9C179BD5EA94F757DA8ADC4 /* IQTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextView.swift; path = IQTextView/Classes/IQTextView.swift; sourceTree = ""; };
+ 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardCore-IQKeyboardCore"; path = IQKeyboardCore.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 6F8B4F4FD7AF6D41DD589FA08ACB546E /* SocketIOClient.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketIOClient.swift; path = Source/SocketIO/Client/SocketIOClient.swift; sourceTree = ""; };
+ 71B8A50BE53EF5AD7DDD9AA35D400F8B /* SocketEngineSpec.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SocketEngineSpec.swift; path = Source/SocketIO/Engine/SocketEngineSpec.swift; sourceTree = ""; };
+ 733B301EAB503165DCF89A94D08216E2 /* HorizontalEdgeInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HorizontalEdgeInsets.swift; path = Sources/Models/HorizontalEdgeInsets.swift; sourceTree = ""; };
+ 73C94B08E5E8A6753D68C5A5C6731ED7 /* UIView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardManagerExtension.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift"; sourceTree = ""; };
+ 74E22D78489209FBD5A99F9FC9BD14F7 /* IQRootControllerConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQRootControllerConfiguration.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift; sourceTree = ""; };
+ 758A1AE725D2B52779D0B0C8E4AAF624 /* AttachmentManagerDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AttachmentManagerDelegate.swift; path = Sources/Plugins/AttachmentManager/Protocols/AttachmentManagerDelegate.swift; sourceTree = ""; };
+ 75AAC64397EA9CC5A27AA9E291EC8557 /* AudioItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AudioItem.swift; path = Sources/Protocols/AudioItem.swift; sourceTree = ""; };
+ 75C846518E523ED197CAD7ED7DF2057A /* Socket.IO-Client-Swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Socket.IO-Client-Swift-umbrella.h"; sourceTree = ""; };
+ 777C27DDF65B45F1B0CD4D511458C32E /* LinkPreviewMessageSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LinkPreviewMessageSizeCalculator.swift; path = Sources/Layout/LinkPreviewMessageSizeCalculator.swift; sourceTree = ""; };
78454B04E3B0C3056579166BAE1C939F /* Pods-VideoSDKRTC_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-VideoSDKRTC_Example-dummy.m"; sourceTree = ""; };
- 79140A4B7F71064DBCFBBF67BF895A62 /* InputBarViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputBarViewController.swift; path = Sources/ViewControllers/InputBarViewController.swift; sourceTree = ""; };
- 79CF7D56C5D50C18B2EA0ED106D998C7 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
- 79DCDCEEAF977077EFE4FA6B38CBEE04 /* InputBarAccessoryViewDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputBarAccessoryViewDelegate.swift; path = Sources/Protocols/InputBarAccessoryViewDelegate.swift; sourceTree = ""; };
- 7A6408E47FDDF35D41EC0CFE9A48B1B0 /* IQUIViewController+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQUIViewController+Additions.swift"; path = "IQKeyboardManagerSwift/Categories/IQUIViewController+Additions.swift"; sourceTree = ""; };
- 7AE7A40568D041FE92D9CAD0A2E29BE2 /* InputBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InputBarButtonItem.swift; path = Sources/Controls/InputBarButtonItem.swift; sourceTree = ""; };
- 7EF3DE9894454F508B7CCAF547EC5AF4 /* MessagesViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessagesViewController.swift; path = Sources/Controllers/MessagesViewController.swift; sourceTree = ""; };
- 7F04AE3B61B00D98D9504B22523759FB /* MessagesCollectionViewLayoutAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessagesCollectionViewLayoutAttributes.swift; path = Sources/Layout/MessagesCollectionViewLayoutAttributes.swift; sourceTree = ""; };
- 808272F7C43F8F467937F4F0501A5E8F /* TypingIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TypingIndicator.swift; path = Sources/Views/TypingIndicator.swift; sourceTree = ""; };
- 816F1A5B831F6810CAADA69E18D0DDE2 /* IQKeyboardManager+Toolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Toolbar.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager+Toolbar.swift"; sourceTree = ""; };
- 81B89A002F44FCEADC029B4AD6C4761F /* SenderType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SenderType.swift; path = Sources/Protocols/SenderType.swift; sourceTree = ""; };
- 83C4049B181843CE3DBD41583DFB5855 /* IQKeyboardManagerSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManagerSwift.modulemap; sourceTree = ""; };
- 83D1C3F2CE16EDB56426810CA01D159C /* ContactMessageSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContactMessageSizeCalculator.swift; path = Sources/Layout/ContactMessageSizeCalculator.swift; sourceTree = ""; };
- 840FA0B75AF62912A30DDC66B647ED98 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
+ 7ADC231F16A7A440FC036F01F7EF8A81 /* ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist"; sourceTree = ""; };
+ 7BA6BD39C6DEB0237BF29162D3E0AD6B /* IQDeepResponderContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQDeepResponderContainerView.swift; path = IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift; sourceTree = ""; };
+ 7BF682ED94361524833B5ADFBC008446 /* IQKeyboardToolbarManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbarManager.debug.xcconfig; sourceTree = ""; };
+ 7C20FA8A7780B7071CF5C30CD05D5C79 /* IQKeyboardToolbarManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbarManager-prefix.pch"; sourceTree = ""; };
+ 7C2A1C9B42FE2CC096963F28981CACA2 /* IQKeyboardReturnManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardReturnManager-dummy.m"; sourceTree = ""; };
+ 7C50E69DF4A8947DE66309723BD591CA /* NSNotification+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSNotification+Extensions.swift"; path = "Sources/Extensions/NSNotification+Extensions.swift"; sourceTree = ""; };
+ 7C5C99DA8EB49E8016C03D3C9760F7EF /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardManagerSwift/PrivacyInfo.xcprivacy; sourceTree = ""; };
+ 7CC00910A11AC9660E3063AA7396EA27 /* IQKeyboardNotification.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardNotification.modulemap; sourceTree = ""; };
+ 7D1548D9491959B1A19F368A77D9AA3D /* TypingIndicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TypingIndicator.swift; path = Sources/Views/TypingIndicator.swift; sourceTree = ""; };
+ 7F6D05237525C109FC759311BF92E19E /* ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist"; sourceTree = ""; };
+ 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardToolbarManager-IQKeyboardToolbarManager"; path = IQKeyboardToolbarManager.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8155DF29534DBC6F3A889A361EE368FA /* AudioMessageSizeCalculator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AudioMessageSizeCalculator.swift; path = Sources/Layout/AudioMessageSizeCalculator.swift; sourceTree = ""; };
+ 82E4E2A8D2B90ED5ED67F286151BB155 /* Security.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Security.swift; path = Sources/Security/Security.swift; sourceTree = ""; };
+ 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQTextView-IQTextView"; path = IQTextView.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+ 84AF8EF00135AB32D33F8145939D5715 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnManager+UITextFieldDelegate.swift"; path = "IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift"; sourceTree = ""; };
+ 851EB002E4118FB341EA033E8F88E19D /* MessageKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "MessageKit-prefix.pch"; sourceTree = "