STPopup provides STPopupController, which works just like UINavigationController in popup style, for both iPhone and iPad. It's written in Objective-C and compatible with Swift.

Overview

STPopup CI Status Version License

STPopup provides STPopupController, which works just like UINavigationController in popup style, for both iPhone and iPad. It's written in Objective-C and compatible with Swift.

Features:

  • Push/Pop view controller into/out of STPopupController just like UINavigationController.
  • Set navigation items through self.navigationItem just like using a UINavigationController.
  • Support both "Form Sheet" and "Bottom Sheet" style.
  • Work well with storyboard(including segue).
  • Customize UI by using UIAppearance.
  • Customizable popup transition style.
  • Auto-reposition of popup view when keyboard shows up, make sure your UITextField/UITextView won't be covered by the keyboard.
  • Drag navigation bar to dismiss popup view.
  • Support both portrait and landscape orientation in iPhone and iPad.
  • iOS 7+.
  • Compatible with Swift.

Use Cases

Use Cases

Get Started

CocoaPods

pod 'STPopup'

Carthage

github "kevin0571/STPopup"

Import header file
Objective-C

#import <STPopup/STPopup.h>

Swift

import STPopup

Initialize and present STPopupController
Objective-C

STPopupController *popupController = [[STPopupController alloc] initWithRootViewController:viewController];
[popupController presentInViewController:self];

Swift

let popupController = STPopupController(rootViewController: viewController)
popupController.present(in: self)

Set content size in view controller
Objective-C

@implementation ViewController

- (instancetype)init
{
    if (self = [super init]) {
        self.title = @"View Controller";
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStylePlain target:self action:@selector(nextBtnDidTap)];
        // It's required to set content size of popup.
        self.contentSizeInPopup = CGSizeMake(300, 400);
        self.landscapeContentSizeInPopup = CGSizeMake(400, 200);
    }
    return self;
}

@end

Swift

class ViewController: UIViewController {
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        title = "View Controller"
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(nextBtnDidTap))
        // It's required to set content size of popup.
        contentSizeInPopup = CGSize(width: 300, height: 400)
        landscapeContentSizeInPopup = CGSize(width: 400, height: 200)
    }
}

Set content size of view controller which is loaded from Storyboard
Set content size in storyboard or in awakeFromNib.
Storyboard

Push, pop and dismiss view controllers
Objective-C

[self.popupController pushViewController:[ViewController new] animated:YES];
[self.popupController popViewControllerAnimated:YES]; // Popup will be dismissed if there is only one view controller in the popup view controller stack
[self.popupController dismiss];

Swift

popupController?.push(viewController, animated: true)
popupController?.popViewController(animated: true) // Popup will be dismissed if there is only one view controller in the popup view controller stack
popupController?.dismiss()

Push & Pop

Bottom sheet style
Objective-C

STPopupController *popupController = [[STPopupController alloc] initWithRootViewController:[ViewController new]];
popupController.style = STPopupStyleBottomSheet;
[popupController presentInViewController:self];

Swift

let popupController = STPopupController(rootViewController: viewController)
popupController.style = .bottomSheet
popupController.present(in: self)

Bottom Sheet

Customize popup transition style
Objective-C

#pragma mark - STPopupControllerTransitioning

- (NSTimeInterval)popupControllerTransitionDuration:(STPopupControllerTransitioningContext *)context
{
    return context.action == STPopupControllerTransitioningActionPresent ? 0.5 : 0.35;
}

- (void)popupControllerAnimateTransition:(STPopupControllerTransitioningContext *)context completion:(void (^)())completion
{
    // Popup will be presented with an animation sliding from right to left.
    UIView *containerView = context.containerView;
    if (context.action == STPopupControllerTransitioningActionPresent) {
        containerView.transform = CGAffineTransformMakeTranslation(containerView.superview.bounds.size.width - containerView.frame.origin.x, 0);
        
        [UIView animateWithDuration:[self popupControllerTransitionDuration:context] delay:0 usingSpringWithDamping:1 initialSpringVelocity:1 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            context.containerView.transform = CGAffineTransformIdentity;
        } completion:^(BOOL finished) {
            completion();
        }];
    }
    else {
        [UIView animateWithDuration:[self popupControllerTransitionDuration:context] delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
            containerView.transform = CGAffineTransformMakeTranslation(- 2 * (containerView.superview.bounds.size.width - containerView.frame.origin.x), 0);
        } completion:^(BOOL finished) {
            containerView.transform = CGAffineTransformIdentity;
            completion();
        }];
    }
}

// Use custom transitioning in popup controller
STPopupController *popupController = [[STPopupController alloc] initWithRootViewController:viewController];
popupController.transitionStyle = STPopupTransitionStyleCustom;
popupController.transitioning = self;
[popupController presentInViewController:self];

Swift

// MARK: STPopupControllerTransitioning

func popupControllerTransitionDuration(_ context: STPopupControllerTransitioningContext) -> TimeInterval {
    return context.action == .present ? 0.5 : 0.35
}

func popupControllerAnimateTransition(_ context: STPopupControllerTransitioningContext, completion: @escaping () -> Void) {
    // Popup will be presented with an animation sliding from right to left.
    let containerView = context.containerView
    if context.action == .present {
        containerView.transform = CGAffineTransform(translationX: containerView.superview!.bounds.size.width - containerView.frame.origin.x, y: 0)
        UIView.animate(withDuration: popupControllerTransitionDuration(context), delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
            containerView.transform = .identity
        }, completion: { _ in
            completion()
        });
    } else {
        UIView.animate(withDuration: popupControllerTransitionDuration(context), delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
            containerView.transform = CGAffineTransform(translationX: -2 * (containerView.superview!.bounds.size.width - containerView.frame.origin.x), y: 0)
        }, completion: { _ in
            containerView.transform = .identity
            completion()
        });
    }
}

// Use custom transitioning in popup controller
let popupController = let popupController = STPopupController(rootViewController: viewController)
popupController.transitionStyle = .custom
popupController.transitioning = self
popupController.present(in: self)

Blur background
Objective-C

STPopupController *popupController = [[STPopupController alloc] initWithRootViewController:[PopupViewController1 new]];
if (NSClassFromString(@"UIBlurEffect")) {
    UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
    popupController.backgroundView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
}

Swift

let popupController = let popupController = STPopupController(rootViewController: viewController)
if NSClassFromString("UIBlurEffect") != nil {
    let blurEffect = UIBlurEffect(style: .dark)
    popupController.backgroundView = UIVisualEffectView(effect: blurEffect)
}

Action of tapping on area outside of popup
Objective-C

[popupController.backgroundView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgroundViewDidTap)]];

Swift

popupController.backgroundView?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(backgroundViewDidTap)))

Customize UI
Objective-C

[STPopupNavigationBar appearance].barTintColor = [UIColor colorWithRed:0.20 green:0.60 blue:0.86 alpha:1.0];
[STPopupNavigationBar appearance].tintColor = [UIColor whiteColor];
[STPopupNavigationBar appearance].barStyle = UIBarStyleDefault;
[STPopupNavigationBar appearance].titleTextAttributes = @{ NSFontAttributeName: [UIFont fontWithName:@"Cochin" size:18], NSForegroundColorAttributeName: [UIColor whiteColor] };
    
[[UIBarButtonItem appearanceWhenContainedIn:[STPopupNavigationBar class], nil] setTitleTextAttributes:@{ NSFontAttributeName:[UIFont fontWithName:@"Cochin" size:17] } forState:UIControlStateNormal];

Swift

STPopupNavigationBar.appearance().barTintColor = UIColor(red: 0.2, green: 0.6, blue: 0.86, alpha: 1)
STPopupNavigationBar.appearance().tintColor = .white
STPopupNavigationBar.appearance().barStyle = .default
STPopupNavigationBar.appearance().titleTextAttributes = [
    .font: UIFont(name: "Cochin", size: 18) ?? .systemFont(ofSize: 18),
    .foregroundColor: UIColor.white,
]
UIBarButtonItem
    .appearance(whenContainedInInstancesOf: [STPopupNavigationBar.self])
    .setTitleTextAttributes([
        .font: UIFont(name: "Cochin", size: 18) ?? .systemFont(ofSize: 18),
        ], for: .normal)

Customize UI

Auto-reposition when keyboard is showing up
This is default behavior.
Auto-reposition

Drag to dismiss
This is default behavior.
Drag to dismiss

Handle orientation change
This is default behavior.
Orientation change

Please checkout the example project for more details.

Comments
  • Ton of Crashes

    Ton of Crashes

    Hey! We got like 120 crashes on this line:

    UIResponder+STPopup.m line 35 -[UIResponder(STPopup) st_becomeFirstResponder]

    Any ideas whats going on? Thanks Kevin!

    opened by nikilster 10
  • Animation problem on Tabbar

    Animation problem on Tabbar

    Hi,

    we're using latest version on STPopup in our app. There is a problem when we present the STPopup from a ViewController contained into Tabbar.

    These are the steps:

    1. Present STPopup
    2. STPopup appears for about 500ms without animation
    3. STPopup disappears
    4. STPopup appears with animation

    Thank you

    opened by nottix 9
  • considering in-call status bar frame changes

    considering in-call status bar frame changes

    First of all Great Lib and now it will be a part of my default Pods

    All things are great just one thing and it might not be an issue with Lib because i have not explore the lib that much.

    Issue or suggestion

    considering in-call status bar frame changes

    Now i am setting the height of contentSizeInPopup in this way and it works awesome with dynamic height

    override func viewDidLoad() {
            super.viewDidLoad()
            self.tableView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.New, context: nil)
            self.contentSizeInPopup = CGSizeMake(UIScreen().bounds.width, self.tableView.contentSize.height ?? 200)
    
      }
    
        override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
            guard let _ = self.tableView else {
                return
            }
            self.contentSizeInPopup = CGSizeMake(UIScreen().bounds.width, self.tableView.contentSize.height ?? 200)
    
        } 
    

    But during the in-call status bar where the size of status bar increased with 40px, At that time popup got shifts down with 20px and was not able to scroll to the bottom of the last cell. so what is the better way to handle this ? any help, Thanks in advanced.

    bug 
    opened by hardikdevios 8
  • Dismiss by background tap is not working

    Dismiss by background tap is not working

    I've done like readme but it's not working, it's a bug? NSlog trigger show fine but popup never close.

    - (void)showPopupDaudit{
        STPopupController *popupController = [[STPopupController alloc] initWithRootViewController:[POPViewController new]];
        [STPopupNavigationBar appearance].tintColor = MP_HEX_RGB(MAINCOLOR);
        popupController.containerView.layer.cornerRadius = 4;
        if (NSClassFromString(@"UIBlurEffect")) {
            UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
            popupController.backgroundView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        }
        [popupController.backgroundView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backgroundViewDidTap:)]];
        [popupController presentInViewController:self];
    }
    - (IBAction)backgroundViewDidTap:(id)sender
    {
        [self.popupController dismiss];
        NSLog(@"Tapping in background.");
    }
    
    opened by vietnguyen09 7
  • Tableview can't scroll down

    Tableview can't scroll down

    I'm having an issue where if the view controller being displayed is a table view you're unable to scroll down.

    I've made a rewritten "PopupViewController1" that you can drop into the sample to see what I mean.

    https://gist.github.com/barrettj/fb7740136e2812c0bf46

    opened by barrettj 7
  • Container does not respect safe are bottom inset on iPhone X

    Container does not respect safe are bottom inset on iPhone X

    When popup is presented as bottomSheet, the content is pushed lower than it should be on iPhone X.

    On gif attached below: • big green button is properly pinned to the bottom edge of safe area • container view's background is tinted red to indicate wrong offset as I pull it up

    bottom inset bug

    opened by jakubheglas 6
  • self.popupController is NULL after presenting MFMessageComposeViewController

    self.popupController is NULL after presenting MFMessageComposeViewController

    We fire up a text message composer from clicking on one of the tableview cells. After dismissing it with [self dismissViewControllerAnimated:completion:] the next time you click on one of the cells, self.popupController is NULL and we can no longer dismiss the controller with [self.popupController dismiss].

    opened by nikilster 6
  • Version 1.8.4 introduced a breaking of layout for iPhones with SafeArea

    Version 1.8.4 introduced a breaking of layout for iPhones with SafeArea

    I believe it's connected to the fix https://github.com/kevin0571/STPopup/issues/102

    It broke my layout, because now the root controller doesn't stick to the bottom and it creates a gap within the safe area. I believe it shouldn't be like that and it should be our job to control the layout of the root controller, because now it seems we can't stick it back to the bottom of the screen.

    I also think it might have broken the behavior of many apps, so, please consider to revert it or provide a way to stick it to the bottom. If you know the way to do that by just using some properties, please let me know.

    Thanks for the great library! Hope you can help me.

    popController = STPopupController(rootViewController: myViewController)
    let blurEffect = UIBlurEffect(style: .dark)
    popController?.backgroundView = UIVisualEffectView(effect: blurEffect)
    popController?.containerView.backgroundColor = UIColor.clear
    popController?.style = STPopupStyle.bottomSheet
    popController?.navigationBarHidden = true
    popController?.present(in: self)
    
    v_1_8_4 Screen Shot 2019-03-15 at 13 33 52
    opened by Ariandr 5
  • navigationBar_titleView_wrongPosition

    navigationBar_titleView_wrongPosition

    I found this issue when upgrade my project to iOS11 the problem looks like an artefact of previous VS's title view in top left corner on destination VS's view when Push/Unwind segue was called. ..I use custom view on navigationItem.titleView

    the problem, I think in - (void)updateNavigationBarAniamted:(BOOL)animated module: STPopupController.m : line:

    [_navigationBar addSubview:fromTitleView];

    I comment this lines of code for now - but I think it has to be resolved in future screens with problem:

    1. https://github.com/nikolay-dementiev/stPopUpIssue/blob/master/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202018-04-12%20%D0%B2%2017.55.04.png
    2. https://github.com/nikolay-dementiev/stPopUpIssue/blob/master/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0%202018-04-12%20%D0%B2%2017.54.12.png

    if I can be helpful - please contact with me

    opened by nikolay-dementiev 5
  • Can you disable

    Can you disable "Drag navigation bar to dismiss popup view"

    Took a quick look and didn't see a way to disable the "Drag navigation bar to dismiss popup view" feature - is that something that I just overlooked or expected to be named differently?

    opened by barrettj 5
  • Adjust top position

    Adjust top position

    Hi there,

    I would like to Adjust top margin because I have ADS banner at bottom, so if I adjust height to see ads then my popup view is too low.

    I've been trying to add CGrectMake but doesn't work.

    Secondly, I want to make close button position X to right instead of left.

    Thanks

    opened by vietnguyen09 4
  • Main Thread Checker: UI API called on a background thread: -[UIViewController parentViewController]

    Main Thread Checker: UI API called on a background thread: -[UIViewController parentViewController]

    ================================================================= Main Thread Checker: UI API called on a background thread: -[UIViewController presentedViewController] PID: 16941, TID: 3137868, Thread name: (none), Queue name: com.apple.photos.accessCallbacks, QoS: 0 Backtrace: 4 STPopup 0x000000010313910c -[UIViewController(STPopup) st_presentedViewController] + 72 5 PhotosUI 0x000000020383bdd8 51E602DA-1E0B-3CA1-8DE6-43DD423F795D + 56792 6 PhotoLibraryServicesCore 0x00000001b50d09fc PLPresentLimitedLibraryPicker + 388 7 PhotoLibraryServicesCore 0x00000001b506dca4 95A95CAA-BF77-3E3A-965E-4F252119845E + 23716 8 libdispatch.dylib 0x0000000103c8c5a8 _dispatch_call_block_and_release + 32 9 libdispatch.dylib 0x0000000103c8e05c _dispatch_client_callout + 20 10 libdispatch.dylib 0x0000000103c9610c _dispatch_lane_serial_drain + 988 11 libdispatch.dylib 0x0000000103c96e68 _dispatch_lane_invoke + 472 12 libdispatch.dylib 0x0000000103ca3cbc _dispatch_workloop_worker_thread + 740 13 libsystem_pthread.dylib 0x00000001ecbdbdf8 _pthread_wqthread + 288 14 libsystem_pthread.dylib 0x00000001ecbdbb98 start_wqthread + 8

    opened by Parkour-zhou 0
  • Enable interaction with vc behind popup on present

    Enable interaction with vc behind popup on present

    Hi, just wondering does this library support user interaction on behind view during popup present? Like when a popup is presented, user will still able to interact with the view behind it, not blocked by the UITransitionView Screen Shot 2021-02-14 at 8 45 26 PM

    opened by hanishassim 0
  • 当控制器里面有个属性名也叫popupController时,就会崩溃

    当控制器里面有个属性名也叫popupController时,就会崩溃

    很明显,集成了STPopup,我的任何控制器都不允许使用一个同名popupController的属性,即使我不用STPopup的时候。因为一定会在[[self.popupController valueForKey:@"containerViewController"] presentingViewController];这里崩溃

    opened by Lovezysong 0
  • crashing on iPhone 6  version 12.2

    crashing on iPhone 6 version 12.2

    Hi,

    Application is crashing only on iPhone 6 with iOS version 12.2.

    [_contentView addSubview:topViewController.view]; line number 871 (STPopupController)

    *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 0]' terminating with uncaught exception of type NSException CoreSimulator 732.18.0.2 - Device: iPhone 6 (D38AC3B5-302C-48C0-8909-9EA5CA54A7B1) - Runtime: iOS 12.2 (16E226) - DeviceType: iPhone 6 Printing description of ((id)0x111a636e3): (id) [0] = 0x0000000111a636e3

    Any reference please revert.

    opened by neen-tech 0
Releases(1.8.7)
Owner
Kevin Lin
Facebook/Mobile UI Frameworks
Kevin Lin
A simple, customizable popup dialog for iOS written in Swift. Replaces UIAlertController alert style.

Introduction Popup Dialog is a simple, customizable popup dialog written in Swift. Features Easy to use API with hardly any boilerplate code Convenien

Orderella Ltd. 3.8k Dec 20, 2022
A framework for presenting bars and view controllers as popup, much like the look and feel of Apple Music App.

PBPopupController PBPopupController is a framework for presenting bars and view controllers as popup, much like the look and feel of Apple Music App.

Patrick 58 Dec 3, 2022
SSToastMessage is written purely in SwiftUI. It will add toast, alert, and floating message view over the top of any view. It is intended to be simple, lightweight, and easy to use. It will be a popup with a single line of code.

SSToastMessage SSToastMessage is written in SwiftUI. It will add toast, alert, and floating message view over the top of any view. It is intended to b

Simform Solutions 223 Dec 2, 2022
Simple Swift class for iOS that shows nice popup windows with animation.

NMPopUpView Simple class for iOS that shows nice popup windows, written in Swift. The project is build with Swift 4.0, so you need Xcode 9.0 or higher

Nikos Maounis 194 Jun 5, 2022
PopupWindow is a simple Popup using another UIWindow in Swift

PopupWindow PopupWindow is a simple Popup using another UIWindow Feature PopupWindow can be displayed at the top or bottom of the screen. Popup can se

shinji hayashi 415 Dec 5, 2022
Simple way to present custom views as a popup in iOS and tvOS.

PopupKit PopupKit is a simple and flexible iOS framework for presenting any custom view as a popup. It includes a variety of options for controlling h

Pointwelve 59 Mar 1, 2022
PopupController is a controller for showing temporary popup view.

PopupController PopupController is a controller for showing temporary popup view. Demo Try PopupController on Appetize.io Installation CocoaPods pod '

daisuke sato 338 Dec 14, 2022
A lightweight library for popup view

SHPopup SHPop is lightweight library used for popup view Sample One Sample Two Sample Three Features SHPopup supports a popup inside another popup wit

Shezad Ahamed 37 Oct 2, 2022
⛩ Presenting custom views as a popup in iOS.

FFPopup is a lightweight library for presenting custom views as a popup. Bounce from Top & Bounce to Bottom Bounce from Top & Bounce to Top Bounce in

JonyFang 828 Jan 5, 2023
The library allows to create simple popup menus

react-native-popup-menu This library allows to create simple popup menus Installation "react-native-popup-menu": "sergeymild/react-native-popup-menu"

SergeyMild 0 Aug 20, 2022
WKWebView handling popup windows

WKWebViewWithPopUp WKWebView handling pop-up windows Property If there is a pop-up window, use the pop-up window. If there is no pop-up window, use th

Hankyeol Park 7 Nov 23, 2022
IAMPopup is a simple class for expressing custom popup in various forms.

IAMPopup Introduction IAMPopup is a simple class for expressing custom popup in various forms. This includes where to display the popup and space to d

Hosung Kang 18 Dec 29, 2022
Popover is a balloon library like Facebook app. It is written in pure swift.

Popover Description and appetize.io`s DEMO Usage To run the example project, clone the repo, and run pod install from the Example directory first. Sim

Yusuke Takahashi 2k Jan 2, 2023
Show MS Windows style activation dialog on my screen.

Activate Mac The "Activate Windows" watermark ported to macOS with Swift Objective-C. Special thanks: MrGlockenspiel/activate-linux for the idea. Inst

Lakr Aream 195 Dec 23, 2022
LNPopupController is a framework for presenting view controllers as popups of other view controllers, much like the Apple Music and Podcasts apps.

LNPopupController LNPopupController is a framework for presenting view controllers as popups of other view controllers, much like the Apple Music and

Leo Natan 2.9k Jan 2, 2023
Subscription View Controller like the Tinder uses

SubscriptionPrompt SubscriptionPrompt is a UIViewController with a carousel at the top and a number of rows at the bottom. Written in Swift, works for

Binur Konarbai 235 Nov 17, 2022
Toasts and popups library written with SwiftUI

Popup View Toasts and popups library written with SwiftUI We are a development agency building phenomenal apps. Usage Put all your body code into a ZS

Exyte 1.9k Jan 6, 2023
Swift wrapper for custom ViewController presentations on iOS

Presentr is a simple customizable wrapper for the Custom View Controller Presentation API introduced in iOS 8. About iOS let's you modally present any

Icalia Labs 2.9k Jan 3, 2023
JSPatch bridge Objective-C and Javascript using the Objective-C runtime. You can call any Objective-C class and method in JavaScript by just including a small engine. JSPatch is generally used to hotfix iOS App.

JSPatch 中文介绍 | 文档 | JSPatch平台 请大家不要自行接入 JSPatch,统一接入 JSPatch 平台,让热修复在一个安全和可控的环境下使用。原因详见 这里 JSPatch bridges Objective-C and JavaScript using the Object

bang 11.4k Jan 1, 2023
A simple and opinionated AES encrypt / decrypt Objective-C class that just works.

AESCrypt-ObjC - Simple AES encryption / decryption for iOS and OS X AESCrypt is a simple to use, opinionated AES encryption / decryption Objective-C c

Gurpartap Singh 782 Oct 12, 2022