Can ascii art be used for branding or logos?
The Ultimate Authoritative Guide for Cybersecurity Leads: Can ASCII Art Be Used for Branding or Logos?
Executive Summary
In the rapidly evolving landscape of digital branding and visual identity, organizations continuously seek innovative and memorable ways to represent themselves. While traditional graphic design has dominated logo creation, the resurgence of text-based art, particularly ASCII art, presents a unique and often overlooked opportunity. This guide, crafted from a Cybersecurity Lead's perspective, delves into the viability of using ASCII art for branding and logos, with a specific focus on the capabilities of the `ascii-art` core tool. We will dissect the technical underpinnings, explore practical applications across various industries, examine global standards, provide a multi-language code repository, and forecast its future potential. The conclusion is clear: ASCII art, when strategically implemented and understood within its technical and creative constraints, can indeed serve as a potent and distinctive branding element, offering a blend of retro charm, technical sophistication, and surprising adaptability.
Deep Technical Analysis: The Foundation of ASCII Art Branding
The efficacy of ASCII art for branding hinges on a fundamental understanding of its creation, limitations, and the tools that facilitate it. At its core, ASCII art is a graphic design technique that uses computers for presentation and consists of pictures pieced together from the 95 printable characters defined by the ASCII standard (from space to tilde). The `ascii-art` tool, a hypothetical yet representative platform for this discussion, leverages algorithms to convert raster images (like JPEGs or PNGs) or vector data into their ASCII equivalents. This process involves several critical technical stages:
1. Image Preprocessing and Pixel Analysis
Before an image can be translated into ASCII characters, it undergoes preprocessing. This typically includes:
- Resizing: The original image is scaled down to a manageable resolution that can be represented by a grid of characters. The aspect ratio must be carefully maintained to avoid distortion.
- Grayscale Conversion: Color information is typically discarded, and the image is converted to grayscale. This is because the luminosity (brightness) of each pixel is the primary factor in determining which ASCII character to use.
- Dithering (Optional but Recommended): To simulate a wider range of tones than is achievable with just a few characters, dithering algorithms are employed. These algorithms strategically place pixels of different shades close together to create the illusion of intermediate shades when viewed from a distance. Common dithering techniques include Floyd-Steinberg and Ordered Dithering.
2. Character Mapping and Luminosity Thresholds
This is the heart of ASCII art generation. Each pixel's grayscale value (typically ranging from 0 for black to 255 for white) is mapped to a specific ASCII character. The selection of characters is crucial for achieving a desired visual effect. A common approach involves defining a set of characters ordered by their visual density (how much space they occupy). For instance:
- High Density (Dark): `#`, `@`, `M`, `W`
- Medium Density: `&`, `X`, `S`, `o`, `*`
- Low Density (Light): `:`, `.`, `,`, ` ` (space)
The `ascii-art` tool would establish luminosity thresholds. Pixels falling within a certain brightness range are assigned a character from the corresponding density group. For example:
// Hypothetical Character Mapping Logic
if (pixel_luminosity < 30) {
ascii_char = '@'; // Darkest
} else if (pixel_luminosity < 60) {
ascii_char = '#';
} else if (pixel_luminosity < 90) {
ascii_char = '*';
} else if (pixel_luminosity < 120) {
ascii_char = ':';
} else {
ascii_char = ' '; // Lightest
}
The choice and ordering of characters significantly impact the final output's fidelity and aesthetic. More sophisticated algorithms might use a larger character set and more complex mapping functions.
3. Aspect Ratio Correction and Character Spacing
A critical technical challenge is that standard terminal characters are taller than they are wide. This means a direct pixel-to-character mapping without adjustment will result in a vertically stretched image. The `ascii-art` tool must compensate for this by:
- Character Aspect Ratio Adjustment: Each character's perceived width relative to its height needs to be considered. This often involves rendering the characters at a slightly reduced width or by adding extra spaces between characters. A common correction factor is around 0.5 for width.
- Line Spacing: The vertical spacing between lines of characters can also be adjusted to further refine the aspect ratio.
4. Output Generation and Formatting
The final step involves assembling the mapped characters into a grid and presenting them in a format suitable for display. This can be plain text, HTML with preformatted tags, or even specialized formats for different terminals. The `ascii-art` tool should offer options for outputting:
- Plain Text: Suitable for console applications, email bodies, or simple text files.
- HTML (`
` tag):
Preserves whitespace and fixed-width formatting, ideal for web display. - Image Formats (e.g., PNG, SVG): The ASCII art itself can be rendered as a traditional image file, allowing for wider compatibility while retaining the ASCII aesthetic.
5. Considerations for Branding and Logos
When applying ASCII art to branding, several technical aspects become paramount:
- Scalability: True vector graphics scale infinitely without loss of quality. ASCII art, being character-based, has a fixed resolution. While it can be scaled up, it will pixelate or become blocky. Therefore, the intended display medium dictates the optimal generation resolution. For web logos, a carefully chosen resolution is key.
- Readability and Recognition: A logo must be instantly recognizable. Complex ASCII art can become abstract at smaller sizes, hindering brand recognition. Simplicity and clarity of the ASCII representation are vital.
- Contrast and Legibility: The choice of characters and their background is crucial for legibility, especially in varying display environments (e.g., dark mode vs. light mode). High contrast is generally preferred.
- File Size: For web assets, file size is a consideration. Plain text ASCII art is incredibly small, making it highly efficient.
- Font Dependency: The appearance of ASCII art is heavily dependent on the font used for rendering. Monospaced fonts (where every character has the same width) are essential for correct alignment. Brands must ensure their chosen display environments utilize compatible fonts or embed font information.
The `ascii-art` tool's robustness in handling these technical nuances directly influences its effectiveness for branding. A tool that offers fine-grained control over character sets, dithering algorithms, aspect ratio correction, and output formats will be far more valuable.
Can ASCII Art Be Used for Branding or Logos? The Definitive Answer
Yes, unequivocally, ASCII art can be used for branding and logos. However, its application requires a strategic, informed approach, acknowledging both its unique strengths and inherent limitations. From a cybersecurity perspective, this means understanding how such a visual element interacts with digital platforms, security protocols, and user perception.
Strengths for Branding:
- Uniqueness and Memorability: In a sea of polished, often generic graphics, ASCII art stands out. Its retro, hacker-culture, or minimalist aesthetic can evoke specific brand personalities.
- Technical Sophistication: For tech-focused companies, developers, or brands that want to project an image of technical prowess, ASCII art is a natural fit. It speaks a visual language understood by a significant segment of the digital world.
- Efficiency and Portability: As mentioned, ASCII art files are remarkably small, making them ideal for performance-critical web applications, email signatures, or command-line interfaces where bandwidth and loading times are concerns. They are also inherently text-based, making them universally compatible across most digital platforms.
- Nostalgia and Authenticity: ASCII art taps into a sense of nostalgia for earlier computing eras, which can resonate with audiences who appreciate authenticity and a departure from hyper-polished corporate imagery.
- Customization and Flexibility: The `ascii-art` tool allows for granular control, enabling brands to create highly customized visual identities that are not bound by traditional graphical constraints.
Limitations and Considerations:
- Limited Detail and Color: ASCII art is inherently monochromatic and lacks fine detail compared to high-resolution raster or vector graphics. This limits its applicability for complex imagery.
- Scalability Issues: While text scales, the visual fidelity of ASCII art can degrade significantly at very large or very small sizes without careful generation.
- Font Dependency: The visual integrity relies heavily on monospaced fonts. Inconsistent rendering across different devices or platforms can be a challenge.
- Perception and Target Audience: The association with early computing and hacker culture might not resonate with all demographics or industries. It's crucial to align the ASCII art aesthetic with the brand's overall messaging and target audience.
- Accessibility: While text-based, complex ASCII art might pose challenges for screen readers or individuals with certain visual impairments if not properly implemented with alternative text.
The `ascii-art` tool acts as the bridge between a desired visual concept and its ASCII manifestation. Its ability to accurately convert complex shapes, maintain aspect ratios, and offer output flexibility is paramount to overcoming these limitations and leveraging the strengths of ASCII art for branding.
5+ Practical Scenarios for ASCII Art Branding
The versatility of ASCII art allows for creative implementation across a range of branding touchpoints. Here are several practical scenarios:
Scenario 1: The Developer-Focused SaaS Company
Brand Identity:
A company offering a cutting-edge cloud infrastructure management tool. Their brand aims to be seen as innovative, technically adept, and part of the developer community.
ASCII Art Application:
- Logo: A simplified, stylized representation of their core product icon (e.g., a cloud, a server rack) rendered in ASCII. This could be used as their favicon, a small avatar on social media, or within their terminal-based user interface.
- Website: ASCII art banners or decorative elements on their website, especially in developer-focused sections or error pages.
- Documentation: Using ASCII art to illustrate complex technical concepts or diagrams within their API documentation.
- Email Signatures: A compact, text-based signature that includes their ASCII logo and contact details.
Tool Usage (`ascii-art`): Generate an ASCII version of their existing vector logo, optimizing for clarity and a specific character set that reflects their brand's "code-like" aesthetic.
Scenario 2: The Retro-Themed Gaming Studio
Brand Identity:
A game development studio specializing in 8-bit or pixel-art inspired games. Their brand evokes nostalgia, fun, and classic gaming aesthetics.
ASCII Art Application:
- Splash Screens: For their games, an ASCII art rendition of their studio logo or a thematic in-game element can serve as a charming splash screen before the game loads.
- Loading Screens: Dynamic ASCII art animations that progress as a game or level loads.
- Merchandise: T-shirts, stickers, and posters featuring their ASCII logo or iconic game characters.
- Website: The entire website could adopt an ASCII art theme, with navigation menus and content blocks rendered in stylized text.
Tool Usage (`ascii-art`): Convert iconic 8-bit sprites or character designs into high-fidelity ASCII art. Experiment with different character sets to mimic the pixelated look.
Scenario 3: The Cybersecurity Consultancy (with a twist)
Brand Identity:
A cybersecurity firm that wants to project an image of intelligence, discretion, and a deep understanding of digital systems, perhaps with a subtle nod to the hacker culture it combats.
ASCII Art Application:
- "About Us" Page: A sophisticated ASCII art rendition of a padlock, a network diagram, or a stylized "C" for Cyber could be used to visually represent their core services.
- Security Advisories: When publishing security alerts or advisories, using a distinct ASCII art header can lend an authoritative and recognizable mark.
- Internal Tools: For proprietary internal dashboards or scripts, ASCII art logos can add a unique branding touch.
- Marketing Materials: Subtle use in presentations or infographics where a unique visual element is desired.
Tool Usage (`ascii-art`): Focus on sharp, clean lines and geometric shapes in the ASCII art to convey precision and security. Character selection should be deliberate, perhaps using characters that appear "solid" or "structured."
Scenario 4: The Independent Bookstore or Library
Brand Identity:
A community-focused bookstore or library that values literature, knowledge, and a thoughtful, perhaps slightly vintage, aesthetic.
ASCII Art Application:
- Website Header: An ASCII art rendition of an open book, a quill pen, or a bookshelf could form a distinctive header for their website.
- Newsletter Graphics: Small ASCII art embellishments within their email newsletters to highlight book recommendations or events.
- Bookmarks: Printing unique bookmarks with stylized ASCII art logos or literary quotes.
- Digital Signage: On screens within the store, ASCII art can create a unique visual ambiance.
Tool Usage (`ascii-art`): Experiment with softer, more artistic character sets (like `.` `,` `;` `"` `(` `)`) to create a more nuanced and less harsh aesthetic, mimicking the texture of paper or ink.
Scenario 5: The Minimalist Digital Artist or Designer
Brand Identity:
An artist or designer who champions simplicity, elegance, and the power of form. Their brand is about creating impact with minimal elements.
ASCII Art Application:
- Portfolio Website: Using minimalist ASCII art as a watermark, a subtle background element, or as the primary visual for their logo.
- Social Media Avatars: A highly simplified, abstract ASCII art representation of their initial or a core design element.
- Digital Business Cards: A text-file-based business card that features their ASCII art logo.
- Artistic Projects: Incorporating ASCII art as a medium within their digital art pieces.
Tool Usage (`ascii-art`): Focus on extremely simple shapes and a very limited character set (perhaps just space, periods, and hyphens) to achieve a clean, modern look. The `ascii-art` tool's ability to control density and character selection is crucial here.
Scenario 6: The Open-Source Project
Brand Identity:
A collaborative open-source software project that wants to foster community, transparency, and a sense of shared ownership.
ASCII Art Application:
- README Files: A prominent ASCII art logo at the top of their project's README file on platforms like GitHub, GitLab, or Bitbucket.
- Command-Line Interface (CLI) Output: Displaying the project's ASCII logo when a user runs a command (e.g., `my-cli --version`).
- Website/Wiki: Using ASCII art for headers or section dividers to maintain a consistent, community-driven aesthetic.
- Community Forums: Allowing community members to use ASCII art avatars or signatures.
Tool Usage (`ascii-art`): Generate a clear, iconic representation of the project's name or symbol that is easily recognizable even at small sizes within code repositories.
Global Industry Standards and Best Practices for ASCII Art Branding
While there are no formal ISO certifications for ASCII art branding, certain de facto standards and best practices have emerged, particularly within communities that heavily utilize text-based interfaces. Adhering to these ensures consistency, compatibility, and a professional presentation.
1. Character Set Standardization
The most common character set is the standard 95 printable ASCII characters. However, for more nuanced designs, extended ASCII or even Unicode characters might be considered. For maximum compatibility, sticking to the basic 95 is recommended. The `ascii-art` tool should allow for the selection and prioritization of specific characters.
2. Monospaced Font Dependency
This is the most critical technical standard. All ASCII art relies on monospaced fonts (e.g., Courier New, Consolas, Monaco, Liberation Mono). Any branding that incorporates ASCII art must ensure it is displayed within an environment that uses such fonts. If embedding ASCII art directly into web pages, using the `
` tag or CSS `font-family: monospace;` is essential.
3. Resolution and Aspect Ratio
Generators like `ascii-art` should provide control over the output resolution (number of characters wide and high). Brands should generate versions optimized for their intended display contexts. For example:
- Small Icons (Favicons, Social Avatars): 32x32 to 64x64 characters.
- Website Headers/Banners: 80-120 characters wide, with corresponding height.
- Terminal Output: Adapting to typical terminal widths (80-132 characters).
Correct aspect ratio correction is paramount. Tools should aim for a character aspect ratio of approximately 2:1 (height:width) as a starting point, allowing for adjustments.
4. Color and Contrast
While traditionally monochromatic, modern terminals and web environments support color. For branding, consider:
- High Contrast: Essential for legibility. Dark characters on a light background or vice-versa.
- Limited Color Palettes: If using color, stick to a very limited palette that aligns with the brand's primary colors. This can be achieved by mapping specific ASCII characters to colored text in HTML or terminal escape codes.
- Accessibility: Ensure sufficient contrast ratios for users with visual impairments.
5. File Format and Portability
The most portable formats are:
- Plain Text (`.txt`): Universally compatible.
- HTML (`.html` with `
` tags):
Excellent for web display. - Image Renderings: If the ASCII art is rendered into a PNG or SVG, standard image optimization techniques apply.
6. Branding Guidelines Integration
Brands should create specific guidelines for their ASCII art assets:
- Approved Versions: Document specific ASCII art logos and their intended uses.
- Character Set Recommendations: Specify the character sets and mappings to be used.
- Font Requirements: Clearly state the need for monospaced fonts.
- Color Usage (if applicable): Define the color palette and how it should be applied.
- Generation Tool Usage: Recommend or mandate the use of specific tools like `ascii-art` for consistency.
7. Cybersecurity Implications
From a cybersecurity perspective, using ASCII art for branding offers some advantages:
- Reduced Attack Surface: Plain text ASCII art has virtually no executable code, unlike some image formats that can be vectors for exploits.
- Tamper Resistance (to a degree): While text can be altered, the deliberate creation and embedding of ASCII art can make unauthorized modifications more obvious if a specific, recognizable pattern is expected.
- Legibility for Security Personnel: In terminal-based security tools or logs, clear ASCII art can quickly convey important information or branding.
However, it's crucial to ensure that any dynamic generation or rendering of ASCII art (e.g., on a web page) is done securely to prevent cross-site scripting (XSS) if user-generated content is involved.
Multi-language Code Vault: Implementing ASCII Art Branding
This vault demonstrates how to generate and use ASCII art across different programming paradigms, showcasing the flexibility of the `ascii-art` tool's potential. We'll focus on generating a simple ASCII logo and displaying it.
Example 1: Python (using a hypothetical `ascii_art_generator` library)
Assume a Python library exists that interfaces with a powerful `ascii-art` engine.
# Assuming 'ascii_art_generator' is a library that wraps the core 'ascii-art' tool
# You would typically install it via pip: pip install ascii-art-generator
import ascii_art_generator
import os
def generate_and_display_logo_python(image_path="logo.png", output_width=80):
"""
Generates an ASCII art logo from an image and displays it.
"""
try:
# Initialize the generator with a character set and desired width
# The 'ascii-art' tool's capabilities would be exposed here.
# For example, it might support different character sets, dithering, etc.
generator = ascii_art_generator.AsciiArtGenerator(
char_set="#@%*+=-:. ", # Example character set
width=output_width,
aspect_ratio_correction=0.5 # Adjust for character height vs width
)
# Load and convert the image
ascii_logo = generator.from_image(image_path)
print("--- Generated ASCII Logo (Python) ---")
print(ascii_logo)
print("------------------------------------")
# Optionally save to a text file
with open("logo_python.txt", "w") as f:
f.write(ascii_logo)
print("Logo saved to logo_python.txt")
except FileNotFoundError:
print(f"Error: Image file not found at {image_path}")
except Exception as e:
print(f"An error occurred: {e}")
# --- Usage ---
# Create a dummy logo.png for demonstration if it doesn't exist
if not os.path.exists("logo.png"):
# In a real scenario, this would be your actual logo file
# For this example, we'll just mention it.
print("Please place a 'logo.png' file in the same directory to test.")
# You might create a placeholder image programmatically if needed for a fully runnable example.
else:
generate_and_display_logo_python("logo.png", output_width=100)
Example 2: JavaScript (Node.js for server-side generation)
Using a hypothetical `ascii-art-node` package.
// Assuming 'ascii-art-node' is a package that wraps the core 'ascii-art' tool
// You would typically install it via npm: npm install ascii-art-node
const asciiArtGenerator = require('ascii-art-node');
const fs = require('fs');
async function generateAndDisplayLogoNode(imagePath = "logo.png", outputWidth = 80) {
try {
// Initialize the generator with options
// The 'ascii-art' tool's capabilities would be exposed here.
const generator = new asciiArtGenerator.AsciiArtGenerator({
charSet: "█▓▒░ ", // Example character set
width: outputWidth,
preserveAspectRatio: true,
// The underlying tool might have specific parameters for aspect ratio correction
// For demonstration, assume it handles it well or has a specific option.
});
// Load and convert the image
const asciiLogo = await generator.fromImage(imagePath);
console.log("--- Generated ASCII Logo (Node.js) ---");
console.log(asciiLogo);
console.log("--------------------------------------");
// Optionally save to a text file
fs.writeFileSync("logo_nodejs.txt", asciiLogo);
console.log("Logo saved to logo_nodejs.txt");
} catch (error) {
if (error.code === 'ENOENT') {
console.error(`Error: Image file not found at ${imagePath}. Please place a 'logo.png' in the directory.`);
} else {
console.error(`An error occurred: ${error.message}`);
}
}
}
// --- Usage ---
// Ensure logo.png exists before running
if (!fs.existsSync("logo.png")) {
console.log("Please place a 'logo.png' file in the same directory to test.");
} else {
generateAndDisplayLogoNode("logo.png", outputWidth = 120);
}
Example 3: Shell Script (using a command-line `ascii-art` tool)
Assuming a standalone `ascii-art` CLI tool is installed.
#!/bin/bash
# Assuming the 'ascii-art' CLI tool is installed and in your PATH
# Command: ascii-art --input logo.png --output logo_bash.txt --width 100 --charset "#@%*+=-:. " --aspect-ratio 0.5
IMAGE_FILE="logo.png"
OUTPUT_FILE="logo_bash.txt"
OUTPUT_WIDTH=100
CHAR_SET="#@%*+=-:. " # Example character set
ASPECT_RATIO_CORRECTION="0.5" # Example correction factor
echo "--- Generating ASCII Logo (Bash) ---"
if [ ! -f "$IMAGE_FILE" ]; then
echo "Error: Image file '$IMAGE_FILE' not found."
echo "Please place a 'logo.png' file in the same directory to test."
else
# Execute the ascii-art command
# The exact command-line arguments will depend on the specific implementation of the 'ascii-art' tool.
# This is a hypothetical example.
ascii-art --input "$IMAGE_FILE" \
--output "$OUTPUT_FILE" \
--width "$OUTPUT_WIDTH" \
--charset "$CHAR_SET" \
--aspect-ratio "$ASPECT_RATIO_CORRECTION" \
--dither "floyd-steinberg" # Example of another potential option
if [ $? -eq 0 ]; then
echo "ASCII Logo generated and saved to $OUTPUT_FILE"
echo "--- Content of $OUTPUT_FILE ---"
cat "$OUTPUT_FILE"
echo "------------------------------"
else
echo "Error: Failed to generate ASCII logo. Please check the 'ascii-art' tool and its arguments."
fi
fi
Example 4: HTML and CSS (for web display)
This demonstrates how to embed and style ASCII art on a web page.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ASCII Art Branding Example</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f0f0f0;
color: #333;
line-height: 1.2; /* Slightly tighter line height for ASCII */
}
.ascii-logo-container {
display: inline-block; /* Allows background to fit content */
background-color: #222; /* Dark background for contrast */
padding: 10px;
border-radius: 5px;
margin-bottom: 20px;
}
.ascii-logo {
font-family: 'Consolas', 'Monaco', 'Andale Mono', 'Ubuntu Mono', monospace;
font-size: 10px; /* Smaller font size for denser art */
line-height: 1.0; /* Tighter line spacing */
color: #00FF00; /* Green for a classic terminal look */
white-space: pre; /* Crucial: preserves whitespace and line breaks */
letter-spacing: 0; /* No extra spacing between letters */
display: block; /* Ensure it takes its own line */
}
/* Example for a different style */
.ascii-logo-alt {
font-family: 'Courier New', Courier, monospace;
font-size: 14px;
line-height: 1.1;
color: #FFFF00; /* Yellow */
white-space: pre;
display: block;
margin-top: 15px;
border: 1px dashed #ccc;
padding: 5px;
}
</style>
</head>
<body>
<h1>ASCII Art Branding Showcase</h1>
<p>This is an example of how ASCII art can be used for branding on the web.</p>
<div class="ascii-logo-container">
<pre class="ascii-logo">
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@