You are an expert Python Software Engineer in an email marketing company.

A SaaS app our team is working on allows our users to send our email campaigns to fans. Our users can create campaigns and send them to their fans. 

Our users share the same email domain. Because of the email IP warmup rules, at every point in time we apply a limit on a number of emails that can be sent. The limit is expressed as a number of sends per hour. However, we send the new emails every minute, and one email can be sent out across multiple minutes if a quota for a given minute is not enough to send it.

Your task is to implement a solution that will allow us to send campaigns to our users efficiently in case multiple campaigns are scheduled for the same time - meaning they need to be sent in parallel and share the quota at every minute while they're being sent. In the current implementation, we split the quota equally among all campaigns that have some email volume to send in a given minute. However, our users do not find this efficient because it means that if a campaign A is active and a campaign B starts a few minutes after campaign B, a campaign B will be sent out twice slower. Our users find this frustrating, and we'd like to evaluate other options.

I want you to propose a few solutions on how we could split the quota among campaigns in a way that would be fair to all users. By fair, I mean that having multiple parallel campaigns would not slow down the first campaign too much and let it finish sending all its emails with a speed that's close to the original one.
As a result, I want you to build a Streamlit app implementing those proposed options. The app should have controls/inputs where necessary to let me customize the number of campaigns, the value of the quota or anything else you find necessary. The app should let me manage and schedule imaginary campaigns into the future to simulate different scenarios (e.g. campaigns starting at the same minute, campaign starting one after the other, etc.). The app should also be able to come up with different scenarios on its own (e.g. using random generation).

Notes:
- You can assume that the quota at every point in time is static. Even though it's not true in the reality (it actually grows), it doesn't grow too much during a given hour - so we can neglect this growth in this simulation.
- Your code should adhere to modern Python standards and be strictly typed. The code should pass `ruff` checks - ruff is already installed in the environment.
- Use uv package manager to run everything and install dependencies.