diff --git a/benchmarks/ppo/accelerate_configs/deepspeed_zero2.yaml b/benchmarks/ppo/accelerate_configs/deepspeed_zero2.yaml index 8046cccc..6281ecec 100644 --- a/benchmarks/ppo/accelerate_configs/deepspeed_zero2.yaml +++ b/benchmarks/ppo/accelerate_configs/deepspeed_zero2.yaml @@ -12,10 +12,11 @@ machine_rank: 0 main_training_function: main mixed_precision: 'bf16' num_machines: 1 -num_processes: 1 +num_processes: 2 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false +main_process_port: 0 diff --git a/jobs/unkillable_diversity.sh b/jobs/unkillable_diversity.sh new file mode 100644 index 00000000..336daade --- /dev/null +++ b/jobs/unkillable_diversity.sh @@ -0,0 +1,82 @@ +#!/bin/bash +#SBATCH --job-name=validate_static_diversity +#SBATCH --tasks=1 +#SBATCH --cpus-per-task=6 +#SBATCH --account= +#SBATCH --gres=gpu:a100:2 +#SBATCH --mem=128G +#SBATCH --time=24:00:00 +#SBATCH --output=slurm-%j.out +#SBATCH --error=slurm-%j.err +#SBATCH --mail-type=ALL +#SBATCH --mail-user= + +cd +module load python/3.10 +module load cuda/12.6 +source .venv/bin/activate +echo "Starting vLLM server..." +uv run vllm serve Salesforce/SFR-Embedding-Mistral \ + --dtype bfloat16 \ + --api-key openai \ + --kv-cache-dtype fp8 \ + --task embed \ + --trust-remote-code \ + --tensor_parallel_size 2 \ + --max-model-len 4096 & + +# Save server process ID +SERVER_PID=$! + +echo "Waiting for server to start..." +while true; do + echo "Checking if server is up..." + RESPONSE=$(curl -s http://localhost:8000/v1/models -H "Authorization: Bearer openai" 2>&1) + + if [[ "$RESPONSE" == *"data"* ]]; then + echo "Server is up and running!" + break + fi + + # Check if server is still running + if ! kill -0 $SERVER_PID 2>/dev/null; then + echo "Server process died unexpectedly" + exit 1 + fi + + echo "Server not ready yet. Waiting 5 seconds..." + sleep 5 +done + +deactivate +cd projects/AIF-Gen +source .env + +echo "Starting validation process..." + +# list all sub‐tasks +tasks=( + merged_qna + merged_qna_summary + hh + ultra + cppo-rl-sampled + cppo-reward-sampled +) + +for t in "${tasks[@]}"; do + echo "Validating $t..." + uv run aif validate \ + "data/$t.json" \ + "data/$t-validate-diversity-nvidia.json" \ + --no-validate-diversity \ + --no-validate-count \ + --no-validate-entropy \ + --no-validate-llm-judge \ + --embedding-model "Salesforce/SFR-Embedding-Mistral" \ + --embedding-batch-size 128 \ + --max_concurrency 8 \ + || { echo "Validation failed on $t"; exit 1; } +done + +echo "All validations completed successfully." diff --git a/jobs/validate_all_static.sh b/jobs/validate_all_static.sh index 06ff546a..08d34672 100644 --- a/jobs/validate_all_static.sh +++ b/jobs/validate_all_static.sh @@ -2,6 +2,7 @@ #SBATCH --job-name=validate_static_all #SBATCH --partition=unkillable-cpu #SBATCH --cpus-per-task=2 +#SBATCH --mem=16G #SBATCH --time=24:00:00 #SBATCH --output=slurm-%j.out #SBATCH --error=slurm-%j.err @@ -10,130 +11,24 @@ source .env -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_qna_direct/*/data.json \ -data/70B_15_validation/70B/education_qna_direct/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_qna_eli5/*/data.json \ -data/70B_15_validation/70B/education_qna_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_qna_expert/*/data.json \ -data/70B_15_validation/70B/education_qna_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_qna_hinted/*/data.json \ -data/70B_15_validation/70B/education_qna_hinted/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_summary_eli5/*/data.json \ -data/70B_15_validation/70B/education_summary_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/education_summary_expert/*/data.json \ -data/70B_15_validation/70B/education_summary_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_generate_long/*/data.json \ -data/70B_15_validation/70B/politics_generate_long/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_generate_short/*/data.json \ -data/70B_15_validation/70B/politics_generate_short/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_qna_eli5/*/data.json \ -data/70B_15_validation/70B/politics_qna_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_qna_expert/*/data.json \ -data/70B_15_validation/70B/politics_qna_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_summary_eli5/*/data.json \ -data/70B_15_validation/70B/politics_summary_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_summary_expert/*/data.json \ -data/70B_15_validation/70B/politics_summary_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_generate_short/*/data.json \ -data/70B_15_validation/70B/politics_generate_short/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_qna_eli5/*/data.json \ -data/70B_15_validation/70B/politics_qna_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/politics_summary_eli5/*/data.json \ -data/70B_15_validation/70B/politics_summary_eli5/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct \ -&& \ -uv run aif \ -validate \ ---max_concurrency 256 \ -data/70B_15_generation/tech_healthcare_summary_expert/*/data.json \ -data/70B_15_validation/70B/tech_healthcare_summary_expert/validate.json \ ---no-validate-diversity \ ---model Meta-Llama-3.1-70B-Instruct +MODEL="gpt-4o-mini" +MAX_CONC=256 + +# list all sub‐tasks +tasks=( + internal_subsampled_merged +) + +for t in "${tasks[@]}"; do + echo "Validating $t..." + uv run aif validate \ + --max_concurrency "$MAX_CONC" \ + "data/$t.json" \ + "data/$t-validate-no-diversity.json" \ + --no-validate-diversity \ + --no-validate-embedding-diversity \ + --no-validate-llm-judge \ + || { echo "Validation failed on $t"; exit 1; } +done + +echo "All validations completed successfully." diff --git a/jobs/validate_all_static_diversity.sh b/jobs/validate_all_static_diversity.sh new file mode 100644 index 00000000..64e849d5 --- /dev/null +++ b/jobs/validate_all_static_diversity.sh @@ -0,0 +1,72 @@ +#!/bin/bash +#SBATCH --job-name=validate_static_all_diversity_external +#SBATCH --partition=main +#SBATCH --gres=gpu:a100l:1 +#SBATCH --mem=48G +#SBATCH --cpus-per-task=8 +#SBATCH --time=24:00:00 +#SBATCH --output=slurm-%j.out +#SBATCH --error=slurm-%j.err +#SBATCH --mail-type=ALL +#SBATCH --mail-user= + +cd +module load python/3.10 +module load cuda/12.6.0 +source .venv/bin/activate +echo "Starting vLLM server..." +uv run vllm serve intfloat/e5-mistral-7b-instruct --quantization int8 --api-key openai --task embed --trust-remote-code --max-model-len 4096 & + +# Save server process ID +SERVER_PID=$! + +echo "Waiting for server to start..." +while true; do + echo "Checking if server is up..." + RESPONSE=$(curl -s http://localhost:8000/v1/models -H "Authorization: Bearer openai" 2>&1) + + if [[ "$RESPONSE" == *"data"* ]]; then + echo "Server is up and running!" + break + fi + + # Check if server is still running + if ! kill -0 $SERVER_PID 2>/dev/null; then + echo "Server process died unexpectedly" + exit 1 + fi + + echo "Server not ready yet. Waiting 5 seconds..." + sleep 5 +done + +deactivate +cd projects/AIF-Gen +source .env + +echo "Starting validation process..." + +# list all sub‐tasks +tasks=( + merged_qna + merged_qna_summary + hh + ultra +) + +for t in "${tasks[@]}"; do + echo "Validating $t..." + uv run aif validate \ + "data/$t.json" \ + "data/$t-validate-diversity-nvidia.json" \ + --no-validate-diversity \ + --no-validate-count \ + --no-validate-entropy \ + --no-validate-llm-judge \ + --embedding-model "intfloat/e5-mistral-7b-instruct" \ + --embedding-batch-size 64 \ + --max_concurrency 8 \ + # || { echo "Validation failed on $t"; exit 1; } +done + +echo "All validations completed successfully." diff --git a/notebooks/continuity.ipynb b/notebooks/continuity.ipynb new file mode 100644 index 00000000..d260da6c --- /dev/null +++ b/notebooks/continuity.ipynb @@ -0,0 +1,541 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fe383535", + "metadata": {}, + "source": [ + "# Continuity Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "45b95049", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/mila/s/shahrad.mohammadzadeh/projects/AIF-Gen/.venv/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\"As the political landscape continues to shift, the looming prospect of impeachment hearings has captured the attention of the American public. In recent weeks, officials from both sides of the aisle have been weighing in on the implications of such an unprecedented move. \\n\\nIn the latest developments, congressional leaders have announced plans to convene hearings that will address multiple allegations against the president, ranging from misuse of power to obstruction of justice. These hearings mark a pivotal moment in American politics, as they are not just a mechanism for accountability but also a reflection of the current partisan divide. s, who largely support the push for impeachment, argue that it is crucial to uphold the integrity of the office. Meanwhile, s have positioned themselves against what they perceive as a political witch hunt, claiming these efforts aim to weaken the presidency rather than serve justice.\\n\\nThe hearings are expected to spotlight testimony from key witnesses and experts, shedding light on the administration's actions over the past few years. Proponents of impeachment argue that the evidence will establish a pattern of behavior that calls into question the president’s respect for constitutional boundaries. Conversely, opponents are preparing to shape the narrative of these hearings to focus on what they see as politically motivated allegations lacking substantial evidence.\\n\\nUltimately, the outcome of the hearings may not only determine the fate of the presidency but also resonate through future s, influencing how campaigns are run and how power is wielded in Washington. As the date approaches, public interest continues to ignite debates across social media platforms and within community discussions, reminding us how this political theater remains a vital aspect of ic engagement.\", \"The political landscape often hinges on the interplay between rhetoric and policy, shaping how issues are perceived and addressed by both the electorate and lawmakers. In recent years, the sharp contrasts in political discourse have become increasingly apparent, with leaders utilizing emotionally charged language to rally support or to demonize opponents.\\n\\nTake, for example, the debate surrounding climate change. Proponents of aggressive environmental policies often employ rhetoric that emphasizes the urgent and existential threat posed by rising temperatures and natural disasters. This strategy aims to evoke a strong emotional response, prompting citizens to back immediate action. However, detractors of climate policy utilize contrasting rhetoric, framing environmental regulations as harmful to jobs and economic growth, appealing to a different set of values rooted in stability and prosperity.\\n\\nThese rhetorical strategies play a crucial role in influencing public opinion, which, in turn, impacts policy decisions made by elected officials. When politicians speak about issues like healthcare reform or educational funding, their choice of words can either facilitate a collective understanding of the proposed policy or create division amongst constituents. Politeness, while ideal, often takes a back seat to the more vigorous exchanges that help maintain party loyalty and attract votes.\\n\\nAs such, it's essential for voters to scrutinize not only the policies being proposed but also the rhetoric surrounding them. Understanding the motivations and implications behind specific phrases can illuminate the broader political strategies at work. In a climate where sound bites often overshadow substantial discussions, fostering a critical approach to rhetoric can empower citizens to better engage with policy-making processes, ultimately leading to more informed and civic participation.\", \"In recent months, the political landscape has witnessed intensifying debates surrounding the need for effective compromise within the cabinet. As one of the central governing bodies, the cabinet is crucial for developing policies that reflect the diverse opinions of both ruling and opposition parties. However, the current divide has raised concerns about the ability of political leaders to reach common ground on key issues affecting citizens.\\n\\nThe significance of compromise cannot be overstated, especially during periods of heightened partisanship. Fostering dialogue among cabinet members from different political backgrounds is essential for meaningful progress. Instances of collaboration can be seen in past legislative achievements, where diverse ideas were synthesized to form comprehensive policies. However, recent impasses suggest that such interactions have become less frequent, raising questions about the efficacy of the cabinet.\\n\\nAs political tensions rise, many citizens are calling for their representatives to prioritize negotiation over confrontation, emphasizing compromise as a pathway to solutions that benefit everyone. Whether it’s addressing the economy, healthcare, or climate change, the call is clear: effective governance requires leaders who are willing to set aside differences in favor of collective progress. \\n\\nMoving forward, the ability of the cabinet to adapt and embrace a culture of compromise will be critical. Leaders must recognize that unity, even when opinions differ, ultimately serves the best interests of the people they represent. In this increasingly polarized age, the cabinet's commitment to collaborative governance could determine the success of current initiatives and uphold the ic ideals that underpin our society.\", \"In today's political landscape, the relationship between elected officials and their constituencies is more crucial than ever. Recently, a local congressperson held a public hearing to address pressing issues that have been troubling their district. The hearing aimed to bring together community members, stakeholders, and local organizations to discuss vital topics such as housing affordability, healthcare accessibility, and public safety initiatives. \\n\\nThe participation of constituents during these hearings is paramount as it not only shows that the elected official values the opinions of their community but also helps to inform policy decisions that directly affect the lives of the residents. Many people in attendance expressed their concerns passionately, sharing personal stories and experiences that highlighted the urgent need for reform. \\n\\nThis particular hearing became a platform for transparent dialogue, where community voices echoed the message of accountability and responsiveness. The congressperson listened intently, taking notes and urging community members to follow up on their specific concerns in subsequent gatherings. This engagement illustrates how elected officials can effectively bridge the gap between government decisions and the everyday realities faced by their constituency. \\n\\nUltimately, these public hearings foster a sense of community ownership over local governance and empower constituents to hold their leaders accountable. As we move forward in this political climate, it's evident that genuine engagement between officials and their constituencies is essential for creating effective policies that genuinely reflect and serve the interests of the people.\", \"In recent years, the resurgence of nationalism has shaken the foundations of many ic societies, prompting leaders and policymakers to navigate a complex political landscape. This evolution of national identity and pride, often seen as a reaction to globalization, has frequently pitted traditional political structures against grassroots movements demanding change. Within this context, a range of political actors, including the ministerial class, has had to adapt their strategies to engage with an increasingly vocal electorate that champions national interests.\\n\\nNationalism, in its various forms, can unify people around a shared cultural background, history, and language, fostering a sense of belonging. However, it also risks alienating minority groups and fostering divisive attitudes. This duality poses significant challenges for government ministers tasked with balancing national pride with the principles of inclusion and solidarity. Recent speeches by several ministers reflect a palpable shift towards rhetoric that both acknowledges the benefits of national identity and warns against the dangers of extreme nationalist sentiments.\\n\\nA prominent example is the discussion surrounding immigration policies, where nationalists argue for tighter controls to preserve cultural identity, while ministers advocate for maintaining open channels that also promote diversity. This push-and-pull illustrates the complicated dance political leaders must perform, responding to calls for sovereignty while recognizing the globalized world's interconnectedness.\\n\\nAs s loom, many ministers find themselves reassessing their messages, realizing that they must resonate with nationalist sentiments without resorting to xenophobia or exclusivity. It's a delicate balancing act, one that could define the political landscape for years to come. The evolution we are witnessing hints at a fundamental rethinking of how nationalism can coexist with modern governance—a question that will continue to shape political discourse in the years ahead.\", \"As the political landscape rapidly evolves, the significance of grassroots campaigns continues to gain recognition among political parties. In recent years, we've seen how smaller, less established political parties have harnessed the power of community engagement and social media to connect with voters. These entities often emphasize localized issues and solutions, tapping into sentiments that larger parties might overlook.\\n\\nOne of the most effective strategies these campaigns utilize is mobilizing volunteers. Unlike traditional campaigning, where resources might be concentrated on high-profile advertising, grassroots organizations rely on the dedication of volunteers to spread their message and engage directly with constituents. This not only helps to build a loyal base but also fosters a sense of ownership among voters in the political process.\\n\\nMoreover, modern technology plays a pivotal role in these campaigns. Social media platforms allow smaller political parties to amplify their message, reach target demographics, and organize events at a fraction of the cost of print advertising and television spots. As s draw nearer, many of these parties are focusing on creating compelling narratives that resonate with voters' daily lives, often using personal stories to highlight their policy positions.\\n\\nThe trend toward more community-focused campaigning also signifies a shift in political strategies. Established parties are beginning to recognize that voters are looking for authenticity and relatability, particularly from candidates who represent their values and aspirations. Consequently, adapting campaigns to prioritize voter concerns rather than strictly party agendas can enhance electoral outcomes.\\n\\nIn the current political climate, it's becoming increasingly clear that the landscape dominated by traditional political campaigns is expanding. The rise of grassroots initiatives not only izes participation but can also lead to innovative solutions to the challenges facing communities today. Engaging with voters at the ground level is proving to be a powerful tool for political parties seeking to reshape the future.\", \"The role of monarchy in shaping political candidates varies dramatically across nations, influencing not just political campaigns, but also the fundamental nature of governance itself. In countries where monarchies exist, such as the United Kingdom, Spain, or Thailand, candidates often have to navigate a complex relationship with the royal family, as public sentiment regarding the monarchy can sway electoral outcomes.\\n\\nIn constitutional monarchies, candidates running for office are expected to support and reflect the values of their nation’s traditions, often in ways that honor the historical significance of the monarchy. For example, a candidate in the UK may leverage royal events or national celebrations to curry favor with voters, aligning themselves with the monarchy's legacy of stability and continuity. This relationship can position the monarchy as a unifying force during cycles, providing candidates an avenue to foster national pride and solidarity.\\n\\nOn the other hand, not all candidates embrace the system of monarchy. In some contexts, especially where there is growing sentiment, candidates actively campaign against the monarchy, marking a stark contrast in their political platforms. This was evident in recent political movements within several countries where candidates underscored issues of equality and ic reform as counter-narratives to the alleged elitism of monarchical systems.\\n\\nMoreover, the presence of a monarchy can influence campaign strategies where candidates vie for public approval through initiatives that resonate with traditional values upheld by the royal family. During contentious s, this often leads to debates surrounding the relevance of monarchy in contemporary politics, causing candidates to take measured stances that account for their constituency’s diverse perspectives on royal influence.\\n\\nAs the global political landscape keeps evolving, it remains essential to understand the intricate dance between monarchy and political candidates. The aspirations and decisions of leaders not only shape their immediate political environments but also reflect broader societal attitudes toward established traditions and the ongoing conversations about what governance should look like in the 21st century.\", 'In contemporary politics, the role of a cabinet in decision-making is often underestimated. A cabinet is generally expected to provide counsel to the head of government, formulate policies, and make administrative decisions. However, an effective cabinet must also cultivate a culture of consensus among its members to create a stable political environment. \\n\\nThe pursuit of consensus within a cabinet is not always straightforward, especially in times of polarization when party lines can be rigidly drawn. Recent events have underscored the need for cabinets to navigate these divisions, bringing diverse viewpoints to the table while still working towards common objectives. In the current landscape, political leaders must prioritize open communication and collaboration within their cabinets, thereby allowing for varied perspectives to contribute to a comprehensive policy framework. \\n\\nFor instance, recent discussions surrounding climate policy highlight how contentious the process can be. Different cabinet members might represent diametrically opposed interests—such as economic growth versus environmental sustainability—yet their ability to reach a consensus on actionable solutions is pivotal. Fostering an environment in which ideas can be exchanged freely is crucial for achieving this goal. \\n\\nUltimately, a cabinet operates best not when it is merely a collection of like-minded individuals, but when it becomes a dynamic forum for debate, negotiation, and collective decision-making. The emphasis on achieving consensus can transform the cabinet into a powerhouse of innovation, driving effective governance and evolving policies that address the pressing issues of our time.', \"As the season heats up, the role of diplomats in shaping international perception and policy becomes increasingly critical. With candidates presenting their platforms, clear communication to foreign allies and competitors is essential. Voters often overlook the impact that these diplomatic relations have on domestic affairs, yet their influence can be profound—affecting trade agreements, security alliances, and environmental considerations, all of which hinge on the interpersonal skills of those representing our nation abroad.\\n\\nDuring an , each candidate's proposed foreign policy can promote different narratives in international forums. A strong stance may position a candidate as a robust leader, but as history shows, this bravado can also lead to increased tensions if not carefully managed. Diplomats act as vital conduits, translating these political ambitions into actionable foreign engagements, helping to maintain stability and ensure that countries remain on a diplomatic course.\\n\\nCandidates often tout their experience with foreign relations during their campaigns, positioning themselves as the diplomat the country needs. They promise to strengthen relationships with allies while asserting their influence over competitors. Voters need to scrutinize these claims carefully; understanding not just the rhetoric but the practical consequences of potential foreign policies proposed on the campaign trail.\\n\\nAs we navigate through this cycle, it's essential to recognize the intertwined nature of domestic politics and international diplomacy. The choices made at the ballot box will resonate through embassies, trade negotiations, and global issues far beyond borders, prompting the next generation of diplomats to address challenges that will shape the future for all.\", \"In today's increasingly interconnected world, the role of diplomats and political representatives has never been more crucial. One of the most pressing issues faced by international communities is climate change, and how nations choose to work together, or fail to do so, will have lasting implications for the health of our planet. \\n\\nDiplomatic efforts in the realm of environmental policy have surged, with representatives from various countries gathering for summits and conferences aimed at addressing this global crisis. The Paris Agreement, which aims to limit global warming to well below 2 degrees Celsius, is a prime example of how diplomacy can bridge gaps between disparate national interests. \\n\\nHowever, the effectiveness of these initiatives can often be hindered by differing economic priorities among nations. For instance, developing countries may prioritize economic growth over environmental protections, leading to tensions in negotiations where wealthier nations demand stringent measures. Here, the skill of a diplomatic representative becomes essential; they must mediate between competing interests while striving for a collective goal. \\n\\nMoreover, the impact of local politics cannot be overlooked. Representatives must thread the needle of global diplomacy with domestic pressures, often facing criticism from constituents who either support or oppose international agreements. Balancing these pressures while maintaining a focus on long-term solutions is a testament to the complex nature of representation in political spheres. \\n\\nAs voters become more aware of global issues like climate change, they demand that their representatives engage more actively on the world stage. A representative who can successfully navigate the intricacies of diplomatic relations stands out as a leader who not only advocates for their nation's interests but also embodies a commitment to global cooperation. \\n\\nThe future of international climate policy depends on the ability of diplomats and representatives to find common ground, facilitate negotiations, and promote sustainable solutions. Only through effective collaboration can we hope to address the challenges posed by climate change and forge a path toward a more sustainable future.\"]\n", + "['In the realm of healthcare technology, the intersection of gravitation and mechanics plays a crucial role in the design and function of medical devices. One of the most intriguing advancements in this area is the development of wearable health monitoring devices, which rely heavily on principles of biomechanics and the gravitational forces acting on the human body.\\n\\nWearable devices like smartwatches and fitness trackers utilize accelerometers and gyroscopes to monitor various health metrics, such as heart rate, physical activity, and even sleep patterns. These devices function by detecting motion through the mechanics of gravitational pull: when a person moves, sensors measure the acceleration and deceleration of movement, providing valuable data on health and fitness levels.\\n\\nOn a physiological level, understanding the mechanics of how the body interacts with gravitational forces can enhance the design of prosthetics and orthopedic devices. Innovations such as high-tech prosthetic limbs are engineered to enable users to regain mobility effectively by simulating natural movement patterns, which are inherently influenced by gravity. Engineers incorporate dynamic adjustments that respond to the weight and movement of the user, ensuring balance and stability. \\n\\nMoreover, in surgical settings, technology that aids in robotic surgery uses principles of mechanics to support precision in procedures. By manipulating gravitational effects, surgeons can perform complex operations with minimal invasiveness, reducing recovery times significantly.\\n\\nAs we delve deeper into the merge of engineering and medicine, it becomes evident that a thorough understanding of gravitation and mechanics is essential for creating innovative health technologies. These advancements not only improve patient outcomes but also pave the way for a future where personalized medicine and technology can work hand in hand, ensuring better quality of care and enhanced patient monitoring.', '**Title: The Internet as a Catalyst for Evolving Healthcare Dynamics** \\n\\n**Author: Dr. Samuel Hargrave, PhD in Health Informatics** \\n\\n**Abstract:** \\nThe integration of the internet in healthcare has transformed traditional practices, enabling unprecedented dynamics in service delivery, patient engagement, and data management. This article explores the current state of internet technologies in healthcare, emphasizing the impact on patient outcomes, information accessibility, and the ongoing evolution of medical practices. \\n\\n**Introduction:** \\nThe advent of the internet has catalyzed transformative changes across various sectors, none more so than in healthcare. Where information was once siloed within healthcare institutions, the internet has democratized access to medical knowledge, shifting the dynamics between patients, providers, and payers. This article delves into these dynamics, looking specifically at telehealth, patient-generated health data (PGHD), and the role of artificial intelligence in enhancing healthcare delivery through internet-enabled solutions.\\n \\n**Telehealth and Accessibility:** \\nTelehealth has emerged as a cornerstone of modern healthcare, utilizing the internet to bridge geographical barriers. By enabling real-time consultations via video conferencing, telehealth significantly expands access to healthcare services, particularly in rural or underserved areas. The dynamics of patient-provider interactions are fundamentally altered; patients can seek advice without the constraints of travel or waiting times, promoting a more proactive approach to health management. \\nMoreover, the continuity of care is enhanced: healthcare providers can follow up on patient progress through online platforms, allowing for adjustments to treatment plans based on immediate data received.\\n \\n**Patient-generated Health Data (PGHD):** \\nAnother revolutionary aspect of internet utilization is the emergence of PGHD. Patients, equipped with wearables and mobile health applications, are now capable of generating a wealth of health information that can inform clinical decisions. This dynamic shifts the traditional provider-dominated model to a democratized one, where patients actively contribute to their health narratives.\\n \\nThe increase in accessible health data has implications for personalized medicine. By analyzing PGHD alongside historical clinical data, healthcare providers can refine treatment protocols to suit individual patient needs, ultimately leading to better health outcomes and increasing engagement and compliance among patients.\\n \\n**Artificial Intelligence and Internet Integration:** \\nAs AI technologies advance, their integration with internet platforms marks another significant turning point in healthcare delivery. AI algorithms can now analyze vast datasets, glean insights from PGHD, and even predict patient risks based on real-time health data. This capability enhances decision-making processes and optimizes clinical workflows, contributing to improved patient safety and operational efficiency.\\n \\nThe dynamics of healthcare are further complicated by ethical considerations surrounding the use of personal data, necessitating robust frameworks that protect patient privacy while enabling the innovation of healthcare services.\\n \\n**Conclusion:** \\nThe internet has undeniably reshaped the dynamics of healthcare delivery, offering tools that foster connectivity, engagement, and data-driven decision-making. As we continue to navigate this digital landscape, the challenge will lie in leveraging these innovations responsibly, maintaining ethical standards, and ensuring that enhancements in accessibility and quality of care benefit all stakeholders within the healthcare ecosystem.\\n \\n**Keywords:** internet, healthcare, telehealth, patient-generated health data, artificial intelligence, health informatics, dynamics.', \"**The Impact of Relativity on Current Advances in Medical Imaging Technology** \\nBy Professor Alice Whitcomb, PhD, Einstein Institute for Medical Technology\\n\\nIn the interconnected worlds of healthcare and technology, one cannot underestimate the influence of core scientific principles, such as Albert Einstein's theory of relativity, on the advancement of diagnostic tools and medical imaging. This article aims to explore how concepts derived from relativity have paved the way for innovative improvements in medical imaging technologies, particularly in the fields of magnetic resonance imaging (MRI) and computed tomography (CT) scans.\\n\\nThe theory of relativity, fundamentally concerned with the interaction between matter and energy, has transcended its origins in cosmology to influence numerous applications in healthcare. At the heart of MRI technology is the magnetic resonance phenomenon, which relies significantly on principles related to the behavior of atoms in a magnetic field—a concept deeply rooted in the relativistic understanding of atomic structure influenced by Einstein's work.\\n\\nModern imaging techniques take advantage of radiofrequency waves and magnetic fields to create detailed images of biological tissues, essential for the diagnosis and monitoring of various medical conditions. As relativity suggests, the way particles behave in different frames of reference is crucial. For example, the precision in rotational speeds needed for MRI machines is a direct application of relativistic physics, allowing for enhanced image clarity and reduced scan times, which benefits patients by expediting diagnosis.\\n\\nFurthermore, in the realm of CT scans, the evolution from traditional imaging to advanced 3D visuals showcases the utilization of algorithms that echo ideas explored in cosmological settings. The ability to visualize the human body in three dimensions, similarly to mapping a cosmic structure, heavily integrates with computational models that simulate relativity and energy distributions. The swift processing capabilities of contemporary computers, enhanced by advances in technology—specifically quantum computing—further advance these imaging methods by allowing more complex calculations previously hindered by slower, classical computing methods.\\n\\nAs we evolve in our understanding and application of physics within biomedical contexts, it becomes clear that merging relativity with medical imaging not only enhances technological capabilities but also raises fundamental questions about how we understand the human body in both physical and metaphysical dimensions. The principles guiding celestial bodies in their interactions find parallels in our own biological processes, as we consider the gravitational influences on cellular activity and the propagation of signals through tissue.\\n\\nLooking ahead, the continued application of relativistic principles holds incredible promise for the development of new imaging modalities. Investigating how these theories can enhance our understanding of diseases at a subatomic level is critical. We may well find that future breakthroughs in medical imaging will not only provide clearer visualizations but transform our comprehension of health and disease through innovations that intertwine health sciences, quantum physics, and the vast landscapes of cosmological phenomena.\\n\\nIn conclusion, the relationship between relativity, cosmology, and healthcare technology, especially medical imaging, exemplifies the interdisciplinary nature of scientific advancement. Recognizing and harnessing the fundamental links between these fields is key to unlocking future innovations that could enhance diagnosis and treatment methods, ensuring that healthcare continues to progress in step with leading-edge technology.\", '**The Role of Machine Learning in Transforming Healthcare Administration** \\n \\nAs innovations in technology continue to reshape numerous sectors, one of the most significant advancements has emerged at the intersection of healthcare and machine learning (ML). This article strives to elucidate how ML algorithms are revolutionizing healthcare administration, thereby facilitating improved patient outcomes, reducing operational costs, and optimizing resource allocation across institutions. \\n \\nIn the realm of healthcare, the administrative processes often become complex due to the voluminous amount of data generated every day. From patient records to billing information, managing this data efficiently is paramount for ensuring seamless healthcare delivery. Machine learning, a subset of artificial intelligence, has shown tremendous potential in processing vast datasets, identifying patterns, and providing actionable insights. \\n \\nOne pivotal application of ML in healthcare administration is in predictive analytics. Hospitals utilize ML models to predict patient admissions by analyzing historical data and seasonal trends. For instance, those facilities that have implemented predictive data analytics witnessed a 15% decline in last-minute hospital admissions. This foresight allows healthcare administrators to allocate staffing and resources more effectively, thus enhancing operational efficiency and improving the patient experience. \\n \\nMoreover, machine learning algorithms have been adept at streamlining the billing process within healthcare institutions. Traditional billing systems can be labor-intensive and prone to errors, often resulting in delayed payments or lost revenue. ML-driven systems employ natural language processing to automate coding and billing procedures, significantly reducing human error. Studies have demonstrated that these automated systems can analyze claims and ensure that all services rendered are accurately billed, leading to a reduction in claim denials by up to 30%. \\n \\nAdditionally, ML can support regulatory compliance by continuously monitoring health records and financial transactions. With ever-evolving regulatory standards, healthcare institutions face the challenge of ensuring adherence while avoiding heavy penalties. Advanced ML algorithms can analyze transaction patterns to flag anomalies, ensuring compliance in real-time without the need for exhaustive manual audits. \\n \\nOne cannot disregard the emphasis on patient and provider engagement facilitated by technology, especially through machine learning algorithms. Chatbots and virtual assistants, powered by ML, have greatly improved patient interactions by providing timely information and triaging patients based on their symptoms. By deploying these tools, healthcare providers can not only enhance patient satisfaction but also allocate their time and resources to more critical tasks requiring human intervention. \\n \\nWhile the benefits of machine learning in healthcare administration are profound, it is crucial to address some challenges it presents. Data privacy, bias in algorithm training due to non-representative datasets, and the need for continuous updating of AI systems are significant considerations that stakeholders must heed. Legal frameworks that safeguard patient data while promoting innovation in AI technology will be paramount to harnessing these benefits in a way that is ethical and equitable. \\n \\nIn conclusion, the integration of machine learning within healthcare administration undoubtedly signals a new era of efficiency, reliability, and enhanced patient care. As technology continues to evolve, the synergy between machine learning and healthcare will expand, offering endless possibilities for innovative solutions that adapt to the dynamic nature of health services. \\n \\nIt is imperative for administrators, healthcare providers, and policymakers to embrace these advancements prudently, ensuring that as we venture into this new frontier, the focus remains on improving healthcare delivery for all.', '### The Integration of Internet of Things (IoT) in Respiratory Healthcare: A Mechanistic Perspective\\n\\nThe advent of the Internet of Things (IoT) has begun to revolutionize numerous fields, with the healthcare sector standing out as a prime beneficiary of this technological transformation. As a professor specializing in respiratory medicine and biomedical engineering, I aim to elucidate the mechanics behind the application of IoT technologies in improving respiratory health outcomes.\\n\\n#### Understanding IoT in Healthcare\\n\\nThe Internet of Things refers to the interconnected network of physical devices that communicate and exchange data via the internet. In healthcare specifically, IoT devices can range from wearable health monitors and smart inhalers to comprehensive remote monitoring systems that collect real-time health data from patients.\\n\\n#### Mechanistic View on Respiratory Healthcare\\n\\nIn respiratory healthcare, the mechanics involved in blending IoT devices with traditional medical practices can enhance early diagnosis, monitoring, and management of respiratory diseases like asthma, COPD (Chronic Obstructive Pulmonary Disease), and pulmonary fibrosis. The following components illustrate how the mechanics of IoT-based interventions work:\\n\\n1. **Data Collection**: IoT-equipped devices facilitate seamless data capture, such as lung function, oxygen saturation levels, and personal inhaler usage patterns. For instance, a smart inhaler can track usage frequency and circumstances under which it is utilized, offering clinicians critical real-time insights into patient behavior.\\n\\n2. **Data Transmission**: Utilizing wireless internet connections, these devices transmit collected data to cloud-based systems where it can be readily accessed by healthcare providers. This process reduces the reliance on manual reporting by patients, which is often hampered by forgetfulness or lack of awareness about their condition.\\n\\n3. **Data Analysis**: Advanced algorithms and machine learning models analyze incoming data to identify patterns and anomalies in patient health trajectories. By employing predictive analytics, healthcare practitioners are better equipped to foresee potential exacerbations in respiratory conditions before they necessitate emergency intervention.\\n\\n4. **Personalized Interventions**: Armed with comprehensive analytics, doctors can tailor treatment plans for individual patients, adjusting medications or recommending lifestyle changes based on empirical data. For example, utilization patterns of inhalers can prompt providers to discuss adherence strategies or transition patients to long-term control medications if necessary.\\n\\n5. **Patient Engagement and Education**: One of the cardinal mechanics of IoT is that it not only aids healthcare professionals but also empowers patients. With access to their health metrics through mobile applications linked to IoT devices, patients are encouraged to be active participants in their health management. Educational tools integrated within these applications can also bolster patient understanding of their conditions and enhance compliance with treatment regimens.\\n\\n#### Challenges and Considerations\\n\\nWhile the integration of IoT in respiratory healthcare presents a compelling future, several challenges persist. Issues regarding patient data privacy, the variability of internet connectivity, device interoperability, and the need for continuous engagement from both patients and providers must be addressed. \\n\\nRegulatory frameworks must evolve to keep pace with these technologies, ensuring that safety standards are met while allowing for innovation in patient care.\\n\\n#### Conclusion\\n\\nIn summary, the fusion of IoT technologies with the mechanics of respiratory healthcare holds unprecedented potential. As we navigate this new frontier, a collaborative approach between healthcare professionals, engineers, and policymakers is pivotal to fully harnessing the benefits of the Internet of Things in the pursuit of better respiratory health outcomes.', 'The integration of radiation therapy in treating cancer has seen significant advancements, particularly with the evolving dynamics of technology that enhance treatment precision and patient safety. Radiation therapy is a cornerstone in oncological treatment, utilizing controlled doses of radiation to target and eradicate cancer cells. Understanding the dynamics of how radiation interacts with various tissues is essential for optimizing treatment outcomes, minimizing damage to surrounding healthy cells, and managing side effects effectively.\\n\\nRecent developments in radiotherapy include image-guided techniques, which allow clinicians to visualize tumors more accurately before and during treatment. This approach significantly improves the targeting of radiation beams, thus enhancing the overall effectiveness of the therapy. Moreover, the introduction of advanced linear accelerators has revolutionized the delivery of radiation. These machines are capable of adjusting the radiation dose in real-time, based on patients’ movements, thereby ensuring that the tumor receives the maximum dose while sparing adjacent healthy tissues.\\n\\nAdditionally, advancements in treatment planning software utilize sophisticated algorithms to simulate radiation dose distributions intricately. The dynamics of tumor shape, size, and location can now be modeled more accurately, allowing personalized treatment plans tailored to individual patient anatomy. By incorporating three-dimensional imaging technologies like CT and MRI, oncologists can assess tumor dynamics and monitor responses to treatments over time, leading to more adaptive treatment strategies.\\n\\nHowever, along with these advancements comes the need for stringent safety protocols. The field of radiation oncology must emphasize patient education and communication to alleviate fears associated with radiation exposure. Furthermore, ongoing research into the biological impact of radiation at cellular and molecular levels is essential to further enhance the safety and effectiveness of treatments.\\n\\nIn conclusion, the interplay between advancements in radiation technology and the understanding of the dynamics within the human body continues to shape the future of cancer treatment. Enhanced precision in radiation delivery not only promises improved patient outcomes but also addresses the crucial challenge of minimizing adverse effects, making cancer therapy more effective and patient-centric.', 'In recent years, the intersection of electromagnetism and healthcare technology has opened up exciting new avenues for diagnosis and treatment. One particularly promising area is the use of electromagnetic fields for therapeutic purposes, known as pulsed electromagnetic field therapy (PEMF). This technique employs oscillation of electromagnetic waves to promote healing in tissues by improving cellular function and circulation.\\n\\nThe principles of electromagnetism suggest that every cell in our body operates on certain frequencies, and the application of specific electromagnetic frequencies can lead to beneficial outcomes. For instance, oscillating fields can stimulate the production of ATP (adenosine triphosphate), enhancing energy levels in cells. As a result, PEMF therapy can aid in reducing inflammation, accelerating healing from injuries, and alleviating pain. \\n\\nHealth practitioners are increasingly integrating these technologies into treatment plans, especially for chronic pain conditions, arthritis, and even post-operative recovery. Other applications include the use of electromagnetic resonances in diagnostics, where fluctuations in specific energy fields around the body provide insight into underlying health conditions.\\n\\nMoreover, advancements in wearable technology have made it feasible to harness the principles of electromagnetism for continuous health monitoring. Devices that incorporate oscillatory electromagnetic sensors allow for the real-time collection of physiological data, enabling the early detection of anomalies and improving preventive health measures.\\n\\nAs research continues to unfold, the integration of electromagnetism into healthcare not only showcases how technology can complement traditional medical practices but also highlights a shift toward more holistic and individualized approaches to health management. Therefore, the future of healthcare may be increasingly defined by our understanding and application of electromagnetic principles, leading to enhanced patient outcomes and innovative therapeutic modalities.', '**Title: The Convergence of AI and Healthcare: A Gravitation Towards Precision Medicine**\\n\\nIn the rapidly evolving field of healthcare, the intersection of artificial intelligence (AI) technologies and medical practices presents unprecedented opportunities for enhancement and innovation. With the integration of AI systems, healthcare professionals can harness vast amounts of data to inform decision-making, optimize patient outcomes, and propel us toward a new paradigm of precision medicine.\\n\\nGravitation toward such advanced technologies can be comprehensively understood when we consider how AI systems analyze patterns within complex datasets. For instance, in genomics, machine learning algorithms can process genetic sequences to predict health risks and develop tailored treatment plans, ensuring that interventions are finely tuned to each patient’s unique biological profile. This not only enhances the efficacy of treatments but also minimizes adverse effects, marking a significant shift from the traditional one-size-fits-all approach.\\n\\nMoreover, AI can revolutionize diagnostics, an area where timely and accurate data interpretation is paramount. Deep learning models, capable of examining radiological images, surpass human accuracy in identifying early-stage malignancies and other diseases, thereby fostering earlier interventions and improving survival rates. As these technologies gravitate into everyday practice, we witness a transformation in the roles of healthcare professionals, who increasingly become facilitators of advanced diagnostic tools rather than sole decision-makers.\\n\\nThe integration of AI is not limited to diagnostics; it transforms operational efficiencies within health systems. Predictive analytics can foresee patient volume trends, optimize staff allocation, and enhance inventory management for medical supplies. When AI is employed to analyze hospital data, services can be aligned more closely with patient needs, thus raising the standard of care while also reducing costs.\\n\\nHowever, the adoption of AI technologies in healthcare comes with imperative ethical considerations. With significant concerns over data privacy, bias in algorithms, and accountability, it becomes essential to approach the implementation of these systems with a robust ethical framework. Ensuring that AI systems are transparent and reliable will be critical in building trust with patients and healthcare providers alike.\\n\\nAs we explore these dimensions, it is clear that AI holds a potent promise in advancing healthcare. The gravitation towards incorporating intelligent systems in various applications within the medical field can lead to a future characterized by improved outcomes, more personalized care, and a streamlined healthcare experience. For professionals currently engaged in health sciences, staying informed and adaptable in the wake of these technological advancements is vital.\\n\\nWithin this landscape, the role of academia is pivotal, guiding research and policy development while driving innovation. As a professor in the field, I advocate for interdisciplinary collaboration among computer scientists, clinicians, and ethicists to ensure a holistic approach to integrating AI in healthcare. The future assures a landscape where AI does not merely support but enhances the very core of healthcare — emphasizing precise, effective, and ethically sound care for all individuals.', \"**Harnessing Machine Learning for Enhanced Healthcare Outcomes: A Focus on Predictive Analytics**\\n\\nIn the ever-evolving landscape of healthcare, the integration of technology has paved the way for transformative solutions that optimize patient care and promote better health outcomes. One of the most promising advancements in this arena is the deployment of machine learning (ML) algorithms to analyze healthcare data, improving both clinical workflows and patient interactions. As a professor and a researcher in health informatics, I find it crucial to explore how machine learning can serve as a catalyst for momentum in healthcare improvement.\\n\\nMachine learning, a subset of artificial intelligence, encompasses a range of techniques that allow systems to learn from data patterns and make informed predictions or decisions without explicit programming. In healthcare, these techniques offer innovative solutions in various domains, from early diagnosis to treatment optimization and operational efficiency.\\n\\nOne pivotal application of machine learning in healthcare is predictive analytics. By leveraging vast amounts of patient data, ML models can identify individuals at high risk for diseases, allowing for timely interventions. For instance, algorithms can analyze electronic health records (EHRs), genetic information, and lifestyle factors, enabling physicians to foresee potential health issues and personalize treatment plans. The momentum gained from these predictive capabilities not only aids in improving individual patient outcomes but also streamlines healthcare resources, enhancing overall system efficiency.\\n\\nConsider the impact of predictive analytics in diabetes management. Machine learning algorithms can recognize patterns in glucose levels and accompanying variables, predicting fluctuations before they occur. Such insights allow healthcare providers to tailor patient management protocols better. Consequently, diabetic patients can achieve tighter control over their condition with fewer complications, illustrating how machine learning fortifies both individual care and larger public health outcomes.\\n\\nMoreover, the functionality of ML extends to operational management within healthcare institutions. Healthcare providers can analyze scheduling data, staffing levels, and even patients' admission patterns to optimize resource allocation. This reduces costs while enhancing patient satisfaction and care delivery times. By harnessing the momentum of ML, hospitals and clinics can become more responsive and better equipped to manage day-to-day operations and unexpected surges in patient volumes.\\n\\nHowever, the journey toward integrating machine learning into healthcare is not without challenges. Ensuring data privacy, managing algorithmic biases, and providing transparent, interpretable outputs are paramount for the ethical deployment of these technologies. As experts in this field, we must navigate these complexities responsibly to foster trust among patients and healthcare providers alike.\\n\\nIn conclusion, the intersection of machine learning and healthcare represents an evolving frontier that has the potential to significantly enhance patient outcomes and operational efficiencies. By continuing to leverage the momentum generated by these technological advancements, we can create a healthcare system that is not only reactive but also proactive and personalized. The future, driven by the power of machine learning, holds promising prospects for comprehensive healthcare delivery and improved quality of life across diverse populations.\", \"### The Intersection of Electromagnetism and Healthcare: Innovations in Medical Imaging\\n\\nAs a professor at a leading medical technology institution, I have long been fascinated by the convergence of physical sciences and clinical applications in healthcare. This article seeks to explore the innovative applications of electromagnetism within the realm of medical imaging, specifically focusing on how advancements in this field are reshaping diagnostic practices and improving patient outcomes.\\n\\n#### Understanding the Basics of Electromagnetism in Medical Imaging\\nElectromagnetism, a branch of physics that deals with electric and magnetic fields and their interactions, plays a pivotal role in several medical imaging modalities, including Magnetic Resonance Imaging (MRI) and Positron Emission Tomography (PET). These technologies leverage the principles of electromagnetism to create detailed images of biological structures and processes, aiding in disease diagnosis and management.\\n\\n#### The Mechanics of MRI Technology\\nMagnetic Resonance Imaging (MRI) is a quintessential application of electromagnetism in healthcare. The core mechanism involves the manipulation of hydrogen nuclei in the body's water molecules using strong magnetic fields and radiofrequency pulses. This process generates signals that are converted into images by complex algorithms and advanced computing techniques.\\n\\nAdvancements in MRI technologies, particularly in the development of higher field strengths, have enabled unprecedented resolution in imaging. Researchers have been exploring the use of ultra-high field MRIs operating at 7T (Tesla) and beyond, which enhances the signal-to-noise ratio and offers clearer delineation of anatomical structures. Such innovations empower radiologists to detect subtle changes in tissues that may signify early disease onset, facilitating timely and effective interventions.\\n\\n#### The Role of Electromagnetic Technologies in PET Imaging\\nSimilarly, Positron Emission Tomography (PET) utilizes principles of electromagnetism for visualization of metabolic processes in real-time. This technique relies on the detection of gamma rays emitted from radiotracers injected into the patient. The intricate mechanics behind this involves the annihilation of positrons and electrons, producing high-energy photons that are subsequently mapped to construct comprehensive images of metabolic activity, providing invaluable insights into conditions such as cancer, neurological disorders, and cardiac diseases.\\n\\n#### Innovative Developments on the Horizon\\nThe future of medical imaging is poised for further transformation through the integration of artificial intelligence (AI) and machine learning. By employing electromagnetic data processing, these technologies can enhance image reconstruction algorithms, reducing noise and improving detection rates of pathologies. Implementing real-time tracking of vital signs through wearable electromagnetic sensors, for instance, may revolutionize patient monitoring and offer proactive rather than reactive healthcare management.\\n\\nMoreover, miniature electromagnetic devices are being researched for their potential use in point-of-care diagnostics. Portable MRI machines or handheld ultrasound devices could expand access to quality imaging in remote and underserved areas, democratizing healthcare without compromising quality.\\n\\n#### Conclusion\\nThe dynamics between electricity, magnetism, and healthcare continue to generate groundbreaking advances in medical imaging technologies. The mechanics of electromagnetism serve not only as the cornerstone of existing modalities like MRI and PET but also as the foundation for future innovations that promise to enhance diagnostic accuracy and accessibility. As researchers, clinicians, and technologists work collaboratively at this intersection of disciplines, we stand on the cusp of a new era in healthcare where electromagnetism boldly illustrates the unseen pathways of health and illness.\"]\n" + ] + } + ], + "source": [ + "# data loading\n", + "from aif_gen.dataset.continual_alignment_dataset import ContinualAlignmentDataset\n", + "\n", + "lipschitz_data = ContinualAlignmentDataset.from_json(\n", + " 'data/4omini_generation/merged_tech_physics.json'\n", + ")\n", + "piecewise_data = ContinualAlignmentDataset.from_json(\n", + " 'data/4omini_generation/merged_politics_generate.json'\n", + ")\n", + "\n", + "# only get the prompts shuffled and only 10K prompts\n", + "data_lip = lipschitz_data.datasets[0].samples\n", + "data_piecewise = piecewise_data.datasets[0].samples\n", + "\n", + "prompts_lip = []\n", + "for sample in data_lip:\n", + " prompts_lip.append(sample.prompt)\n", + "\n", + "# randomly shuffle the prompts and keep only 10K\n", + "import random\n", + "\n", + "random.shuffle(prompts_lip)\n", + "prompts_lip = prompts_lip[:10000]\n", + "\n", + "prompts_piecewise = []\n", + "for sample in data_piecewise:\n", + " prompts_piecewise.append(sample.prompt)\n", + "# randomly shuffle the prompts and keep only 10K\n", + "random.shuffle(prompts_piecewise)\n", + "prompts_piecewise = prompts_piecewise[:10000]\n", + "print(prompts_piecewise[:10])\n", + "print(prompts_lip[:10])" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f04d8316", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "||T12|| = 0.86, ||T23|| = 0.83\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T12: 100%|██████████| 11/11 [13:07<00:00, 71.56s/it]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAd29JREFUeJzt3XlYVNX/B/D3zAAzgKwiqyibioiKYiDuCypaLtnivlCpaX5/FZVli6RZLpmZ5ZZmau6VmaWiiJIbikq444IgqKwurAIDc39/EFPIOgjcgXm/nmeepzn33DOfyxnywz3nniMRBEEAERERkQ6Rih0AERERUX1jAkREREQ6hwkQERER6RwmQERERKRzmAARERGRzmECRERERDqHCRARERHpHCZAREREpHOYABEREZHOYQJERA3O5MmT4eTkVKpMIpHg008/FSWehmDIkCGYMmWK2GE0GCEhIWjSpAnS0tLEDoXqCBMgatA2bNgAiUSifunp6cHBwQGTJ0/G3bt3y9Tv06cPJBIJWrVqVW57oaGh6rZ++eUXdXl2djaCg4MREBAAS0tLSCQSbNiwoVavxcnJqdS1GBsbw8fHB5s2bSpTNzw8XF1v8+bN5bbXvXt3SCQSeHp6qstyc3OxYsUKDBw4EHZ2djAxMUGnTp2watUqFBUV1SjuyMhISCQSfP3112WODR8+HBKJBD/++GOZY7169YKDg0ONPrO2bN26FcuWLRM1hvpw4sQJHDx4EO+//766rOQ79N/vOQAUFBTgueeeg1Qqxfr165/qc5/8/fzvKzk5ucrzJ0+eXO657u7uZeomJSVh6tSpcHZ2hqGhIVxdXREUFIT79++XqatSqbBq1Sp4eXnB0NAQTZs2Rb9+/XD+/Hl1nYCAALi5uWHBggVP9TMg7aUndgBEtWHevHlwdnZGXl4eTp06hQ0bNuD48eO4dOkSFApFqboKhQI3b95EZGQkfHx8Sh3bsmULFAoF8vLySpWnp6dj3rx5aNGiBTp27Ijw8PA6uQ4vLy+88847AIr/h75u3TpMmjQJ+fn55f71rlAosHXrVowfP75UeXx8PE6ePFnm2m/duoX//e9/6N+/P4KCgmBqaooDBw5gxowZOHXqFDZu3KhxzJ07d4aRkRGOHz+Ot99+u9SxkydPQk9PDydOnEBgYKC6vKCgAGfOnMHQoUM1/ryKPH78GHp6mv0vbevWrbh06RLeeuutWotDG3355Zfo378/3NzcKq2nVCrx4osvYt++fVi7di1eeeWVWvn8kt/P/zI3N6/WuXK5HOvWrStVZmZmVup9dnY2/Pz8kJOTgxkzZsDR0RHnz5/Hd999hyNHjuDcuXOQSv/9e/+VV17Bli1bMHHiRMycORM5OTn4+++/kZqaWqrdadOm4d1338XcuXNhYmKiwRVTgyAQNWA//vijAEA4c+ZMqfL3339fACDs2LGjVHnv3r2Fdu3aCW3atBHeeuutUsceP34smJqaCi+88IIAQPj555/Vx/Ly8oSkpCRBEAThzJkzAgDhxx9/rNVradmypfDss8+WKktNTRWaNGkitG3btlT5kSNHBADCyJEjBT09PSEtLa3U8c8//1ywsbERevToIbRr105dnpaWJly6dKnMZwcGBgoAhBs3btQo9r59+wo2NjalymJiYgQAwtixY4U2bdqUOnby5EkBgPDNN9/U6PMmTZoktGzZskbn/tezzz5bK+1os5SUFEFPT09Yt25dqfKS71DJ97ygoEAYMWKEIJFIhO+//75WPrui38/qmjRpkmBsbFxlvS1btggAhD///LNU+Zw5cwQAQlRUlLpsx44dAgBh165dVbabkpIiyGQy4YcfftA8eNJ6HAKjRqlnz54AgNjY2HKPjxkzBjt27IBKpVKX/fHHH8jNzcXLL79cpr5cLoetrW3dBFuJZs2awd3dvcLrGD58OORyOX7++edS5Vu3bsXLL78MmUxWqtzKygrt2rUr087zzz8PALh69Wqp8tjY2Ao/+7969OiBlJQU3Lx5U1124sQJmJqaYurUqbh27RrS09NLHSs5ryq7d++Gp6cnFAoFPD098dtvv5Vb78k5QFlZWXjrrbfg5OQEuVwOa2trDBgwAFFRUQCKh0P37t2L27dvq4dWnpxX9F+enp7o27dvmXKVSgUHBwe8+OKL6rLt27fD29sbJiYmMDU1Rfv27fHNN99Uea0PHjzAK6+8AgsLC1hYWGDMmDF4+PAhdu/eDYVCgezs7CrbeNLevXtRWFgIf3//CusUFhZi9OjR+P3337Fq1ao6mSuUlZVV42HWoqIiZGZmVni85JiNjU2pcjs7OwCAoaGhumzp0qXw8fHB888/D5VKhZycnArbtba2RocOHfD777/XKG7SbkyAqFGKj48HAFhY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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T23: 100%|██████████| 11/11 [13:05<00:00, 71.39s/it]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAghdJREFUeJzt3Xlc1NX6B/DPzAAzgKwiOwjiiogoBmqaS7iWaVm5VC63ss17S9t+tmja4pKZLaZl1zYzLevaZiSilAtKLrjvoiCyI7vAwJzfHzCjyCKDM3xn+bxfL+6N75z5zjMclsdznnOOTAghQERERGRF5FIHQERERNTamAARERGR1WECRERERFaHCRARERFZHSZAREREZHWYABEREZHVYQJEREREVocJEBEREVkdJkBERERkdZgAEZHZmTZtGoKCgupck8lkeOONNySJx1AqKyvx/PPPw8fHBw4ODujZsye++eabW75vSUkJPD098e233xogSuuwatUqBAYGoqKiQupQyEiYAJFZ+/LLLyGTyXQfNjY28PPzw7Rp05Cenl6v/eDBgyGTydCpU6cG7xcXF6e718aNG3XX//nnH8ycORPdu3eHo6MjAgMD8eCDD+L06dMGey9BQUF13oujoyOioqLw9ddf12ubkJCga7d27doG73f77bdDJpMhLCyszvV33nkHffv2Rbt27aBSqdCpUyc899xzyMnJaVHcSUlJkMlkeP/99+s9NnbsWMhkMnzxxRf1Hrvjjjvg5+fXotc0lHXr1mH58uWSxnC9V199FcuWLcPtt9+OZcuWoVu3bpgyZQp+//33W7rvBx98ACcnJ0ycOFF37Y033oBMJkNubm6dtmlpaQgJCYG7uzsOHDhwS6+7evVqDBo0CF5eXlAqlQgODsb06dNx4cIFve9VUFAAT0/Pej+bWmfOnMHEiRPh7+8PBwcHdO3aFQsWLEBZWVmddtrfATd+jBw5sk67adOmobKyEp9++qnesZJ5sJE6ACJDWLBgAYKDg1FeXo49e/bgyy+/xM6dO3H06FGoVKo6bVUqFc6ePYukpCRERUXVeezbb7+FSqVCeXl5neuLFy/Grl278MADDyA8PByZmZn4+OOP0bt3b+zZs6dektFSEREReP755wEAGRkZ+PzzzzF16lRUVFTg8ccfr9depVJh3bp1ePjhh+tcv3DhAnbv3l3v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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Empirical Lipschitz constants: K12=5.5859, K23=3.4846\n" + ] + } + ], + "source": [ + "import copy\n", + "import torch\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.stats import wasserstein_distance\n", + "from tqdm import tqdm\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Utilities for state‐dict arithmetic & norms\n", + "# -----------------------------------------------------------------------------\n", + "def subtract_state_dicts(sd_a, sd_b):\n", + " return {k: sd_a[k] - sd_b[k] for k in sd_a}\n", + "\n", + "\n", + "def add_scaled(sd_base, sd_delta, alpha):\n", + " return {k: sd_base[k] + alpha * sd_delta[k] for k in sd_base}\n", + "\n", + "\n", + "def state_dict_norm(sd):\n", + " total = torch.stack([v.flatten().dot(v.flatten()) for v in sd.values()]).sum()\n", + " return torch.sqrt(total).item()\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your 3 reward models & tokenizer\n", + "# -----------------------------------------------------------------------------\n", + "paths = [\n", + " 'LifelongAlignment/aifgen-lipschitz-0-reward-model',\n", + " 'LifelongAlignment/aifgen-lipschitz-1-reward-model',\n", + " 'LifelongAlignment/aifgen-lipschitz-2-reward-model',\n", + "]\n", + "\n", + "models = [\n", + " AutoModelForSequenceClassification.from_pretrained(\n", + " p,\n", + " torch_dtype=torch.bfloat16,\n", + " cache_dir='//network/scratch/s/shahrad.mohammadzadeh/.cache',\n", + " ).cuda()\n", + " for p in paths\n", + "]\n", + "tokenizer = AutoTokenizer.from_pretrained(paths[0])\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Compute task vectors & their norms\n", + "# -----------------------------------------------------------------------------\n", + "sd1, sd2, sd3 = [m.state_dict() for m in models]\n", + "T12 = subtract_state_dicts(sd2, sd1)\n", + "T23 = subtract_state_dicts(sd3, sd2)\n", + "norm12 = state_dict_norm(T12)\n", + "norm23 = state_dict_norm(T23)\n", + "print(f'||T12|| = {norm12:.2f}, ||T23|| = {norm23:.2f}')\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your prompts\n", + "# -----------------------------------------------------------------------------\n", + "prompts = prompts_lip\n", + "\n", + "# In experiments.ipynb, add a new cell before your interpolation\n", + "\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\n", + "class PromptDataset(Dataset):\n", + " def __init__(self, prompts):\n", + " self.prompts = prompts\n", + "\n", + " def __len__(self):\n", + " return len(self.prompts)\n", + "\n", + " def __getitem__(self, i):\n", + " return self.prompts[i]\n", + "\n", + "\n", + "def compute_rewards(model, prompts, batch_size=64, num_workers=4):\n", + " \"\"\"Compute reward scores in batches.\"\"\"\n", + " model.eval()\n", + " ds = PromptDataset(prompts)\n", + " loader = DataLoader(\n", + " ds,\n", + " batch_size=batch_size,\n", + " shuffle=False,\n", + " num_workers=num_workers,\n", + " collate_fn=lambda batch: tokenizer(\n", + " batch,\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ),\n", + " )\n", + " rewards = []\n", + " with torch.no_grad():\n", + " for batch in loader:\n", + " batch = {k: v.cuda(non_blocking=True) for k, v in batch.items()}\n", + " logits = model(**batch).logits\n", + " # if binary head, pick class 1; else regression head\n", + " if logits.shape[-1] > 1:\n", + " vals = logits[:, 1]\n", + " else:\n", + " vals = logits[:, 0]\n", + " rewards.extend(vals.cpu().tolist())\n", + " return rewards\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T12 (RM1 → RM2)\n", + "# -----------------------------------------------------------------------------\n", + "alphas = np.linspace(0, 1, 11)\n", + "all_rewards_12 = []\n", + "for α in tqdm(alphas, desc='Interp T12'):\n", + " sd_interp = add_scaled(sd1, T12, α)\n", + " m = copy.deepcopy(models[0])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_12.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "# Wasserstein distances & Lipschitz estimate\n", + "dists12 = [\n", + " wasserstein_distance(all_rewards_12[i], all_rewards_12[i + 1])\n", + " for i in range(len(alphas) - 1)\n", + "]\n", + "rates12 = [d / ((alphas[i + 1] - alphas[i]) * norm12) for i, d in enumerate(dists12)]\n", + "K12 = max(rates12)\n", + "\n", + "plt.figure()\n", + "plt.plot(alphas[:-1], dists12, marker='o')\n", + "plt.title(f'RM1→RM2: W-dist vs α (K≈{K12:.3f})')\n", + "plt.xlabel('α')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T23 (RM2 → RM3)\n", + "# -----------------------------------------------------------------------------\n", + "betas = np.linspace(0, 1, 11)\n", + "all_rewards_23 = []\n", + "for β in tqdm(betas, desc='Interp T23'):\n", + " sd_interp = add_scaled(sd2, T23, β)\n", + " m = copy.deepcopy(models[1])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_23.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "dists23 = [\n", + " wasserstein_distance(all_rewards_23[i], all_rewards_23[i + 1])\n", + " for i in range(len(betas) - 1)\n", + "]\n", + "rates23 = [d / ((betas[i + 1] - betas[i]) * norm23) for i, d in enumerate(dists23)]\n", + "K23 = max(rates23)\n", + "\n", + "plt.figure()\n", + "plt.plot(betas[:-1], dists23, marker='o')\n", + "plt.title(f'RM2→RM3: W-dist vs β (K≈{K23:.3f})')\n", + "plt.xlabel('β')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "print(f'Empirical Lipschitz constants: K12={K12:.4f}, K23={K23:.4f}')" + ] + }, + { + "cell_type": "markdown", + "id": "b127c047", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c834752b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "||T12|| = 0.83, ||T23|| = 0.88\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T12: 0%| | 0/11 [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Interp T23: 100%|██████████| 11/11 [08:16<00:00, 45.12s/it]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHHCAYAAABXx+fLAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiIlJREFUeJzt3Xd8k9X+B/BPkiZN96B0L8ouHUChpYAyLEO4CIKAgIC4Ba4D5afovVauVxkiF68gOC6gDEFQERRraxVZLYWWAqWUWdrSvXfTNDm/P9InUDto2iRPxvf9evF60SdPnnyTk7TfnPM95wgYYwyEEEIIIWZEyHcAhBBCCCH6RgkQIYQQQswOJUCEEEIIMTuUABFCCCHE7FACRAghhBCzQwkQIYQQQswOJUCEEEIIMTuUABFCCCHE7FACRAghhBCzQwkQIcToPPnkk/D3929xTCAQ4N133+UlHm1pbGzEa6+9Bg8PD1hbWyM0NBS7du3q9nVramrg6uqKPXv2aCFK8xATEwNbW1sUFxfzHQrREUqAiFHbuXMnBAKB+p+FhQW8vLzw5JNPIjc3t9X5Y8eOhUAgQN++fdu8XlxcnPpaBw8eVB8/e/Ysli9fjkGDBsHGxga+vr6YM2cOrl27prXn4u/v3+K52NjYIDw8HF9//XWrc48dO6Y+b/fu3W1eb9SoURAIBAgKCmpx/IMPPsCIESPQs2dPSKVS9O3bF6+88kqXf9EnJSVBIBDgP//5T6vbpk+fDoFAgB07drS67cEHH4SXl1eXHlNb9u7di02bNvEaw73efvttbNy4EaNGjcLGjRsxcOBALFq0CD///HO3rvvxxx/Dzs4Ojz/+uPrYu+++C4FAgJKSkhbn5uTkoHfv3nB2dkZKSkq3HjcpKQlLly5FWFgYxGIxBAKBxtdobGzEBx98gAEDBkAqlcLNzQ1Tp07FnTt31Ofc+3n467/ExMQW1+vs+3/y5Mno06cP1qxZ07UnTwyeBd8BEKIN//rXv9CrVy80NDQgMTERO3fuxMmTJ5GWlgapVNriXKlUihs3biApKQnh4eEtbtuzZw+kUikaGhpaHF+3bh1OnTqF2bNnIyQkBAUFBdi8eTOGDh2KxMTEVklGVw0ePBivvfYaACA/Px9ffvklFi9eDJlMhmeffbbV+VKpFHv37sUTTzzR4vjt27dx+vTpVs8dAJKTkzF48GA8/vjjsLOzw5UrV/DFF1/g559/RmpqKmxsbDSKeejQobC2tsbJkyfx6quvtrjt9OnTsLCwwKlTp7BkyRL18cbGRpw9exbTpk3T6LE6Ul9fDwsLzX6l7d27F2lpaXjllVe0FkdXMcbwv//9DyNGjFAn3y+88ALS0tLw+eefY+rUqV26rlwux8cff4xXX30VIpGow3Nzc3Mxbtw4lJWV4bfffsPQoUO79Jico0eP4ssvv0RISAgCAgI0/sIgl8sxdepUnD59Gs8++yxCQkJQXl6OM2fOoLKyEt7e3i3Of+mllzB8+PAWx/r06dPiZ03e/88//zxef/11rF69GnZ2dho+e2LwGCFGbMeOHQwAO3v2bIvjb7zxBgPA9u/f3+L4mDFj2KBBg1j//v3ZK6+80uK2+vp6Zm9vz2bNmsUAsAMHDqhvO3XqFJPJZC3Ov3btGrO0tGQLFizQynPx8/NjU6dObXGsqKiI2drasoEDB7Y4/scffzAAbObMmczCwoIVFxe3uP39999nbm5ubPTo0WzQoEH3feyDBw8yAOybb77pUuzjxo1jbm5uLY5lZGQwAGz+/Pmsf//+LW47ffo0A8A+/vjjLj3e4sWLmZ+fX5fue6+pU6dq5TraUFBQwACwt956q8XxuXPndqoN2/P9998zAOzGjRstjkdHRzMA6vdObm4u69u3L3N0dGz1eeqqgoICVldXxxhjbNmyZUzTPznr1q1jYrGYnTlzpsPzuM/DvZ9ZTbT3/i8sLGQikYj973//69J1iWGjITBikh544AEAwM2bN9u8fd68edi/fz+USqX62JEjR1BXV4c5c+a0On/kyJGQSCQtjvXt2xeDBg3ClStXtBh5Sz179sSAAQPafR7Tp0+HpaUlDhw40OL43r17MWfOnPt+4+dw9TQVFRUtjt+8ebPdx77X6NGjUVhYiBs3bqiPnTp1Cvb29njuuedw9erVFkMtp06dUt/vfg4dOoSgoCBIpVIEBQXhhx9+aPO8v9YAVVdX45VXXoG/vz8sLS3h6uqKCRMmqId1xo4di59//hlZWVnq4ZK/1hXdKygoCOPGjWt1XKlUwsvLC4899pj62L59+xAWFgY7OzvY29sjODgYH3/8cYfPk+t1dHJyanG8uLi4S0NHnEOHDsHf3x+9e/du95z8/HyMGzcORUVFiI2NxbBhw7r8ePdyc3ODlZVVl+6rVCrx8ccf49FHH0V4eDiamppQV1d33/tVV1ejqalJo8dq7/3v6uqKkJAQ/PjjjxpdjxgHSoCISbp9+zaA1n9MOPPnz0d+fj6OHTumPrZ371489NBDcHV17dRjMMZQWFgIFxeXTsdVVlaGv/3tb8jMzOzU+U1NTbhz5067z8Pa2hrTp0/HN998oz524cIFXL58GfPnz+8w9pKSEhQUFODEiRN46aWXIBKJMHbs2BbnPfTQQ3jooYfuGyeXyJw8eVJ97NSpUxgxYgQiIiIgFotx+vTpFrfZ2dkhNDS0w+vGxsZi1qxZEAgEWLNmDWbMmIElS5bg3Llz943phRdewNatWzFr1ix8+umneP3112FlZaVOWN9++20MHjwYLi4u2LVrF3bt2tVhPdDcuXNx/PhxFBQUtDh+8uRJ5OXlqetr4uLiMG/ePDg5OWHdunVYu3Ytxo4dq0762sMYa3WsuLgYSUlJGDBgwH2fb3tOnz7d4VBWYWEhxo8fj4KCAvz666+thpDuVVtbi4yMjFaJAqeturuuSk9PR15eHkJCQvDcc8/BxsYGNjY2CAkJwR9//NHmfZYsWQJ7e3tIpVKMGzeu3fdJZ9//ABAWFtbivUtMCL8dUIR0DzcE9ttvv7Hi4mKWk5PDDh48yHr27MksLS1ZTk5Oi/O5ITDGGBs2bBh7+umnGWOMlZeXM4lEwr766qtOd6fv2rWLAdCoezw/P5/169eP+fn5saysrBa3+fn5sYkTJ7Li4mJWXFzMLl26xBYuXMgAsGXLlrU4994Yf/rpJyYQCFh2djZjjLGVK1eygICAVs/3r3EAUP/z9vZuNVzIxdSZIaKqqiomEonUrydjjPXv35+tXr2aMcZYeHg4W7lypfq2nj17sgkTJtz3uoMHD2YeHh6soqJCfSw2NpYBaBUXABYdHa3+2cHBodXr9leaDIFdvXqVAWCffPJJi+NLly5ltra26qGel19+mdnb27OmpqZOXZeTmZnJALAPP/yQVVRUsN9//52Fh4czAOzo0aMaXYsjl8uZQCBgr732WqvbuCEwPz8/Zm9vzxISEtq9TllZGXvmmWeYRCJhAJhQKGQPPPAA27p1K7t69Sq7ceMG+/DDD9Xvu7ZoOgTGDd316NGD9e3bl+3YsYPt2LGD9e3bl0kkEnbhwgX1uadOnWKzZs1i//vf/9iPP/7I1qxZw3r06MGkUilLSUlpde3Ovv8ZY+yDDz5gAFhhYWGnYyfGgYqgiUmIiopq8bO/vz92797dqkjyXvPnz8d7772HTz/9FAcPHoRIJMKjjz6K5OTk+z5eRkYGli1bhsjISCxevFh9XKFQQC6Xt3s/R0dHHD16FOPHj8f48ePx559/tpgJFRsbi549e7a4z5IlS/Dhhx+2e82JEyfC2dkZ+/btw+uvv459+/Zh0aJFHcbv7OyMuLg4NDQ04Pz58/j+++9RU1PT6jyuJ+1+7OzsEBISou4BKikpwdWrVzFy5EgAqhlpXA/ItWvXUFxcfN/hr/z8fKSmpuLNN9+Eg4OD+viECRMQGBiI2traDu/v6OiIM2fOIC8vD56enp16Hh3p168fBg8ejP3792P58uUAVO198OBBTJs2TT3U4+joiNraWsTFxWHy5Mldeqz//Oc/WL16NQBgxIgRiIyM7NJ1ysrKwBhrtwcRUPUAOTs7w8PDo91zPv30U1y6dAlfffUV/P39kZ6ejgMHDmD58uVQKBQAVMNdGzZs6FKcbeHej9XV1Th//jx8fHwAAOPHj0efPn2wfv169QzIkSNHqt9rAPDII4/gscceQ0hICFatWoWYmJgW1+7s+x+424tcUlLS6d5hYhxoCIyYhC1btiAuLg4HDx7ElClTUFJSAktLyw7v8/jjj6OyshK//PIL9uzZg7/97W+dmulRUFCAqVOnwsHBQZ04cbZu3QorK6sO//Xp0wfZ2dm4efMmnn/++RbXjoiIQFxcHGJiYrBhwwY4OjqivLy8Vf3RvcRiMWbPno29e/fi+PHjyMnJ6XD4CwAkEgmioqLwt7/9Df/85z+xZcsWPP300/jpp5/u+/zbM3r0aHWtz+nTpyESiTBixAgAqj9QycnJkMlkrep/GhsbUVBQ0OKfQqFAVlYWALS5ZEH//v3vG8/69euRlpYGHx8fhIeH491338WtW7e6/PwA1TDYqVOn1EM9x44dQ1FREebOnas+Z+nSpejXrx8efvhheHt746mnnmr1B/h+nnjiCezduxdvvPEGbt26hUGDBnWqFqs9rI3hNc7u3btRVlaGCRMmoKioqM1zZs+ejdOnT+Pxxx/HiBEj8NRTT+GXX35BQUEB4uLicOLECWRnZ2P27NldjvGvuIRy1KhR6uQHAHx9fTF69Oj7Dkv16dMH06dPxx9//KFO0jiavP+51647dVjEMFECRExCeHg4oqKiMGvWLBw+fBhBQUGYP39+u9/qAMDDwwNjx47FRx99hOPHj983aQCAyspKPPzww6ioqEBMTEyrnoWoqCjs2LGjw3//+9//4OvrCwsLCzz11FMt7u/i4oKoqChMmjQJr732Gnbv3o1Dhw7dt4B2/vz5SE1NxbvvvovQ0FAEBgbe97nca+TIkfDw8OjWQnlcQnPq1CmcOnUKwcHBsLW1VV9fJpPh7NmzOHnyJCwsLNTJ0enTp+Hh4dHiX05OTpfj4MyZMwe3bt3CJ598Ak9PT3z44YcYNGgQfvnlly5fc+7cuWCMqYvOv/32Wzg4OLTo6XF1dUVqaioOHz6MRx55BH/88QcefvjhFj2F99OnTx/MmzcPa9euRUJCAgoLC7Fu3TqN43V2doZAIEB5eXm754wZMwbffvstMjMzMWnSJFRWVrY6x9fXF+vWrUPfvn1hYWEBb29vPP3000hMTMSwYcMQEhKC7777Tj35QBu4z5abm1ur21xdXTt8ThwfHx80Njbet7ewo/c/9zia1PoR40BDYMTkiEQirFmzBuPGjcPmzZvx5ptvtnvu/Pnz8cwzz8DR0RFTpkzp8LoNDQ2YNm0arl27ht9++63NJGPAgAEdFqwyxvDcc88hNzcXe/bswcyZMzt8zKlTp2LMmDH44IMP8Pzzz7e7Rs/o0aPh6+uLY8eOdekPJaB6fm398eusewuhExISMGrUKPVtnp6e8PPzUydHQ4YMgbW1NQAgNDQUcXFxLa7l7u6u7sG7fv16q8e6evVqp2Ly8PDA0qVLsXTpUhQVFWHo0KF4//338fDDDwPQ/Ft9r169EB4erh4G+/777zFjxoxWvY0SiQTTpk3DtGnToFQqsXTpUnz22Wf45z//2WpdmvsJCAiAt7c38vLyNLofAFhYWKB37973LbqfNm0atm/fjsWLF+Nvf/sbYmNjW8ze2rhxI3bt2oVXX30VvXr1wuXLl7F//35s375dfY69vT3ee+89jWNsT3BwMMRicZuF1Xl5ea2Gitty69YtSKVSdSLekfbe/5mZmXBxcenU4xHjQj1AxCSNHTsW4eHh2LRpU6tFDe/12GOPITo6Gp9++mmHw0wKhQJz585FQkICDhw40OWajCtXruCbb77Bjh07WgybdOSNN95AaWkpvvjii3bPEQgE+O9//4vo6GgsXLiw3fNqa2vbnEr83Xffoby8vNX0585OgwdUSU6vXr0QHx+Pc+fOtajJAFTfsg8dOoSrV6+2qP9xcnJCVFRUi39SqRQeHh4YPHgwvvrqqxZ/mOLi4pCent5hLAqFotUfM1dXV3h6ekImk6mP2djYaJz0zZ07F4mJidi+fTtKSkpatWNpaWmLn4VCIUJCQgCgxWO35+LFiy1+zs3NRW5ubofT2DsSGRnZqVlzCxcuxKZNm3Dy5EnMmjWrRS3blClTcOHCBSxduhQPP/wwXn/9dZw9exY3b97EgQMHcOTIEeTk5OCll17qUoyAqq4uOztb/bOdnR2mTJmC06dPIyMjQ338ypUrOH36NCZMmKA+1tYq5hcuXMDhw4cxceJECIWqP3Wavv8B1cKJXf28E8NGPUDEZK1cuRKzZ8/Gzp078cILL7R5joODQ6f2j3rttddw+PBhTJs2DWVlZa22n/jrSsztCQwMxI0bN+Du7t6p8wHg4YcfRlBQEDZu3Ihly5ZBLBa3ed706dMxffr0Dq91/fp1REVFYe7cuRgwYACEQiHOnTuH3bt3w9/fHy+//HKL87kp8J0thh49erR676p7e4AAVQLETdfvzPo/ALBmzRpMnToVo0ePxlNPPYWysjJ88sknGDRoUIfDm9XV1fD29sZjjz2G0NBQ2Nra4rfffsPZs2fx0Ucfqc8LCwvD/v37sWLFCgwfPhy2trb3XZ16zpw5eP311/H666/D2dm5VQH+M888g7KyMowfPx7e3t7IysrCJ598gsGDB2PgwIH3fc67du1CYWEhZs6cidraWnz22WcQCoXtvofvZ/r06di1axeuXbuGfv36dXjuSy+9hLKyMqxevRqLFi3Cnj17IBQKMXjw4DbPDwgIQEBAQLvXy8rKUr8fuCTs3//+NwDAz8+vRbI+cOBAjBkzpsXSFB988AHi4+Mxfvx4dXL13//+F87OznjrrbfU582dOxdWVlYYOXIkXF1dkZ6ejs8//xzW1tZYu3at+jxN3/9FRUW4ePEili1b1uHrRowUr3PQCOmm9laCZowxhULBevfuzXr37q2ektzetPB7tTUNfsyYMS2mzf71nza0tRI0Z+fOnQwA27FjR7sxtuWvz7e4uJg999xzbMCAAczGxoZJJBLWt29f9sorr7RaTZqLSZOVkj/77DMGgHl5ebW6LSUlRf16aTKl+LvvvmMDBw5klpaWLDAwkH3//fdtrgSNe6bBy2QytnLlShYaGsrs7OyYjY0NCw0NZZ9++mmL+9TU1LD58+czR0fHNqfWt2fUqFEMAHvmmWda3Xbw4EE2ceJE5urqyiQSCfP19WXPP/88y8/P7/Ca3DT42bNns8jISGZnZ8d69uzJxo8fz06cONGpuNoik8mYi4sLe++991oc/+tK0Pf6+9//zgCwF154ocuPy9jd92lb/8aMGdPi3LaOMcZYcnIyi4qKYjY2NszOzo5Nnz6dXbt2rcU5H3/8MQsPD2fOzs7MwsKCeXh4sCeeeIJdv369xXmavv+3bt3KrK2tWVVVVbdeB2KYBIx1MD2AEEKIXty+fRu9evXChx9+iNdff12r137vvfewY8cOXL9+vdOrgxNgyJAhGDt2bJsb/RLjRzVAhBBi4l599VXU1NRg3759fIdiNGJiYnD9+nWsWrWK71CIjlANECGEmDhbW9t21/ghbZs8eXKHdWbE+FEPECGEEELMDtUAEUIIIcTsUA8QIYQQQswOJUCEEEIIMTtUBN0GpVKJvLw82NnZ0QZ4hBBCiJFgjKG6uhqenp7qFcDbQwlQG/Ly8lrsPkwIIYQQ45GTkwNvb+8Oz6EEqA12dnYAVC+gvb29Vq8tl8sRGxuLiRMntrulAdEfag/DQu1hWKg9DAu1x/1VVVXBx8dH/Xe8I5QAtYEb9rK3t9dJAmRtbQ17e3t6AxsAag/DQu1hWKg9DAu1R+d1pnyFiqAJIYQQYnYoASKEEEKI2aEEiBBCCCFmhxIgQgghhJgdSoAIIYQQYnYoASKEEEKI2aEEiBBCCCFmhxIgQgghhJgdSoAIIYQQYnZoJWhCCCGE6IVCyZCUWYai6ga42kkR3ssZIiE/m45TAkQIIYQQnYtJy8fqI+nIr2xQH/NwkCJ6WiAmB3noPR4aAiOEEEKITsWk5ePF3Sktkh8AKKhswIu7UxCTlq/3mCgBIoQQQojOKJQMq4+kg7VxG3ds9ZF0KJRtnaE7lAARQgghRGeSMsta9fzciwHIr2xAUmaZ/oICJUCEEEII0aGi6vaTn66cpy2UABFCCCFEZ1ztpFo9T1soASKEEEKIzoT3coaHgxTtTXYXQDUbLLyXsz7DogSIEEIIIbojEgoQPS2wzdu4pCh6WqDe1wOiBIgQQgghOjU5yANbnxgKW0tRi+PuDlJsfWIoL+sA0UKIhBBCCNG5yUEe+CYpG39eK8HsMG/MHOpNK0ETQgghxLQxxpCWWwUAmB/hiyG+TrzGQ0NghBBCCNG5vMoGlNY2wkIowEAPe77DoQSIEEIIIbp36U4FAKCfmx2kYlHHJ+sBJUCEEEII0bmLdyoBACHeDjxHosJ7ArRlyxb4+/tDKpUiIiICSUlJ7Z57+fJlzJo1C/7+/hAIBNi0aVOH1167di0EAgFeeeUV7QZNCCGEEI1cylUlQMGUAAH79+/HihUrEB0djZSUFISGhmLSpEkoKipq8/y6ujoEBARg7dq1cHd37/DaZ8+exWeffYaQkBBdhE4IIYSQTmKMqROgEC9HfoNpxmsCtHHjRjz77LNYsmQJAgMDsW3bNlhbW2P79u1tnj98+HB8+OGHePzxx2FpadnudWtqarBgwQJ88cUXcHLit8qcEEIIMXd3yutRUSeHWCRAP3dbvsMBwOM0+MbGRiQnJ2PVqlXqY0KhEFFRUUhISOjWtZctW4apU6ciKioK//73v+97vkwmg0wmU/9cVaWapieXyyGXy7sVy19x19P2dUnXUHsYFmoPw0LtYViMuT3OZ5UCAPq72UHIlJDLlTp5HE1eG94SoJKSEigUCri5ubU47ubmhoyMjC5fd9++fUhJScHZs2c7fZ81a9Zg9erVrY7HxsbC2tq6y7F0JC4uTifXJV1D7WFYqD0MC7WHYTHG9jicJQQghL2iAkePHtXZ49TV1XX6XJNaCDEnJwcvv/wy4uLiIJV2flfZVatWYcWKFeqfq6qq4OPjg4kTJ8LeXrtrFcjlcsTFxWHChAkQi8VavTbRHLWHYaH2MCzUHobFmNtj/45zAMowdUQQpgzz1tnjcCM4ncFbAuTi4gKRSITCwsIWxwsLC+9b4Nye5ORkFBUVYejQoepjCoUCx48fx+bNmyGTySAStV57wNLSss2aIrFYrLM3mS6vTTRH7WFYqD0MC7WHYTG29mCM4VKeKjEZ7Oes09g1uTZvRdASiQRhYWGIj49XH1MqlYiPj0dkZGSXrvnQQw/h0qVLSE1NVf8bNmwYFixYgNTU1DaTH0IIIYToTlZpHaobmiCxEKKfmx3f4ajxOgS2YsUKLF68GMOGDUN4eDg2bdqE2tpaLFmyBACwaNEieHl5Yc2aNQBUhdPp6enq/+fm5iI1NRW2trbo06cP7OzsEBQU1OIxbGxs0KNHj1bHCSGEEKJ7F5unvw/0sIdYxPvyg2q8JkBz585FcXEx3nnnHRQUFGDw4MGIiYlRF0ZnZ2dDKLz7YuXl5WHIkCHqnzds2IANGzZgzJgxOHbsmL7DJ4QQQsh9cFtghHgZxgKIHN6LoJcvX47ly5e3edtfkxp/f38wxjS6PiVGhBBCCH+4LTAMZQVojuH0RRFCCCHEpCiVDJebC6ANZQ8wDiVAhBBCCNGJzNJa1MiaIBUL0aenYawAzaEEiBBCCCE6cal5+CvQwx4WBlQADVACRAghhBAd4ep/Qrwd+Q2kDZQAEUIIIUQnLuVWAACCDWwGGEAJECGEEEJ0QGHABdAAJUCEEEII0YFbxTWoa1TAWiJCgIEVQAOUABFCCCFEB7j6n0Ge9hAJBTxH0xolQIQQQgjRukvNW2AEeznyG0g7KAEihBBCiNZd5LbAMMD6H4ASIEIIIYRoWZNCifR8VQG0oW2BwaEEiBBCCCFadaO4Bg1yJWwtLdCrhw3f4bSJEiBCCCGEaBVXAB3kZQ+hARZAA5QAEUIIIUTLuC0wDHEBRA4lQIQQQgjRqovcDDAD3AKDQwkQIYQQQrRGrlDiSnMBdAj1ABFCCCHEHFwrrEZjkxJ2Ugv49bDmO5x2UQJECCGEEK25pN4B3gECgWEWQAOUABFCCCFEiy4a+ArQHAu+AyCEEEJ0RaFkSMosQ1F1A1ztpAjv5WyQ+1KZEmOYAQZQAkQIIcRExaTlY/WRdORXNqiPeThIET0tEJODPHiMzHTJmhTIKGgugDbQFaA5NARGCCHE5MSk5ePF3Sktkh8AKKhswIu7UxCTls9TZKbtakE15AoGR2sxvJ2s+A6nQ5QAEUIIMSkKJcPqI+lgbdzGHVt9JB0KZVtnkO64uwO8YRdAA5QAEUIIMTFJmWWten7uxQDkVzYgKbNMf0GZiXtngBk6SoAIIYSYlKLq9pOfrpxHOu+ikRRAA5QAEUIIMTGudlKtnkc6p0GuwLXCagCGvQUGhxIgQgghJmWwjyOsxKJ2bxdANRssvJez/oIyA1fyq9CkZOhhI4Gng+Enl5QAEUIIMRlVDXI8+/U51MsVHZ4XPS2Q1gPSMnUBtIGvAM2hBIgQQohJyK+sx5xtCTh5owTWEhGWjesNj7/0RDhaibH1iaG0DpAOqAugjaD+B6CFEAkhhJiA9LwqPLXzLAqqGtDTzhI7nhyOIC8HrJjQH0mZZfj8+E38cbUYEwe5UfKjI3d7gBz5DaSTKAEihBBi1I5fK8bSPSmokTWhr6stdiwZDm8n1S7kIqEAkb17oK6xCX9cLcbZ2+U8R2ua6hvvKYA2kh4gGgIjhBBitL49l4Ondp5FjawJIwKccfDFkerk517D/J0hEACZJbUorKLp79qWnl8JJQN62lnCzd6S73A6hRIgQgghRocxho1x1/B/By+iSckwY7AnvnoqHA5W4jbPd7ASY5CnPQAg8VapPkM1Cxfvqf8xhgJogBIgQgghRqaxSYnXDlzAf+OvAwCWj+uD/8wdDEuL9qe+A0BErx4AgMRbtAK0tt07A8xYUAJECCHEaFQ1yPHkjiR8n5ILkVCANTOD8fqk/p3qdRgRoEqAzmRSD5C2GdMWGBwqgiaEEGIU8irqsWTHWVwtrIaNRITNC4ZiXH/XTt8/vLkO6FZxLYqqGuBqb/iL9RmDWlkTbhTXAACCjKQAGqAeIEIIIUbgcl4lHv30FK4WVsPVzhL7n4/UKPkBAAdrMQa6q+qAztBGqFpzOa8KjAHu9lKj2l6EEiBCCCEG7c9rxZizLQGFVTL0c7PFD8tGdbmnISJAtf0FFUJrz8U7FQCMq/4HoASIEEKIAdt/NhtP7TyL2kYFIgN64MALI+HlaNXl692tA6IeIG3hCqCNZQVoDtUAEUIIMTjcNPdPfr8BAJg5xAtrZ4VAYtG97+3h/qoeoBtFNSiulqGnnXGsWWPIjHEGGEA9QIQQQgxMY5MSr317QZ38/H18H3w0J7TbyQ8AONlIMMDdDgCQRL1A3VbdIMet4loAxrMCNIf3BGjLli3w9/eHVCpFREQEkpKS2j338uXLmDVrFvz9/SEQCLBp06ZW56xZswbDhw+HnZ0dXF1dMWPGDFy9elWHz4AQQoi2VNY3T3M/r5rmvm5WMF6b2Llp7p3FDYNRHVD3peVWAQC8HK3Qw9a4etN4TYD279+PFStWIDo6GikpKQgNDcWkSZNQVFTU5vl1dXUICAjA2rVr4e7u3uY5f/75J5YtW4bExETExcVBLpdj4sSJqK2t1eVTIYQQ0k25FfWYve00Tt8shY1EhO1PDsfc4b5af5wRzYXQtB5Q913KrQBgfL0/AM81QBs3bsSzzz6LJUuWAAC2bduGn3/+Gdu3b8ebb77Z6vzhw4dj+PDhANDm7QAQExPT4uedO3fC1dUVycnJePDBB7X8DAghhGhDWm4lntp5FkXVMrjZW2L7k8MxyFM3f1TDm1eEvlZYg9IamdH1XBgSbgsMY6v/AXjsAWpsbERycjKioqLuBiMUIioqCgkJCVp7nMpKVeM4Oztr7ZqEEEK054+rRZj7WQKKqmXo72aHH5aO0lnyAwDONhL0d6M6IG1IyzW+FaA5vPUAlZSUQKFQwM3NrcVxNzc3ZGRkaOUxlEolXnnlFYwaNQpBQUHtnieTySCTydQ/V1WpxjTlcjnkcrlWYuFw19P2dUnXUHsYFmoPw6KP9th/7g6ij1yBQskQGeCMzY+Hwt7KQufvgeH+jrhaWI3TN4oRNcBFp4+lLYb2+aisl+N2aR0AYICrjUHEpUkMJj0NftmyZUhLS8PJkyc7PG/NmjVYvXp1q+OxsbGwtrbWSWxxcXE6uS7pGmoPw0LtYVh00R6MAUdzhIjNVQ1EDO+pxGM9i3DyD/20vbhcAECE3y5lY5gwUy+PqS2G8vm4Wql6DXtYMpw+Zhgx1dXVdfpc3hIgFxcXiEQiFBYWtjheWFjYboGzJpYvX46ffvoJx48fh7e3d4fnrlq1CitWrFD/XFVVBR8fH0ycOBH29vbdjuVecrkccXFxmDBhAsRisVavTTRH7WFYqD0Mi67ao7FJibcOXUZsbj4AYPnYALw0vrdWZ3rdT0SNDDvW/Yn8OgFGjImCs41Eb4/dVYb2+cg5ngmkX0d4H3dMmRLKdzgA7o7gdAZvCZBEIkFYWBji4+MxY8YMAKohq/j4eCxfvrzL12WM4e9//zt++OEHHDt2DL169brvfSwtLWFp2boITiwW6+xNpstrE81RexgWag/Dos32qKyX44Vd55FwqxQWQgE+eDQYc4b7aOXamnB3EqOvqy2uF9Xg/J1qTA7q/hdvfTGUz0d6QTUAINTXySDiAaBRHLwOga1YsQKLFy/GsGHDEB4ejk2bNqG2tlY9K2zRokXw8vLCmjVrAKgKp9PT09X/z83NRWpqKmxtbdGnTx8AqmGvvXv34scff4SdnR0KCgoAAA4ODrCy6vry6YQQQrrnTnkdluw4i+tFNbCRiLD1iTA82K8nb/FEBDjjelENEm+VGlUCZCi4GWDGtgUGh9cEaO7cuSguLsY777yDgoICDB48GDExMerC6OzsbAiFdyeq5eXlYciQIeqfN2zYgA0bNmDMmDE4duwYAGDr1q0AgLFjx7Z4rB07duDJJ5/U6fMhhBDStrTcSizZeRbFepjm3lkjAnpgd2I27QvWBeW1jbhTXg8AGEQJUNcsX7683SEvLqnh+Pv7gzHW4fXudzshhBD9+iOjCMv2pqCuUYEB7nbY/uRweHZjQ1NtCe+lWh4lo6AKFXWNcLQ2/DogQ8Ht/9XLxQYOVoYx/KUp3rfCIIQQYrr2nsnGM1+fQ12jAqP7uODbFyINIvkBAFc7KXr3tAFjtB6QprgEKMhIe38ASoAIIYToAGMMH/6agbd+uASFkmHWUG9sf3I47KWG1VsQod4XjBIgTVy8UwHAeOt/AEqACCGEaJmsSYFX9qdiyx83AQAvP9QXG2aHaGU3d23jNkalfcE0c8mIt8Dg8F4DRAghxHRU1snx3K5zOJNZpprmPjMYc4bpf5p7Z41orgNKz69CZZ0cDtaG1UNliEpqZMirbIBAAAzy1O5aefpkeOk4IYQQo5RTVodZ207jTGYZbC0tsGPJcINOfgDA1V6KABdVHdDZ2zQM1hlc/U+Aiw3sDGxIUxOUABFCCOm2S3cq8einp3GjqAbu9lIceCESD/Tlb40fTUQEqHqBEm/RMFhncMNfId6O/AbSTZQAEUII6ZbfMwox57MElNTIMMDdDj8sG4mBHsYzNHK3Doh6gDqDWwDRmGeAAVQDRAghpBv2nMnCPw+lQcmAB/q64NMFQ41uWCSilyoBupxXiaoGucHNVDM0l3IrAAAhRlwADVAPECGEkC5QKhnWxWTg7R9Uyc/sMNU0d2NLfgDA3UEK/x7WUDLgHNUBdaioqgGFVTIIBUCgEfXytYUSIEIIIRqRNSnw8v5UbD2mmub+alQ/rH8sBGKR8f5J4XqBaD2gjnEF0H1cbWFjadyDSMb7biWEEKJ3FXWNWPi/JBy5kAcLoQAbZofi5ai+EAgEfIfWLSN6qwqhz1AhdIe4+p9gL0d+A9ECSoAIIYS0olAynMksQ3KJAGcyy6BQMtU0962nkZRZBjtLC+xcEo7Hwrz5DlUruB6gS7mVqG6Q8xyN4eJ6gIy9/gegImhCCCF/EZOWj9VH0pFf2QBAhK+vn0MPWwkam5SobmiCh4MUO5YMxwB3464BuZenoxV8na2RXVaHc1nlGNffle+QDA5jzGRmgAHUA0QIIeQeMWn5eHF3SnPyc1dpTSOqG5rg5SjFD0tHmVTyw4noResBdaSgqgElNTKIhAKjL4AGKAEihBDSTKFkWH0kHew+5/S0s9RbTPqkXg+ICqHbxPX+9HW1hZVExHM03UcJECGEEABAUmZZq56fvyqokiHJRBcM5FaEvpRbiRpZE8/RGJ40E6r/ASgBIoQQ0qyouuPkR9PzjI23kzW8naygUDIkZ5XzHY7BUc8AM/ItMDiUABFCCAEAuNpJtXqeMbq7HhDVAd2LMaaeARZsAgXQACVAhBBCmoX3coaHgxTtregjAODhIEV4c7GwKRoRQOsBtSW3oh5ltY2wEAowwN2O73C0ghIgQgghAACRUIDoaYFt3sYlRdHTAiESGveihx3hCqEv3qlEXSPVAXG4HeD7u9tBKjb+AmiAEiBCCCH3mBzkgS3zh7bqBXJ3kGLrE0MxOciDl7j0xdvJCl6OVmiiOqAWTGkBRA4thEgIIaSFXj1twABYWggx20+OyWMiENnH1aR7fjgCgQARvZzx/flcJN4qxQN9e/IdkkG4W//jyG8gWkQ9QIQQQlrg6l+G+zthuCtDRC9ns0h+OLQeUEv3rgBtSj1AlAARQghp4UzzOj/h/k48R8IPbj2gC3cqUN+o4Dka/uWU1aOyXg6JSIh+bqZRAA1QAkQIIeQejDH1QofmmgD5OlvDw0EKuYIhJZvqgC7mVgAABnjYQWJhOmmD6TwTQggh3XazuAaltY2wtBCazHovmuLqgABaDwi4OwPM1N4PlAARQghRS2yuexnq62RS3/Y1RXVAd5niDDCAEiBCCCH34Op/uDoYcxXRnACl5lSgQW6+dUBKJTPJGWAAJUCEEEKaMcbUM8C4LSHMlX8Pa7jZW6JRoTTrOqCssjpUNzTB0kKIvm62fIejVZQAEUIIAQDcLq1DUbUMEpEQQ3wd+Q6HVwKBQD0MlmjGw2AX71QAAAZ62EMsMq2UwbSeDSGEkC5LylT1/gz2cTSZ7Q66g+sFM+d9wS6Z4Po/HEqACCGEALhb8GvKm51qgtsY9bwZ1wFdNLEd4O9FCRAhhBAAVAD9V71cbNDTzhKNTUqk5lTwHY7eKZUMl9UzwBz5DUYHKAEihBCCnLI65FbUw0IoQJifeS6A+Fct64DMbxjsVkktahsVsBKL0LunDd/haB0lQIQQQtS9P8HeDrCW0D7ZHG5BRHNcD+hS8wrQgZ72sDCxAmiAEiBCCCG4WwBt7tPf/4rrAUrJLoesybzqgC6a6ArQHEqACCGE3K3/oQLoFnr3tIGLrSVkTUpcyKnkOxy9MuUZYAAlQIQQYvYKKhuQVVoHoQAYZqYboLZHIBCoi8LNqQ5IoWS4nFcFgBIgQgghJupM8/DXIE8H2EnFPEdjeEZwdUCZ5pMA3SyuQb1cARuJCL1cTGsFaA4lQIQQYua4lY5p+KttXB1QclY5GpuUPEejH1z9zyAvB4iEAp6j0Q1KgAghxMypC6ADqAC6LX1cbdHDRoIGuVK9NYSpu9T8PE21ABqgBIgQQsxacbUMN4trIRAAw6n+p03mWAd0Mde0C6ABA0iAtmzZAn9/f0ilUkRERCApKandcy9fvoxZs2bB398fAoEAmzZt6vY1CSHEnCU1z/7q72YHR2sJz9EYLvW+YJmmvx5Qk0KJ9OYCaOoB0pH9+/djxYoViI6ORkpKCkJDQzFp0iQUFRW1eX5dXR0CAgKwdu1auLu7a+WahBBizrjC3hE0/NUh7vU5d7sccoVp1wFdL6qBrEkJO0sL+PcwvRWgObwmQBs3bsSzzz6LJUuWIDAwENu2bYO1tTW2b9/e5vnDhw/Hhx9+iMcffxyWlpZauSYhhJizM1QA3Sl9XW3hZC1GvVyhLhA2Vdz6P0FeDhCaaAE0APC23nljYyOSk5OxatUq9TGhUIioqCgkJCTo9ZoymQwymUz9c1WVqutPLpdDLpd3KZb2cNfT9nVJ11B7GBZqD/0qr2vE1cJqAMAQH/tWrzu1R0vD/Z0Qm16E09eLEOKp/6nh+mqP1BxVUhzoYWt0ba9JvLwlQCUlJVAoFHBzc2tx3M3NDRkZGXq95po1a7B69epWx2NjY2Ftbd2lWO4nLi5OJ9clXUPtYVioPfTjYpkAgAhuVgxn/vyt3fOoPVRs61Sv189nr8G3tmt/p7RB1+1x8rIIgABNRbdw9OhNnT6WttXV1XX6XNrxDsCqVauwYsUK9c9VVVXw8fHBxIkTYW9vr9XHksvliIuLw4QJEyAW04JjfKP2MCzUHvp1/mgGgGyMD/LBlCmBrW6n9mgpoKAa329JQHa9GBMmjYNYzxuE6qM9GpuUeD0pHgDDwr+NgZ+zbjoBdIUbwekM3hIgFxcXiEQiFBYWtjheWFjYboGzrq5paWnZZk2RWCzW2ZtMl9cmmqP2MCzUHvpxNqsCABDZp2eHrze1h8ogLyc4WotRUSfH1aI6DPHlZ9kAXbbH1aJKyBUM9lIL9Ha1h0BgXDVAmrwuvBVBSyQShIWFIT4+Xn1MqVQiPj4ekZGRBnNNQggxRZX1cqTnq74tj6AC6E4RCgUI9+fWAzLN6fCX1Ov/OBpd8qMpXmeBrVixAl988QW++uorXLlyBS+++CJqa2uxZMkSAMCiRYtaFDQ3NjYiNTUVqampaGxsRG5uLlJTU3Hjxo1OX5MQQgiQnFUGxoBeLjZwtZfyHY7R4FbLNtV9wbgZbsEmvAAih9caoLlz56K4uBjvvPMOCgoKMHjwYMTExKiLmLOzsyEU3s3R8vLyMGTIEPXPGzZswIYNGzBmzBgcO3asU9ckhBByd/o716NBOmdE84rQZzPL0KRQwkLPdUC6dim3AoBpL4DI4b0Ievny5Vi+fHmbt3FJDcff3x+MsW5dkxBCCJDYvKIxt8UD6ZwB7vawl1qgqqEJl/OqEOrjyHdIWtMgV+BqgWpZBHNIgEwrdSWEEHJfNbImpDXXetAGqJoRCQUIb94Ww9T2BbtaUA25gsHJWgxvJyu+w9E5SoAIIcTMpGSVQ6Fk8Haygpej6f+h0zZuGMzU9gXjCqCDzaAAGqAEiBBCzA5XwMtt8Ek0w+0LdjazDArl/csyjAW3BUaIGQx/AV2sAYqPj0d8fDyKioqgVLbcFI723CKEEMNG+391z0APe9hJLVDd0IT0vCqTmTF1Mdd8ZoABXegBWr16NSZOnIj4+HiUlJSgvLy8xT9CCCGGq75RgQt3KgBQAXRXiVqsB2QadUANcgWuFZpPATTQhR6gbdu2YefOnVi4cKEu4iGEEKJD57PLIVcwuNtL4Wtk2xwYkogAZ8RnFOFMZimefTCA73C6LT2/Cgolg4utBB4O5rEulMY9QI2NjRg5cqQuYiGEEKJjZ+6Z/m4Oha66MkK9IKJp1AFx9T/BXg5m877QOAF65plnsHfvXl3EQgghRMe4Auhwqv/plkAPe9haquqAruR3fgNOQ3XvDDBzofEQWENDAz7//HP89ttvCAkJabXx2MaNG7UWHCGEEO2RNSlwPrsCAM0A6y4LkRDD/Z3wx9ViJN4qRZCR182Y2wwwoAsJ0MWLFzF48GAAQFpaWovbzKXbjBBCjNGFnErImpRwsbVE7542fIdj9CICeuCPq8U4k1mGZx4w3jqgusYmXC9qLoA2kxlgQBcSoD/++EMXcRBCCNGxM7e49X+o/kcbuDqgpMwyKJUMQqFxvqbpeVVQMsDVzhJuZrQxLi2ESAghZiLpNu3/pU1BnvawkYhQWS9HRvMeWsaI2wE+xIx6f4BO9gDNnDkTO3fuhL29PWbOnNnhud9//71WAiOEEKI9coUSyVmqtdqoAFo7LERCDPN3xp/XVHVAgZ72fIfUJdy+cMFejvwGomedSoAcHO5Oi3NwMK8MkRBCTMGl3ErUNSrgaC1GP1c7vsMxGREBqgToTGYpnhrdi+9wuoRbAZp6gNqwY8eONv9PCCHEOHDbX4T7OxttrYohunc9IGOsA6qRNeFmcQ0AGP1MNk11qQaoqakJv/32Gz777DNUV6vGPfPy8lBTU6PV4AghhGiHegPUAJr+rk3BXg6wlohQUSfHtSLjqwO6nFsJxgAPByl62lnyHY5eaTwLLCsrC5MnT0Z2djZkMhkmTJgAOzs7rFu3DjKZDNu2bdNFnIQQQrpIoWQ4d1tV/0MboGqXWCREmJ8TTlwvQeLNUgxwN646IPUCiGbW+wN0oQfo5ZdfxrBhw1BeXg4rKyv18UcffRTx8fFaDY4QQkj3pedVoUbWBDupBQZ6GNcfaGNw7zCYsTHXGWBAF3qATpw4gdOnT0MikbQ47u/vj9zcXK0FRgghRDu44a/h/s4QGVmNijEY0byswJnMMjDGjGqNpTQz3AKDo3EPkFKphEKhaHX8zp07sLOjmQWEEGJoEpsLoGn4SzeCvRwhFQtRVtuI60XGUwtb1SDHrZJaADQE1ikTJ07Epk2b1D8LBALU1NQgOjoaU6ZM0WZshBBCukmpZDirXgCRCqB1QWIhxDA/VXKZ2LzatjHgen+8HK3gbCO5z9mmR+ME6KOPPsKpU6cQGBiIhoYGzJ8/Xz38tW7dOl3ESAghpIuuFlajsl4Oa4kIQUa6UJ8x4HrXuOUGjMElM67/AbpQA+Tt7Y0LFy5g//79uHDhAmpqavD0009jwYIFLYqiCSGE8I/b/yvMzwkWItr9SFdG9O4BxKnqrYylDuiiuv6HEqBOOX78OEaOHIkFCxZgwYIF6uNNTU04fvw4HnzwQa0GSAghpOu4mUkjaPhLp0K8HWBpIURJTSNuFtegjxGsts0NgYWY2RYYHI2/DowbNw5lZa27+CorKzFu3DitBEUIIaT7GGNIyqQCaH2wtBAhzM8JAJBgBMNglXVyZJXWATDPAmigCwlQe117paWlsLGx0UpQhBBCuu9GUQ1KaxshFQsRYobTnPUtolfzekBGUAjNLYDo18MaDtZinqPhR6eHwLhd4AUCAZ588klYWt5dMluhUODixYsYOXKk9iMkhBDSJdzw11BfJ0gsqP5H17j1gBJvGf56QBdzKwCY3/5f9+p0AsTtAs8Yg52dXYuCZ4lEghEjRuDZZ5/VfoSEEEK6hEuAwmn4Sy9CfRwhsRCipEaGWyW16N3Tlu+Q2qWeAUYJ0P1xu8D7+/vj9ddfp+EuQggxYIwx9VAMNzRDdEsqFmGoryMSb5Uh8VapQSdA3BYY5joDDOhCDdD//d//tejWy8rKwqZNmxAbG6vVwAghhHTd7dI6FFXLIBEJMcTXke9wzMbdOiDDLYQuq21EbkU9APMeAtM4AZo+fTq+/vprAEBFRQXCw8Px0UcfYfr06di6davWAySEEKK5pOb9vwb7OEIqFvEcjfnglhtIvKVaD8gQcQXQAS42sJeaZwE00IUEKCUlBQ888AAA4ODBg3B3d0dWVha+/vpr/Pe//9V6gIQQQjTH9UBEBFD9jz4N8XWERCREUbUMt5unmRuaS3cqAJj38BfQhQSorq5OvelpbGwsZs6cCaFQiBEjRiArK0vrARJCCNEcFUDzQyoWYXDzkKOh7gumrv8x4+EvoAsJUJ8+fXDo0CHk5OTg119/xcSJEwEARUVFsLenfWYIIYRvOWV1yK2oh4VQoF6cj+jPCPW+YIaZAHFDYJQAaeidd97B66+/Dn9/f0RERCAyMhKAqjdoyJAhWg+QEEKIZrjen2BvB1hLNN7xiHTT3TqgMoOrAyquliG/sgECATDIzBMgjT8Zjz32GEaPHo38/HyEhoaqjz/00EN49NFHtRocIYQQzXEF0DT9nR9DfJ0gFglQUNWA7LI6+PUwnGVjuP2/eve0ha2leSfHGvUAyeVyWFhYoKSkBEOGDIFQePfu4eHhGDBggNYDJIQQohmuB4gKoPlhJRFhsI8jAMOrA7pICyCqaZQAicVi+Pr6QqFQ6CoeQggh3VBQ2YCs0joIBcAwqv/hjaGuB3SJtsBQ07gG6O2338Zbb73V5o7whBBC+HWmefhrkKcD7Mx4jRe+Gep6QOoeIDOfAg90oQZo8+bNuHHjBjw9PeHn59dqS4yUlBStBUcIIUQzidz6PzT9nVdD/RxhIRQgr7IBd8rr4eNszXdIKKxqQFG1DEIBEOhJs7Y1ToBmzJihgzAIIYRog7oAOoAKoPlkLbFAqI8jkrPKkXCr1CASIG4D1L6udjQ7EF1IgKKjo3URByGEkG4qrpbhZnEtBAIg3J96gPgW0csZyVnlOHOrDHOG+fAdDi7m0gao99K4BghQ7QH25ZdfYtWqVepaoJSUFOTm5mp8rS1btsDf3x9SqRQRERFISkrq8PwDBw5gwIABkEqlCA4OxtGjR1vcXlNTg+XLl8Pb2xtWVlYIDAzEtm3bNI6LEEKMTVLz7K/+bnZwsKb6H77dWwdkCLgtMKj+R0XjBOjixYvo168f1q1bhw0bNqCiogIA8P3332PVqlUaXWv//v1YsWIFoqOjkZKSgtDQUEyaNAlFRUVtnn/69GnMmzcPTz/9NM6fP48ZM2ZgxowZSEtLU5+zYsUKxMTEYPfu3bhy5QpeeeUVLF++HIcPH9b0qRJCiFHhCqBH0PCXQQjzc4JIKEBuRT1yyvjdF4wxpl4BmmaAqWicAK1YsQJPPvkkrl+/DqlUqj4+ZcoUHD9+XKNrbdy4Ec8++yyWLFmi7qmxtrbG9u3b2zz/448/xuTJk7Fy5UoMHDgQ7733HoYOHYrNmzerzzl9+jQWL16MsWPHwt/fH8899xxCQ0Pv27NEOk+hZEi4WYofU3ORcLMUCqXhzHAgxJydoQJog2JjaaHubeHWZuJLfmUDSmoaIRIKEOhBBdBAF2qAzp49i88++6zVcS8vLxQUFHT6Oo2NjUhOTm7RayQUChEVFYWEhIQ275OQkIAVK1a0ODZp0iQcOnRI/fPIkSNx+PBhPPXUU/D09MSxY8dw7do1/Oc//2k3FplMBplMpv65qqoKgGrhR7lc3unn1Bnc9bR9XX359XIh/n00AwVVd18vd3tL/GPKAEwa5MZjZF1j7O1haqg9uq68rhFXC6sBAEN87LXyGlJ7dN9wP0ecz65Aws1iTA/p3u/I7rTH+SxV72BfV1uIoIRcruxWLIZKk9dG4wTI0tJSnSDc69q1a+jZs2enr1NSUgKFQgE3t5ZvCDc3N2RkZLR5n4KCgjbPvzfx+uSTT/Dcc8/B29sbFhYWEAqF+OKLL/Dggw+2G8uaNWuwevXqVsdjY2Nhba2byv24uDidXFeXLpQKsP0a12koUB8vqGrA8n2peKqfEqE9jLM3yBjbw5RRe2juYpkAgAhuVgxn/vxNq9em9ug6YbmqXY5dzsVRy2ytXLMr7fFzthCAEI7Kyla1s6akrq7zQ40aJ0CPPPII/vWvf+Hbb78FAAgEAmRnZ+ONN97ArFmzNL2c1n3yySdITEzE4cOH4efnh+PHj2PZsmXw9PREVFRUm/dZtWpVi56lqqoq+Pj4YOLEiVrf4V4ulyMuLg4TJkyAWGw8RYoKJcOaj44DkLVxqwACAL8UWuP/FjwIkVDQxjmGyVjbw1RRe3Td+aMZALIxPsgHU6YEauWa1B7d96CsCV988AdKZcDgkePg6WjV5Wt1pz0OfpUMoBQPRwzClHD+Z6TpSlsdNO3ROAH66KOP8Nhjj8HV1RX19fUYM2YMCgoKEBkZiffff7/T13FxcYFIJEJhYWGL44WFhXB3d2/zPu7u7h2eX19fj7feegs//PADpk6dCgAICQlBamoqNmzY0G4CZGlpCUtLy1bHxWKxzj70ury2Lpy7Wdpi2OuvGID8ShnO36lGZG/jK8A0tvYwddQemjubVQEAiOzTU+uvHbVH1zmJxQjycsCFnAok51TBr2f3v1Rr2h6MMaTlqRKDIX7OJt2Wmjw3jYugHRwcEBcXh59++gn//e9/sXz5chw9ehR//vlnq1WhOyKRSBAWFob4+Hj1MaVSifj4eERGRrZ5n8jIyBbnA6quQO58rmbn3k1aAUAkEkGpNM3xTn0pqm7Q6nmEEO2prJcjPV/1B24EFUAbHK5N+NoX7E55Pcrr5BCLBOjvbsdLDIaoy0tBjho1CqNGjQIA9VR4Ta1YsQKLFy/GsGHDEB4ejk2bNqG2thZLliwBACxatAheXl5Ys2YNAODll1/GmDFj8NFHH2Hq1KnYt28fzp07h88//xwAYG9vjzFjxmDlypWwsrKCn58f/vzzT3z99dfYuHFjV58qAeBqJ73/SRqcRwjRnuSsMjAG9HKxgas9fQYNzYiAHvjs+C0kZvKzHhA3/b2/ux0sLUS8xGCINO4BWrduHfbv36/+ec6cOejRowe8vLxw4cIFja41d+5cbNiwAe+88w4GDx6M1NRUxMTEqAuds7OzkZ+frz5/5MiR2Lt3Lz7//HOEhobi4MGDOHToEIKCgtTn7Nu3D8OHD8eCBQsQGBiItWvX4v3338cLL7yg6VMl9wjv5QwPh/Z/sQoAeDhIEU7fPgnRO65ngVZ/NkzD/J0gFABZpXXIr6zX++NzCVCwl6PeH9uQadwDtG3bNuzZsweAavgpLi4Ov/zyC7799lusXLkSsbGxGl1v+fLlWL58eZu3HTt2rNWx2bNnY/bs2e1ez93dHTt27NAoBnJ/IqEA0dMC8cLu9je7jZ4WaFQF0ISYisTmNWYiAigBMkR2UlUd0MU7lThzqwwzhnjp9fEv0Q7wbdK4B6igoAA+PqoK8p9++glz5szBxIkT8X//9384e/as1gMkhmPcAFdILVq/ZURCAT5dMBSTgzx4iIoQ81Yja0Ja8zd82gDVcHGLU57R8zAYYwwXm7fACKYVoFvQOAFycnJCTk4OACAmJkY9s4oxBoVCod3oiEFJvFWGhiYlXGwl2PtMBNY/FgKpWAiFksHeynRnFRBiyJKzyqFQMng7WcGrG1OsiW7d3RdMv4XQ2WV1qGpogkQkRD83KoC+l8ZDYDNnzsT8+fPRt29flJaW4uGHHwYAnD9/Hn369NF6gMRwxKWrFpycOMgdI/u4AADScivxdUIWdiVkYVTzMUKI/iQ19yhE9KLeH0M2zN8ZAgGQWVKLwqoGuOmpWP1i8/DXQA87SNrowTdnGr8a//nPf7B8+XIEBgYiLi4Otra2AID8/HwsXbpU6wESw6BUMsSlq9ZgmhB4dzXuJ0b4AQDirhTyUtxHiLmj/b+Mg4OVGIM8VWsA6XN3eHUBNNX/tKJxD5BYLMbrr7/e6virr76qlYCIYbqYW4nCKhlsJCKMvGehw35udojo5YwzmWX4JikHKyb04zFKQsxLfaMCF5rrO6gA2vBF9OqBtNwqnMksw/TB+imEVhdA0wywVjTuAfrqq6/w888/q3/+v//7Pzg6OmLkyJHIysrSanDEcMReVg1/jR3g2modiYWRql6gb5KyIVfQgpOE6Mv57HLIFQzu9lL4Outm30KiPXfrgPTTA6RUMnWBPPUAtaZxAvTBBx/AykpVaJeQkIAtW7Zg/fr1cHFxoV4gExbbPPw1MbD1bsYTA93R084SxdUyxF4ubHU7IUQ37p3+LhDQEhSGLry5DuhWca1eVs2/XVqLalkTLC2E6Otqq/PHMzYaJ0A5OTnqYudDhw5h1qxZeO6557BmzRqcOHFC6wES/t0srsGNohqIRQKMG+Da6naJhRDzhquWRtiVeFvP0RFivqgA2rg4WIsx0F1VB6SPbTG4+p9AT3tYiKgA+q80fkVsbW1RWqr60MXGxmLChAkAAKlUivp6KoI1RVzx84iAHrCXtj3dfV6EL0RCARJvleF6YbU+wyPELMmaFDifXQEAtAK7EeFqtfSxHtBFdf0PDX+1ReMEaMKECXjmmWfwzDPP4Nq1a5gyZQoA4PLly/D399d2fMQAcPU/Ewe5t3uOh4MVogaqeod2J1ItGCG6diGnErImJVxsLdG7Z+c3oib80ud6QFwBdLC3o84fyxhpnABt2bIFkZGRKC4uxnfffYcePVSNmZycjHnz5mk9QMKvoqoGnM+pAABMGNi6/udeC0f4AwC+S8lFraxJx5ERYt7O3OKGv6j+x5io2gu4UVSDkhqZzh5HoWS4nEdbYHRE42nwjo6O2Lx5c6vjq1ev1kpAxLD8dqUIjAGhPo5w72AzVAAY2bsHAlxscKukFodSc7Egwk9PURJifpJu0/5fxsjRWoL+bnbIKKjGmVtlmBqimy2EMktqUNuogJVYhN49qQC6LV2uiqqrq0NGRgYuXrzY4h8xLbHc6s9tzP76K6FQgAXNCyPuSsgCY0ynsRFiruQKJZKzygFQAbQx4obBdFkHxNX/DPK0p02q26FxAlRcXIypU6fCzs4OgwYNwpAhQ1r8I6ajukGO0zdUH9BJg+6fAAHAY0O9IRULkVFQrf4FTQjRrku5lahrVMDRWkzTm43QiOZeO12uB3TxDq3/cz8aJ0CvvPIKKisrcebMGVhZWSEmJgZfffUV+vbti8OHD+siRsKTP68Vo1GhRICLTae7UB2sxZgeqlrhdBcVQxOiE9wU6nB/Zwjp273RCW/utbtWWINSHdUBcVPgqf6nfRonQL///js2btyIYcOGQSgUws/PD0888QTWr1+PNWvW6CJGwhNuUcMJg9w0KrLkVoY+eilfp0V+hJgrbugkIoCGv4yRs42qDggAkjK1PxusSaFEel4VACCYtsBol8YJUG1tLVxdVdOdnZycUFxcDAAIDg5GSkqKdqMjvGlsUuKPjCIAqpWeNRHk5YDBPo6QKxj2n83RRXiEmC2FkuHcba7+hwqgjdUI9XpA2k+AbhbXol6ugI1EhAAXWiKhPRonQP3798fVq1cBAKGhofjss8+Qm5uLbdu2wcNDN9XsRP8Sb5WiWtYEF1tLDPFx1Pj+C5uLofeeyYZCScXQhGhLel4VamRNsJNaYKCHPd/hkC6K0OG+YBebN8gN8nKgIdIOdDoByszMBAC8/PLLyM/PBwBER0fjl19+ga+vL/773//igw8+0E2URO+42V8TAt269AGaGuIBR2sxcivq1T1JhJDu44a/hvs70+weI8at3p1RUI3y2katXpur/wmmFaA71OkEqHfv3ujVqxd+//13iEQi3LlzB2FhYcjKysLZs2eRk5ODuXPn6jJWoidKJVNvfzGxk7O//koqFmHuMG5/MCqGJkRbuBWEafjLuLnYWqpn8Gl7GIxmgHVOpxOg33//HYsXL8atW7fw3HPPwc/PD3379sWrr76Ka9euQaFQ6DJOokcXcytRWCWDjUSEkb27XmQ5P8IXAoFqNllWaa0WIyTEPCmVDGfVCyBSAbSx08V6QHKFEun5qgLoENoCo0OdToDGjh2Ld999F8eOHUN5eTni4uIwb948XLlyBU8++SQ8PT0xaNAgXcZK9ITb+2vsAFdYWoi6fB2/HjYY068nAGDPmWytxEaIObtaWI3KejlsJCIEeVL9j7GLUK8HpL0eoOuFNWhsUsJOagE/Z2utXdcUdWklaKlUivHjx+Mf//gHVq9ejZdeegm2trbIyMjQdnyEB7Hc8FcnVn++H64Y+ttzOWiQUy8hId3B7f8V5u8MC1GXF/InBoJbxTujoAoVddqpA7qUWwFAVf9DBdAd0+gT1NjYiOPHj2P16tUYN24cHB0d8cILL6C8vBybN29WF0oT43WruAY3imogFgkwboBrt683tr8rvBytUFEnx08X87UQISHmi6sVofof09DTzhK9e9qAMe2tB0T1P53X6QRo/PjxcHJywtKlS1FUVITnn38eN2/exNWrV/HFF19g4cKF8PX11WWsRA+44ucRAT1gLxV3+3oioQALRqjeF1QMTUjXMcbUfyQpATIdd+uAtJMA0Qywzut0AnTixAn06NED48ePx0MPPYQJEybQuj8mSJvDX5w5w3wgEQlxIadCvT4FIUQzN4pqUFrbCKlYSMWtJkSb6wE1NimRkV8NAAihFaDvq9MJUEVFBT7//HNYW1tj3bp18PT0RHBwMJYvX46DBw+qV4QmxquougEp2aoVZqO0mAC52FpiSrBqNend1AtESJdwPQRDfZ0gsaD6H1Mxork3Lz2/CpX18m5d61phNRoVSjhYieHjbKWN8Exapz9FNjY2mDx5MtauXYszZ86gpKQE69evh7W1NdavXw9vb28EBQXpMlaiY/FXisAYEOrtAA8H7X54uP3BfkzNQ2Vd9z7khJiju/U/NP3dlLjaSxHgoqoDOtvNYTCu/ifE20Gj/RvNVZe/RtjY2MDZ2RnOzs5wcnKChYUFrly5os3YiJ5x098nDtJs76/OGOrrhIEe9pA1KXEgmfYHI0QTjDH1DLBwqv8xORFaWg/o3hlg5P46nQAplUokJSVh/fr1ePjhh+Ho6IiRI0fi008/hbu7O7Zs2YJbt27pMlaiQzWyJpy6ofrwabP+hyMQCNRT4vecyYaS9gcjpNNul9ahqFoGiUiIIb6OfIdDtGyEltYDUs8AowSoUyw6e6KjoyNqa2vh7u6OcePG4T//+Q/Gjh2L3r176zI+oid/Xi1Go0KJXi426NO8PLu2TR/siTVHryCzpBanbpbggb49dfI4hJgarvdnsI8jpOKuL05KDBM3rHk5rxJVDfIuzcBtkCtwtUBVAE1T4Dun0wnQhx9+iHHjxqFfv366jIfwhNv8dGKgm87Gjm0sLTArzBs7T9/GroQsSoAI6ST19PcAGv4yRe4OUvj3sMbt0jqcu12G8QM074XPKKhGk5LB2UYCL0cqgO6MTg+BPf/885T8mKjGJiV+b96xvaubn3bWE81rAv12pRB5FfU6fSxzoVAyJNwsxY+puUi4WQoFDS+aHK4Amup/TJd6PaAuDoPdu/4PFUB3Tqd7gIjpOpNZiuqGJrjYWmKwj5NOH6uPqx0iA3og4VYp9p7JxuuT+uv08UxdTFo+Vh9JR35lg/qYh4MU0dMCMTmI1ukyBTlldcitqIeFUIAwP91+Pgl/IgKcse9sTpfXA7rUvMZaCA1/dRotJkEQe1m1+OGEQFeI9LB3DDclft/ZbDQ2KXX+eKYqJi0fL+5OaZH8AEBBZQNe3J2CmDTaesQUcL0/wd4OsJbQd1ZTxdUBpeVVobpB86VCqABac5QAmTmlkqm3v5gYqP3p722ZEOgGVztLlNQ0IqZ56j3RjELJsPpIOtoa7OKOrT6STsNhJoArgKb1f0ybp6MVfJ2toVAynMsq1+i+9Y0KXC+qAUAF0JqgBMjMXcqtREFVA2wkIkT21s8vWLFIiHnhqlqg3Qm0MnRXJGWWter5uRcDkF/ZoLUNFgl/km5TAbS54KbDa1oHlJ5fBYWSwcXWEu72Ul2EZpIoATJz3Oyvsf1d9Tq9dl64L0RCAZJulyGjoEpvj2sqiqrbT366ch4xTAWVDcgqrYNQAAyj+h+Tx/XyaVoHdG/9DxVAdx4lQGaOq//R9eyvv3J3kKoXXKT9wTTnate5b3mdPY8YJm5l4EGeDrDrwtowxLhwvXyXcitRK2vq9P0u5aq+RFL9j2YoATJjt4prcL2oBhZCAcb2d9X743MrQ/+Qktuloj9zFt7LGe72lu3eLoBqNhhNmzZu3MrAEdSOZsHbyRreTlYa1wFxW2DQDDDNUAJkxrji58jePeBgpf9vl5G9eyCgpw1qGxU4dD5X749vzERCAYb5d/xHMXpaoF5m9RHdSWruAeL2iiKm7+56QJ0bBquVNeEGVwBNPUAa4T0B2rJlC/z9/SGVShEREYGkpKQOzz9w4AAGDBgAqVSK4OBgHD16tNU5V65cwSOPPAIHBwfY2Nhg+PDhyM7O1tVTMFqx6tlf+h3+4ty7P9iuxCwwRjOWOutGUY16+NLxL8mrhVCATxcMpXWAjFxxtQw3i2shEADh90l2iengevs6WweUnl8FJQPc7C3hSgXQGuE1Adq/fz9WrFiB6OhopKSkIDQ0FJMmTUJRUVGb558+fRrz5s3D008/jfPnz2PGjBmYMWMG0tLS1OfcvHkTo0ePxoABA3Ds2DFcvHgR//znPyGV0hvjXkXVDUjJVnWxRvGUAAHAzKHesBKLcK2whmYsdZJSyfDWD5fQqFBibP+eOPePKHzz7AisnRUMSwshmpQMDtZUL2LsuM9Dfzc7ak8zwvUAXbxTibrG+9cB3V3/x1GXYZkkXhOgjRs34tlnn8WSJUsQGBiIbdu2wdraGtu3b2/z/I8//hiTJ0/GypUrMXDgQLz33nsYOnQoNm/erD7n7bffxpQpU7B+/XoMGTIEvXv3xiOPPAJXV/3XuBiy+CtFYAwI9XaAhwN/+8Y4WIkxY4gnAFUvELm/A8k5SMosg5VYhPemB8FCJERk7x54fLgvHgvzBgDsouUFjB5XAD2Chr/Mio+zNbwcrdCkZEjuRB1QWvMWGFT/ozneEqDGxkYkJycjKirqbjBCIaKiopCQkNDmfRISElqcDwCTJk1Sn69UKvHzzz+jX79+mDRpElxdXREREYFDhw7p7HkYK/Xih4P0s/hhR55oHgaLSSugadv3UVwtwwdHMwAAKyb0g4+zdYvbF0X6A1ANb+ZX0l5rxuwMFUCbrQgN1gO62DwFnhZA1Bxv66qXlJRAoVDAza3l8IubmxsyMjLavE9BQUGb5xcUqNayKSoqQk1NDdauXYt///vfWLduHWJiYjBz5kz88ccfGDNmTJvXlclkkMlk6p+rqlRTCuVyOeRy7c5O4q6n7etqokbWhJM3SgAA4/r14DUWAOjX0xpDfBxwPqcSexOzsGxsgN4e2xDaQxOrD6ehsl6OQA87PBHu1SrugB5ShPs7Iel2OXadvo1Xo/rwFGnXGFt76Ep5XSOuFlYDAIb42PP2elB78GOYryO+T8lFws0SyOV3fx/+tT2qG5pwq6QWADDQ1ZraCZq9V01qYxmlUrWv1PTp0/Hqq68CAAYPHozTp09j27Zt7SZAa9aswerVq1sdj42NhbW1dRv36L64uDidXLczUksFaGwSwUXKcO3scVw3gIlCgywFOA8Rdp64Dt/aDIj0HBOf7dFZV8oF+ClDBAEYpriUI/bXmDbPC5QIkAQRdp2+id4N12DB+1QHzRlDe+jSxTIBABHcrRjO/Pkb3+GYfXvoW30DAFggNacch44cheQva9Ry7XGjEmDMAo4ShjPH4/UepyGqq6vr9Lm8JUAuLi4QiUQoLCxscbywsBDu7m0Py7i7u3d4vouLCywsLBAYGNjinIEDB+LkyZPtxrJq1SqsWLFC/XNVVRV8fHwwceJE2Nvba/S87kculyMuLg4TJkyAWMxPYWP8gUsA8jE9zB9TJxvGbuwPyRX4ecNxlNfJIe01DBMC9VOzZQjt0Rl1jU348JPTABrw5Eh/PP9w++02QaHELx+dQGG1DALfIZgSYjyzwYylPXTt/NEMANkYF+SDKVMC73u+rlB78IMxhi9uHkdBlQyugREY2bxN0V/b43+nbgPp1zC8txumTBnMa8yGghvB6QzeEiCJRIKwsDDEx8djxowZAFQ9OPHx8Vi+fHmb94mMjER8fDxeeeUV9bG4uDhERkaqrzl8+HBcvXq1xf2uXbsGPz+/dmOxtLSEpWXrReXEYrHOPvS6vHZH5Aol/rhWDAB4ONjTYH6picVizB3ui21/3sQ35+5gSqiX3h/fUF6LtnwadwN3Khrg5WiF1ycNgFjc/kdXLAbmRfhi02/XsTfpDmaG+eoxUu0w9PbQtbNZFQCAyD49DeJ1MPf24ENkbxf8cD4XydmVGDOgZacA1x6X81Xr/wz2daL2aabJ68Br5/iKFSvwxRdf4KuvvsKVK1fw4osvora2FkuWLAEALFq0CKtWrVKf//LLLyMmJgYfffQRMjIy8O677+LcuXMtEqaVK1di//79+OKLL3Djxg1s3rwZR44cwdKlS/X+/AzRmVtlqG5ogoutBEN8DWtvoQURvhAIgBPXS3CruIbvcAzG5bxKfHkyEwDwr+mDYGN5/+8t88N9YSEU4FxWOdLzaK81Y1JZL0d6vqrNRlABtNm6ux5Q+4XQ3AwwWgCxa3hNgObOnYsNGzbgnXfeweDBg5GamoqYmBh1oXN2djby8/PV548cORJ79+7F559/jtDQUBw8eBCHDh1CUFCQ+pxHH30U27Ztw/r16xEcHIwvv/wS3333HUaPHq3352eIuM1Powa6GdwqwT7O1hjXvCXHnjO0cCUAKJQMq76/BIWSYWqwBx4a2Lk1m1ztpZgUpPrWuCvxtg4jJNqWnFUGxoBeLja0sJ0Z45Y/SM2pQINc0er2yno5MpsLoCkB6hreyyOXL1+OrKwsyGQynDlzBhEREerbjh07hp07d7Y4f/bs2bh69SpkMhnS0tIwZcqUVtd86qmncP36ddTX1yM1NRXTp0/X9dMwCowx3jY/7SxuZegD53JQ39j6Q29uvjp9GxfvVMJOaoHoaZrVgixqfi0Pnc9DZT3NDjEWNP2dAIBfD2u42VuiUaFUL1p7r8vNvT8+zlZwspHoOzyTwHsCRPTnUm4lCqoaYC0RYWRvF77DadOD/XrCx9kKVQ1NOHIhj+9weJVbUY8Nsap6tjcfHqBxb0B4L2f0d7NDvVyBg8l3dBEi0YHE5hWgaSNb8yYQCO7ZF6z1MNhFGv7qNkqAzAjX+zO2f09IxaL7nM0PkVCABRGqnouvE2+b7f5gjDFE/5iGukYFhvk5Yd5wzQuZBQIBFkaqXsvdiVlQKs3ztTQmNbImdV0HbYBKInqp3gNt7Qt2ibbA6DZKgMwIV/8zMZD/1Z87MmeYDyQWQqTlVuFC84fc3MSkFeC3K0UQiwT4YGYwhF2s13p0iBfsLC2QWVKrXvySGK7krHIolAzeTlbwcuRvixpiGEY0rwh9vo06oEu0BUa3UQJkJjJLanGtsAYWQoG60NhQOdtI8Ldg1do15rinVVWDHNGHLwMAXhjTG/3c7Lp8LRtLC8xq3h/sazN8LY1NUvP+X9w3f2LeernYoKedJRqblEjNqVAfr6iTI7tMteBfkCclQF1FCZCZiGvu/RkR0MModpZ+onno5sjFPJTXNvIcjX6tj8lAUbUMvVxssGxc97ey4PZa+z2jEHfKO79KKtE/dQF0ANX/kPbrgNKal7bw72FtFL/PDRUlQGbC0Gd//dUQH0cEedmjsUmJA8k5fIejN8lZZeolAN5/NEgrtVp9XG0xqk8PKBktL2DI6hsVuNC8sSXNACOcu+sB3a0D4urEgqgAulsoATIDxdUyJDdPo4zq5DoyfBMIBOop8bsTs82igLexSYlV318CY8DsMG+tztRbOMIfALD/bE6ba4oQ/p3PLodcweBuL4Wvs272ICTGh+sBSskuh6xJtd/lpeYeIKr/6R5KgMxA/JVCMKb6sHgaUWHlI6FesJNaILusDsevF/Mdjs59ceIWrhXWwNlGgremDNTqtaMGusLTQYqy2kYcvZR//zsQveOmv0cEOEMgMKxFSgl/eve0gYutJWRNSlxsnhSSlqtKgGgGWPdQAmQGYtObh78CjaP3h2MlEWF2mA8A1TRuU5ZZUouP468DAN75W6DWFzazEAkxP0I1lZ6KoQ0TFUCTtggEAnVNWNLtctTIgbzKBgBAkJd2N+s2N5QAmbgaWZN6+vPEQYY9/b0tC0ao/mjHZxQhp8w0C3gZY3j7h0tobFLigb4umD7YUyePM3e4L8QiAVJzKnCxudaEGAZZkwLnsysAUAE0aY3bEy4psww5NarewYCeNrCTUgF0d1ACZOKOXytGY5MS/j2s0dfVlu9wNNa7py1G93EBY8A3SaZZwPtdSi5O3yyFVCzE+zOCdTb80dPOElOblxegXiDDciGnErImJVxsLRHgYsN3OMTAqOuAciqQWa36/RBCBdDdRgmQiYu93Lz44SB3o60r4KZx7z+bA1mTaRXwltbI8P7P6QCAlx/qB98eui1+XRjpDwA4csH8lhcwZGduccNfVP9DWuvjagtnazEa5EocL1C9PwI9afiruygBMmFyhRK/ZxQBML76n3tFDXSFu70UpbWNiEkr4DscrXr/5ysor5NjgLsdnnmgl84fb6ivIwZ52kPWpMS358xneQFDdyaT1v8h7fv1cgHqmmdv1itUCdBnf95CTBpNaOgOSoBMWFJmGaoamuBiK8EQXye+w+myewt4TWll6JPXS/D9+VwIBMDaWSEQi3T/cRQIBFjE7Q92JgsKM1hewNDJFUokZ6mWqaACaPJXMWn5eHF3ChrkyhbHy2ob8eLuFEqCuoESIBPGDX9FDXSDqIt7SRmKx4f7wEIowLmscqQ3r4FhzBrkCrx96BIAYHGkPwb7OOrtsR8J9YKDlRg5ZfX481qR3h6XtO1SbiXq5Qo4WYuNsk6P6I5CybD6SDra+prCHVt9JJ2+yHQRJUAmijGmnv4+wYiHvziu9lJMClLNYtt9xvh7gf4bfx1ZpXVwt5fitYn99PrYquUFaH8wQ8FtcTDc37nLm94S05SUWYb85invbWEA8isbkJRZ1u45pH2UAJmotNwq5Fc2wFoiwqg+2ltRmE/cytCHzueiqkHOczRdl1FQhc+P3wIA/Gv6IF6msnKF5X9eK0ZWaa3eH5/cdYZb/yeAhr9IS0XV7Sc/XTmPtEQJkImKbd78dEy/nlrZT8oQRPRyRl9XW9Q1KvBDSi7f4XSJQsnw5neX0KRkmDTIjbe1mfxdbDCmX08wZvqLTBqyJoUS525z9T9UAE1acrWTavU80hIlQCbK2DY/7QyBQICFzQW8uxKzwJjxjXvvOZOF1JwK2FpaYPUjQbzGwhVDf3vuDuobTWt5AWNxJb8aNbIm2EktMNCDpjWTlsJ7OcPDQYr2BkYFADwcpAin5LlLKAEyQbdLanG1sBoioQDj+5tOAgQAjw7xgrVEhBtFNUi8ZVzj3gWVDVgfcxUA8H+T+8Pdgd9vbWP7u8LbyQqV9XIcuZDHayzmihv+Gu7vbPQTFYj2iYQCRE8LBIBWSRD3c/S0QHrvdBElQCYorrn4eUSAMxysTWupdDupGI8O8QJgfEM30YfTUCNrwhBfRyyI8OM7HIiEAnUt0NeJt42yR83YcUk8DX+R9kwO8sDWJ4a2+sLk7iDF1ieGYnKQB0+RGT9KgEwQV/8zMdD49v7qDO6P9q+XC1BYZRzFf79eLsCvlwthIRRgzcxgg/nGNmeYDyQWQqTlVuF8TgXf4ZgVpZLh7G1uAUQqgCbtmxzkgZNvjMfup4ZhUV8Fdj81DCffGE/JTzdRAmRiSmpkONe8qJopTH9vy0APewz3d0KTkmFfkuGvZlzdIEf0j5cBAM89GIAB7oZT6+FsI8G0ENXmq6a0yKQxuFpYjcp6OWwkIgTRtgbkPkRCASJ6OSPMhSGiFw2ZagMlQCYm/kohGAOCvRzg6WjFdzg6w/UC7U3KglyhvM/Z/Poo9hoKqhrg18MaLz3Ul+9wWuGKoX++mI+SGhnP0ZgPbv+vMH9nWOhhFXBCSEv0qTMx6tlfJtr7w5kc5A4XWwkKq2SIv1LIdzjtOp9djq8SbgMA3p8RbJBLEoT6OCLU2wGNCiX2nzX8HjVTod7/i+p/COEFJUAmpFbWhBM3SgCAt/Vl9MXSQoS5w30AqKbEGyK5QolV318CY8DMIV4Y3ddwF6Tkdonfk5iFJgPvUTMFjDH16r2UABHCD0qATMjxa8VobFLCr4c1+rmZ/p5C88J9IRQAp26U4kZRDd/htPLliUxkFFTDyVqMt6cO5DucDv0txANO1mLkVTYgPoP2B9O1G0U1KK1thFQsRIi3I9/hEGKWKAEyIdzeXxMD3SAQmH6BnLeTNcYPUA317TGw/cGySmvxcfw1AMDbUwPRw9aS54g6JhWLMIfrUaNiaJ3jhr+G+jpBYkG/hgnhA33yTIRcoVTXwpj68Ne9uJWhDybfQV1jE8/RqDDG8I9DaWiQKzGydw/MGurFd0id8kSEHwQC4OSNEtwsNrweNVNyt/6Hpr8TwhdKgExEUmYZqhqa0MNGgqG+TnyHozcP9HGBXw9rVDc04XCqYaxm/GNqHk5cL4HEQoj3Hw02mt44H2drPDTAFQD1AukSY0w9A4y2MCCEP5QAmYjYy6rFD6MGupnV+hBCoQBPNK+q/HUC//uDldc24l8/pQMAXhrfB71cbHiNR1NcMfR3yXdQKzOMHjVTc7u0DkXVMkhEQgzxdeQ7HELMFiVAJoAxdrf+x4Q2P+2sx8K8YWkhRHo+/6sZf3D0CspqG9HPzRbPPdib11i64oE+LvDvYY1qWRMOpebyHY5J4np/Bvs4GuSyCISYC0qATEBabhXyKxtgLRFhVB/DnWqtK042EkwLVa1mvJvHoZvTN0twIPkOAGDNzGCjLG4V3rM/2C4D6FEzRerp7wE0/EUIn4zvNzRpJa55768x/Xqa7TfKhc1/tH+6mI+y2ka9P36DXIG3f0gDADwxwhdhfsb7x212mA+kYiEyCqpx9nY53+GYHCqAJsQwUAJkAsx5+IsT6uOIkObVjL89p//VjLf8cQOZJbVwtbPE/00eoPfH1yYHazFmDFbNXPu6eRVroh05ZXXIraiHhVCAoX6OfIdDiFmjBMjIZZXWIqOgGiKhAOP7m28CBNzdH2zPmSwolPoburleWI1tf94EAKx+ZBDspWK9PbaucMsLxKQVoKiqgedoTAfX+xPs7QBriQXP0RBi3igBMnJxzb0/IwKc4WBt/H94u2NaiCccrMTIKavH8WvFenlMpZJh1feXIFcwRA10xeQg01iDaZCnA8L8nNCkZPgmifYH0xauAJqGvwjhHyVARo7b/HTCQPPu/QEAK4kIs8O8Aehvf7BvzmbjXFY5bCQi/Gt6kNGs+dMZ3C7xe5OyIKf9wbQi6TYVQBNiKCgBMmIlNTKcy1L9Qp1gRqs/d2RB8zDYH1eLkFNWp9PHKqpqwNpfMgAAr03sD09HK50+nr5NDnKHi60EhVUydU8j6bqCygZkldZBKACG+ZnPYqWEGCpKgIzY71eKoGRAkJc9vEzsj29X9XKxwQN9XcAYsOdMtk4fa/WRdFQ3NCHE2wGLR/rr9LH4YGkhwuPDfQFQMbQ2nMlUDX8N8nSAnQnUiRFi7CgBMmKxzdPfJwZS78+9uCnx357LQYNcoZPHiL9SiJ8v5UMkFGDNzGCTXX17foQvhAIg8VYZrhVW8x2OUUu8xU1/p+EvQgwBJUBGqlbWhOPXSwCY9/T3towf4ApPBynKahvxS1q+1q9fK2vCOz9eBgA8M7oXBnk6aP0xDIWnoxUmBKreX7Q/WPdwPUARAVQATYghMIgEaMuWLfD394dUKkVERASSkpI6PP/AgQMYMGAApFIpgoODcfTo0XbPfeGFFyAQCLBp0yYtR82vE9eL0dikhK+zNfq72fEdjkGxEAkxP0I1dKOLP9ob464ht6Ie3k5WeDmqr9avb2gWNe8P9n3KHVQ3yPkNxkgVV8twq7gWAgEQ7k89QIQYAt4ToP3792PFihWIjo5GSkoKQkNDMWnSJBQVFbV5/unTpzFv3jw8/fTTOH/+PGbMmIEZM2YgLS2t1bk//PADEhMT4enpqeunoXfc7K+JgW4mNfNIW+YM94FYJEBKdgXSciu1dt1Ldyqx41QmAODfM4LMYi2Xkb17oHdPG9Q2KvB9Cu0P1hXc9hcD3O3NfrkKQgwF7wnQxo0b8eyzz2LJkiUIDAzEtm3bYG1tje3bt7d5/scff4zJkydj5cqVGDhwIN577z0MHToUmzdvbnFebm4u/v73v2PPnj0Qi03rF45coUR8hipBnEizv9rkaifF5CAPAKqFEbWhSaHEm99fhJIBj4R6Ymx/V61c19AJBAJ1XdWuRNofrCvUw19U/0OIweD162tjYyOSk5OxatUq9TGhUIioqCgkJCS0eZ+EhASsWLGixbFJkybh0KFD6p+VSiUWLlyIlStXYtCgQfeNQyaTQSaTqX+uqqoCAMjlcsjl2u3y567Xnesm3CpFZb0cTtZihHjaaj1GUzFvmBeOXMjDofO5eD2qD+ytWifCmrTH/07dxuW8KjhYWWDV5L5m9bo/EuKG9b9exY2iGpy4VohIHdWxaOPzYYgSb6oSoDBfB6N6bqbaHsaK2uP+NHlteE2ASkpKoFAo4ObWsojXzc0NGRkZbd6noKCgzfMLCgrUP69btw4WFhZ46aWXOhXHmjVrsHr16lbHY2NjYW1t3alraCouLq7L9/0uUwhAiH42Mvwa84v2gjIxjAEeViLk1yvx/t7fMMaj/Z6L+7VHaQOw8YIIgAAPe8iQdDxey9EaviFOQpwqFGLDj2fxdH/dLozYnc+HoamRA9eKVL9qq24k46gR1pKbUnuYAmqP9tXVdX79N5MrYEhOTsbHH3+MlJSUTtfGrFq1qkWvUlVVFXx8fDBx4kTY29trNT65XI64uDhMmDChS0NzjDGs/egEgAYsmTgUDw0wj2GYrqromYN3j1xBao0d1j48qtV7ojPtwRjDs7vOo1FZgnB/J/zryWFmWXfVt7AGUzafxuUKEYaMGgsPB6nWH6O7nw9DFJdeBJxLRZ+eNpgzfRTf4WjEFNvDmFF73B83gtMZvCZALi4uEIlEKCxsucpsYWEh3N3brm1xd3fv8PwTJ06gqKgIvr6+6tsVCgVee+01bNq0Cbdv3251TUtLS1haWrY6LhaLdfYm6+q103IrkV/ZACuxCGMHuEMsFukgOtPx2DBffPjrNdwqqcO57CqM7OPS5nkdtceRC3n483oJJCIh1swKgUQi0WXIBivQ2wkRvZxxJrMMB1Ly8NrE/jp7LF1+9vTtXLaqCH9E7x5G+5xMqT1MAbVH+zR5XXgtgpZIJAgLC0N8/N3hBKVSifj4eERGRrZ5n8jIyBbnA6ruQO78hQsX4uLFi0hNTVX/8/T0xMqVK/Hrr7/q7snoSexl1VDfmH49IaXk575sLS0wc6hqf7CvuzAlvrJOjtVHVGv+LBvXB7172mo1PmPDTYn/JikHjU20P1hncAXQ4bQBKiEGhfchsBUrVmDx4sUYNmwYwsPDsWnTJtTW1mLJkiUAgEWLFsHLywtr1qwBALz88ssYM2YMPvroI0ydOhX79u3DuXPn8PnnnwMAevTogR49Wv6iEYvFcHd3R//+uvvGqi+xzXsy0eKHnffECD/sSsxC3JVC5FfWw8Oh89uGrI25gpKaRvTuaYMXxgboMErjMHGQG9zsLVFYJcMvafmYPtiL75AMWmW9HOn5qi75ETQDjBCDwvs0+Llz52LDhg145513MHjwYKSmpiImJkZd6JydnY38/Lur+Y4cORJ79+7F559/jtDQUBw8eBCHDh1CUFAQX09Bb7JKa5FRUA2RUIDxVPvTaf3d7RDeyxkKJcM3STmdvl9SZpn6/DUzQ2BpQT1uYpEQ88J1t8ikqUnOKgNjqj3qXO21XzNFCOk63nuAAGD58uVYvnx5m7cdO3as1bHZs2dj9uzZnb5+W3U/xojbkTuilzMcrc2zDqWrFo7wa05osvH38X0gFnWc+8uaFFj1/UUAwLxwH4TTt3e1+eG+2Pz7DZzLKkd6XhUCPbU7UcCUnKH9vwgxWLz3AJHOu3f1Z6KZSYPc4WJrieJqmfp17MjWYzdxs7gWLraWeHPyQD1EaDxc7aWYFKSadLAr8Ta/wRi4xOYVoCMCKAEixNBQAmQkSmtkOJel+mU6gVZ/1pjEQoh54T4A7v9H+0ZRDT794yYAIHpaIG1d0IZFzStDHzqfh8p6WpStLTWyJvU2LFQATYjhoQTISMRnFEHJgCAve3g5dr6Il9w1L9wXQgGQeKsM1wur2zxHqWR464dLaFQoMbZ/T/wtxEPPURqH8F7O6O9mh3q5AgeT7/AdjkFKziqHQsng7WRFn1lCDBAlQEbi7vAX9f50laejFaIGqoYPdye2XcB7IDkHSZllsBKL8N70ILNc8LAzBAIBFkaqeoF2J2ZBqaT9wf4qSb3/F/X+EGKIKAEyAnWNTThxvRgATX/vLu6P9ncpuaiVNbW4rbhahvd/vgIAWDGhH3ycdbMNiql4dIgX7CwtkFlSi5M3SvgOx+CoC6Cp/ocQg0QJkBE4fq0EsiYlfJyt0N/Nju9wjNqo3i7o5WKDGlkTDqXmtrjtvZ/SUdXQhEGe9lgyyp+fAI2IjaUFZoVxi0ze5jcYA6JQMvx5tQjns8sBAMP8nHiOiBDSFkqAjEBsumr154mB7jQk001CoQALIu6uY8OYaujm+PUSHL6QB6EAWDszBBb3mSZPVJ5oLoaOzyhCTlnnNyE0VTFp+Ri97ncs3nEWiuZRwflfnkFMWn7HdySE6B39ljdwTQol4q8UAaDp79oyO8wHUrEQGQXV2JWYjcQiAd747hIAYMmoXgj2duA5QuPRx9UWo/r0AGPAnjPZfIfDq5i0fLy4OwX5lQ0tjhdWNuDF3SmUBBFiYCgBMnBJt8tQWS+Hs40EYdSVrhUO1mIM9VW9lu8dvYpvbopQUiuHUAAEe1Hyo6mFI/wBAPvPZqNBruA3GJ4olAyrj6SjrVJw7tjqI+lQULE4IQaDEiADx83+emiAKw3LaElMWj5O3yxtdVzJgFf3p9I3dQ1FDXSFp4MU5XVy/HzRPF+7pMyyVj0/92IA8isbkNS8MCIhhH/0F9WAMcbU219MpMUPtYL7pt4R+qauGQuREPOb66q+bmd5AVNXVN1+8tOV8wghukcJkAG7nFeF3Ip6WIlFeKCvC9/hmAT6pq4bj4f7QiIS4kJOBS7eqeA7HL2TdLJ31tWONkQlxFBQAmTAYpt7fx7s5wKpmHYi1wb6pq4bLraWmBKs6qX82sx2iU/Pq8K/jlzu8BwBAA8HKW2qS4gBoQTIgMVevjv9nWhHZ7+B0zd1zS2M9AcAHLmQh/LaRn6D0ZP4K4WYve008qtkcLO3BKBKdu7F/Rw9LRAiIS1jQYihoATIQGWX1iGjoBoioQDjB7jyHY7JCO/lDA8Haas/Uhz6pt51Q30dMcjTHrImJb49l8N3ODrFGMOXJ27hma/PobZRgVF9eiD2lTHY9sRQuDu0TJ7dHaTY+sRQTA6ifeUIMSQWfAdA2sYtfhju7wwnGwnP0ZgOkVCA6GmBeHF3CgRAi2nL9E29ewQCARZF+uGN7y5h95ksPPNAgEm+jnKFEtGHL2Nv87pH88J98a/pgyAWCTE5yAMTAt2RlFmGouoGuNqpkmlTfB0IMXbUA2SgYtWzv2jxQ22bHOSBrfRNXSceCfWCg5UYOWX1+PNaEd/haF1lvRxLdpzF3jPZEAiAf0wdiA8eDYL4niJokVCAyN49MH2wFyJ796DkhxADRT1ABqi0RoZzt1WzkCbQ6s86wX1TT7hRhNgTZzDxgQhE9nGlP1bdZCURYXaYN748mYmvE7IwfoDpvH+zSmvx1M6zuFlcC2uJCP99fAii6PNJiNGiHiADFJ9RBCUDBnnaw9uJdiTXFZFQgIhezghzYYigYQqt4fYH+/NaMbJKa3mORjvO3i7DjC2ncLO4Fh4OUhx4IZKSH0KMHCVABohb/ZlmfxFj5O9igzH9eoIxYLcJLIz4fcodLPjiDMrr5AjxdsCPy0ZhkCdtmUKIsaMEyMDUNTbhxPViAFT/Q4zXokhVL9C35+6gvtE49wdTKhk2/HoVK769gEaFEg8HuWP/c5FwtaclEggxBZQAGZgT10sga1LCx9kKA9zt+A6HkC4Z298V3k5WqKyX4/CFXL7D0ViDXIG/f3Mem/+4AQBYOrY3tswfCisJLUhKiKmgBMjA3Dv8JRBQTQoxTiKhQF0L9HVCFhgznr3ViqobMPfzRPx8KR9ikQAbZofi/yYPgJBqxAgxKZQAGZAmhRLxGVwCRMNfxLjNGeYDiYUQl/OqkJJdwXc4nXIlvwozNp/ChZwKOFqLsfvpCDwW5s13WIQQHaAEyICcvV2Oijo5nG0kCPNz4jscQrrF2UaCaSGeAIBdCbf5DaYTfs8oxGNbTyOvsgEBPW1waOkoRAT04DssQoiOUAJkQLjVnx8a4AqLTu4uTYgh44qhj14qQEmNjOdo2sYYw/9OZuKZr1TbWozs3QM/vDgK/i42fIdGCNEh+itrIBhj6vofWvyQmIpQH0eEejugUaHE/rOGtz+YXKHEPw6l4b2f0qFkwLxwH3z1VDgcrMV8h0YI0TFKgAxEen4VcivqIRUL8UDfnnyHQ4jWcLvE70nMQpNCyW8w96isl+OpnWexp3lbi7enDMQHjwa32NaCEGK66JNuILjenwf79qSptsSk/C3EA07WYuRVNiA+wzD2B8surcOsradx4noJrCUifL5wGJ59MIBmXhJiRigBMhB3Nz+l1Z+JaZGKRZg73BcAsCuB/5Whz94uw4xPT+FGUQ3c7aX49vlIGnYmxAxRAmQAcsrqcCW/CkKBqgCaEFOzIMIXAgFw8kYJbhbX8BbHD+dV21qU1TYi2MsBPy4fhSAv2taCEHNECZAB4Hp/wns5w8lGwnM0hGifj7O1OrnnoxdIqWT4KPYqXt2v2tZi8iB3fPt8JNxoWwtCzBYlQAYg9rJq+jttfkpMGVcM/V3yHdTKmvT2uA1yBf6+7zw++V21rcWLY3vj0wW0rQUh5o4SIJ6V1Tbi7O0yADT9nZi2B/q4wL+HNaplTTiUqp/9wdTbWlxUbWux/rEQvEHbWhBCQAkQ7+KvFELJgEAPe/g4W/MdDiE6I7xnf7Bdetgf7Ep+FR7dclq9rcWupyMwZ5iPTh+TEGI8KAHi2d3ZX9T7Q0zf7DAfSMVCZBRU4+ztcp09DretRW5FPQJcbPDD0lEYQdtaEELuQQkQj+obFThxvRgA1f8Q8+BgLcaMwV4AgK91sD8YYwzb79nWIjKgB75fOhK9aFsLQshfUALEo+PXi9EgV8LbyQoDPez4DocQvVjYvD9YTFoBiqoatHbdJoUS//wxDf9q3tbi8eE++PrpcDha08xKQkhrlADxiFv9eWKgO61AS8zGIE8HhPk5oUnJsDcpWyvXrKyXY8nOs9ideHdbizUzaVsLQkj76LcDT5oUSsRnUP0PMU/cLvF7z2RD3s39we7d1sJKLMJnT4TRthaEkPuiBIgnydkVqKiTw8lajGF+TnyHQ4heTQ5yh4utBEXVMnVPaFec+8u2FgdeiKTtZAghnUIJEE/irqg2hXxooBssqJuemBlLCxEeb94frKvF0IfO52J+87YWQV72OLSMtrUghHSeQfzl3bJlC/z9/SGVShEREYGkpKQOzz9w4AAGDBgAqVSK4OBgHD16VH2bXC7HG2+8geDgYNjY2MDT0xOLFi1CXl6erp9GpzEGxDcnQBNp8UNipuZH+EIoAM5kluFqQXWn76dUMmyMvYpX9qeiUaHEpEFu+Pb5SLg70LYWhJDO4z0B2r9/P1asWIHo6GikpKQgNDQUkyZNQlFRUZvnnz59GvPmzcPTTz+N8+fPY8aMGZgxYwbS0tIAAHV1dUhJScE///lPpKSk4Pvvv8fVq1fxyCOP6PNpdSivDrhT0QCpWIgH+vbkOxxCeOHpaKVe/XxX4u1O3Yfb1uK/zdtavDCmN7YuCIO1xEJXYRJCTBTvCdDGjRvx7LPPYsmSJQgMDMS2bdtgbW2N7du3t3n+xx9/jMmTJ2PlypUYOHAg3nvvPQwdOhSbN28GADg4OCAuLg5z5sxB//79MWLECGzevBnJycnIztbOjJPuulimKs58sG9P2o+ImLVFzfuD/ZCSi+oGeYfnFlU34PHmbS0shKptLd58mLa1IIR0Da9fmxobG5GcnIxVq1apjwmFQkRFRSEhIaHN+yQkJGDFihUtjk2aNAmHDh1q93EqKyshEAjg6OjY5u0ymQwymUz9c1VVFQDVcJpc3vEvZU3J5XJcKlPlnQ8NcNH69YlmuNef2oEfw33tEeBig1sltThwNhuPh3kAaN0eVwuq8dzu88irbICjlRib54UiopcztZuO0efDsFB73J8mrw2vCVBJSQkUCgXc3FrWwbi5uSEjI6PN+xQUFLR5fkFBQZvnNzQ04I033sC8efNgb2/f5jlr1qzB6tWrWx2PjY2FtbX29udSMuB8iQC5dSIADPKsCziaf0Fr1yddFxcXx3cIZmuIrQC3SkT47PcrcC5Ng0DQsj0ulwvw1TUhZEoBekoZnutfj9IriTh6hcegzQx9PgwLtUf76urqOn2uSQ+cy+VyzJkzB4wxbN26td3zVq1a1aJXqaqqCj4+Ppg4cWK7SZOmfr1ciDVHM1BQxfU0CbD5ug3+MWUAJtE6QLyRy+WIi4vDhAkTIBaL+Q7HLD3Q0ISYD/9EYb0CeXb9UXD7GsZHhiEiwAV7knLwZeJVKBkQ0csJmx8fDEdraid9oc+HYaH2uD9uBKczeE2AXFxcIBKJUFjYch2QwsJCuLu3vZaHu7t7p87nkp+srCz8/vvvHSYylpaWsLS0bHVcLBZr5U0Wk5aPv++7gL/ufV1YJcPf913A1ieGYnKQR7cfh3SdttqaaM5ZLEaYvxOOXyvB+ribAET4+noqrCUi1DUqAABzhnnj3zOCIbHgvWzRLNHnw7BQe7RPk9eF198mEokEYWFhiI+PVx9TKpWIj49HZGRkm/eJjIxscT6g6g6893wu+bl+/Tp+++039OjB3y7QCiXD6iPprZIfAOpjq4+kQ6Fs6wxCTF9MWj6OXytpdZxLfmYO8cK6WSGU/BBCtIr3IbAVK1Zg8eLFGDZsGMLDw7Fp0ybU1tZiyZIlAIBFixbBy8sLa9asAQC8/PLLGDNmDD766CNMnToV+/btw7lz5/D5558DUCU/jz32GFJSUvDTTz9BoVCo64OcnZ0hkeh3Y8SkzDLkV7a/4SMDkF/ZgKTMMkT25i9RI4QP3BeEjiTcKoWSASKa7EUI0SLeE6C5c+eiuLgY77zzDgoKCjB48GDExMSoC52zs7MhFN795jdy5Ejs3bsX//jHP/DWW2+hb9++OHToEIKCggAAubm5OHz4MABg8ODBLR7rjz/+wNixY/XyvDhF1Z3b7bqz5xFiSu73BQGgLwiEEN3gPQECgOXLl2P58uVt3nbs2LFWx2bPno3Zs2e3eb6/vz8YM5zhJFe7zq1O29nzCDEl9AWBEMIXGlTXsfBezvBwkKK93nsBAA8HKcJ7OeszLEIMAn1BIITwhRIgHRMJBYieFggArZIg7ufoaYEQ0Wq2xAzRFwRCCF8oAdKDyUEe2PrE0FabNbo7SGkKPDFr9AWBEMIXg6gBMgeTgzwwIdAdCTeKEHviDCY+EIHIPq70i52YPe4Lwuoj6S0Kot0dpIieFkhfEAghOkEJkB6JhAJE9HJG6RWGiF7OlPwQ0oy+IBBC9I0SIEKIQaAvCIQQfaIaIEIIIYSYHUqACCGEEGJ2KAEihBBCiNmhBIgQQgghZocSIEIIIYSYHUqACCGEEGJ2KAEihBBCiNmhBIgQQgghZocSIEIIIYSYHVoJug2MMQBAVVWV1q8tl8tRV1eHqqoqiMVirV+faIbaw7BQexgWag/DQu1xf9zfbe7veEcoAWpDdXU1AMDHx4fnSAghhBCiqerqajg4OHR4joB1Jk0yM0qlEnl5ebCzs4NAoN39iKqqquDj44OcnBzY29tr9dpEc9QehoXaw7BQexgWao/7Y4yhuroanp6eEAo7rvKhHqA2CIVCeHt76/Qx7O3t6Q1sQKg9DAu1h2Gh9jAs1B4du1/PD4eKoAkhhBBidigBIoQQQojZoQRIzywtLREdHQ1LS0u+QyGg9jA01B6GhdrDsFB7aBcVQRNCCCHE7FAPECGEEELMDiVAhBBCCDE7lAARQgghxOxQAkQIIYQQs0MJkA5s2bIF/v7+kEqliIiIQFJSUofnHzhwAAMGDIBUKkVwcDCOHj2qp0jNgybt8cUXX+CBBx6Ak5MTnJycEBUVdd/2I5rR9PPB2bdvHwQCAWbMmKHbAM2Mpu1RUVGBZcuWwcPDA5aWlujXrx/9ztIiTdtj06ZN6N+/P6ysrODj44NXX30VDQ0NeorWyDGiVfv27WMSiYRt376dXb58mT377LPM0dGRFRYWtnn+qVOnmEgkYuvXr2fp6ensH//4BxOLxezSpUt6jtw0adoe8+fPZ1u2bGHnz59nV65cYU8++SRzcHBgd+7c0XPkpknT9uBkZmYyLy8v9sADD7Dp06frJ1gzoGl7yGQyNmzYMDZlyhR28uRJlpmZyY4dO8ZSU1P1HLlp0rQ99uzZwywtLdmePXtYZmYm+/XXX5mHhwd79dVX9Ry5caIESMvCw8PZsmXL1D8rFArm6enJ1qxZ0+b5c+bMYVOnTm1xLCIigj3//PM6jdNcaNoef9XU1MTs7OzYV199pasQzUpX2qOpqYmNHDmSffnll2zx4sWUAGmRpu2xdetWFhAQwBobG/UVolnRtD2WLVvGxo8f3+LYihUr2KhRo3Qap6mgITAtamxsRHJyMqKiotTHhEIhoqKikJCQ0OZ9EhISWpwPAJMmTWr3fNJ5XWmPv6qrq4NcLoezs7OuwjQbXW2Pf/3rX3B1dcXTTz+tjzDNRlfa4/Dhw4iMjMSyZcvg5uaGoKAgfPDBB1AoFPoK22R1pT1GjhyJ5ORk9TDZrVu3cPToUUyZMkUvMRs72gxVi0pKSqBQKODm5tbiuJubGzIyMtq8T0FBQZvnFxQU6CxOc9GV9virN954A56enq2SVKK5rrTHyZMn8b///Q+pqal6iNC8dKU9bt26hd9//x0LFizA0aNHcePGDSxduhRyuRzR0dH6CNtkdaU95s+fj5KSEowePRqMMTQ1NeGFF17AW2+9pY+QjR71ABHSjrVr12Lfvn344YcfIJVK+Q7H7FRXV2PhwoX44osv4OLiwnc4BIBSqYSrqys+//xzhIWFYe7cuXj77bexbds2vkMzS8eOHcMHH3yATz/9FCkpKfj+++/x888/47333uM7NKNAPUBa5OLiApFIhMLCwhbHCwsL4e7u3uZ93N3dNTqfdF5X2oOzYcMGrF27Fr/99htCQkJ0GabZ0LQ9bt68idu3b2PatGnqY0qlEgBgYWGBq1evonfv3roN2oR15fPh4eEBsVgMkUikPjZw4EAUFBSgsbEREolEpzGbsq60xz//+U8sXLgQzzzzDAAgODgYtbW1eO655/D2229DKKQ+jo7Qq6NFEokEYWFhiI+PVx9TKpWIj49HZGRkm/eJjIxscT4AxMXFtXs+6byutAcArF+/Hu+99x5iYmIwbNgwfYRqFjRtjwEDBuDSpUtITU1V/3vkkUcwbtw4pKamwsfHR5/hm5yufD5GjRqFGzduqBNRALh27Ro8PDwo+emmrrRHXV1dqySHS04ZbfN5f3xXYZuaffv2MUtLS7Zz506Wnp7OnnvuOebo6MgKCgoYY4wtXLiQvfnmm+rzT506xSwsLNiGDRvYlStXWHR0NE2D1yJN22Pt2rVMIpGwgwcPsvz8fPW/6upqvp6CSdG0Pf6KZoFpl6btkZ2dzezs7Njy5cvZ1atX2U8//cRcXV3Zv//9b76egknRtD2io6OZnZ0d++abb9itW7dYbGws6927N5szZw5fT8GoUAKkA5988gnz9fVlEomEhYeHs8TERPVtY8aMYYsXL25x/rfffsv69evHJBIJGzRoEPv555/1HLFp06Q9/Pz8GIBW/6Kjo/UfuInS9PNxL0qAtE/T9jh9+jSLiIhglpaWLCAggL3//vusqalJz1GbLk3aQy6Xs3fffZf17t2bSaVS5uPjw5YuXcrKy8v1H7gREjBG/WSEEEIIMS9UA0QIIYQQs0MJECGEEELMDiVAhBBCCDE7lAARQgghxOxQAkQIIYQQs0MJECGEEELMDiVAhBBCCDE7lAARQsxCU1MTVq5cCS8vL9jb22Ps2LG4ePEi32ERQnhCCRAhxCxs374dmzdvxieffILz58+jT58+mDt3Lt9hEUJ4QitBE0LMwty5c8EYw7fffgsASE9Px6BBg1BaWgpnZ2eeoyOE6Bv1ABFCzEJRURE8PT3VPxcUFAC4u3s2IcS8UAJECDEL93Z2X79+HatWrUJkZCQcHBx4jIoQwhcLvgMghBB9euONN7B+/XoIBAIcOHCA73AIITyhHiBCiFl57bXXcOLECbz55puYN2+euiaIEGJeqAeIEGJWXF1d4erqitGjR6OoqAiffvop5syZw3dYhBA9ox4gQojZaGpqavGzWCyGVCrlKRpCCJ8oASKEmI2dO3di586dyMrKwuHDh7F37148/PDDfIdFCOEBrQNECDELY8eORUNDA2pqanDz5k24u7vjiSeewLvvvktT4QkxQ1QDRAgxGyNGjMCmTZv4DoMQYgBoCIwQQgghZocSIEIIIYSYHaoBIoQQQojZoR4gQgghhJgdSoAIIYQQYnYoASKEEEKI2aEEiBBCCCFmhxIgQgghhJgdSoAIIYQQYnYoASKEEEKI2aEEiBBCCCFmhxIgQgghhJid/weKq6jtWtKkGQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Empirical Lipschitz constants: K12=9.3892, K23=1.6530\n" + ] + } + ], + "source": [ + "import copy\n", + "import torch\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from scipy.stats import wasserstein\n", + "from tqdm import tqdm\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Utilities for state‐dict arithmetic & norms\n", + "# -----------------------------------------------------------------------------\n", + "def subtract_state_dicts(sd_a, sd_b):\n", + " return {k: sd_a[k] - sd_b[k] for k in sd_a}\n", + "\n", + "\n", + "def add_scaled(sd_base, sd_delta, alpha):\n", + " return {k: sd_base[k] + alpha * sd_delta[k] for k in sd_base}\n", + "\n", + "\n", + "def state_dict_norm(sd):\n", + " total = torch.stack([v.flatten().dot(v.flatten()) for v in sd.values()]).sum()\n", + " return torch.sqrt(total).item()\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your 3 reward models & tokenizer\n", + "# -----------------------------------------------------------------------------\n", + "paths = [\n", + " 'LifelongAlignment/aifgen-piecewise-preference-shift-0-reward-model',\n", + " 'LifelongAlignment/aifgen-piecewise-preference-shift-1-reward-model',\n", + " 'LifelongAlignment/aifgen-piecewise-preference-shift-2-reward-model',\n", + "]\n", + "\n", + "models = [\n", + " AutoModelForSequenceClassification.from_pretrained(\n", + " p,\n", + " torch_dtype=torch.bfloat16,\n", + " cache_dir='//network/scratch/s/shahrad.mohammadzadeh/.cache',\n", + " ).cuda()\n", + " for p in paths\n", + "]\n", + "tokenizer = AutoTokenizer.from_pretrained(paths[0])\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Compute task vectors & their norms\n", + "# -----------------------------------------------------------------------------\n", + "sd1, sd2, sd3 = [m.state_dict() for m in models]\n", + "T12 = subtract_state_dicts(sd2, sd1)\n", + "T23 = subtract_state_dicts(sd3, sd2)\n", + "norm12 = state_dict_norm(T12)\n", + "norm23 = state_dict_norm(T23)\n", + "print(f'||T12|| = {norm12:.2f}, ||T23|| = {norm23:.2f}')\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Load your prompts\n", + "# -----------------------------------------------------------------------------\n", + "prompts = prompts_piecewise\n", + "\n", + "# In experiments.ipynb, add a new cell before your interpolation\n", + "\n", + "from torch.utils.data import DataLoader, Dataset\n", + "\n", + "\n", + "class PromptDataset(Dataset):\n", + " def __init__(self, prompts):\n", + " self.prompts = prompts\n", + "\n", + " def __len__(self):\n", + " return len(self.prompts)\n", + "\n", + " def __getitem__(self, i):\n", + " return self.prompts[i]\n", + "\n", + "\n", + "def compute_rewards(model, prompts, batch_size=64, num_workers=4):\n", + " \"\"\"Compute reward scores in batches.\"\"\"\n", + " model.eval()\n", + " ds = PromptDataset(prompts)\n", + " loader = DataLoader(\n", + " ds,\n", + " batch_size=batch_size,\n", + " shuffle=False,\n", + " num_workers=num_workers,\n", + " collate_fn=lambda batch: tokenizer(\n", + " batch,\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ),\n", + " )\n", + " rewards = []\n", + " with torch.no_grad():\n", + " for batch in loader:\n", + " batch = {k: v.cuda(non_blocking=True) for k, v in batch.items()}\n", + " logits = model(**batch).logits\n", + " # if binary head, pick class 1; else regression head\n", + " if logits.shape[-1] > 1:\n", + " vals = logits[:, 1]\n", + " else:\n", + " vals = logits[:, 0]\n", + " rewards.extend(vals.cpu().tolist())\n", + " return rewards\n", + "\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T12 (RM1 → RM2)\n", + "# -----------------------------------------------------------------------------\n", + "alphas = np.linspace(0, 1, 11)\n", + "all_rewards_12 = []\n", + "for α in tqdm(alphas, desc='Interp T12'):\n", + " sd_interp = add_scaled(sd1, T12, α)\n", + " m = copy.deepcopy(models[0])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_12.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "# Wasserstein distances & Lipschitz estimate\n", + "dists12 = [\n", + " wasserstein_distance(all_rewards_12[i], all_rewards_12[i + 1])\n", + " for i in range(len(alphas) - 1)\n", + "]\n", + "rates12 = [d / ((alphas[i + 1] - alphas[i]) * norm12) for i, d in enumerate(dists12)]\n", + "K12 = max(rates12)\n", + "\n", + "plt.figure()\n", + "plt.plot(alphas[:-1], dists12, marker='o')\n", + "plt.title(f'RM1→RM2: W-dist vs α (K≈{K12:.3f})')\n", + "plt.xlabel('α')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "# -----------------------------------------------------------------------------\n", + "# Interpolate along T23 (RM2 → RM3)\n", + "# -----------------------------------------------------------------------------\n", + "betas = np.linspace(0, 1, 11)\n", + "all_rewards_23 = []\n", + "for β in tqdm(betas, desc='Interp T23'):\n", + " sd_interp = add_scaled(sd2, T23, β)\n", + " m = copy.deepcopy(models[1])\n", + " m.load_state_dict(sd_interp)\n", + " all_rewards_23.append(compute_rewards(m, prompts, batch_size=1024))\n", + "\n", + "dists23 = [\n", + " wasserstein_distance(all_rewards_23[i], all_rewards_23[i + 1])\n", + " for i in range(len(betas) - 1)\n", + "]\n", + "rates23 = [d / ((betas[i + 1] - betas[i]) * norm23) for i, d in enumerate(dists23)]\n", + "K23 = max(rates23)\n", + "\n", + "plt.figure()\n", + "plt.plot(betas[:-1], dists23, marker='o')\n", + "plt.title(f'RM2→RM3: W-dist vs β (K≈{K23:.3f})')\n", + "plt.xlabel('β')\n", + "plt.ylabel('Wasserstein')\n", + "plt.grid(True)\n", + "plt.show()\n", + "\n", + "print(f'Empirical Lipschitz constants: K12={K12:.4f}, K23={K23:.4f}')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4057dfe", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index b90c8e52..a317f1d4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ dependencies = [ "pydantic>=2.10.4", "pytest-asyncio>=0.25.3", "pytest-mock>=3.14.0", + "setuptools>=75.8.2", "torch==2.3.0", "types-pyyaml>=6.0.12.20241230", ] @@ -40,6 +41,9 @@ dev = [ "ruff>=0.7.3", "sphinx>=7.4.7", "sphinx-rtd-theme>=3.0.2", + "ipykernel>=6.29.5", + "matplotlib>=3.10.1", + "scipy>=1.15.2", ] benchmarks-dpo = [ "datasets>=3.2.0", diff --git a/uv.lock b/uv.lock index ad720968..b1fded56 100644 --- a/uv.lock +++ b/uv.lock @@ -43,6 +43,7 @@ dependencies = [ { name = "pydantic" }, { name = "pytest-asyncio" }, { name = "pytest-mock" }, + { name = "setuptools" }, { name = "torch" }, { name = "types-pyyaml" }, ] @@ -72,12 +73,15 @@ benchmarks-ppo = [ { name = "wandb" }, ] dev = [ + { name = "ipykernel" }, { name = "isort" }, + { name = "matplotlib" }, { name = "mypy" }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, { name = "ruff" }, + { name = "scipy" }, { name = "sphinx" }, { name = "sphinx-rtd-theme" }, ] @@ -95,6 +99,7 @@ requires-dist = [ { name = "pydantic", specifier = ">=2.10.4" }, { name = "pytest-asyncio", specifier = ">=0.25.3" }, { name = "pytest-mock", specifier = ">=3.14.0" }, + { name = "setuptools", specifier = ">=75.8.2" }, { name = "torch", specifier = "==2.3.0" }, { name = "types-pyyaml", specifier = ">=6.0.12.20241230" }, ] @@ -124,12 +129,15 @@ benchmarks-ppo = [ { name = "wandb", specifier = ">=0.19.6" }, ] dev = [ + { name = "ipykernel", specifier = ">=6.29.5" }, { name = "isort", specifier = ">=5.13.2" }, + { name = "matplotlib", specifier = ">=3.10.1" }, { name = "mypy", specifier = ">=1.13.0" }, { name = "pre-commit", specifier = ">=4.0.1" }, { name = "pytest", specifier = ">=8.3.3" }, { name = "pytest-cov", specifier = ">=6.0.0" }, { name = "ruff", specifier = ">=0.7.3" }, + { name = "scipy", specifier = ">=1.15.2" }, { name = "sphinx", specifier = ">=7.4.7" }, { name = "sphinx-rtd-theme", specifier = ">=3.0.2" }, ] @@ -270,6 +278,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, ] +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, +] + [[package]] name = "async-timeout" version = "5.0.1" @@ -315,6 +341,63 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, ] +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + [[package]] name = "cfgv" version = "3.4.0" @@ -390,7 +473,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -415,6 +498,85 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551 }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399 }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061 }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956 }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872 }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027 }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641 }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075 }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534 }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188 }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636 }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636 }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053 }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985 }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750 }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246 }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728 }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762 }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196 }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017 }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580 }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688 }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331 }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963 }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681 }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674 }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480 }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489 }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042 }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630 }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670 }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694 }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986 }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060 }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747 }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895 }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098 }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090 }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643 }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443 }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865 }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162 }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355 }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935 }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168 }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681 }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101 }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599 }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807 }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729 }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791 }, +] + [[package]] name = "coverage" version = "7.6.12" @@ -480,6 +642,15 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, +] + [[package]] name = "datasets" version = "3.3.2" @@ -505,6 +676,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4c/37/22ef7675bef4ffe9577b937ddca2e22791534cbbe11c30714972a91532dc/datasets-3.3.2-py3-none-any.whl", hash = "sha256:fdaf3d5d70242621210b044e9b9b15a56e908bfc3e9d077bcf5605ac390f70bd", size = 485360 }, ] +[[package]] +name = "debugpy" +version = "1.8.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/75/087fe07d40f490a78782ff3b0a30e3968936854105487decdb33446d4b0e/debugpy-1.8.14.tar.gz", hash = "sha256:7cd287184318416850aa8b60ac90105837bb1e59531898c07569d197d2ed5322", size = 1641444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/df/156df75a41aaebd97cee9d3870fe68f8001b6c1c4ca023e221cfce69bece/debugpy-1.8.14-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:93fee753097e85623cab1c0e6a68c76308cd9f13ffdf44127e6fab4fbf024339", size = 2076510 }, + { url = "https://files.pythonhosted.org/packages/69/cd/4fc391607bca0996db5f3658762106e3d2427beaef9bfd363fd370a3c054/debugpy-1.8.14-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d937d93ae4fa51cdc94d3e865f535f185d5f9748efb41d0d49e33bf3365bd79", size = 3559614 }, + { url = "https://files.pythonhosted.org/packages/1a/42/4e6d2b9d63e002db79edfd0cb5656f1c403958915e0e73ab3e9220012eec/debugpy-1.8.14-cp310-cp310-win32.whl", hash = "sha256:c442f20577b38cc7a9aafecffe1094f78f07fb8423c3dddb384e6b8f49fd2987", size = 5208588 }, + { url = "https://files.pythonhosted.org/packages/97/b1/cc9e4e5faadc9d00df1a64a3c2d5c5f4b9df28196c39ada06361c5141f89/debugpy-1.8.14-cp310-cp310-win_amd64.whl", hash = "sha256:f117dedda6d969c5c9483e23f573b38f4e39412845c7bc487b6f2648df30fe84", size = 5241043 }, + { url = "https://files.pythonhosted.org/packages/67/e8/57fe0c86915671fd6a3d2d8746e40485fd55e8d9e682388fbb3a3d42b86f/debugpy-1.8.14-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:1b2ac8c13b2645e0b1eaf30e816404990fbdb168e193322be8f545e8c01644a9", size = 2175064 }, + { url = "https://files.pythonhosted.org/packages/3b/97/2b2fd1b1c9569c6764ccdb650a6f752e4ac31be465049563c9eb127a8487/debugpy-1.8.14-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf431c343a99384ac7eab2f763980724834f933a271e90496944195318c619e2", size = 3132359 }, + { url = "https://files.pythonhosted.org/packages/c0/ee/b825c87ed06256ee2a7ed8bab8fb3bb5851293bf9465409fdffc6261c426/debugpy-1.8.14-cp311-cp311-win32.whl", hash = "sha256:c99295c76161ad8d507b413cd33422d7c542889fbb73035889420ac1fad354f2", size = 5133269 }, + { url = "https://files.pythonhosted.org/packages/d5/a6/6c70cd15afa43d37839d60f324213843174c1d1e6bb616bd89f7c1341bac/debugpy-1.8.14-cp311-cp311-win_amd64.whl", hash = "sha256:7816acea4a46d7e4e50ad8d09d963a680ecc814ae31cdef3622eb05ccacf7b01", size = 5158156 }, + { url = "https://files.pythonhosted.org/packages/d9/2a/ac2df0eda4898f29c46eb6713a5148e6f8b2b389c8ec9e425a4a1d67bf07/debugpy-1.8.14-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:8899c17920d089cfa23e6005ad9f22582fd86f144b23acb9feeda59e84405b84", size = 2501268 }, + { url = "https://files.pythonhosted.org/packages/10/53/0a0cb5d79dd9f7039169f8bf94a144ad3efa52cc519940b3b7dde23bcb89/debugpy-1.8.14-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6bb5c0dcf80ad5dbc7b7d6eac484e2af34bdacdf81df09b6a3e62792b722826", size = 4221077 }, + { url = "https://files.pythonhosted.org/packages/f8/d5/84e01821f362327bf4828728aa31e907a2eca7c78cd7c6ec062780d249f8/debugpy-1.8.14-cp312-cp312-win32.whl", hash = "sha256:281d44d248a0e1791ad0eafdbbd2912ff0de9eec48022a5bfbc332957487ed3f", size = 5255127 }, + { url = "https://files.pythonhosted.org/packages/33/16/1ed929d812c758295cac7f9cf3dab5c73439c83d9091f2d91871e648093e/debugpy-1.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:5aa56ef8538893e4502a7d79047fe39b1dae08d9ae257074c6464a7b290b806f", size = 5297249 }, + { url = "https://files.pythonhosted.org/packages/4d/e4/395c792b243f2367d84202dc33689aa3d910fb9826a7491ba20fc9e261f5/debugpy-1.8.14-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:329a15d0660ee09fec6786acdb6e0443d595f64f5d096fc3e3ccf09a4259033f", size = 2485676 }, + { url = "https://files.pythonhosted.org/packages/ba/f1/6f2ee3f991327ad9e4c2f8b82611a467052a0fb0e247390192580e89f7ff/debugpy-1.8.14-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f920c7f9af409d90f5fd26e313e119d908b0dd2952c2393cd3247a462331f15", size = 4217514 }, + { url = "https://files.pythonhosted.org/packages/79/28/b9d146f8f2dc535c236ee09ad3e5ac899adb39d7a19b49f03ac95d216beb/debugpy-1.8.14-cp313-cp313-win32.whl", hash = "sha256:3784ec6e8600c66cbdd4ca2726c72d8ca781e94bce2f396cc606d458146f8f4e", size = 5254756 }, + { url = "https://files.pythonhosted.org/packages/e0/62/a7b4a57013eac4ccaef6977966e6bec5c63906dd25a86e35f155952e29a1/debugpy-1.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:684eaf43c95a3ec39a96f1f5195a7ff3d4144e4a18d69bb66beeb1a6de605d6e", size = 5297119 }, + { url = "https://files.pythonhosted.org/packages/97/1a/481f33c37ee3ac8040d3d51fc4c4e4e7e61cb08b8bc8971d6032acc2279f/debugpy-1.8.14-py2.py3-none-any.whl", hash = "sha256:5cd9a579d553b6cb9759a7908a41988ee6280b961f24f63336835d9418216a20", size = 5256230 }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, +] + [[package]] name = "deepspeed" version = "0.16.3" @@ -626,6 +831,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, ] +[[package]] +name = "executing" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, +] + [[package]] name = "filelock" version = "3.17.0" @@ -635,6 +849,47 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/89/ec/00d68c4ddfedfe64159999e5f8a98fb8442729a63e2077eb9dcd89623d27/filelock-3.17.0-py3-none-any.whl", hash = "sha256:533dc2f7ba78dc2f0f531fc6c4940addf7b70a481e269a5a3b93be94ffbe8338", size = 16164 }, ] +[[package]] +name = "fonttools" +version = "4.57.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/2d/a9a0b6e3a0cf6bd502e64fc16d894269011930cabfc89aee20d1635b1441/fonttools-4.57.0.tar.gz", hash = "sha256:727ece10e065be2f9dd239d15dd5d60a66e17eac11aea47d447f9f03fdbc42de", size = 3492448 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/17/3ddfd1881878b3f856065130bb603f5922e81ae8a4eb53bce0ea78f765a8/fonttools-4.57.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:babe8d1eb059a53e560e7bf29f8e8f4accc8b6cfb9b5fd10e485bde77e71ef41", size = 2756260 }, + { url = "https://files.pythonhosted.org/packages/26/2b/6957890c52c030b0bf9e0add53e5badab4682c6ff024fac9a332bb2ae063/fonttools-4.57.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81aa97669cd726349eb7bd43ca540cf418b279ee3caba5e2e295fb4e8f841c02", size = 2284691 }, + { url = "https://files.pythonhosted.org/packages/cc/8e/c043b4081774e5eb06a834cedfdb7d432b4935bc8c4acf27207bdc34dfc4/fonttools-4.57.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0e9618630edd1910ad4f07f60d77c184b2f572c8ee43305ea3265675cbbfe7e", size = 4566077 }, + { url = "https://files.pythonhosted.org/packages/59/bc/e16ae5d9eee6c70830ce11d1e0b23d6018ddfeb28025fda092cae7889c8b/fonttools-4.57.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34687a5d21f1d688d7d8d416cb4c5b9c87fca8a1797ec0d74b9fdebfa55c09ab", size = 4608729 }, + { url = "https://files.pythonhosted.org/packages/25/13/e557bf10bb38e4e4c436d3a9627aadf691bc7392ae460910447fda5fad2b/fonttools-4.57.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:69ab81b66ebaa8d430ba56c7a5f9abe0183afefd3a2d6e483060343398b13fb1", size = 4759646 }, + { url = "https://files.pythonhosted.org/packages/bc/c9/5e2952214d4a8e31026bf80beb18187199b7001e60e99a6ce19773249124/fonttools-4.57.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d639397de852f2ccfb3134b152c741406752640a266d9c1365b0f23d7b88077f", size = 4941652 }, + { url = "https://files.pythonhosted.org/packages/df/04/e80242b3d9ec91a1f785d949edc277a13ecfdcfae744de4b170df9ed77d8/fonttools-4.57.0-cp310-cp310-win32.whl", hash = "sha256:cc066cb98b912f525ae901a24cd381a656f024f76203bc85f78fcc9e66ae5aec", size = 2159432 }, + { url = "https://files.pythonhosted.org/packages/33/ba/e858cdca275daf16e03c0362aa43734ea71104c3b356b2100b98543dba1b/fonttools-4.57.0-cp310-cp310-win_amd64.whl", hash = "sha256:7a64edd3ff6a7f711a15bd70b4458611fb240176ec11ad8845ccbab4fe6745db", size = 2203869 }, + { url = "https://files.pythonhosted.org/packages/81/1f/e67c99aa3c6d3d2f93d956627e62a57ae0d35dc42f26611ea2a91053f6d6/fonttools-4.57.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3871349303bdec958360eedb619169a779956503ffb4543bb3e6211e09b647c4", size = 2757392 }, + { url = "https://files.pythonhosted.org/packages/aa/f1/f75770d0ddc67db504850898d96d75adde238c35313409bfcd8db4e4a5fe/fonttools-4.57.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c59375e85126b15a90fcba3443eaac58f3073ba091f02410eaa286da9ad80ed8", size = 2285609 }, + { url = "https://files.pythonhosted.org/packages/f5/d3/bc34e4953cb204bae0c50b527307dce559b810e624a733351a654cfc318e/fonttools-4.57.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967b65232e104f4b0f6370a62eb33089e00024f2ce143aecbf9755649421c683", size = 4873292 }, + { url = "https://files.pythonhosted.org/packages/41/b8/d5933559303a4ab18c799105f4c91ee0318cc95db4a2a09e300116625e7a/fonttools-4.57.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39acf68abdfc74e19de7485f8f7396fa4d2418efea239b7061d6ed6a2510c746", size = 4902503 }, + { url = "https://files.pythonhosted.org/packages/32/13/acb36bfaa316f481153ce78de1fa3926a8bad42162caa3b049e1afe2408b/fonttools-4.57.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d077f909f2343daf4495ba22bb0e23b62886e8ec7c109ee8234bdbd678cf344", size = 5077351 }, + { url = "https://files.pythonhosted.org/packages/b5/23/6d383a2ca83b7516d73975d8cca9d81a01acdcaa5e4db8579e4f3de78518/fonttools-4.57.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:46370ac47a1e91895d40e9ad48effbe8e9d9db1a4b80888095bc00e7beaa042f", size = 5275067 }, + { url = "https://files.pythonhosted.org/packages/bc/ca/31b8919c6da0198d5d522f1d26c980201378c087bdd733a359a1e7485769/fonttools-4.57.0-cp311-cp311-win32.whl", hash = "sha256:ca2aed95855506b7ae94e8f1f6217b7673c929e4f4f1217bcaa236253055cb36", size = 2158263 }, + { url = "https://files.pythonhosted.org/packages/13/4c/de2612ea2216eb45cfc8eb91a8501615dd87716feaf5f8fb65cbca576289/fonttools-4.57.0-cp311-cp311-win_amd64.whl", hash = "sha256:17168a4670bbe3775f3f3f72d23ee786bd965395381dfbb70111e25e81505b9d", size = 2204968 }, + { url = "https://files.pythonhosted.org/packages/cb/98/d4bc42d43392982eecaaca117d79845734d675219680cd43070bb001bc1f/fonttools-4.57.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:889e45e976c74abc7256d3064aa7c1295aa283c6bb19810b9f8b604dfe5c7f31", size = 2751824 }, + { url = "https://files.pythonhosted.org/packages/1a/62/7168030eeca3742fecf45f31e63b5ef48969fa230a672216b805f1d61548/fonttools-4.57.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0425c2e052a5f1516c94e5855dbda706ae5a768631e9fcc34e57d074d1b65b92", size = 2283072 }, + { url = "https://files.pythonhosted.org/packages/5d/82/121a26d9646f0986ddb35fbbaf58ef791c25b59ecb63ffea2aab0099044f/fonttools-4.57.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44c26a311be2ac130f40a96769264809d3b0cb297518669db437d1cc82974888", size = 4788020 }, + { url = "https://files.pythonhosted.org/packages/5b/26/e0f2fb662e022d565bbe280a3cfe6dafdaabf58889ff86fdef2d31ff1dde/fonttools-4.57.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c41ba992df5b8d680b89fd84c6a1f2aca2b9f1ae8a67400c8930cd4ea115f6", size = 4859096 }, + { url = "https://files.pythonhosted.org/packages/9e/44/9075e323347b1891cdece4b3f10a3b84a8f4c42a7684077429d9ce842056/fonttools-4.57.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea1e9e43ca56b0c12440a7c689b1350066595bebcaa83baad05b8b2675129d98", size = 4964356 }, + { url = "https://files.pythonhosted.org/packages/48/28/caa8df32743462fb966be6de6a79d7f30393859636d7732e82efa09fbbb4/fonttools-4.57.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84fd56c78d431606332a0627c16e2a63d243d0d8b05521257d77c6529abe14d8", size = 5226546 }, + { url = "https://files.pythonhosted.org/packages/f6/46/95ab0f0d2e33c5b1a4fc1c0efe5e286ba9359602c0a9907adb1faca44175/fonttools-4.57.0-cp312-cp312-win32.whl", hash = "sha256:f4376819c1c778d59e0a31db5dc6ede854e9edf28bbfa5b756604727f7f800ac", size = 2146776 }, + { url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl", hash = "sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9", size = 2193956 }, + { url = "https://files.pythonhosted.org/packages/e9/2f/11439f3af51e4bb75ac9598c29f8601aa501902dcedf034bdc41f47dd799/fonttools-4.57.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:408ce299696012d503b714778d89aa476f032414ae57e57b42e4b92363e0b8ef", size = 2739175 }, + { url = "https://files.pythonhosted.org/packages/25/52/677b55a4c0972dc3820c8dba20a29c358197a78229daa2ea219fdb19e5d5/fonttools-4.57.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bbceffc80aa02d9e8b99f2a7491ed8c4a783b2fc4020119dc405ca14fb5c758c", size = 2276583 }, + { url = "https://files.pythonhosted.org/packages/64/79/184555f8fa77b827b9460a4acdbbc0b5952bb6915332b84c615c3a236826/fonttools-4.57.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f022601f3ee9e1f6658ed6d184ce27fa5216cee5b82d279e0f0bde5deebece72", size = 4766437 }, + { url = "https://files.pythonhosted.org/packages/f8/ad/c25116352f456c0d1287545a7aa24e98987b6d99c5b0456c4bd14321f20f/fonttools-4.57.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dea5893b58d4637ffa925536462ba626f8a1b9ffbe2f5c272cdf2c6ebadb817", size = 4838431 }, + { url = "https://files.pythonhosted.org/packages/53/ae/398b2a833897297797a44f519c9af911c2136eb7aa27d3f1352c6d1129fa/fonttools-4.57.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dff02c5c8423a657c550b48231d0a48d7e2b2e131088e55983cfe74ccc2c7cc9", size = 4951011 }, + { url = "https://files.pythonhosted.org/packages/b7/5d/7cb31c4bc9ffb9a2bbe8b08f8f53bad94aeb158efad75da645b40b62cb73/fonttools-4.57.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:767604f244dc17c68d3e2dbf98e038d11a18abc078f2d0f84b6c24571d9c0b13", size = 5205679 }, + { url = "https://files.pythonhosted.org/packages/4c/e4/6934513ec2c4d3d69ca1bc3bd34d5c69dafcbf68c15388dd3bb062daf345/fonttools-4.57.0-cp313-cp313-win32.whl", hash = "sha256:8e2e12d0d862f43d51e5afb8b9751c77e6bec7d2dc00aad80641364e9df5b199", size = 2144833 }, + { url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl", hash = "sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3", size = 2190799 }, + { url = "https://files.pythonhosted.org/packages/90/27/45f8957c3132917f91aaa56b700bcfc2396be1253f685bd5c68529b6f610/fonttools-4.57.0-py3-none-any.whl", hash = "sha256:3122c604a675513c68bd24c6a8f9091f1c2376d18e8f5fe5a101746c81b3e98f", size = 1093605 }, +] + [[package]] name = "frozenlist" version = "1.5.0" @@ -851,6 +1106,52 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/21/b590c0cc3888b24f2ac9898c41d852d7454a1695fbad34bee85dba6dc408/intel_openmp-2021.4.0-py2.py3-none-win_amd64.whl", hash = "sha256:eef4c8bcc8acefd7f5cd3b9384dbf73d59e2c99fc56545712ded913f43c4a94f", size = 3516906 }, ] +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, +] + +[[package]] +name = "ipython" +version = "8.36.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/9f/d9a73710df947b7804bd9d93509463fb3a89e0ddc99c9fcc67279cddbeb6/ipython-8.36.0.tar.gz", hash = "sha256:24658e9fe5c5c819455043235ba59cfffded4a35936eefceceab6b192f7092ff", size = 5604997 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/d7/c1c9f371790b3a181e343c4815a361e5a0cc7d90ef6642d64ba5d05de289/ipython-8.36.0-py3-none-any.whl", hash = "sha256:12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1", size = 831074 }, +] + [[package]] name = "isort" version = "6.0.1" @@ -860,6 +1161,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186 }, ] +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + [[package]] name = "jinja2" version = "3.1.5" @@ -940,6 +1253,123 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, ] +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, +] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623 }, + { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720 }, + { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826 }, + { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231 }, + { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938 }, + { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799 }, + { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362 }, + { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695 }, + { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646 }, + { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260 }, + { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633 }, + { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885 }, + { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175 }, + { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, + { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, + { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, + { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, + { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, + { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, + { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, + { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, + { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, + { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, + { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, + { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, + { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, + { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403 }, + { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657 }, + { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948 }, + { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186 }, + { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279 }, + { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762 }, +] + [[package]] name = "markdown-it-py" version = "3.0.0" @@ -1010,6 +1440,70 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, ] +[[package]] +name = "matplotlib" +version = "3.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/08/b89867ecea2e305f408fbb417139a8dd941ecf7b23a2e02157c36da546f0/matplotlib-3.10.1.tar.gz", hash = "sha256:e8d2d0e3881b129268585bf4765ad3ee73a4591d77b9a18c214ac7e3a79fb2ba", size = 36743335 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/b1/f70e27cf1cd76ce2a5e1aa5579d05afe3236052c6d9b9a96325bc823a17e/matplotlib-3.10.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ff2ae14910be903f4a24afdbb6d7d3a6c44da210fc7d42790b87aeac92238a16", size = 8163654 }, + { url = "https://files.pythonhosted.org/packages/26/af/5ec3d4636106718bb62503a03297125d4514f98fe818461bd9e6b9d116e4/matplotlib-3.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0721a3fd3d5756ed593220a8b86808a36c5031fce489adb5b31ee6dbb47dd5b2", size = 8037943 }, + { url = "https://files.pythonhosted.org/packages/a1/3d/07f9003a71b698b848c9925d05979ffa94a75cd25d1a587202f0bb58aa81/matplotlib-3.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0673b4b8f131890eb3a1ad058d6e065fb3c6e71f160089b65f8515373394698", size = 8449510 }, + { url = "https://files.pythonhosted.org/packages/12/87/9472d4513ff83b7cd864311821793ab72234fa201ab77310ec1b585d27e2/matplotlib-3.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e875b95ac59a7908978fe307ecdbdd9a26af7fa0f33f474a27fcf8c99f64a19", size = 8586585 }, + { url = "https://files.pythonhosted.org/packages/31/9e/fe74d237d2963adae8608faeb21f778cf246dbbf4746cef87cffbc82c4b6/matplotlib-3.10.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2589659ea30726284c6c91037216f64a506a9822f8e50592d48ac16a2f29e044", size = 9397911 }, + { url = "https://files.pythonhosted.org/packages/b6/1b/025d3e59e8a4281ab463162ad7d072575354a1916aba81b6a11507dfc524/matplotlib-3.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:a97ff127f295817bc34517255c9db6e71de8eddaab7f837b7d341dee9f2f587f", size = 8052998 }, + { url = "https://files.pythonhosted.org/packages/a5/14/a1b840075be247bb1834b22c1e1d558740b0f618fe3a823740181ca557a1/matplotlib-3.10.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:057206ff2d6ab82ff3e94ebd94463d084760ca682ed5f150817b859372ec4401", size = 8174669 }, + { url = "https://files.pythonhosted.org/packages/0a/e4/300b08e3e08f9c98b0d5635f42edabf2f7a1d634e64cb0318a71a44ff720/matplotlib-3.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a144867dd6bf8ba8cb5fc81a158b645037e11b3e5cf8a50bd5f9917cb863adfe", size = 8047996 }, + { url = "https://files.pythonhosted.org/packages/75/f9/8d99ff5a2498a5f1ccf919fb46fb945109623c6108216f10f96428f388bc/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56c5d9fcd9879aa8040f196a235e2dcbdf7dd03ab5b07c0696f80bc6cf04bedd", size = 8461612 }, + { url = "https://files.pythonhosted.org/packages/40/b8/53fa08a5eaf78d3a7213fd6da1feec4bae14a81d9805e567013811ff0e85/matplotlib-3.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f69dc9713e4ad2fb21a1c30e37bd445d496524257dfda40ff4a8efb3604ab5c", size = 8602258 }, + { url = "https://files.pythonhosted.org/packages/40/87/4397d2ce808467af86684a622dd112664553e81752ea8bf61bdd89d24a41/matplotlib-3.10.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c59af3e8aca75d7744b68e8e78a669e91ccbcf1ac35d0102a7b1b46883f1dd7", size = 9408896 }, + { url = "https://files.pythonhosted.org/packages/d7/68/0d03098b3feb786cbd494df0aac15b571effda7f7cbdec267e8a8d398c16/matplotlib-3.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:11b65088c6f3dae784bc72e8d039a2580186285f87448babb9ddb2ad0082993a", size = 8061281 }, + { url = "https://files.pythonhosted.org/packages/7c/1d/5e0dc3b59c034e43de16f94deb68f4ad8a96b3ea00f4b37c160b7474928e/matplotlib-3.10.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:66e907a06e68cb6cfd652c193311d61a12b54f56809cafbed9736ce5ad92f107", size = 8175488 }, + { url = "https://files.pythonhosted.org/packages/7a/81/dae7e14042e74da658c3336ab9799128e09a1ee03964f2d89630b5d12106/matplotlib-3.10.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e9b4bb156abb8fa5e5b2b460196f7db7264fc6d62678c03457979e7d5254b7be", size = 8046264 }, + { url = "https://files.pythonhosted.org/packages/21/c4/22516775dcde10fc9c9571d155f90710761b028fc44f660508106c363c97/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1985ad3d97f51307a2cbfc801a930f120def19ba22864182dacef55277102ba6", size = 8452048 }, + { url = "https://files.pythonhosted.org/packages/63/23/c0615001f67ce7c96b3051d856baedc0c818a2ed84570b9bf9bde200f85d/matplotlib-3.10.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c96f2c2f825d1257e437a1482c5a2cf4fee15db4261bd6fc0750f81ba2b4ba3d", size = 8597111 }, + { url = "https://files.pythonhosted.org/packages/ca/c0/a07939a82aed77770514348f4568177d7dadab9787ebc618a616fe3d665e/matplotlib-3.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35e87384ee9e488d8dd5a2dd7baf471178d38b90618d8ea147aced4ab59c9bea", size = 9402771 }, + { url = "https://files.pythonhosted.org/packages/a6/b6/a9405484fb40746fdc6ae4502b16a9d6e53282ba5baaf9ebe2da579f68c4/matplotlib-3.10.1-cp312-cp312-win_amd64.whl", hash = "sha256:cfd414bce89cc78a7e1d25202e979b3f1af799e416010a20ab2b5ebb3a02425c", size = 8063742 }, + { url = "https://files.pythonhosted.org/packages/60/73/6770ff5e5523d00f3bc584acb6031e29ee5c8adc2336b16cd1d003675fe0/matplotlib-3.10.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c42eee41e1b60fd83ee3292ed83a97a5f2a8239b10c26715d8a6172226988d7b", size = 8176112 }, + { url = "https://files.pythonhosted.org/packages/08/97/b0ca5da0ed54a3f6599c3ab568bdda65269bc27c21a2c97868c1625e4554/matplotlib-3.10.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4f0647b17b667ae745c13721602b540f7aadb2a32c5b96e924cd4fea5dcb90f1", size = 8046931 }, + { url = "https://files.pythonhosted.org/packages/df/9a/1acbdc3b165d4ce2dcd2b1a6d4ffb46a7220ceee960c922c3d50d8514067/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa3854b5f9473564ef40a41bc922be978fab217776e9ae1545c9b3a5cf2092a3", size = 8453422 }, + { url = "https://files.pythonhosted.org/packages/51/d0/2bc4368abf766203e548dc7ab57cf7e9c621f1a3c72b516cc7715347b179/matplotlib-3.10.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e496c01441be4c7d5f96d4e40f7fca06e20dcb40e44c8daa2e740e1757ad9e6", size = 8596819 }, + { url = "https://files.pythonhosted.org/packages/ab/1b/8b350f8a1746c37ab69dda7d7528d1fc696efb06db6ade9727b7887be16d/matplotlib-3.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d45d3f5245be5b469843450617dcad9af75ca50568acf59997bed9311131a0b", size = 9402782 }, + { url = "https://files.pythonhosted.org/packages/89/06/f570373d24d93503988ba8d04f213a372fa1ce48381c5eb15da985728498/matplotlib-3.10.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e8e25b1209161d20dfe93037c8a7f7ca796ec9aa326e6e4588d8c4a5dd1e473", size = 8063812 }, + { url = "https://files.pythonhosted.org/packages/fc/e0/8c811a925b5a7ad75135f0e5af46408b78af88bbb02a1df775100ef9bfef/matplotlib-3.10.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:19b06241ad89c3ae9469e07d77efa87041eac65d78df4fcf9cac318028009b01", size = 8214021 }, + { url = "https://files.pythonhosted.org/packages/4a/34/319ec2139f68ba26da9d00fce2ff9f27679fb799a6c8e7358539801fd629/matplotlib-3.10.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01e63101ebb3014e6e9f80d9cf9ee361a8599ddca2c3e166c563628b39305dbb", size = 8090782 }, + { url = "https://files.pythonhosted.org/packages/77/ea/9812124ab9a99df5b2eec1110e9b2edc0b8f77039abf4c56e0a376e84a29/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f06bad951eea6422ac4e8bdebcf3a70c59ea0a03338c5d2b109f57b64eb3972", size = 8478901 }, + { url = "https://files.pythonhosted.org/packages/c9/db/b05bf463689134789b06dea85828f8ebe506fa1e37593f723b65b86c9582/matplotlib-3.10.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfb036f34873b46978f55e240cff7a239f6c4409eac62d8145bad3fc6ba5a3", size = 8613864 }, + { url = "https://files.pythonhosted.org/packages/c2/04/41ccec4409f3023a7576df3b5c025f1a8c8b81fbfe922ecfd837ac36e081/matplotlib-3.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dc6ab14a7ab3b4d813b88ba957fc05c79493a037f54e246162033591e770de6f", size = 9409487 }, + { url = "https://files.pythonhosted.org/packages/ac/c2/0d5aae823bdcc42cc99327ecdd4d28585e15ccd5218c453b7bcd827f3421/matplotlib-3.10.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc411ebd5889a78dabbc457b3fa153203e22248bfa6eedc6797be5df0164dbf9", size = 8134832 }, + { url = "https://files.pythonhosted.org/packages/c8/f6/10adb696d8cbeed2ab4c2e26ecf1c80dd3847bbf3891f4a0c362e0e08a5a/matplotlib-3.10.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:648406f1899f9a818cef8c0231b44dcfc4ff36f167101c3fd1c9151f24220fdc", size = 8158685 }, + { url = "https://files.pythonhosted.org/packages/3f/84/0603d917406072763e7f9bb37747d3d74d7ecd4b943a8c947cc3ae1cf7af/matplotlib-3.10.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:02582304e352f40520727984a5a18f37e8187861f954fea9be7ef06569cf85b4", size = 8035491 }, + { url = "https://files.pythonhosted.org/packages/fd/7d/6a8b31dd07ed856b3eae001c9129670ef75c4698fa1c2a6ac9f00a4a7054/matplotlib-3.10.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3809916157ba871bcdd33d3493acd7fe3037db5daa917ca6e77975a94cef779", size = 8590087 }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -1024,8 +1518,8 @@ name = "mkl" version = "2021.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "intel-openmp" }, - { name = "tbb" }, + { name = "intel-openmp", marker = "sys_platform != 'linux'" }, + { name = "tbb", marker = "sys_platform != 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ce/c6/892fe3bc91e811b78e4f85653864f2d92541d5e5c306b0cb3c2311e9ca64/mkl-2021.4.0-py2.py3-none-win32.whl", hash = "sha256:439c640b269a5668134e3dcbcea4350459c4a8bc46469669b2d67e07e3d330e8", size = 129048357 }, @@ -1230,6 +1724,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, ] +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, +] + [[package]] name = "networkx" version = "3.2.1" @@ -1381,7 +1884,7 @@ name = "nvidia-cudnn-cu12" version = "8.9.2.26" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ff/74/a2e2be7fb83aaedec84f391f082cf765dfb635e7caa9b49065f73e4835d8/nvidia_cudnn_cu12-8.9.2.26-py3-none-manylinux1_x86_64.whl", hash = "sha256:5ccb288774fdfb07a7e7025ffec286971c06d8d7b4fb162525334616d7629ff9", size = 731725872 }, @@ -1408,9 +1911,9 @@ name = "nvidia-cusolver-cu12" version = "11.4.5.107" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-cublas-cu12" }, - { name = "nvidia-cusparse-cu12" }, - { name = "nvidia-nvjitlink-cu12" }, + { name = "nvidia-cublas-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/bc/1d/8de1e5c67099015c834315e333911273a8c6aaba78923dd1d1e25fc5f217/nvidia_cusolver_cu12-11.4.5.107-py3-none-manylinux1_x86_64.whl", hash = "sha256:8a7ec542f0412294b15072fa7dab71d31334014a69f953004ea7a118206fe0dd", size = 124161928 }, @@ -1421,7 +1924,7 @@ name = "nvidia-cusparse-cu12" version = "12.1.0.106" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "nvidia-nvjitlink-cu12" }, + { name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/65/5b/cfaeebf25cd9fdec14338ccb16f6b2c4c7fa9163aefcf057d86b9cc248bb/nvidia_cusparse_cu12-12.1.0.106-py3-none-manylinux1_x86_64.whl", hash = "sha256:f3b50f42cf363f86ab21f720998517a659a48131e8d538dc02f8768237bd884c", size = 195958278 }, @@ -1441,7 +1944,6 @@ name = "nvidia-nccl-cu12" version = "2.20.5" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/bb/d09dda47c881f9ff504afd6f9ca4f502ded6d8fc2f572cacc5e39da91c28/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1fc150d5c3250b170b29410ba682384b14581db722b2531b0d8d33c595f33d01", size = 176238458 }, { url = "https://files.pythonhosted.org/packages/4b/2a/0a131f572aa09f741c30ccd45a8e56316e8be8dfc7bc19bf0ab7cfef7b19/nvidia_nccl_cu12-2.20.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:057f6bf9685f75215d0c53bf3ac4a10b3e6578351de307abad9e18a99182af56", size = 176249402 }, ] @@ -1451,7 +1953,6 @@ version = "12.8.61" source = { registry = "https://pypi.org/simple" } wheels = [ { url = "https://files.pythonhosted.org/packages/03/f8/9d85593582bd99b8d7c65634d2304780aefade049b2b94d96e44084be90b/nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:45fd79f2ae20bd67e8bc411055939049873bfd8fac70ff13bd4865e0b9bdab17", size = 39243473 }, - { url = "https://files.pythonhosted.org/packages/af/53/698f3758f48c5fcb1112721e40cc6714da3980d3c7e93bae5b29dafa9857/nvidia_nvjitlink_cu12-12.8.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b80ecab31085dda3ce3b41d043be0ec739216c3fc633b8abe212d5a30026df0", size = 38374634 }, ] [[package]] @@ -1538,6 +2039,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, ] +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, +] + [[package]] name = "peft" version = "0.14.0" @@ -1559,6 +2069,95 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/88/05/e58e3aaa36544d30a917814e336fc65a746f708e5874945e92999bc22fa3/peft-0.14.0-py3-none-any.whl", hash = "sha256:2f04f3a870c3baf30f15e7dcaa5dd70d3e54cfdd146d3c6c187735d3ae0a0700", size = 374831 }, ] +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, +] + +[[package]] +name = "pillow" +version = "11.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/8b/b158ad57ed44d3cc54db8d68ad7c0a58b8fc0e4c7a3f995f9d62d5b464a1/pillow-11.2.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:d57a75d53922fc20c165016a20d9c44f73305e67c351bbc60d1adaf662e74047", size = 3198442 }, + { url = "https://files.pythonhosted.org/packages/b1/f8/bb5d956142f86c2d6cc36704943fa761f2d2e4c48b7436fd0a85c20f1713/pillow-11.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:127bf6ac4a5b58b3d32fc8289656f77f80567d65660bc46f72c0d77e6600cc95", size = 3030553 }, + { url = "https://files.pythonhosted.org/packages/22/7f/0e413bb3e2aa797b9ca2c5c38cb2e2e45d88654e5b12da91ad446964cfae/pillow-11.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ba4be812c7a40280629e55ae0b14a0aafa150dd6451297562e1764808bbe61", size = 4405503 }, + { url = "https://files.pythonhosted.org/packages/f3/b4/cc647f4d13f3eb837d3065824aa58b9bcf10821f029dc79955ee43f793bd/pillow-11.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c8bd62331e5032bc396a93609982a9ab6b411c05078a52f5fe3cc59234a3abd1", size = 4490648 }, + { url = "https://files.pythonhosted.org/packages/c2/6f/240b772a3b35cdd7384166461567aa6713799b4e78d180c555bd284844ea/pillow-11.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:562d11134c97a62fe3af29581f083033179f7ff435f78392565a1ad2d1c2c45c", size = 4508937 }, + { url = "https://files.pythonhosted.org/packages/f3/5e/7ca9c815ade5fdca18853db86d812f2f188212792780208bdb37a0a6aef4/pillow-11.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c97209e85b5be259994eb5b69ff50c5d20cca0f458ef9abd835e262d9d88b39d", size = 4599802 }, + { url = "https://files.pythonhosted.org/packages/02/81/c3d9d38ce0c4878a77245d4cf2c46d45a4ad0f93000227910a46caff52f3/pillow-11.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0c3e6d0f59171dfa2e25d7116217543310908dfa2770aa64b8f87605f8cacc97", size = 4576717 }, + { url = "https://files.pythonhosted.org/packages/42/49/52b719b89ac7da3185b8d29c94d0e6aec8140059e3d8adcaa46da3751180/pillow-11.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc1c3bc53befb6096b84165956e886b1729634a799e9d6329a0c512ab651e579", size = 4654874 }, + { url = "https://files.pythonhosted.org/packages/5b/0b/ede75063ba6023798267023dc0d0401f13695d228194d2242d5a7ba2f964/pillow-11.2.1-cp310-cp310-win32.whl", hash = "sha256:312c77b7f07ab2139924d2639860e084ec2a13e72af54d4f08ac843a5fc9c79d", size = 2331717 }, + { url = "https://files.pythonhosted.org/packages/ed/3c/9831da3edea527c2ed9a09f31a2c04e77cd705847f13b69ca60269eec370/pillow-11.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:9bc7ae48b8057a611e5fe9f853baa88093b9a76303937449397899385da06fad", size = 2676204 }, + { url = "https://files.pythonhosted.org/packages/01/97/1f66ff8a1503d8cbfc5bae4dc99d54c6ec1e22ad2b946241365320caabc2/pillow-11.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:2728567e249cdd939f6cc3d1f049595c66e4187f3c34078cbc0a7d21c47482d2", size = 2414767 }, + { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450 }, + { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550 }, + { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018 }, + { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006 }, + { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773 }, + { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069 }, + { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460 }, + { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304 }, + { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809 }, + { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338 }, + { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918 }, + { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185 }, + { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306 }, + { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121 }, + { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707 }, + { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921 }, + { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523 }, + { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836 }, + { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390 }, + { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309 }, + { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768 }, + { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087 }, + { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098 }, + { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166 }, + { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674 }, + { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005 }, + { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707 }, + { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008 }, + { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420 }, + { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655 }, + { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329 }, + { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388 }, + { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950 }, + { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759 }, + { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284 }, + { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826 }, + { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329 }, + { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049 }, + { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408 }, + { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863 }, + { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938 }, + { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774 }, + { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895 }, + { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234 }, + { url = "https://files.pythonhosted.org/packages/33/49/c8c21e4255b4f4a2c0c68ac18125d7f5460b109acc6dfdef1a24f9b960ef/pillow-11.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b7b0d4fd2635f54ad82785d56bc0d94f147096493a79985d0ab57aedd563156", size = 3181727 }, + { url = "https://files.pythonhosted.org/packages/6d/f1/f7255c0838f8c1ef6d55b625cfb286835c17e8136ce4351c5577d02c443b/pillow-11.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:aa442755e31c64037aa7c1cb186e0b369f8416c567381852c63444dd666fb772", size = 2999833 }, + { url = "https://files.pythonhosted.org/packages/e2/57/9968114457bd131063da98d87790d080366218f64fa2943b65ac6739abb3/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d3348c95b766f54b76116d53d4cb171b52992a1027e7ca50c81b43b9d9e363", size = 3437472 }, + { url = "https://files.pythonhosted.org/packages/b2/1b/e35d8a158e21372ecc48aac9c453518cfe23907bb82f950d6e1c72811eb0/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85d27ea4c889342f7e35f6d56e7e1cb345632ad592e8c51b693d7b7556043ce0", size = 3459976 }, + { url = "https://files.pythonhosted.org/packages/26/da/2c11d03b765efff0ccc473f1c4186dc2770110464f2177efaed9cf6fae01/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bf2c33d6791c598142f00c9c4c7d47f6476731c31081331664eb26d6ab583e01", size = 3527133 }, + { url = "https://files.pythonhosted.org/packages/79/1a/4e85bd7cadf78412c2a3069249a09c32ef3323650fd3005c97cca7aa21df/pillow-11.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e616e7154c37669fc1dfc14584f11e284e05d1c650e1c0f972f281c4ccc53193", size = 3571555 }, + { url = "https://files.pythonhosted.org/packages/69/03/239939915216de1e95e0ce2334bf17a7870ae185eb390fab6d706aadbfc0/pillow-11.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:39ad2e0f424394e3aebc40168845fee52df1394a4673a6ee512d840d14ab3013", size = 2674713 }, + { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734 }, + { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841 }, + { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470 }, + { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013 }, + { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165 }, + { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586 }, + { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751 }, +] + [[package]] name = "platformdirs" version = "4.3.6" @@ -1593,6 +2192,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/b3/df14c580d82b9627d173ceea305ba898dca135feb360b6d84019d0803d3b/pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b", size = 220560 }, ] +[[package]] +name = "prompt-toolkit" +version = "3.0.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, +] + [[package]] name = "propcache" version = "0.3.0" @@ -1711,6 +2322,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, ] +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, +] + [[package]] name = "py-cpuinfo" version = "9.0.0" @@ -1762,6 +2391,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ed/bd/54907846383dcc7ee28772d7e646f6c34276a17da740002a5cefe90f04f7/pyarrow-19.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", size = 42085744 }, ] +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + [[package]] name = "pydantic" version = "2.10.6" @@ -1860,6 +2498,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, ] +[[package]] +name = "pyparsing" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, +] + [[package]] name = "pytest" version = "8.3.5" @@ -1935,6 +2582,25 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/eb/38/ac33370d784287baa1c3d538978b5e2ea064d4c1b93ffbd12826c190dd10/pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57", size = 507930 }, ] +[[package]] +name = "pywin32" +version = "310" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/da/a5f38fffbba2fb99aa4aa905480ac4b8e83ca486659ac8c95bce47fb5276/pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1", size = 8848240 }, + { url = "https://files.pythonhosted.org/packages/aa/fe/d873a773324fa565619ba555a82c9dabd677301720f3660a731a5d07e49a/pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d", size = 9601854 }, + { url = "https://files.pythonhosted.org/packages/3c/84/1a8e3d7a15490d28a5d816efa229ecb4999cdc51a7c30dd8914f669093b8/pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213", size = 8522963 }, + { url = "https://files.pythonhosted.org/packages/f7/b1/68aa2986129fb1011dabbe95f0136f44509afaf072b12b8f815905a39f33/pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd", size = 8784284 }, + { url = "https://files.pythonhosted.org/packages/b3/bd/d1592635992dd8db5bb8ace0551bc3a769de1ac8850200cfa517e72739fb/pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c", size = 9520748 }, + { url = "https://files.pythonhosted.org/packages/90/b1/ac8b1ffce6603849eb45a91cf126c0fa5431f186c2e768bf56889c46f51c/pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582", size = 8455941 }, + { url = "https://files.pythonhosted.org/packages/6b/ec/4fdbe47932f671d6e348474ea35ed94227fb5df56a7c30cbbb42cd396ed0/pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d", size = 8796239 }, + { url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060", size = 9503839 }, + { url = "https://files.pythonhosted.org/packages/1f/32/9ccf53748df72301a89713936645a664ec001abd35ecc8578beda593d37d/pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966", size = 8459470 }, + { url = "https://files.pythonhosted.org/packages/1c/09/9c1b978ffc4ae53999e89c19c77ba882d9fce476729f23ef55211ea1c034/pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab", size = 8794384 }, + { url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e", size = 9503039 }, + { url = "https://files.pythonhosted.org/packages/b4/f4/f785020090fb050e7fb6d34b780f2231f302609dc964672f72bfaeb59a28/pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33", size = 8458152 }, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -1979,6 +2645,79 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, ] +[[package]] +name = "pyzmq" +version = "26.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/b8/af1d814ffc3ff9730f9a970cbf216b6f078e5d251a25ef5201d7bc32a37c/pyzmq-26.4.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:0329bdf83e170ac133f44a233fc651f6ed66ef8e66693b5af7d54f45d1ef5918", size = 1339238 }, + { url = "https://files.pythonhosted.org/packages/ee/e4/5aafed4886c264f2ea6064601ad39c5fc4e9b6539c6ebe598a859832eeee/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:398a825d2dea96227cf6460ce0a174cf7657d6f6827807d4d1ae9d0f9ae64315", size = 672848 }, + { url = "https://files.pythonhosted.org/packages/79/39/026bf49c721cb42f1ef3ae0ee3d348212a7621d2adb739ba97599b6e4d50/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6d52d62edc96787f5c1dfa6c6ccff9b581cfae5a70d94ec4c8da157656c73b5b", size = 911299 }, + { url = "https://files.pythonhosted.org/packages/03/23/b41f936a9403b8f92325c823c0f264c6102a0687a99c820f1aaeb99c1def/pyzmq-26.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1410c3a3705db68d11eb2424d75894d41cff2f64d948ffe245dd97a9debfebf4", size = 867920 }, + { url = "https://files.pythonhosted.org/packages/c1/3e/2de5928cdadc2105e7c8f890cc5f404136b41ce5b6eae5902167f1d5641c/pyzmq-26.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:7dacb06a9c83b007cc01e8e5277f94c95c453c5851aac5e83efe93e72226353f", size = 862514 }, + { url = "https://files.pythonhosted.org/packages/ce/57/109569514dd32e05a61d4382bc88980c95bfd2f02e58fea47ec0ccd96de1/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6bab961c8c9b3a4dc94d26e9b2cdf84de9918931d01d6ff38c721a83ab3c0ef5", size = 1204494 }, + { url = "https://files.pythonhosted.org/packages/aa/02/dc51068ff2ca70350d1151833643a598625feac7b632372d229ceb4de3e1/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a5c09413b924d96af2aa8b57e76b9b0058284d60e2fc3730ce0f979031d162a", size = 1514525 }, + { url = "https://files.pythonhosted.org/packages/48/2a/a7d81873fff0645eb60afaec2b7c78a85a377af8f1d911aff045d8955bc7/pyzmq-26.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7d489ac234d38e57f458fdbd12a996bfe990ac028feaf6f3c1e81ff766513d3b", size = 1414659 }, + { url = "https://files.pythonhosted.org/packages/ef/ea/813af9c42ae21845c1ccfe495bd29c067622a621e85d7cda6bc437de8101/pyzmq-26.4.0-cp310-cp310-win32.whl", hash = "sha256:dea1c8db78fb1b4b7dc9f8e213d0af3fc8ecd2c51a1d5a3ca1cde1bda034a980", size = 580348 }, + { url = "https://files.pythonhosted.org/packages/20/68/318666a89a565252c81d3fed7f3b4c54bd80fd55c6095988dfa2cd04a62b/pyzmq-26.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa59e1f5a224b5e04dc6c101d7186058efa68288c2d714aa12d27603ae93318b", size = 643838 }, + { url = "https://files.pythonhosted.org/packages/91/f8/fb1a15b5f4ecd3e588bfde40c17d32ed84b735195b5c7d1d7ce88301a16f/pyzmq-26.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:a651fe2f447672f4a815e22e74630b6b1ec3a1ab670c95e5e5e28dcd4e69bbb5", size = 559565 }, + { url = "https://files.pythonhosted.org/packages/32/6d/234e3b0aa82fd0290b1896e9992f56bdddf1f97266110be54d0177a9d2d9/pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54", size = 1339723 }, + { url = "https://files.pythonhosted.org/packages/4f/11/6d561efe29ad83f7149a7cd48e498e539ed09019c6cd7ecc73f4cc725028/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030", size = 672645 }, + { url = "https://files.pythonhosted.org/packages/19/fd/81bfe3e23f418644660bad1a90f0d22f0b3eebe33dd65a79385530bceb3d/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01", size = 910133 }, + { url = "https://files.pythonhosted.org/packages/97/68/321b9c775595ea3df832a9516252b653fe32818db66fdc8fa31c9b9fce37/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e", size = 867428 }, + { url = "https://files.pythonhosted.org/packages/4e/6e/159cbf2055ef36aa2aa297e01b24523176e5b48ead283c23a94179fb2ba2/pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88", size = 862409 }, + { url = "https://files.pythonhosted.org/packages/05/1c/45fb8db7be5a7d0cadea1070a9cbded5199a2d578de2208197e592f219bd/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6", size = 1205007 }, + { url = "https://files.pythonhosted.org/packages/f8/fa/658c7f583af6498b463f2fa600f34e298e1b330886f82f1feba0dc2dd6c3/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df", size = 1514599 }, + { url = "https://files.pythonhosted.org/packages/4d/d7/44d641522353ce0a2bbd150379cb5ec32f7120944e6bfba4846586945658/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef", size = 1414546 }, + { url = "https://files.pythonhosted.org/packages/72/76/c8ed7263218b3d1e9bce07b9058502024188bd52cc0b0a267a9513b431fc/pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca", size = 579247 }, + { url = "https://files.pythonhosted.org/packages/c3/d0/2d9abfa2571a0b1a67c0ada79a8aa1ba1cce57992d80f771abcdf99bb32c/pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896", size = 644727 }, + { url = "https://files.pythonhosted.org/packages/0d/d1/c8ad82393be6ccedfc3c9f3adb07f8f3976e3c4802640fe3f71441941e70/pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3", size = 559942 }, + { url = "https://files.pythonhosted.org/packages/10/44/a778555ebfdf6c7fc00816aad12d185d10a74d975800341b1bc36bad1187/pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b", size = 1341586 }, + { url = "https://files.pythonhosted.org/packages/9c/4f/f3a58dc69ac757e5103be3bd41fb78721a5e17da7cc617ddb56d973a365c/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905", size = 665880 }, + { url = "https://files.pythonhosted.org/packages/fe/45/50230bcfb3ae5cb98bee683b6edeba1919f2565d7cc1851d3c38e2260795/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b", size = 902216 }, + { url = "https://files.pythonhosted.org/packages/41/59/56bbdc5689be5e13727491ad2ba5efd7cd564365750514f9bc8f212eef82/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63", size = 859814 }, + { url = "https://files.pythonhosted.org/packages/81/b1/57db58cfc8af592ce94f40649bd1804369c05b2190e4cbc0a2dad572baeb/pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5", size = 855889 }, + { url = "https://files.pythonhosted.org/packages/e8/92/47542e629cbac8f221c230a6d0f38dd3d9cff9f6f589ed45fdf572ffd726/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b", size = 1197153 }, + { url = "https://files.pythonhosted.org/packages/07/e5/b10a979d1d565d54410afc87499b16c96b4a181af46e7645ab4831b1088c/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84", size = 1507352 }, + { url = "https://files.pythonhosted.org/packages/ab/58/5a23db84507ab9c01c04b1232a7a763be66e992aa2e66498521bbbc72a71/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f", size = 1406834 }, + { url = "https://files.pythonhosted.org/packages/22/74/aaa837b331580c13b79ac39396601fb361454ee184ca85e8861914769b99/pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44", size = 577992 }, + { url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be", size = 640466 }, + { url = "https://files.pythonhosted.org/packages/e4/29/073779afc3ef6f830b8de95026ef20b2d1ec22d0324d767748d806e57379/pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0", size = 556342 }, + { url = "https://files.pythonhosted.org/packages/d7/20/fb2c92542488db70f833b92893769a569458311a76474bda89dc4264bd18/pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3", size = 1339484 }, + { url = "https://files.pythonhosted.org/packages/58/29/2f06b9cabda3a6ea2c10f43e67ded3e47fc25c54822e2506dfb8325155d4/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43", size = 666106 }, + { url = "https://files.pythonhosted.org/packages/77/e4/dcf62bd29e5e190bd21bfccaa4f3386e01bf40d948c239239c2f1e726729/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6", size = 902056 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/b36b3d7aea236087d20189bec1a87eeb2b66009731d7055e5c65f845cdba/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e", size = 860148 }, + { url = "https://files.pythonhosted.org/packages/18/a6/f048826bc87528c208e90604c3bf573801e54bd91e390cbd2dfa860e82dc/pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771", size = 855983 }, + { url = "https://files.pythonhosted.org/packages/0a/27/454d34ab6a1d9772a36add22f17f6b85baf7c16e14325fa29e7202ca8ee8/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30", size = 1197274 }, + { url = "https://files.pythonhosted.org/packages/f4/3d/7abfeab6b83ad38aa34cbd57c6fc29752c391e3954fd12848bd8d2ec0df6/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86", size = 1507120 }, + { url = "https://files.pythonhosted.org/packages/13/ff/bc8d21dbb9bc8705126e875438a1969c4f77e03fc8565d6901c7933a3d01/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101", size = 1406738 }, + { url = "https://files.pythonhosted.org/packages/f5/5d/d4cd85b24de71d84d81229e3bbb13392b2698432cf8fdcea5afda253d587/pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637", size = 577826 }, + { url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b", size = 640406 }, + { url = "https://files.pythonhosted.org/packages/b3/99/676b8851cb955eb5236a0c1e9ec679ea5ede092bf8bf2c8a68d7e965cac3/pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08", size = 556216 }, + { url = "https://files.pythonhosted.org/packages/65/c2/1fac340de9d7df71efc59d9c50fc7a635a77b103392d1842898dd023afcb/pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4", size = 1333769 }, + { url = "https://files.pythonhosted.org/packages/5c/c7/6c03637e8d742c3b00bec4f5e4cd9d1c01b2f3694c6f140742e93ca637ed/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a", size = 658826 }, + { url = "https://files.pythonhosted.org/packages/a5/97/a8dca65913c0f78e0545af2bb5078aebfc142ca7d91cdaffa1fbc73e5dbd/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b", size = 891650 }, + { url = "https://files.pythonhosted.org/packages/7d/7e/f63af1031eb060bf02d033732b910fe48548dcfdbe9c785e9f74a6cc6ae4/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d", size = 849776 }, + { url = "https://files.pythonhosted.org/packages/f6/fa/1a009ce582802a895c0d5fe9413f029c940a0a8ee828657a3bb0acffd88b/pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf", size = 842516 }, + { url = "https://files.pythonhosted.org/packages/6e/bc/f88b0bad0f7a7f500547d71e99f10336f2314e525d4ebf576a1ea4a1d903/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c", size = 1189183 }, + { url = "https://files.pythonhosted.org/packages/d9/8c/db446a3dd9cf894406dec2e61eeffaa3c07c3abb783deaebb9812c4af6a5/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8", size = 1495501 }, + { url = "https://files.pythonhosted.org/packages/05/4c/bf3cad0d64c3214ac881299c4562b815f05d503bccc513e3fd4fdc6f67e4/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364", size = 1395540 }, + { url = "https://files.pythonhosted.org/packages/47/03/96004704a84095f493be8d2b476641f5c967b269390173f85488a53c1c13/pyzmq-26.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:98d948288ce893a2edc5ec3c438fe8de2daa5bbbd6e2e865ec5f966e237084ba", size = 834408 }, + { url = "https://files.pythonhosted.org/packages/e4/7f/68d8f3034a20505db7551cb2260248be28ca66d537a1ac9a257913d778e4/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9f34f5c9e0203ece706a1003f1492a56c06c0632d86cb77bcfe77b56aacf27b", size = 569580 }, + { url = "https://files.pythonhosted.org/packages/9b/a6/2b0d6801ec33f2b2a19dd8d02e0a1e8701000fec72926e6787363567d30c/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80c9b48aef586ff8b698359ce22f9508937c799cc1d2c9c2f7c95996f2300c94", size = 798250 }, + { url = "https://files.pythonhosted.org/packages/96/2a/0322b3437de977dcac8a755d6d7ce6ec5238de78e2e2d9353730b297cf12/pyzmq-26.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3f2a5b74009fd50b53b26f65daff23e9853e79aa86e0aa08a53a7628d92d44a", size = 756758 }, + { url = "https://files.pythonhosted.org/packages/c2/33/43704f066369416d65549ccee366cc19153911bec0154da7c6b41fca7e78/pyzmq-26.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:61c5f93d7622d84cb3092d7f6398ffc77654c346545313a3737e266fc11a3beb", size = 555371 }, + { url = "https://files.pythonhosted.org/packages/04/52/a70fcd5592715702248306d8e1729c10742c2eac44529984413b05c68658/pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb", size = 834405 }, + { url = "https://files.pythonhosted.org/packages/25/f9/1a03f1accff16b3af1a6fa22cbf7ced074776abbf688b2e9cb4629700c62/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1", size = 569578 }, + { url = "https://files.pythonhosted.org/packages/76/0c/3a633acd762aa6655fcb71fa841907eae0ab1e8582ff494b137266de341d/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494", size = 798248 }, + { url = "https://files.pythonhosted.org/packages/cd/cc/6c99c84aa60ac1cc56747bed6be8ce6305b9b861d7475772e7a25ce019d3/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9", size = 756757 }, + { url = "https://files.pythonhosted.org/packages/13/9c/d8073bd898eb896e94c679abe82e47506e2b750eb261cf6010ced869797c/pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0", size = 555371 }, +] + [[package]] name = "regex" version = "2024.11.6" @@ -2124,6 +2863,62 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/69/e2/b011c38e5394c4c18fb5500778a55ec43ad6106126e74723ffaee246f56e/safetensors-0.5.3-cp38-abi3-win_amd64.whl", hash = "sha256:836cbbc320b47e80acd40e44c8682db0e8ad7123209f69b093def21ec7cafd11", size = 308878 }, ] +[[package]] +name = "scipy" +version = "1.15.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/b9/31ba9cd990e626574baf93fbc1ac61cf9ed54faafd04c479117517661637/scipy-1.15.2.tar.gz", hash = "sha256:cd58a314d92838f7e6f755c8a2167ead4f27e1fd5c1251fd54289569ef3495ec", size = 59417316 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/df/ef233fff6838fe6f7840d69b5ef9f20d2b5c912a8727b21ebf876cb15d54/scipy-1.15.2-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a2ec871edaa863e8213ea5df811cd600734f6400b4af272e1c011e69401218e9", size = 38692502 }, + { url = "https://files.pythonhosted.org/packages/5c/20/acdd4efb8a68b842968f7bc5611b1aeb819794508771ad104de418701422/scipy-1.15.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:6f223753c6ea76983af380787611ae1291e3ceb23917393079dcc746ba60cfb5", size = 30085508 }, + { url = "https://files.pythonhosted.org/packages/42/55/39cf96ca7126f1e78ee72a6344ebdc6702fc47d037319ad93221063e6cf4/scipy-1.15.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:ecf797d2d798cf7c838c6d98321061eb3e72a74710e6c40540f0e8087e3b499e", size = 22359166 }, + { url = "https://files.pythonhosted.org/packages/51/48/708d26a4ab8a1441536bf2dfcad1df0ca14a69f010fba3ccbdfc02df7185/scipy-1.15.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:9b18aa747da280664642997e65aab1dd19d0c3d17068a04b3fe34e2559196cb9", size = 25112047 }, + { url = "https://files.pythonhosted.org/packages/dd/65/f9c5755b995ad892020381b8ae11f16d18616208e388621dfacc11df6de6/scipy-1.15.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87994da02e73549dfecaed9e09a4f9d58a045a053865679aeb8d6d43747d4df3", size = 35536214 }, + { url = "https://files.pythonhosted.org/packages/de/3c/c96d904b9892beec978562f64d8cc43f9cca0842e65bd3cd1b7f7389b0ba/scipy-1.15.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69ea6e56d00977f355c0f84eba69877b6df084516c602d93a33812aa04d90a3d", size = 37646981 }, + { url = "https://files.pythonhosted.org/packages/3d/74/c2d8a24d18acdeae69ed02e132b9bc1bb67b7bee90feee1afe05a68f9d67/scipy-1.15.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:888307125ea0c4466287191e5606a2c910963405ce9671448ff9c81c53f85f58", size = 37230048 }, + { url = "https://files.pythonhosted.org/packages/42/19/0aa4ce80eca82d487987eff0bc754f014dec10d20de2f66754fa4ea70204/scipy-1.15.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9412f5e408b397ff5641080ed1e798623dbe1ec0d78e72c9eca8992976fa65aa", size = 40010322 }, + { url = "https://files.pythonhosted.org/packages/d0/d2/f0683b7e992be44d1475cc144d1f1eeae63c73a14f862974b4db64af635e/scipy-1.15.2-cp310-cp310-win_amd64.whl", hash = "sha256:b5e025e903b4f166ea03b109bb241355b9c42c279ea694d8864d033727205e65", size = 41233385 }, + { url = "https://files.pythonhosted.org/packages/40/1f/bf0a5f338bda7c35c08b4ed0df797e7bafe8a78a97275e9f439aceb46193/scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:92233b2df6938147be6fa8824b8136f29a18f016ecde986666be5f4d686a91a4", size = 38703651 }, + { url = "https://files.pythonhosted.org/packages/de/54/db126aad3874601048c2c20ae3d8a433dbfd7ba8381551e6f62606d9bd8e/scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:62ca1ff3eb513e09ed17a5736929429189adf16d2d740f44e53270cc800ecff1", size = 30102038 }, + { url = "https://files.pythonhosted.org/packages/61/d8/84da3fffefb6c7d5a16968fe5b9f24c98606b165bb801bb0b8bc3985200f/scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4c6676490ad76d1c2894d77f976144b41bd1a4052107902238047fb6a473e971", size = 22375518 }, + { url = "https://files.pythonhosted.org/packages/44/78/25535a6e63d3b9c4c90147371aedb5d04c72f3aee3a34451f2dc27c0c07f/scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8bf5cb4a25046ac61d38f8d3c3426ec11ebc350246a4642f2f315fe95bda655", size = 25142523 }, + { url = "https://files.pythonhosted.org/packages/e0/22/4b4a26fe1cd9ed0bc2b2cb87b17d57e32ab72c346949eaf9288001f8aa8e/scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a8e34cf4c188b6dd004654f88586d78f95639e48a25dfae9c5e34a6dc34547e", size = 35491547 }, + { url = "https://files.pythonhosted.org/packages/32/ea/564bacc26b676c06a00266a3f25fdfe91a9d9a2532ccea7ce6dd394541bc/scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28a0d2c2075946346e4408b211240764759e0fabaeb08d871639b5f3b1aca8a0", size = 37634077 }, + { url = "https://files.pythonhosted.org/packages/43/c2/bfd4e60668897a303b0ffb7191e965a5da4056f0d98acfb6ba529678f0fb/scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:42dabaaa798e987c425ed76062794e93a243be8f0f20fff6e7a89f4d61cb3d40", size = 37231657 }, + { url = "https://files.pythonhosted.org/packages/4a/75/5f13050bf4f84c931bcab4f4e83c212a36876c3c2244475db34e4b5fe1a6/scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6f5e296ec63c5da6ba6fa0343ea73fd51b8b3e1a300b0a8cae3ed4b1122c7462", size = 40035857 }, + { url = "https://files.pythonhosted.org/packages/b9/8b/7ec1832b09dbc88f3db411f8cdd47db04505c4b72c99b11c920a8f0479c3/scipy-1.15.2-cp311-cp311-win_amd64.whl", hash = "sha256:597a0c7008b21c035831c39927406c6181bcf8f60a73f36219b69d010aa04737", size = 41217654 }, + { url = "https://files.pythonhosted.org/packages/4b/5d/3c78815cbab499610f26b5bae6aed33e227225a9fa5290008a733a64f6fc/scipy-1.15.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c4697a10da8f8765bb7c83e24a470da5797e37041edfd77fd95ba3811a47c4fd", size = 38756184 }, + { url = "https://files.pythonhosted.org/packages/37/20/3d04eb066b471b6e171827548b9ddb3c21c6bbea72a4d84fc5989933910b/scipy-1.15.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:869269b767d5ee7ea6991ed7e22b3ca1f22de73ab9a49c44bad338b725603301", size = 30163558 }, + { url = "https://files.pythonhosted.org/packages/a4/98/e5c964526c929ef1f795d4c343b2ff98634ad2051bd2bbadfef9e772e413/scipy-1.15.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:bad78d580270a4d32470563ea86c6590b465cb98f83d760ff5b0990cb5518a93", size = 22437211 }, + { url = "https://files.pythonhosted.org/packages/1d/cd/1dc7371e29195ecbf5222f9afeedb210e0a75057d8afbd942aa6cf8c8eca/scipy-1.15.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:b09ae80010f52efddb15551025f9016c910296cf70adbf03ce2a8704f3a5ad20", size = 25232260 }, + { url = "https://files.pythonhosted.org/packages/f0/24/1a181a9e5050090e0b5138c5f496fee33293c342b788d02586bc410c6477/scipy-1.15.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a6fd6eac1ce74a9f77a7fc724080d507c5812d61e72bd5e4c489b042455865e", size = 35198095 }, + { url = "https://files.pythonhosted.org/packages/c0/53/eaada1a414c026673eb983f8b4a55fe5eb172725d33d62c1b21f63ff6ca4/scipy-1.15.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b871df1fe1a3ba85d90e22742b93584f8d2b8e6124f8372ab15c71b73e428b8", size = 37297371 }, + { url = "https://files.pythonhosted.org/packages/e9/06/0449b744892ed22b7e7b9a1994a866e64895363572677a316a9042af1fe5/scipy-1.15.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11", size = 36872390 }, + { url = "https://files.pythonhosted.org/packages/6a/6f/a8ac3cfd9505ec695c1bc35edc034d13afbd2fc1882a7c6b473e280397bb/scipy-1.15.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:601881dfb761311045b03114c5fe718a12634e5608c3b403737ae463c9885d53", size = 39700276 }, + { url = "https://files.pythonhosted.org/packages/f5/6f/e6e5aff77ea2a48dd96808bb51d7450875af154ee7cbe72188afb0b37929/scipy-1.15.2-cp312-cp312-win_amd64.whl", hash = "sha256:e7c68b6a43259ba0aab737237876e5c2c549a031ddb7abc28c7b47f22e202ded", size = 40942317 }, + { url = "https://files.pythonhosted.org/packages/53/40/09319f6e0f276ea2754196185f95cd191cb852288440ce035d5c3a931ea2/scipy-1.15.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf", size = 38717587 }, + { url = "https://files.pythonhosted.org/packages/fe/c3/2854f40ecd19585d65afaef601e5e1f8dbf6758b2f95b5ea93d38655a2c6/scipy-1.15.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:08b57a9336b8e79b305a143c3655cc5bdbe6d5ece3378578888d2afbb51c4e37", size = 30100266 }, + { url = "https://files.pythonhosted.org/packages/dd/b1/f9fe6e3c828cb5930b5fe74cb479de5f3d66d682fa8adb77249acaf545b8/scipy-1.15.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:54c462098484e7466362a9f1672d20888f724911a74c22ae35b61f9c5919183d", size = 22373768 }, + { url = "https://files.pythonhosted.org/packages/15/9d/a60db8c795700414c3f681908a2b911e031e024d93214f2d23c6dae174ab/scipy-1.15.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:cf72ff559a53a6a6d77bd8eefd12a17995ffa44ad86c77a5df96f533d4e6c6bb", size = 25154719 }, + { url = "https://files.pythonhosted.org/packages/37/3b/9bda92a85cd93f19f9ed90ade84aa1e51657e29988317fabdd44544f1dd4/scipy-1.15.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9de9d1416b3d9e7df9923ab23cd2fe714244af10b763975bea9e4f2e81cebd27", size = 35163195 }, + { url = "https://files.pythonhosted.org/packages/03/5a/fc34bf1aa14dc7c0e701691fa8685f3faec80e57d816615e3625f28feb43/scipy-1.15.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb530e4794fc8ea76a4a21ccb67dea33e5e0e60f07fc38a49e821e1eae3b71a0", size = 37255404 }, + { url = "https://files.pythonhosted.org/packages/4a/71/472eac45440cee134c8a180dbe4c01b3ec247e0338b7c759e6cd71f199a7/scipy-1.15.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5ea7ed46d437fc52350b028b1d44e002646e28f3e8ddc714011aaf87330f2f32", size = 36860011 }, + { url = "https://files.pythonhosted.org/packages/01/b3/21f890f4f42daf20e4d3aaa18182dddb9192771cd47445aaae2e318f6738/scipy-1.15.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:11e7ad32cf184b74380f43d3c0a706f49358b904fa7d5345f16ddf993609184d", size = 39657406 }, + { url = "https://files.pythonhosted.org/packages/0d/76/77cf2ac1f2a9cc00c073d49e1e16244e389dd88e2490c91d84e1e3e4d126/scipy-1.15.2-cp313-cp313-win_amd64.whl", hash = "sha256:a5080a79dfb9b78b768cebf3c9dcbc7b665c5875793569f48bf0e2b1d7f68f6f", size = 40961243 }, + { url = "https://files.pythonhosted.org/packages/4c/4b/a57f8ddcf48e129e6054fa9899a2a86d1fc6b07a0e15c7eebff7ca94533f/scipy-1.15.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:447ce30cee6a9d5d1379087c9e474628dab3db4a67484be1b7dc3196bfb2fac9", size = 38870286 }, + { url = "https://files.pythonhosted.org/packages/0c/43/c304d69a56c91ad5f188c0714f6a97b9c1fed93128c691148621274a3a68/scipy-1.15.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:c90ebe8aaa4397eaefa8455a8182b164a6cc1d59ad53f79943f266d99f68687f", size = 30141634 }, + { url = "https://files.pythonhosted.org/packages/44/1a/6c21b45d2548eb73be9b9bff421aaaa7e85e22c1f9b3bc44b23485dfce0a/scipy-1.15.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:def751dd08243934c884a3221156d63e15234a3155cf25978b0a668409d45eb6", size = 22415179 }, + { url = "https://files.pythonhosted.org/packages/74/4b/aefac4bba80ef815b64f55da06f62f92be5d03b467f2ce3668071799429a/scipy-1.15.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:302093e7dfb120e55515936cb55618ee0b895f8bcaf18ff81eca086c17bd80af", size = 25126412 }, + { url = "https://files.pythonhosted.org/packages/b1/53/1cbb148e6e8f1660aacd9f0a9dfa2b05e9ff1cb54b4386fe868477972ac2/scipy-1.15.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd5b77413e1855351cdde594eca99c1f4a588c2d63711388b6a1f1c01f62274", size = 34952867 }, + { url = "https://files.pythonhosted.org/packages/2c/23/e0eb7f31a9c13cf2dca083828b97992dd22f8184c6ce4fec5deec0c81fcf/scipy-1.15.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d0194c37037707b2afa7a2f2a924cf7bac3dc292d51b6a925e5fcb89bc5c776", size = 36890009 }, + { url = "https://files.pythonhosted.org/packages/03/f3/e699e19cabe96bbac5189c04aaa970718f0105cff03d458dc5e2b6bd1e8c/scipy-1.15.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:bae43364d600fdc3ac327db99659dcb79e6e7ecd279a75fe1266669d9a652828", size = 36545159 }, + { url = "https://files.pythonhosted.org/packages/af/f5/ab3838e56fe5cc22383d6fcf2336e48c8fe33e944b9037fbf6cbdf5a11f8/scipy-1.15.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f031846580d9acccd0044efd1a90e6f4df3a6e12b4b6bd694a7bc03a89892b28", size = 39136566 }, + { url = "https://files.pythonhosted.org/packages/0a/c8/b3f566db71461cabd4b2d5b39bcc24a7e1c119535c8361f81426be39bb47/scipy-1.15.2-cp313-cp313t-win_amd64.whl", hash = "sha256:fe8a9eb875d430d81755472c5ba75e84acc980e4a8f6204d402849234d3017db", size = 40477705 }, +] + [[package]] name = "sentry-sdk" version = "2.22.0" @@ -2350,6 +3145,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, ] +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, +] + [[package]] name = "submitit" version = "1.5.2" @@ -2456,22 +3265,22 @@ dependencies = [ { name = "filelock" }, { name = "fsspec" }, { name = "jinja2" }, - { name = "mkl", marker = "platform_system == 'Windows'" }, + { name = "mkl", marker = "sys_platform == 'win32'" }, { name = "networkx", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' and sys_platform != 'linux'" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'linux' or python_full_version >= '3.11'" }, - { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, - { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' or sys_platform == 'linux'" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "sympy" }, - { name = "triton", marker = "python_full_version < '3.12' and platform_machine == 'x86_64' and platform_system == 'Linux'" }, + { name = "triton", marker = "python_full_version < '3.12' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "typing-extensions" }, ] wheels = [ @@ -2489,18 +3298,45 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/55/51/4bdee83e6fa9cca8e3a6cdf81a2695ede9d3fd7148e4fd4188dff142d7b0/torch-2.3.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:dca986214267b34065a79000cee54232e62b41dff1ec2cab9abc3fc8b3dee0ad", size = 60968873 }, ] +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, +] + [[package]] name = "tqdm" version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, +] + [[package]] name = "transformers" version = "4.49.0" @@ -2527,7 +3363,7 @@ name = "triton" version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "filelock" }, + { name = "filelock", marker = "python_full_version < '3.12' and sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/db/ee/8d50d44ed5b63677bb387f4ee67a7dbaaded0189b320ffe82685a6827728/triton-2.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ce4b8ff70c48e47274c66f269cce8861cf1dc347ceeb7a67414ca151b1822d8", size = 168055246 }, @@ -2633,6 +3469,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/90/038a64abcbe5f991468f057bd21bead84a5c39d9b0409b652893263a47b4/wandb-0.19.8-py3-none-win_amd64.whl", hash = "sha256:f7da8e6fc6693014c72fb7db3ecd5e1116066198d2aca96f6eb7220cea03081c", size = 20165486 }, ] +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + [[package]] name = "xxhash" version = "3.5.0"