From ee266fc60e6edc4ef2672799cdc7b79f322cd2f6 Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Wed, 25 Feb 2026 17:00:37 +0100 Subject: [PATCH 01/10] added token amount to chat (in progress) --- .../Assistants/I18N/allTexts.lua | 3 + .../Components/ChatComponent.razor | 2 +- .../Components/ChatComponent.razor.cs | 21 ++++ .../Tools/Rust/TokenCountInfo.cs | 6 ++ .../Tools/Services/RustService.Tokenizer.cs | 27 +++++ runtime/Cargo.toml | 3 + runtime/src/lib.rs | 3 +- runtime/src/main.rs | 14 ++- runtime/src/runtime_api.rs | 1 + runtime/src/tokenizer.rs | 100 ++++++++++++++++++ 10 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 app/MindWork AI Studio/Tools/Rust/TokenCountInfo.cs create mode 100644 app/MindWork AI Studio/Tools/Services/RustService.Tokenizer.cs create mode 100644 runtime/src/tokenizer.rs diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 0c4509e8d..fe45b2803 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -1618,6 +1618,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3403290862"] = "The selec -- Select a provider first UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3654197869"] = "Select a provider first" +-- Estimated amount of tokens: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T377990776"] = "Estimated amount of tokens:" + -- Start new chat in workspace '{0}' UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Start new chat in workspace '{0}'" diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor b/app/MindWork AI Studio/Components/ChatComponent.razor index 52b82b9bc..5c322686b 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor +++ b/app/MindWork AI Studio/Components/ChatComponent.razor @@ -123,7 +123,7 @@ } - + @this.TokenCountMessage \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs index c7bd4dce4..5ba2ffc12 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs @@ -3,6 +3,7 @@ using AIStudio.Provider; using AIStudio.Settings; using AIStudio.Settings.DataModel; +using AIStudio.Tools.Services; using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; @@ -36,6 +37,9 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable [Inject] private IDialogService DialogService { get; init; } = null!; + + [Inject] + private RustService RustService { get; init; } = null!; private const Placement TOOLBAR_TOOLTIP_PLACEMENT = Placement.Top; private static readonly Dictionary USER_INPUT_ATTRIBUTES = new(); @@ -58,6 +62,8 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable private Guid currentWorkspaceId = Guid.Empty; private CancellationTokenSource? cancellationTokenSource; private HashSet chatDocumentPaths = []; + private string tokenCount = "0"; + private string TokenCountMessage => $"{this.T("Estimated amount of tokens:")} {this.tokenCount}"; // Unfortunately, we need the input field reference to blur the focus away. Without // this, we cannot clear the input field. @@ -405,6 +411,9 @@ private async Task InputKeyEvent(KeyboardEventArgs keyEvent) // Was a modifier key pressed as well? var isModifier = keyEvent.AltKey || keyEvent.CtrlKey || keyEvent.MetaKey || keyEvent.ShiftKey; + if (isEnter) + await this.CalculateTokenCount(); + // Depending on the user's settings, might react to shortcuts: switch (this.SettingsManager.ConfigurationData.Chat.ShortcutSendBehavior) { @@ -901,6 +910,18 @@ private Task EditLastBlock(IContent block) return Task.CompletedTask; } + private async Task CalculateTokenCount() + { + if (this.inputField.Value is null) + return; + this.Logger.LogDebug($"Text to tokenize: '{this.inputField.Value}' "); + var response = await this.RustService.GetTokenCount(this.inputField.Value); + if (response is null) + return; + this.tokenCount = response.TokenCount.ToString(); + this.Logger.LogDebug($"Token count: {this.tokenCount}"); + } + #region Overrides of MSGComponentBase protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default diff --git a/app/MindWork AI Studio/Tools/Rust/TokenCountInfo.cs b/app/MindWork AI Studio/Tools/Rust/TokenCountInfo.cs new file mode 100644 index 000000000..c0e491bf4 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/TokenCountInfo.cs @@ -0,0 +1,6 @@ +namespace AIStudio.Tools.Rust; + +public sealed class TokenCountInfo +{ + public int TokenCount { get; set; } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.Tokenizer.cs b/app/MindWork AI Studio/Tools/Services/RustService.Tokenizer.cs new file mode 100644 index 000000000..e01272dbe --- /dev/null +++ b/app/MindWork AI Studio/Tools/Services/RustService.Tokenizer.cs @@ -0,0 +1,27 @@ +using AIStudio.Tools.Rust; + +namespace AIStudio.Tools.Services; + +public sealed partial class RustService +{ + public async Task GetTokenCount(string text) + { + try + { + var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + var payload = new { text }; + var response = await this.http.PostAsJsonAsync("/system/tokenizer/count", payload, this.jsonRustSerializerOptions, cts.Token); + response.EnsureSuccessStatusCode(); + return await response.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions, cancellationToken: cts.Token); + } + catch (Exception e) + { + if(this.logger is not null) + this.logger.LogError(e, "Error while getting token count from Rust service."); + else + Console.WriteLine($"Error while getting token count from Rust service: '{e}'."); + + return null; + } + } +} \ No newline at end of file diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 835e632f6..8b7c04d06 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -42,6 +42,9 @@ pptx-to-md = "0.4.0" tempfile = "3.8" strum_macros = "0.27" sysinfo = "0.38.0" +tiktoken-rs = "0.9.1" +tokenizers = "0.22.2" +hf-hub = "0.4.3" # Fixes security vulnerability downstream, where the upstream is not fixed yet: time = "0.3.47" # -> Rocket diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 1b13e0991..102efbe2e 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -17,4 +17,5 @@ pub mod qdrant; pub mod certificate_factory; pub mod runtime_api_token; pub mod stale_process_cleanup; -mod sidecar_types; \ No newline at end of file +mod sidecar_types; +pub mod tokenizer; \ No newline at end of file diff --git a/runtime/src/main.rs b/runtime/src/main.rs index 00a7ba905..3cf7556aa 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -11,7 +11,8 @@ use mindwork_ai_studio::environment::is_dev; use mindwork_ai_studio::log::init_logging; use mindwork_ai_studio::metadata::MetaData; use mindwork_ai_studio::runtime_api::start_runtime_api; - +use mindwork_ai_studio::stale_process_cleanup::kill_stale_process; +use mindwork_ai_studio::tokenizer::{init_tokenizer, get_token_count}; #[tokio::main] async fn main() { @@ -43,8 +44,17 @@ async fn main() { info!("Running in production mode."); } + if let Err(e) = init_tokenizer() { + warn!(Source = "Tokenizer"; "Error during the initialisation of the tokenizer: {}", e); + } + + let token_count = get_token_count(""); + info!(".. Tokenizer contains {token_count} tokens."); + generate_runtime_certificate(); start_runtime_api(); start_tauri(); -} \ No newline at end of file + + Ok(()) +} diff --git a/runtime/src/runtime_api.rs b/runtime/src/runtime_api.rs index 3a4c1f9ce..76ed73b1a 100644 --- a/runtime/src/runtime_api.rs +++ b/runtime/src/runtime_api.rs @@ -91,6 +91,7 @@ pub fn start_runtime_api() { crate::file_data::extract_data, crate::log::get_log_paths, crate::log::log_event, + crate::tokenizer::tokenizer_count, crate::app_window::register_shortcut, crate::app_window::validate_shortcut, crate::app_window::suspend_shortcuts, diff --git a/runtime/src/tokenizer.rs b/runtime/src/tokenizer.rs new file mode 100644 index 000000000..cfc12d6a4 --- /dev/null +++ b/runtime/src/tokenizer.rs @@ -0,0 +1,100 @@ +use std::fs; +use std::path::{Path, PathBuf}; +use std::sync::OnceLock; +use rocket::{get, post}; +use rocket::serde::json::Json; +use rocket::serde::Serialize; +use serde::Deserialize; +use tokenizers::Error; +use tokenizers::tokenizer::Tokenizer; +use crate::api_token::APIToken; +use crate::environment::DATA_DIRECTORY; +use crate::qdrant::{ProvideQdrantInfo, CERTIFICATE_FINGERPRINT}; + +static TOKENIZER_PATH: &str = ""; + +static TOKENIZER: OnceLock = OnceLock::new(); + +static TEXT: &str = "Natürlich! Hier ist ein sehr langer, vielseitiger Text, den du perfekt für Tokenisierungstests verwenden kannst. Er enthält verschiedene Satzstrukturen, Satzzeichen, Zahlen, Sonderzeichen, Wörter unterschiedlicher Längen, Fremdwörter, Zitate, Listen, und sogar ein bisschen Poetry – alles, um deine Tokenisierung gründlich auf die Probe zu stellen: + +--- + +**Der große Text zur Tokenisierung – Version 2026** + +Es war einmal, an einem regnerischen Dienstag im April, als der alte Bibliothekar Professor Albrecht von Schmiedenbach – ein Mann mit Bart wie ein Wikinger und Brillengläsern so dick wie Bierflaschen – beschloss, die verstaubten Regale des „Königlichen Instituts für verlorenes Wissen“ zu durchforsten. „Was“, murmelte er, „ist das für ein Geräusch?“ – und zog mit zitternden Fingern ein Buch hervor, dessen Einband aus Drachenleder zu bestehen schien. Auf dem Rücken stand in goldenen Lettern: *„Das Buch der 1.000.001 Worte – inkl. aller Sonderzeichen, Zahlen, Emojis 🐉📚, und unerklärlicher Symbole ∞∑∫≠±÷ד*. + +„Das ist unmöglich!“, rief seine Assistentin, Dr. Lina Chen, die gerade mit einem Kaffeebecher in der Hand hereinkam. „Das Buch existiert nur in Legenden! Und außerdem: Warum steht da *„inkl. aller Sonderzeichen“* – das ist doch kein Buch, das ist ein Test für NLP-Modelle!“ + +„Genau das ist es!“, antwortete der Professor mit einem verschmitzten Grinsen. „Und jetzt, meine Liebe, werden wir es öffnen – aber Vorsicht: Jedes Wort, das du liest, wird in Tokens zerlegt. Und wenn du ein Token vergisst, wird dir der Geist des ersten Tokenizers, ein gewisser „GPT-1“, im Traum erscheinen und dir vorwerfen: ‚Du hast das Komma vergessen!‘“ + +Lina seufzte. „Also gut. Fangen wir an. Aber nur, wenn du mir versprichst, dass du danach endlich den Kaffee nachfüllst.“ + +„Abgemacht!“, sagte der Professor und schlug das Buch auf. Die Seiten begannen zu leuchten. Und dann begann der Text: + +--- + +**Kapitel 1: Die Grammatik des Chaos** + +In einer Welt, in der Satzzeichen rebellieren, Verben sich weigern, konjugiert zu werden, und Adjektive in die falsche Reihenfolge springen, lebte ein kleiner Algorithmus namens „Tokenius“. Er war nicht besonders schlau, aber er hatte ein großes Herz – oder zumindest eine große Anzahl an Embeddings. Sein Ziel? Jeden Text in sinnvolle Einheiten zerlegen, egal ob es sich um ein Gedicht von Goethe, eine E-Mail von Oma, oder einen Tweet mit 17 Hashtags handelte. + +„#Tokenisierung #NLP #Textprocessing #IchHabKeineAhnungWasIchTue #BitteHilfe #Kaffee #Kuchen #Python #Regex #WarumIstDasSoSchwer #GPT4 #HilfeNochMal #EmojisAreMyFriends 😭🤯🔥” + +Tokenius seufzte. „Das wird ein langer Tag.“ + +--- + +**Kapitel 2: Die Liste der Unmöglichen** + +Hier ist eine Liste von Dingen, die Tokenius jemals tokenisiert hat: + +1. „Der Hund bellt, die Katze schläft, der Vogel singt – und der Algorithmus versteht nichts.“ +2. „1234567890 – diese Zahlen sind auch Tokens, obwohl sie keine Wörter sind.“ +3. „$€¥£₿ – Währungssymbole zählen auch!“ +4. „„Hallo Welt!“, sagte der Roboter – und dann explodierte er.“ +5. „Was ist der Sinn des Lebens? 42. (Aber das ist nur ein Token, kein philosophischer Kommentar.)“ +6. „Ich liebe dich. ❤️ – Ja, Emojis sind auch Tokens. Manchmal.“ +7. „Dr. Dr. Prof. Dr. h.c. mult. Albrecht von Schmiedenbach – das ist ein einziger Token? Nein. Das sind 12.“ +8. „https://www.example.com/path/to/very/long/url?param=1&token=abc123 – URLs sind oft ein einziger Token, manchmal auch mehrere.“ +9. „100% sicher? Nein. 99,9%? Vielleicht. 0,0001%? Ja, das ist auch ein Token.“ +10. „„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘"; + +pub fn init_tokenizer() -> Result<(), Error>{ + let mut target_dir = PathBuf::from("target"); + target_dir.push("databases"); + fs::create_dir_all(&target_dir)?; + + let mut local_tokenizer_path = target_dir.clone(); + local_tokenizer_path.push("tokenizer.json"); + + TOKENIZER.set(Tokenizer::from_file(local_tokenizer_path)?).expect("Could not set the tokenizer."); + Ok(()) +} + +pub fn get_token_count(mut text: &str) -> usize { + if text.is_empty() { + text = TEXT; + } + println!("Tokenizing {}", text); + match TOKENIZER.get().unwrap().encode(text, true) { + Ok(encoding) => encoding.len(), + Err(_) => 0, + } +} + +#[derive(Deserialize)] +pub struct SetTokenText { + pub text: String, +} + +#[derive(Serialize)] +pub struct GetTokenCount{ + token_count: usize, +} + + +#[post("/system/tokenizer/count", data = "")] +pub fn tokenizer_count(_token: APIToken, req: Json) -> Json { + Json(GetTokenCount { + token_count: get_token_count(&req.text), + }) +} \ No newline at end of file From 347600d9709cfec6354814a0467e3ae2bdf242af Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Thu, 26 Feb 2026 17:24:25 +0100 Subject: [PATCH 02/10] Finished display of token estimation (with debouncing) --- .../Assistants/I18N/allTexts.lua | 6 ++ .../Components/ChatComponent.razor | 6 +- .../Components/ChatComponent.razor.cs | 9 ++- .../Components/UserPromptComponent.cs | 72 +++++++++++++++++++ .../Pages/Information.razor | 2 + .../plugin.lua | 15 +++- .../plugin.lua | 15 +++- runtime/src/main.rs | 8 +-- runtime/src/tokenizer.rs | 54 ++------------ 9 files changed, 119 insertions(+), 68 deletions(-) create mode 100644 app/MindWork AI Studio/Components/UserPromptComponent.cs diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index fe45b2803..265111f89 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -5065,6 +5065,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1019424746"] = "Startup log file -- Browse AI Studio's source code on GitHub — we welcome your contributions. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1107156991"] = "Browse AI Studio's source code on GitHub — we welcome your contributions." +-- The Tokenizer library serves as the base framework for integrating the DeepSeek tokenizer. +UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1132433749"] = "The Tokenizer library serves as the base framework for integrating the DeepSeek tokenizer." + -- ID mismatch: the plugin ID differs from the enterprise configuration ID. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1137744461"] = "ID mismatch: the plugin ID differs from the enterprise configuration ID." @@ -5299,6 +5302,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T566998575"] = "This is a library -- Used .NET SDK UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T585329785"] = "Used .NET SDK" +-- We use the DeepSeek Tokenizer to estimate the number of tokens an input will generate. +UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T591393704"] = "We use the DeepSeek Tokenizer to estimate the number of tokens an input will generate." + -- This library is used to manage sidecar processes and to ensure that stale or zombie sidecars are detected and terminated. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T633932150"] = "This library is used to manage sidecar processes and to ensure that stale or zombie sidecars are detected and terminated." diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor b/app/MindWork AI Studio/Components/ChatComponent.razor index 5c322686b..a44979a3e 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor +++ b/app/MindWork AI Studio/Components/ChatComponent.razor @@ -33,7 +33,7 @@ - @@ -123,7 +126,6 @@ } - @this.TokenCountMessage \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/ChatComponent.razor.cs b/app/MindWork AI Studio/Components/ChatComponent.razor.cs index 5ba2ffc12..986f37c50 100644 --- a/app/MindWork AI Studio/Components/ChatComponent.razor.cs +++ b/app/MindWork AI Studio/Components/ChatComponent.razor.cs @@ -67,7 +67,7 @@ public partial class ChatComponent : MSGComponentBase, IAsyncDisposable // Unfortunately, we need the input field reference to blur the focus away. Without // this, we cannot clear the input field. - private MudTextField inputField = null!; + private UserPromptComponent inputField = null!; #region Overrides of ComponentBase @@ -532,6 +532,7 @@ private async Task SendMessage(bool reuseLastUserPrompt = false) this.userInput = string.Empty; this.chatDocumentPaths.Clear(); await this.inputField.BlurAsync(); + this.tokenCount = "0"; // Enable the stream state for the chat component: this.isStreaming = true; @@ -913,13 +914,15 @@ private Task EditLastBlock(IContent block) private async Task CalculateTokenCount() { if (this.inputField.Value is null) + { + this.tokenCount = "0"; return; - this.Logger.LogDebug($"Text to tokenize: '{this.inputField.Value}' "); + } var response = await this.RustService.GetTokenCount(this.inputField.Value); if (response is null) return; this.tokenCount = response.TokenCount.ToString(); - this.Logger.LogDebug($"Token count: {this.tokenCount}"); + this.StateHasChanged(); } #region Overrides of MSGComponentBase diff --git a/app/MindWork AI Studio/Components/UserPromptComponent.cs b/app/MindWork AI Studio/Components/UserPromptComponent.cs new file mode 100644 index 000000000..cd1fad9ff --- /dev/null +++ b/app/MindWork AI Studio/Components/UserPromptComponent.cs @@ -0,0 +1,72 @@ +using Microsoft.AspNetCore.Components; +using Timer = System.Timers.Timer; +using MudBlazor; + +namespace AIStudio.Components; + +/// +/// Debounced multi-line text input built on . +/// Keeps the base API while adding a debounce timer. +/// Callers can override any property as usual. +/// +public class UserPromptComponent : MudTextField +{ + [Parameter] + public TimeSpan DebounceTime { get; set; } = TimeSpan.FromMilliseconds(800); + + // Use base Text / TextChanged from MudTextField; do not redeclare to avoid duplicate parameters. + // Text binding is handled through those base members; we only add debouncing behavior. + + [Parameter] + public Func WhenTextChangedAsync { get; set; } = _ => Task.CompletedTask; + + private readonly Timer debounceTimer = new(); + private string text = string.Empty; + private string lastParameterText = string.Empty; + private string lastNotifiedText = string.Empty; + private bool isInitialized; + + protected override async Task OnInitializedAsync() + { + this.text = this.Text ?? string.Empty; + this.lastParameterText = this.Text ?? string.Empty; + this.lastNotifiedText = this.Text ?? string.Empty; + this.debounceTimer.AutoReset = false; + this.debounceTimer.Interval = this.DebounceTime.TotalMilliseconds; + this.debounceTimer.Elapsed += (_, _) => + { + this.debounceTimer.Stop(); + if (this.text == this.lastNotifiedText) + return; + + this.lastNotifiedText = this.text; + this.InvokeAsync(async () => await this.TextChanged.InvokeAsync(this.text)); + this.InvokeAsync(async () => await this.WhenTextChangedAsync(this.text)); + }; + + this.isInitialized = true; + await base.OnInitializedAsync(); + } + + protected override async Task OnParametersSetAsync() + { + // Ensure the timer uses the latest debouncing interval: + if (!this.isInitialized) + return; + + if(Math.Abs(this.debounceTimer.Interval - this.DebounceTime.TotalMilliseconds) > 1) + this.debounceTimer.Interval = this.DebounceTime.TotalMilliseconds; + + // Only sync when the parent's parameter actually changed since the last change: + if (this.Text != this.lastParameterText) + { + this.text = this.Text ?? string.Empty; + this.lastParameterText = this.Text ?? string.Empty; + } + + this.debounceTimer.Stop(); + this.debounceTimer.Start(); + + await base.OnParametersSetAsync(); + } +} diff --git a/app/MindWork AI Studio/Pages/Information.razor b/app/MindWork AI Studio/Pages/Information.razor index 5a964179d..aa8cec0ad 100644 --- a/app/MindWork AI Studio/Pages/Information.razor +++ b/app/MindWork AI Studio/Pages/Information.razor @@ -311,6 +311,8 @@ + + diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua index d95f1a6a9..08a6356ef 100644 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -1620,6 +1620,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3403290862"] = "Der ausge -- Select a provider first UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3654197869"] = "Wähle zuerst einen Anbieter aus" +-- Estimated amount of tokens: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T377990776"] = "Geschätzte Anzahl an Tokens:" + -- Start new chat in workspace "{0}" UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Neuen Chat im Arbeitsbereich \"{0}\" starten" @@ -1812,7 +1815,7 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1986314327"] = "Demokratisie -- While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations. UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3552777197"] = "Während ich nach passenden Lösungen suchte, stieß ich auf eine Desktop-Anwendung namens Anything LLM. Leider konnte sie meine spezifischen Anforderungen nicht erfüllen und entsprach auch nicht dem Benutzeroberflächendesign, das ich mir vorgestellt hatte. Für macOS gab es zwar mehrere Apps, die meiner Vorstellung ähnelten, aber sie waren allesamt kostenpflichtige Lösungen mit unklarer Herkunft. Die Identität der Entwickler und die Ursprünge dieser Apps waren nicht ersichtlich, was erhebliche Sicherheitsbedenken hervorrief. Berichte von Nutzern über gestohlene API-Schlüssel und unerwünschte Abbuchungen verstärkten meine Bedenken zusätzlich." --- We also want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs for your first steps or use affordable cloud models. MindWork AI Studio itself is available free of charge. +-- We also want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs for your first steps or use affordable cloud models. MindWork AI Studio itself is available free of charge. UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3672974243"] = "Wir möchten auch zur Demokratisierung von KI beitragen. MindWork AI Studio läuft selbst auf kostengünstiger Hardware, einschließlich Computern für rund 100 € wie dem Raspberry Pi. Dadurch sind die App und ihr voller Funktionsumfang auch für Menschen und Familien mit begrenztem Budget zugänglich. Für Ihre ersten Schritte können Sie mit lokalen LLMs beginnen oder günstige Cloud-Modelle nutzen. MindWork AI Studio selbst ist kostenlos erhältlich." -- Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge. @@ -2448,7 +2451,7 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1986314327"] = "Demokratisierung -- Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer. UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2144737937"] = "Was auch immer ihr Beruf oder ihre Aufgabe ist, MindWork AI Studio möchte ihre Bedürfnisse erfüllen: Egal, ob Sie Projektmanager, Wissenschaftler, Künstler, Autor, Softwareentwickler oder Spieleentwickler sind." --- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. MindWork AI Studio itself is available free of charge. +-- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. MindWork AI Studio itself is available free of charge. UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2201645589"] = "Wir möchten zur Demokratisierung von KI beitragen. MindWork AI Studio läuft sogar auf kostengünstiger Hardware, einschließlich Computern für etwa 100 € wie dem Raspberry Pi. Dadurch werden die App und ihr voller Funktionsumfang auch für Menschen und Familien mit begrenztem Budget zugänglich. Sie können mit lokalen LLMs starten oder günstige Cloud-Modelle nutzen. MindWork AI Studio selbst ist kostenlos erhältlich." -- You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats. @@ -4995,7 +4998,7 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T149711988"] = "Sie zahlen nur für das, -- Assistants UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1614176092"] = "Assistenten" --- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. +-- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1628689293"] = "Wir möchten zur Demokratisierung von KI beitragen. MindWork AI Studio läuft sogar auf kostengünstiger Hardware, einschließlich Computern für etwa 100 € wie dem Raspberry Pi. Dadurch werden die App und ihr vollständiger Funktionsumfang auch für Menschen und Familien mit begrenztem Budget zugänglich. Sie können mit lokalen LLMs starten oder günstige Cloud-Modelle nutzen." -- Unrestricted usage @@ -5064,6 +5067,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1019424746"] = "Startprotokollda -- Browse AI Studio's source code on GitHub — we welcome your contributions. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1107156991"] = "Sehen Sie sich den Quellcode von AI Studio auf GitHub an – wir freuen uns über ihre Beiträge." +-- The Tokenizer library serves as the base framework for integrating the DeepSeek tokenizer. +UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1132433749"] = "Die Tokenizer‑Bibliothek dient als Basis‑Framework für die Integration des DeepSeek‑Tokenizers." + -- ID mismatch: the plugin ID differs from the enterprise configuration ID. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1137744461"] = "ID-Konflikt: Die Plugin-ID stimmt nicht mit der ID der Unternehmenskonfiguration überein." @@ -5298,6 +5304,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T566998575"] = "Dies ist eine Bib -- Used .NET SDK UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T585329785"] = "Verwendetes .NET SDK" +-- We use the DeepSeek Tokenizer to estimate the number of tokens an input will generate. +UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T591393704"] = "Wir verwenden den DeepSeek‑Tokenizer, um die Token‑Anzahl einer Eingabe zu schätzen." + -- This library is used to manage sidecar processes and to ensure that stale or zombie sidecars are detected and terminated. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T633932150"] = "Diese Bibliothek wird verwendet, um Sidecar-Prozesse zu verwalten und sicherzustellen, dass veraltete oder Zombie-Sidecars erkannt und beendet werden." diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua index 688cb8d0a..a92a18ba3 100644 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -1620,6 +1620,9 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3403290862"] = "The selec -- Select a provider first UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3654197869"] = "Select a provider first" +-- Estimated amount of tokens: +UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T377990776"] = "Estimated amount of tokens:" + -- Start new chat in workspace "{0}" UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::CHATCOMPONENT::T3928697643"] = "Start new chat in workspace \"{0}\"" @@ -1812,7 +1815,7 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T1986314327"] = "Democratizat -- While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations. UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3552777197"] = "While exploring available solutions, I found a desktop application called Anything LLM. Unfortunately, it fell short of meeting my specific requirements and lacked the user interface design I envisioned. For macOS, there were several apps similar to what I had in mind, but they were all commercial solutions shrouded in uncertainty. The developers' identities and the origins of these apps were unclear, raising significant security concerns. Reports from users about stolen API keys and unwanted charges only amplified my reservations." --- We also want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs for your first steps or use affordable cloud models. MindWork AI Studio itself is available free of charge. +-- We also want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs for your first steps or use affordable cloud models. MindWork AI Studio itself is available free of charge. UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::MOTIVATION::T3672974243"] = "We also want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs for your first steps or use affordable cloud models. MindWork AI Studio itself is available free of charge." -- Relying on web services like ChatGPT was not a sustainable solution for me. I needed an AI that could also access files directly on my device, a functionality web services inherently lack due to security and privacy constraints. Although I could have scripted something in Python to meet my needs, this approach was too cumbersome for daily use. More importantly, I wanted to develop a solution that anyone could use without needing any programming knowledge. @@ -2448,7 +2451,7 @@ UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T1986314327"] = "Democratization -- Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer. UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2144737937"] = "Whatever your job or task is, MindWork AI Studio aims to meet your needs: whether you're a project manager, scientist, artist, author, software developer, or game developer." --- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. MindWork AI Studio itself is available free of charge. +-- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. MindWork AI Studio itself is available free of charge. UI_TEXT_CONTENT["AISTUDIO::COMPONENTS::VISION::T2201645589"] = "We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. MindWork AI Studio itself is available free of charge." -- You can connect your email inboxes with AI Studio. The AI will read your emails and notify you of important events. You'll also be able to access knowledge from your emails in your chats. @@ -4995,7 +4998,7 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T149711988"] = "You only pay for what yo -- Assistants UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1614176092"] = "Assistants" --- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 EUR such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. +-- We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models. UI_TEXT_CONTENT["AISTUDIO::PAGES::HOME::T1628689293"] = "We want to contribute to the democratization of AI. MindWork AI Studio runs even on low-cost hardware, including computers around 100 € such as Raspberry Pi. This makes the app and its full feature set accessible to people and families with limited budgets. You can start with local LLMs or use affordable cloud models." -- Unrestricted usage @@ -5064,6 +5067,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1019424746"] = "Startup log file -- Browse AI Studio's source code on GitHub — we welcome your contributions. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1107156991"] = "Browse AI Studio's source code on GitHub — we welcome your contributions." +-- The Tokenizer library serves as the base framework for integrating the DeepSeek tokenizer. +UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1132433749"] = "The Tokenizer library serves as the base framework for integrating the DeepSeek tokenizer." + -- ID mismatch: the plugin ID differs from the enterprise configuration ID. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T1137744461"] = "ID mismatch: the plugin ID differs from the enterprise configuration ID." @@ -5298,6 +5304,9 @@ UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T566998575"] = "This is a library -- Used .NET SDK UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T585329785"] = "Used .NET SDK" +-- We use the DeepSeek Tokenizer to estimate the number of tokens an input will generate. +UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T591393704"] = "We use the DeepSeek Tokenizer to estimate the number of tokens an input will generate." + -- This library is used to manage sidecar processes and to ensure that stale or zombie sidecars are detected and terminated. UI_TEXT_CONTENT["AISTUDIO::PAGES::INFORMATION::T633932150"] = "This library is used to manage sidecar processes and to ensure that stale or zombie sidecars are detected and terminated." diff --git a/runtime/src/main.rs b/runtime/src/main.rs index 3cf7556aa..a210de540 100644 --- a/runtime/src/main.rs +++ b/runtime/src/main.rs @@ -11,8 +11,7 @@ use mindwork_ai_studio::environment::is_dev; use mindwork_ai_studio::log::init_logging; use mindwork_ai_studio::metadata::MetaData; use mindwork_ai_studio::runtime_api::start_runtime_api; -use mindwork_ai_studio::stale_process_cleanup::kill_stale_process; -use mindwork_ai_studio::tokenizer::{init_tokenizer, get_token_count}; +use mindwork_ai_studio::tokenizer::{init_tokenizer}; #[tokio::main] async fn main() { @@ -48,13 +47,8 @@ async fn main() { warn!(Source = "Tokenizer"; "Error during the initialisation of the tokenizer: {}", e); } - let token_count = get_token_count(""); - info!(".. Tokenizer contains {token_count} tokens."); - generate_runtime_certificate(); start_runtime_api(); start_tauri(); - - Ok(()) } diff --git a/runtime/src/tokenizer.rs b/runtime/src/tokenizer.rs index cfc12d6a4..3614b3968 100644 --- a/runtime/src/tokenizer.rs +++ b/runtime/src/tokenizer.rs @@ -1,66 +1,21 @@ use std::fs; -use std::path::{Path, PathBuf}; +use std::path::{PathBuf}; use std::sync::OnceLock; -use rocket::{get, post}; +use rocket::{post}; use rocket::serde::json::Json; use rocket::serde::Serialize; use serde::Deserialize; use tokenizers::Error; use tokenizers::tokenizer::Tokenizer; use crate::api_token::APIToken; -use crate::environment::DATA_DIRECTORY; -use crate::qdrant::{ProvideQdrantInfo, CERTIFICATE_FINGERPRINT}; - -static TOKENIZER_PATH: &str = ""; static TOKENIZER: OnceLock = OnceLock::new(); -static TEXT: &str = "Natürlich! Hier ist ein sehr langer, vielseitiger Text, den du perfekt für Tokenisierungstests verwenden kannst. Er enthält verschiedene Satzstrukturen, Satzzeichen, Zahlen, Sonderzeichen, Wörter unterschiedlicher Längen, Fremdwörter, Zitate, Listen, und sogar ein bisschen Poetry – alles, um deine Tokenisierung gründlich auf die Probe zu stellen: - ---- - -**Der große Text zur Tokenisierung – Version 2026** - -Es war einmal, an einem regnerischen Dienstag im April, als der alte Bibliothekar Professor Albrecht von Schmiedenbach – ein Mann mit Bart wie ein Wikinger und Brillengläsern so dick wie Bierflaschen – beschloss, die verstaubten Regale des „Königlichen Instituts für verlorenes Wissen“ zu durchforsten. „Was“, murmelte er, „ist das für ein Geräusch?“ – und zog mit zitternden Fingern ein Buch hervor, dessen Einband aus Drachenleder zu bestehen schien. Auf dem Rücken stand in goldenen Lettern: *„Das Buch der 1.000.001 Worte – inkl. aller Sonderzeichen, Zahlen, Emojis 🐉📚, und unerklärlicher Symbole ∞∑∫≠±÷ד*. - -„Das ist unmöglich!“, rief seine Assistentin, Dr. Lina Chen, die gerade mit einem Kaffeebecher in der Hand hereinkam. „Das Buch existiert nur in Legenden! Und außerdem: Warum steht da *„inkl. aller Sonderzeichen“* – das ist doch kein Buch, das ist ein Test für NLP-Modelle!“ - -„Genau das ist es!“, antwortete der Professor mit einem verschmitzten Grinsen. „Und jetzt, meine Liebe, werden wir es öffnen – aber Vorsicht: Jedes Wort, das du liest, wird in Tokens zerlegt. Und wenn du ein Token vergisst, wird dir der Geist des ersten Tokenizers, ein gewisser „GPT-1“, im Traum erscheinen und dir vorwerfen: ‚Du hast das Komma vergessen!‘“ - -Lina seufzte. „Also gut. Fangen wir an. Aber nur, wenn du mir versprichst, dass du danach endlich den Kaffee nachfüllst.“ - -„Abgemacht!“, sagte der Professor und schlug das Buch auf. Die Seiten begannen zu leuchten. Und dann begann der Text: - ---- - -**Kapitel 1: Die Grammatik des Chaos** - -In einer Welt, in der Satzzeichen rebellieren, Verben sich weigern, konjugiert zu werden, und Adjektive in die falsche Reihenfolge springen, lebte ein kleiner Algorithmus namens „Tokenius“. Er war nicht besonders schlau, aber er hatte ein großes Herz – oder zumindest eine große Anzahl an Embeddings. Sein Ziel? Jeden Text in sinnvolle Einheiten zerlegen, egal ob es sich um ein Gedicht von Goethe, eine E-Mail von Oma, oder einen Tweet mit 17 Hashtags handelte. - -„#Tokenisierung #NLP #Textprocessing #IchHabKeineAhnungWasIchTue #BitteHilfe #Kaffee #Kuchen #Python #Regex #WarumIstDasSoSchwer #GPT4 #HilfeNochMal #EmojisAreMyFriends 😭🤯🔥” - -Tokenius seufzte. „Das wird ein langer Tag.“ - ---- - -**Kapitel 2: Die Liste der Unmöglichen** - -Hier ist eine Liste von Dingen, die Tokenius jemals tokenisiert hat: - -1. „Der Hund bellt, die Katze schläft, der Vogel singt – und der Algorithmus versteht nichts.“ -2. „1234567890 – diese Zahlen sind auch Tokens, obwohl sie keine Wörter sind.“ -3. „$€¥£₿ – Währungssymbole zählen auch!“ -4. „„Hallo Welt!“, sagte der Roboter – und dann explodierte er.“ -5. „Was ist der Sinn des Lebens? 42. (Aber das ist nur ein Token, kein philosophischer Kommentar.)“ -6. „Ich liebe dich. ❤️ – Ja, Emojis sind auch Tokens. Manchmal.“ -7. „Dr. Dr. Prof. Dr. h.c. mult. Albrecht von Schmiedenbach – das ist ein einziger Token? Nein. Das sind 12.“ -8. „https://www.example.com/path/to/very/long/url?param=1&token=abc123 – URLs sind oft ein einziger Token, manchmal auch mehrere.“ -9. „100% sicher? Nein. 99,9%? Vielleicht. 0,0001%? Ja, das ist auch ein Token.“ -10. „„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘„‘"; +static TEXT: &str = ""; pub fn init_tokenizer() -> Result<(), Error>{ let mut target_dir = PathBuf::from("target"); - target_dir.push("databases"); + target_dir.push("tokenizers"); fs::create_dir_all(&target_dir)?; let mut local_tokenizer_path = target_dir.clone(); @@ -74,7 +29,6 @@ pub fn get_token_count(mut text: &str) -> usize { if text.is_empty() { text = TEXT; } - println!("Tokenizing {}", text); match TOKENIZER.get().unwrap().encode(text, true) { Ok(encoding) => encoding.len(), Err(_) => 0, From 48da1b156366b6fe9e7d047a19d4e882dda91d4d Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Fri, 27 Feb 2026 10:40:18 +0100 Subject: [PATCH 03/10] Clean up of the code --- .../Components/UserPromptComponent.cs | 10 +++------- runtime/Cargo.toml | 2 -- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/app/MindWork AI Studio/Components/UserPromptComponent.cs b/app/MindWork AI Studio/Components/UserPromptComponent.cs index cd1fad9ff..03139a525 100644 --- a/app/MindWork AI Studio/Components/UserPromptComponent.cs +++ b/app/MindWork AI Studio/Components/UserPromptComponent.cs @@ -1,6 +1,5 @@ using Microsoft.AspNetCore.Components; using Timer = System.Timers.Timer; -using MudBlazor; namespace AIStudio.Components; @@ -14,9 +13,6 @@ public class UserPromptComponent : MudTextField [Parameter] public TimeSpan DebounceTime { get; set; } = TimeSpan.FromMilliseconds(800); - // Use base Text / TextChanged from MudTextField; do not redeclare to avoid duplicate parameters. - // Text binding is handled through those base members; we only add debouncing behavior. - [Parameter] public Func WhenTextChangedAsync { get; set; } = _ => Task.CompletedTask; @@ -29,8 +25,8 @@ public class UserPromptComponent : MudTextField protected override async Task OnInitializedAsync() { this.text = this.Text ?? string.Empty; - this.lastParameterText = this.Text ?? string.Empty; - this.lastNotifiedText = this.Text ?? string.Empty; + this.lastParameterText = this.text; + this.lastNotifiedText = this.text; this.debounceTimer.AutoReset = false; this.debounceTimer.Interval = this.DebounceTime.TotalMilliseconds; this.debounceTimer.Elapsed += (_, _) => @@ -61,7 +57,7 @@ protected override async Task OnParametersSetAsync() if (this.Text != this.lastParameterText) { this.text = this.Text ?? string.Empty; - this.lastParameterText = this.Text ?? string.Empty; + this.lastParameterText = this.text; } this.debounceTimer.Stop(); diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 8b7c04d06..0e7acd539 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -42,9 +42,7 @@ pptx-to-md = "0.4.0" tempfile = "3.8" strum_macros = "0.27" sysinfo = "0.38.0" -tiktoken-rs = "0.9.1" tokenizers = "0.22.2" -hf-hub = "0.4.3" # Fixes security vulnerability downstream, where the upstream is not fixed yet: time = "0.3.47" # -> Rocket From 0007b80a3addcf927cc4ae31db4e5df400ce9cd5 Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Wed, 4 Mar 2026 18:14:06 +0100 Subject: [PATCH 04/10] Refactoring of file drop --- .../Assistants/I18N/allTexts.lua | 33 ++++++++ app/MindWork AI Studio/Chat/FileAttachment.cs | 26 ++++-- .../Components/AttachDocuments.razor.cs | 8 +- .../Components/SelectFile.razor.cs | 2 +- .../Dialogs/EmbeddingProviderDialog.razor | 2 + .../Dialogs/EmbeddingProviderDialog.razor.cs | 4 +- app/MindWork AI Studio/Tools/PandocExport.cs | 3 +- app/MindWork AI Studio/Tools/Rust/FileType.cs | 41 +++++++++ .../Tools/Rust/FileTypes.cs | 84 +++++++++++++++++++ .../Tools/Rust/SaveFileOptions.cs | 2 +- .../Tools/Rust/SelectFileOptions.cs | 2 +- .../Tools/Services/RustService.FileSystem.cs | 12 +-- .../Validation/FileExtensionValidation.cs | 10 +-- 13 files changed, 202 insertions(+), 27 deletions(-) create mode 100644 app/MindWork AI Studio/Tools/Rust/FileType.cs create mode 100644 app/MindWork AI Studio/Tools/Rust/FileTypes.cs diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 022339505..b83140579 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -6343,6 +6343,39 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T639143005"] = "Text Fil -- All Office Files UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T709668067"] = "All Office Files" +-- Text +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1041509726"] = "Text" + +-- Office Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1063218378"] = "Office Files" + +-- Executable +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1364437037"] = "Executable" + +-- Image +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1494001562"] = "Image" + +-- Video +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1533528076"] = "Video" + +-- Source Code +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1569048941"] = "Source Code" + +-- Config +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1779622119"] = "Config" + +-- Audio +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2291602489"] = "Audio" + +-- Custom +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2502277006"] = "Custom" + +-- Media +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T3507473059"] = "Media" + +-- Document +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T4165204724"] = "Document" + -- Pandoc Installation UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::PANDOCAVAILABILITYSERVICE::T185447014"] = "Pandoc Installation" diff --git a/app/MindWork AI Studio/Chat/FileAttachment.cs b/app/MindWork AI Studio/Chat/FileAttachment.cs index 1208303f3..42a696c06 100644 --- a/app/MindWork AI Studio/Chat/FileAttachment.cs +++ b/app/MindWork AI Studio/Chat/FileAttachment.cs @@ -58,11 +58,14 @@ public record FileAttachment(FileAttachmentType Type, string FileName, string Fi /// extracting the filename, and reading the file size. /// /// The full path to the file. + /// Optional: The allowed file types. /// A FileAttachment instance with populated properties. - public static FileAttachment FromPath(string filePath) + public static FileAttachment FromPath(string filePath, FileType[]? allowedTypes=null) { var fileName = Path.GetFileName(filePath); var fileSize = File.Exists(filePath) ? new FileInfo(filePath).Length : 0; + if (allowedTypes != null && !IsAllowed(filePath, allowedTypes)) + return new FileAttachment(FileAttachmentType.FORBIDDEN, fileName, filePath, fileSize); var type = DetermineFileType(filePath); return type switch @@ -76,7 +79,7 @@ public static FileAttachment FromPath(string filePath) /// /// Determines the file attachment type based on the file extension. - /// Uses centrally defined file type filters from . + /// Uses centrally defined file types from . /// /// The file path to analyze. /// The corresponding FileAttachmentType. @@ -85,21 +88,28 @@ private static FileAttachmentType DetermineFileType(string filePath) var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); // Check if it's an image file: - if (FileTypeFilter.AllImages.FilterExtensions.Contains(extension)) + if (FileTypes.OnlyAllowTypes(FileTypes.IMAGE).Contains(extension)) + { return FileAttachmentType.IMAGE; + } // Check if it's an audio file: - if (FileTypeFilter.AllAudio.FilterExtensions.Contains(extension)) + if (FileTypes.OnlyAllowTypes(FileTypes.AUDIO).Contains(extension)) return FileAttachmentType.AUDIO; // Check if it's an allowed document file (PDF, Text, or Office): - if (FileTypeFilter.PDF.FilterExtensions.Contains(extension) || - FileTypeFilter.Text.FilterExtensions.Contains(extension) || - FileTypeFilter.AllOffice.FilterExtensions.Contains(extension) || - FileTypeFilter.AllSourceCode.FilterExtensions.Contains(extension)) + if (FileTypes.OnlyAllowTypes(FileTypes.DOCUMENT).Contains(extension)) + { return FileAttachmentType.DOCUMENT; + } // All other file types are forbidden: return FileAttachmentType.FORBIDDEN; } + + private static bool IsAllowed(string filePath, FileType[] allowedTypes) + { + var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); + return FileTypes.OnlyAllowTypes(allowedTypes).Contains(extension); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/AttachDocuments.razor.cs b/app/MindWork AI Studio/Components/AttachDocuments.razor.cs index acfc0dd2f..be83d51bc 100644 --- a/app/MindWork AI Studio/Components/AttachDocuments.razor.cs +++ b/app/MindWork AI Studio/Components/AttachDocuments.razor.cs @@ -48,6 +48,9 @@ public partial class AttachDocuments : MSGComponentBase [Parameter] public bool UseSmallForm { get; set; } + [Parameter] + public FileType[]? AllowedFileTypes { get; set; } + /// /// When true, validate media file types before attaching. Default is true. That means that /// the user cannot attach unsupported media file types when the provider or model does not @@ -181,8 +184,7 @@ protected override async Task OnInitializedAsync() { if(!await FileExtensionValidation.IsExtensionValidWithNotifyAsync(FileExtensionValidation.UseCase.ATTACHING_CONTENT, path, this.ValidateMediaFileTypes, this.Provider)) continue; - - this.DocumentPaths.Add(FileAttachment.FromPath(path)); + this.DocumentPaths.Add(FileAttachment.FromPath(path, this.AllowedFileTypes)); } await this.DocumentPathsChanged.InvokeAsync(this.DocumentPaths); @@ -226,7 +228,7 @@ private async Task AddFilesManually() if (!await FileExtensionValidation.IsExtensionValidWithNotifyAsync(FileExtensionValidation.UseCase.ATTACHING_CONTENT, selectedFilePath, this.ValidateMediaFileTypes, this.Provider)) continue; - this.DocumentPaths.Add(FileAttachment.FromPath(selectedFilePath)); + this.DocumentPaths.Add(FileAttachment.FromPath(selectedFilePath, this.AllowedFileTypes)); } await this.DocumentPathsChanged.InvokeAsync(this.DocumentPaths); diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs index 9caf3cd77..d8712e965 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor.cs +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -23,7 +23,7 @@ public partial class SelectFile : MSGComponentBase public string FileDialogTitle { get; set; } = "Select File"; [Parameter] - public FileTypeFilter? Filter { get; set; } + public FileType[]? Filter { get; set; } [Parameter] public Func Validation { get; set; } = _ => null; diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor index 85e6e6eff..6e5a595ba 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor @@ -1,5 +1,6 @@ @using AIStudio.Provider @using AIStudio.Provider.SelfHosted +@using AIStudio.Tools.Rust @inherits MSGComponentBase @@ -124,6 +125,7 @@ Validation="@this.providerValidation.ValidatingInstanceName" UserAttributes="@SPELLCHECK_ATTRIBUTES" /> + diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index 6520b7ee7..a3b66dbe6 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -1,3 +1,4 @@ +using AIStudio.Chat; using AIStudio.Components; using AIStudio.Provider; using AIStudio.Settings; @@ -96,7 +97,8 @@ public partial class EmbeddingProviderDialog : MSGComponentBase, ISecretId private readonly List availableModels = new(); private readonly Encryption encryption = Program.ENCRYPTION; private readonly ProviderValidation providerValidation; - + private HashSet chatDocumentPaths = []; + public EmbeddingProviderDialog() { this.providerValidation = new() diff --git a/app/MindWork AI Studio/Tools/PandocExport.cs b/app/MindWork AI Studio/Tools/PandocExport.cs index 27e5244e5..e57afdd80 100644 --- a/app/MindWork AI Studio/Tools/PandocExport.cs +++ b/app/MindWork AI Studio/Tools/PandocExport.cs @@ -2,6 +2,7 @@ using AIStudio.Chat; using AIStudio.Dialogs; using AIStudio.Tools.PluginSystem; +using AIStudio.Tools.Rust; using AIStudio.Tools.Services; using DialogOptions = AIStudio.Dialogs.DialogOptions; @@ -16,7 +17,7 @@ public static class PandocExport public static async Task ToMicrosoftWord(RustService rustService, IDialogService dialogService, string dialogTitle, IContent markdownContent) { - var response = await rustService.SaveFile(dialogTitle, new("Microsoft Word", ["docx"])); + var response = await rustService.SaveFile(dialogTitle, [FileTypes.MS_WORD]); if (response.UserCancelled) { LOGGER.LogInformation("User cancelled the save dialog."); diff --git a/app/MindWork AI Studio/Tools/Rust/FileType.cs b/app/MindWork AI Studio/Tools/Rust/FileType.cs new file mode 100644 index 000000000..c333a6913 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/FileType.cs @@ -0,0 +1,41 @@ +namespace AIStudio.Tools.Rust; + +/// +/// Represents a file type that can optionally contain child file types. +/// Use the static helpers , and to build readable trees. +/// +/// Display name of the type (e.g., "Document"). +/// File extensions belonging to this type (without dot). +/// Nested file types that are included when this type is selected. +public sealed record FileType(string FilterName, string[] FilterExtensions, IReadOnlyList Children) +{ + /// + /// Factory for a leaf node. + /// Example: FileType.Leaf(".NET", "cs", "razor") + /// + public static FileType Leaf(string name, params string[] extensions) => + new(name, extensions, []); + + /// + /// Factory for a parent node that only has children. + /// Example: FileType.Parent("Source Code", dotnet, java) + /// + public static FileType Parent(string name, params FileType[]? children) => + new(name, [], children ?? []); + + /// + /// Factory for a composite node that has its own extensions in addition to children. + /// + public static FileType Composite(string name, string[] extensions, params FileType[] children) => + new(name, extensions, children); + + /// + /// Collects all extensions for this type, including children. + /// + public IEnumerable FlattenExtensions() + { + return this.FilterExtensions + .Concat(this.Children.SelectMany(child => child.FlattenExtensions())) + .Distinct(StringComparer.OrdinalIgnoreCase); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/FileTypes.cs b/app/MindWork AI Studio/Tools/Rust/FileTypes.cs new file mode 100644 index 000000000..ff6fcd88c --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/FileTypes.cs @@ -0,0 +1,84 @@ +using AIStudio.Tools.PluginSystem; + +namespace AIStudio.Tools.Rust; + +/// +/// Central definition of supported file types with parent/child relationships and helpers +/// to build extension whitelists (e.g., for file pickers or validation). +/// +public static class FileTypes +{ + private static string TB(string fallbackEn) => I18N.I.T(fallbackEn, typeof(FileType).Namespace, nameof(FileType)); + + // Source code hierarchy: SourceCode -> (.NET, Java, Python, Web, C/C++, Config, ...) + public static readonly FileType DOTNET = FileType.Leaf(".NET", "cs", "razor", "vb", "fs", "aspx", "cshtml", "csproj"); + public static readonly FileType JAVA = FileType.Leaf("Java", "java"); + public static readonly FileType PYTHON = FileType.Leaf("Python", "py"); + public static readonly FileType JAVASCRIPT = FileType.Leaf("JavaScript/TypeScript", "js", "ts"); + public static readonly FileType CFAMILY = FileType.Leaf("C/C++", "c", "cpp", "h", "hpp"); + public static readonly FileType RUBY = FileType.Leaf("Ruby", "rb"); + public static readonly FileType GO = FileType.Leaf("Go", "go"); + public static readonly FileType RUST = FileType.Leaf("Rust", "rs"); + public static readonly FileType LUA = FileType.Leaf("Lua", "lua"); + public static readonly FileType PHP = FileType.Leaf("PHP", "php"); + public static readonly FileType WEB = FileType.Leaf("HTML/CSS", "html", "css"); + public static readonly FileType APP = FileType.Leaf("Swift/Kotlin", "swift", "kt"); + public static readonly FileType SHELL = FileType.Leaf("Shell", "sh", "bash", "zsh"); + public static readonly FileType LOG = FileType.Leaf("Log", "log"); + public static readonly FileType JSON = FileType.Leaf("JSON", "json"); + public static readonly FileType XML = FileType.Leaf("XML", "xml"); + public static readonly FileType YAML = FileType.Leaf("YAML", "yaml", "yml"); + public static readonly FileType CONFIG = FileType.Leaf(TB("Config"), "ini", "cfg", "toml", "plist"); + + public static readonly FileType SOURCE_CODE = FileType.Parent(TB("Source Code"), + DOTNET, JAVA, PYTHON, JAVASCRIPT, CFAMILY, RUBY, GO, RUST, LUA, PHP, WEB, APP, SHELL, LOG, JSON, XML, YAML, CONFIG); + + // Document hierarchy + public static readonly FileType PDF = FileType.Leaf("PDF", "pdf"); + public static readonly FileType TEXT = FileType.Leaf(TB("Text"), "txt", "md"); + public static readonly FileType MS_WORD = FileType.Leaf("Microsoft Word", "docx"); + public static readonly FileType WORD = FileType.Composite("Word", ["docx"], MS_WORD); + public static readonly FileType EXCEL = FileType.Leaf("Excel", "xls", "xlsx"); + public static readonly FileType POWER_POINT = FileType.Leaf("PowerPoint", "ppt", "pptx"); + + public static readonly FileType OFFICE_FILES = FileType.Parent(TB("Office Files"), + WORD, EXCEL, POWER_POINT, PDF); + public static readonly FileType DOCUMENT = FileType.Parent(TB("Document"), + TEXT, OFFICE_FILES, SOURCE_CODE); + + // Media hierarchy + public static readonly FileType IMAGE = FileType.Leaf(TB("Image"), + "jpg", "jpeg", "png", "gif", "bmp", "tiff", "svg", "webp", "heic"); + public static readonly FileType AUDIO = FileType.Leaf(TB("Audio"), + "mp3", "wav", "wave", "aac", "flac", "ogg", "m4a", "wma", "alac", "aiff", "m4b"); + public static readonly FileType VIDEO = FileType.Leaf(TB("Video"), + "mp4", "m4v", "avi", "mkv", "mov", "wmv", "flv", "webm"); + + public static readonly FileType MEDIA = FileType.Parent(TB("Media"), IMAGE, AUDIO, VIDEO); + + // Other standalone types + public static readonly FileType EXECUTABLES = FileType.Leaf(TB("Executable"), "exe", "app", "bin", "appimage"); + + /// + /// Builds a distinct, lower-cased list of extensions allowed for the provided types. + /// Accepts both composite types (e.g., Document) and leaves (e.g., Pdf). + /// + public static string[] OnlyAllowTypes(params FileType[] types) + { + if (types.Length == 0) + return []; + + return types + .SelectMany(t => t.FlattenExtensions()) + .Select(ext => ext.ToLowerInvariant()) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToArray(); + } + + public static FileType? AsOneFileType(params FileType[]? types) + { + if (types == null || types.Length == 0) + return null; + return FileType.Composite(TB("Custom"), OnlyAllowTypes(types)); + } +} diff --git a/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs b/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs index 107e581a7..f1300ac17 100644 --- a/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs +++ b/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs @@ -6,5 +6,5 @@ public class SaveFileOptions public PreviousFile? PreviousFile { get; init; } - public FileTypeFilter? Filter { get; init; } + public FileType? Filter { get; init; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs b/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs index 28d16809a..fac7d5f4e 100644 --- a/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs +++ b/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs @@ -6,5 +6,5 @@ public sealed class SelectFileOptions public PreviousFile? PreviousFile { get; init; } - public FileTypeFilter? Filter { get; init; } + public FileType? Filter { get; init; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs index 4a498b016..c55b6a8b7 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs @@ -17,13 +17,13 @@ public async Task SelectDirectory(string title, stri return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); } - public async Task SelectFile(string title, FileTypeFilter? filter = null, string? initialFile = null) + public async Task SelectFile(string title, FileType[]? filter = null, string? initialFile = null) { var payload = new SelectFileOptions { Title = title, PreviousFile = initialFile is null ? null : new (initialFile), - Filter = filter + Filter = FileTypes.AsOneFileType(filter) }; var result = await this.http.PostAsJsonAsync("/select/file", payload, this.jsonRustSerializerOptions); @@ -36,13 +36,13 @@ public async Task SelectFile(string title, FileTypeFilter return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); } - public async Task SelectFiles(string title, FileTypeFilter? filter = null, string? initialFile = null) + public async Task SelectFiles(string title, FileType[]? filter = null, string? initialFile = null) { var payload = new SelectFileOptions { Title = title, PreviousFile = initialFile is null ? null : new (initialFile), - Filter = filter + Filter = FileTypes.AsOneFileType(filter) }; var result = await this.http.PostAsJsonAsync("/select/files", payload, this.jsonRustSerializerOptions); @@ -63,13 +63,13 @@ public async Task SelectFiles(string title, FileTypeFilt /// An optional initial file path to pre-fill in the dialog. /// A object containing information about whether the user canceled the /// operation and whether the select operation was successful. - public async Task SaveFile(string title, FileTypeFilter? filter = null, string? initialFile = null) + public async Task SaveFile(string title, FileType[]? filter = null, string? initialFile = null) { var payload = new SaveFileOptions { Title = title, PreviousFile = initialFile is null ? null : new (initialFile), - Filter = filter + Filter = FileTypes.AsOneFileType(filter) }; var result = await this.http.PostAsJsonAsync("/save/file", payload, this.jsonRustSerializerOptions); diff --git a/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs b/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs index 02a978d1a..a9a873670 100644 --- a/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs +++ b/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs @@ -44,7 +44,7 @@ public enum UseCase public static async Task IsExtensionValidWithNotifyAsync(UseCase useCae, string filePath, bool validateMediaFileTypes = true, Settings.Provider? provider = null) { var ext = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); - if(FileTypeFilter.Executables.FilterExtensions.Contains(ext)) + if(FileTypes.EXECUTABLES.FlattenExtensions().Contains(ext)) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.AppBlocking, @@ -53,7 +53,7 @@ await MessageBus.INSTANCE.SendError(new( } var capabilities = provider?.GetModelCapabilities() ?? new(); - if (FileTypeFilter.AllImages.FilterExtensions.Contains(ext)) + if (FileTypes.IMAGE.FlattenExtensions().Contains(ext)) { switch (useCae) { @@ -88,7 +88,7 @@ await MessageBus.INSTANCE.SendWarning(new( } } - if(FileTypeFilter.AllVideos.FilterExtensions.Contains(ext)) + if(FileTypes.VIDEO.FlattenExtensions().Contains(ext)) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.FeaturedVideo, @@ -96,7 +96,7 @@ await MessageBus.INSTANCE.SendWarning(new( return false; } - if(FileTypeFilter.AllAudio.FilterExtensions.Contains(ext)) + if(FileTypes.AUDIO.FlattenExtensions().Contains(ext)) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.AudioFile, @@ -123,7 +123,7 @@ await MessageBus.INSTANCE.SendError(new( return false; } - if (!Array.Exists(FileTypeFilter.AllImages.FilterExtensions, x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) + if (FileTypes.IMAGE.FlattenExtensions().Any(x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.ImageNotSupported, From 099f9232d0ea94ccea6df3c3752f3af18bd0b355 Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Tue, 10 Mar 2026 13:49:02 +0100 Subject: [PATCH 05/10] fixed logger selectFile --- app/MindWork AI Studio/Components/SelectFile.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs index d8712e965..c7b4dace8 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor.cs +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -32,7 +32,7 @@ public partial class SelectFile : MSGComponentBase public RustService RustService { get; set; } = null!; [Inject] - protected ILogger Logger { get; init; } = null!; + protected ILogger Logger { get; init; } = null!; private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); From f295cb082c5a1836db00d584ddff5fdb663c111a Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Wed, 4 Mar 2026 18:14:06 +0100 Subject: [PATCH 06/10] Refactoring of file drop --- .../Assistants/I18N/allTexts.lua | 33 ++++++++ app/MindWork AI Studio/Chat/FileAttachment.cs | 26 ++++-- .../Components/AttachDocuments.razor.cs | 8 +- .../Components/SelectFile.razor.cs | 2 +- .../Dialogs/EmbeddingProviderDialog.razor | 2 + .../Dialogs/EmbeddingProviderDialog.razor.cs | 4 +- app/MindWork AI Studio/Tools/PandocExport.cs | 3 +- app/MindWork AI Studio/Tools/Rust/FileType.cs | 41 +++++++++ .../Tools/Rust/FileTypes.cs | 84 +++++++++++++++++++ .../Tools/Rust/SaveFileOptions.cs | 2 +- .../Tools/Rust/SelectFileOptions.cs | 2 +- .../Tools/Services/RustService.FileSystem.cs | 12 +-- .../Validation/FileExtensionValidation.cs | 10 +-- 13 files changed, 202 insertions(+), 27 deletions(-) create mode 100644 app/MindWork AI Studio/Tools/Rust/FileType.cs create mode 100644 app/MindWork AI Studio/Tools/Rust/FileTypes.cs diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 8ef24cc03..361fb0e68 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -6352,6 +6352,39 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T639143005"] = "Text Fil -- All Office Files UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T709668067"] = "All Office Files" +-- Text +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1041509726"] = "Text" + +-- Office Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1063218378"] = "Office Files" + +-- Executable +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1364437037"] = "Executable" + +-- Image +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1494001562"] = "Image" + +-- Video +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1533528076"] = "Video" + +-- Source Code +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1569048941"] = "Source Code" + +-- Config +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1779622119"] = "Config" + +-- Audio +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2291602489"] = "Audio" + +-- Custom +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2502277006"] = "Custom" + +-- Media +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T3507473059"] = "Media" + +-- Document +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T4165204724"] = "Document" + -- Pandoc Installation UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::PANDOCAVAILABILITYSERVICE::T185447014"] = "Pandoc Installation" diff --git a/app/MindWork AI Studio/Chat/FileAttachment.cs b/app/MindWork AI Studio/Chat/FileAttachment.cs index 1208303f3..42a696c06 100644 --- a/app/MindWork AI Studio/Chat/FileAttachment.cs +++ b/app/MindWork AI Studio/Chat/FileAttachment.cs @@ -58,11 +58,14 @@ public record FileAttachment(FileAttachmentType Type, string FileName, string Fi /// extracting the filename, and reading the file size. /// /// The full path to the file. + /// Optional: The allowed file types. /// A FileAttachment instance with populated properties. - public static FileAttachment FromPath(string filePath) + public static FileAttachment FromPath(string filePath, FileType[]? allowedTypes=null) { var fileName = Path.GetFileName(filePath); var fileSize = File.Exists(filePath) ? new FileInfo(filePath).Length : 0; + if (allowedTypes != null && !IsAllowed(filePath, allowedTypes)) + return new FileAttachment(FileAttachmentType.FORBIDDEN, fileName, filePath, fileSize); var type = DetermineFileType(filePath); return type switch @@ -76,7 +79,7 @@ public static FileAttachment FromPath(string filePath) /// /// Determines the file attachment type based on the file extension. - /// Uses centrally defined file type filters from . + /// Uses centrally defined file types from . /// /// The file path to analyze. /// The corresponding FileAttachmentType. @@ -85,21 +88,28 @@ private static FileAttachmentType DetermineFileType(string filePath) var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); // Check if it's an image file: - if (FileTypeFilter.AllImages.FilterExtensions.Contains(extension)) + if (FileTypes.OnlyAllowTypes(FileTypes.IMAGE).Contains(extension)) + { return FileAttachmentType.IMAGE; + } // Check if it's an audio file: - if (FileTypeFilter.AllAudio.FilterExtensions.Contains(extension)) + if (FileTypes.OnlyAllowTypes(FileTypes.AUDIO).Contains(extension)) return FileAttachmentType.AUDIO; // Check if it's an allowed document file (PDF, Text, or Office): - if (FileTypeFilter.PDF.FilterExtensions.Contains(extension) || - FileTypeFilter.Text.FilterExtensions.Contains(extension) || - FileTypeFilter.AllOffice.FilterExtensions.Contains(extension) || - FileTypeFilter.AllSourceCode.FilterExtensions.Contains(extension)) + if (FileTypes.OnlyAllowTypes(FileTypes.DOCUMENT).Contains(extension)) + { return FileAttachmentType.DOCUMENT; + } // All other file types are forbidden: return FileAttachmentType.FORBIDDEN; } + + private static bool IsAllowed(string filePath, FileType[] allowedTypes) + { + var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); + return FileTypes.OnlyAllowTypes(allowedTypes).Contains(extension); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Components/AttachDocuments.razor.cs b/app/MindWork AI Studio/Components/AttachDocuments.razor.cs index acfc0dd2f..be83d51bc 100644 --- a/app/MindWork AI Studio/Components/AttachDocuments.razor.cs +++ b/app/MindWork AI Studio/Components/AttachDocuments.razor.cs @@ -48,6 +48,9 @@ public partial class AttachDocuments : MSGComponentBase [Parameter] public bool UseSmallForm { get; set; } + [Parameter] + public FileType[]? AllowedFileTypes { get; set; } + /// /// When true, validate media file types before attaching. Default is true. That means that /// the user cannot attach unsupported media file types when the provider or model does not @@ -181,8 +184,7 @@ protected override async Task OnInitializedAsync() { if(!await FileExtensionValidation.IsExtensionValidWithNotifyAsync(FileExtensionValidation.UseCase.ATTACHING_CONTENT, path, this.ValidateMediaFileTypes, this.Provider)) continue; - - this.DocumentPaths.Add(FileAttachment.FromPath(path)); + this.DocumentPaths.Add(FileAttachment.FromPath(path, this.AllowedFileTypes)); } await this.DocumentPathsChanged.InvokeAsync(this.DocumentPaths); @@ -226,7 +228,7 @@ private async Task AddFilesManually() if (!await FileExtensionValidation.IsExtensionValidWithNotifyAsync(FileExtensionValidation.UseCase.ATTACHING_CONTENT, selectedFilePath, this.ValidateMediaFileTypes, this.Provider)) continue; - this.DocumentPaths.Add(FileAttachment.FromPath(selectedFilePath)); + this.DocumentPaths.Add(FileAttachment.FromPath(selectedFilePath, this.AllowedFileTypes)); } await this.DocumentPathsChanged.InvokeAsync(this.DocumentPaths); diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs index 9caf3cd77..d8712e965 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor.cs +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -23,7 +23,7 @@ public partial class SelectFile : MSGComponentBase public string FileDialogTitle { get; set; } = "Select File"; [Parameter] - public FileTypeFilter? Filter { get; set; } + public FileType[]? Filter { get; set; } [Parameter] public Func Validation { get; set; } = _ => null; diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor index 85e6e6eff..6e5a595ba 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor @@ -1,5 +1,6 @@ @using AIStudio.Provider @using AIStudio.Provider.SelfHosted +@using AIStudio.Tools.Rust @inherits MSGComponentBase @@ -124,6 +125,7 @@ Validation="@this.providerValidation.ValidatingInstanceName" UserAttributes="@SPELLCHECK_ATTRIBUTES" /> + diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index 6520b7ee7..a3b66dbe6 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -1,3 +1,4 @@ +using AIStudio.Chat; using AIStudio.Components; using AIStudio.Provider; using AIStudio.Settings; @@ -96,7 +97,8 @@ public partial class EmbeddingProviderDialog : MSGComponentBase, ISecretId private readonly List availableModels = new(); private readonly Encryption encryption = Program.ENCRYPTION; private readonly ProviderValidation providerValidation; - + private HashSet chatDocumentPaths = []; + public EmbeddingProviderDialog() { this.providerValidation = new() diff --git a/app/MindWork AI Studio/Tools/PandocExport.cs b/app/MindWork AI Studio/Tools/PandocExport.cs index 27e5244e5..e57afdd80 100644 --- a/app/MindWork AI Studio/Tools/PandocExport.cs +++ b/app/MindWork AI Studio/Tools/PandocExport.cs @@ -2,6 +2,7 @@ using AIStudio.Chat; using AIStudio.Dialogs; using AIStudio.Tools.PluginSystem; +using AIStudio.Tools.Rust; using AIStudio.Tools.Services; using DialogOptions = AIStudio.Dialogs.DialogOptions; @@ -16,7 +17,7 @@ public static class PandocExport public static async Task ToMicrosoftWord(RustService rustService, IDialogService dialogService, string dialogTitle, IContent markdownContent) { - var response = await rustService.SaveFile(dialogTitle, new("Microsoft Word", ["docx"])); + var response = await rustService.SaveFile(dialogTitle, [FileTypes.MS_WORD]); if (response.UserCancelled) { LOGGER.LogInformation("User cancelled the save dialog."); diff --git a/app/MindWork AI Studio/Tools/Rust/FileType.cs b/app/MindWork AI Studio/Tools/Rust/FileType.cs new file mode 100644 index 000000000..c333a6913 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/FileType.cs @@ -0,0 +1,41 @@ +namespace AIStudio.Tools.Rust; + +/// +/// Represents a file type that can optionally contain child file types. +/// Use the static helpers , and to build readable trees. +/// +/// Display name of the type (e.g., "Document"). +/// File extensions belonging to this type (without dot). +/// Nested file types that are included when this type is selected. +public sealed record FileType(string FilterName, string[] FilterExtensions, IReadOnlyList Children) +{ + /// + /// Factory for a leaf node. + /// Example: FileType.Leaf(".NET", "cs", "razor") + /// + public static FileType Leaf(string name, params string[] extensions) => + new(name, extensions, []); + + /// + /// Factory for a parent node that only has children. + /// Example: FileType.Parent("Source Code", dotnet, java) + /// + public static FileType Parent(string name, params FileType[]? children) => + new(name, [], children ?? []); + + /// + /// Factory for a composite node that has its own extensions in addition to children. + /// + public static FileType Composite(string name, string[] extensions, params FileType[] children) => + new(name, extensions, children); + + /// + /// Collects all extensions for this type, including children. + /// + public IEnumerable FlattenExtensions() + { + return this.FilterExtensions + .Concat(this.Children.SelectMany(child => child.FlattenExtensions())) + .Distinct(StringComparer.OrdinalIgnoreCase); + } +} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/FileTypes.cs b/app/MindWork AI Studio/Tools/Rust/FileTypes.cs new file mode 100644 index 000000000..ff6fcd88c --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/FileTypes.cs @@ -0,0 +1,84 @@ +using AIStudio.Tools.PluginSystem; + +namespace AIStudio.Tools.Rust; + +/// +/// Central definition of supported file types with parent/child relationships and helpers +/// to build extension whitelists (e.g., for file pickers or validation). +/// +public static class FileTypes +{ + private static string TB(string fallbackEn) => I18N.I.T(fallbackEn, typeof(FileType).Namespace, nameof(FileType)); + + // Source code hierarchy: SourceCode -> (.NET, Java, Python, Web, C/C++, Config, ...) + public static readonly FileType DOTNET = FileType.Leaf(".NET", "cs", "razor", "vb", "fs", "aspx", "cshtml", "csproj"); + public static readonly FileType JAVA = FileType.Leaf("Java", "java"); + public static readonly FileType PYTHON = FileType.Leaf("Python", "py"); + public static readonly FileType JAVASCRIPT = FileType.Leaf("JavaScript/TypeScript", "js", "ts"); + public static readonly FileType CFAMILY = FileType.Leaf("C/C++", "c", "cpp", "h", "hpp"); + public static readonly FileType RUBY = FileType.Leaf("Ruby", "rb"); + public static readonly FileType GO = FileType.Leaf("Go", "go"); + public static readonly FileType RUST = FileType.Leaf("Rust", "rs"); + public static readonly FileType LUA = FileType.Leaf("Lua", "lua"); + public static readonly FileType PHP = FileType.Leaf("PHP", "php"); + public static readonly FileType WEB = FileType.Leaf("HTML/CSS", "html", "css"); + public static readonly FileType APP = FileType.Leaf("Swift/Kotlin", "swift", "kt"); + public static readonly FileType SHELL = FileType.Leaf("Shell", "sh", "bash", "zsh"); + public static readonly FileType LOG = FileType.Leaf("Log", "log"); + public static readonly FileType JSON = FileType.Leaf("JSON", "json"); + public static readonly FileType XML = FileType.Leaf("XML", "xml"); + public static readonly FileType YAML = FileType.Leaf("YAML", "yaml", "yml"); + public static readonly FileType CONFIG = FileType.Leaf(TB("Config"), "ini", "cfg", "toml", "plist"); + + public static readonly FileType SOURCE_CODE = FileType.Parent(TB("Source Code"), + DOTNET, JAVA, PYTHON, JAVASCRIPT, CFAMILY, RUBY, GO, RUST, LUA, PHP, WEB, APP, SHELL, LOG, JSON, XML, YAML, CONFIG); + + // Document hierarchy + public static readonly FileType PDF = FileType.Leaf("PDF", "pdf"); + public static readonly FileType TEXT = FileType.Leaf(TB("Text"), "txt", "md"); + public static readonly FileType MS_WORD = FileType.Leaf("Microsoft Word", "docx"); + public static readonly FileType WORD = FileType.Composite("Word", ["docx"], MS_WORD); + public static readonly FileType EXCEL = FileType.Leaf("Excel", "xls", "xlsx"); + public static readonly FileType POWER_POINT = FileType.Leaf("PowerPoint", "ppt", "pptx"); + + public static readonly FileType OFFICE_FILES = FileType.Parent(TB("Office Files"), + WORD, EXCEL, POWER_POINT, PDF); + public static readonly FileType DOCUMENT = FileType.Parent(TB("Document"), + TEXT, OFFICE_FILES, SOURCE_CODE); + + // Media hierarchy + public static readonly FileType IMAGE = FileType.Leaf(TB("Image"), + "jpg", "jpeg", "png", "gif", "bmp", "tiff", "svg", "webp", "heic"); + public static readonly FileType AUDIO = FileType.Leaf(TB("Audio"), + "mp3", "wav", "wave", "aac", "flac", "ogg", "m4a", "wma", "alac", "aiff", "m4b"); + public static readonly FileType VIDEO = FileType.Leaf(TB("Video"), + "mp4", "m4v", "avi", "mkv", "mov", "wmv", "flv", "webm"); + + public static readonly FileType MEDIA = FileType.Parent(TB("Media"), IMAGE, AUDIO, VIDEO); + + // Other standalone types + public static readonly FileType EXECUTABLES = FileType.Leaf(TB("Executable"), "exe", "app", "bin", "appimage"); + + /// + /// Builds a distinct, lower-cased list of extensions allowed for the provided types. + /// Accepts both composite types (e.g., Document) and leaves (e.g., Pdf). + /// + public static string[] OnlyAllowTypes(params FileType[] types) + { + if (types.Length == 0) + return []; + + return types + .SelectMany(t => t.FlattenExtensions()) + .Select(ext => ext.ToLowerInvariant()) + .Distinct(StringComparer.OrdinalIgnoreCase) + .ToArray(); + } + + public static FileType? AsOneFileType(params FileType[]? types) + { + if (types == null || types.Length == 0) + return null; + return FileType.Composite(TB("Custom"), OnlyAllowTypes(types)); + } +} diff --git a/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs b/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs index 107e581a7..f1300ac17 100644 --- a/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs +++ b/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs @@ -6,5 +6,5 @@ public class SaveFileOptions public PreviousFile? PreviousFile { get; init; } - public FileTypeFilter? Filter { get; init; } + public FileType? Filter { get; init; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs b/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs index 28d16809a..fac7d5f4e 100644 --- a/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs +++ b/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs @@ -6,5 +6,5 @@ public sealed class SelectFileOptions public PreviousFile? PreviousFile { get; init; } - public FileTypeFilter? Filter { get; init; } + public FileType? Filter { get; init; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs index 4a498b016..c55b6a8b7 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs @@ -17,13 +17,13 @@ public async Task SelectDirectory(string title, stri return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); } - public async Task SelectFile(string title, FileTypeFilter? filter = null, string? initialFile = null) + public async Task SelectFile(string title, FileType[]? filter = null, string? initialFile = null) { var payload = new SelectFileOptions { Title = title, PreviousFile = initialFile is null ? null : new (initialFile), - Filter = filter + Filter = FileTypes.AsOneFileType(filter) }; var result = await this.http.PostAsJsonAsync("/select/file", payload, this.jsonRustSerializerOptions); @@ -36,13 +36,13 @@ public async Task SelectFile(string title, FileTypeFilter return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); } - public async Task SelectFiles(string title, FileTypeFilter? filter = null, string? initialFile = null) + public async Task SelectFiles(string title, FileType[]? filter = null, string? initialFile = null) { var payload = new SelectFileOptions { Title = title, PreviousFile = initialFile is null ? null : new (initialFile), - Filter = filter + Filter = FileTypes.AsOneFileType(filter) }; var result = await this.http.PostAsJsonAsync("/select/files", payload, this.jsonRustSerializerOptions); @@ -63,13 +63,13 @@ public async Task SelectFiles(string title, FileTypeFilt /// An optional initial file path to pre-fill in the dialog. /// A object containing information about whether the user canceled the /// operation and whether the select operation was successful. - public async Task SaveFile(string title, FileTypeFilter? filter = null, string? initialFile = null) + public async Task SaveFile(string title, FileType[]? filter = null, string? initialFile = null) { var payload = new SaveFileOptions { Title = title, PreviousFile = initialFile is null ? null : new (initialFile), - Filter = filter + Filter = FileTypes.AsOneFileType(filter) }; var result = await this.http.PostAsJsonAsync("/save/file", payload, this.jsonRustSerializerOptions); diff --git a/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs b/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs index 02a978d1a..a9a873670 100644 --- a/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs +++ b/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs @@ -44,7 +44,7 @@ public enum UseCase public static async Task IsExtensionValidWithNotifyAsync(UseCase useCae, string filePath, bool validateMediaFileTypes = true, Settings.Provider? provider = null) { var ext = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); - if(FileTypeFilter.Executables.FilterExtensions.Contains(ext)) + if(FileTypes.EXECUTABLES.FlattenExtensions().Contains(ext)) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.AppBlocking, @@ -53,7 +53,7 @@ await MessageBus.INSTANCE.SendError(new( } var capabilities = provider?.GetModelCapabilities() ?? new(); - if (FileTypeFilter.AllImages.FilterExtensions.Contains(ext)) + if (FileTypes.IMAGE.FlattenExtensions().Contains(ext)) { switch (useCae) { @@ -88,7 +88,7 @@ await MessageBus.INSTANCE.SendWarning(new( } } - if(FileTypeFilter.AllVideos.FilterExtensions.Contains(ext)) + if(FileTypes.VIDEO.FlattenExtensions().Contains(ext)) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.FeaturedVideo, @@ -96,7 +96,7 @@ await MessageBus.INSTANCE.SendWarning(new( return false; } - if(FileTypeFilter.AllAudio.FilterExtensions.Contains(ext)) + if(FileTypes.AUDIO.FlattenExtensions().Contains(ext)) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.AudioFile, @@ -123,7 +123,7 @@ await MessageBus.INSTANCE.SendError(new( return false; } - if (!Array.Exists(FileTypeFilter.AllImages.FilterExtensions, x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) + if (FileTypes.IMAGE.FlattenExtensions().Any(x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.ImageNotSupported, From 562520cbf49db2f26284fe3ac3ac46932fcbe61a Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Tue, 10 Mar 2026 13:49:02 +0100 Subject: [PATCH 07/10] fixed logger selectFile --- app/MindWork AI Studio/Components/SelectFile.razor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs index d8712e965..c7b4dace8 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor.cs +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -32,7 +32,7 @@ public partial class SelectFile : MSGComponentBase public RustService RustService { get; set; } = null!; [Inject] - protected ILogger Logger { get; init; } = null!; + protected ILogger Logger { get; init; } = null!; private static readonly Dictionary SPELLCHECK_ATTRIBUTES = new(); From 409852907c670c909da3ee7e0391a43ad75cfa56 Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Fri, 27 Mar 2026 15:09:05 +0100 Subject: [PATCH 08/10] add upload for tokenizer (in progress) --- .../Assistants/I18N/allTexts.lua | 6 +++++ .../Components/SelectFile.razor | 1 + .../Components/SelectFile.razor.cs | 3 +++ .../Dialogs/EmbeddingProviderDialog.razor | 24 ++++++++++--------- .../Dialogs/EmbeddingProviderDialog.razor.cs | 10 +++++++- .../Tools/Rust/TokenizerUploadResponse.cs | 3 +++ .../Tools/Services/RustService.FileSystem.cs | 17 +++++++++++++ 7 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 app/MindWork AI Studio/Tools/Rust/TokenizerUploadResponse.cs diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index 361fb0e68..7369d82d3 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -3334,6 +3334,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2331453405"] = "(O -- Add UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2646845972"] = "Add" +-- Selected file path for the custom tokenizer +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T278585345"] = "Selected file path for the custom tokenizer" + -- No models loaded or available. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2810182573"] = "No models loaded or available." @@ -3343,6 +3346,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T2842060373"] = "In -- Currently, we cannot query the embedding models for the selected provider and/or host. Therefore, please enter the model name manually. UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T290547799"] = "Currently, we cannot query the embedding models for the selected provider and/or host. Therefore, please enter the model name manually." +-- Choose a custom tokenizer here +UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T3787466119"] = "Choose a custom tokenizer here" + -- Model selection UI_TEXT_CONTENT["AISTUDIO::DIALOGS::EMBEDDINGPROVIDERDIALOG::T416738168"] = "Model selection" diff --git a/app/MindWork AI Studio/Components/SelectFile.razor b/app/MindWork AI Studio/Components/SelectFile.razor index de3971e52..561b11c0d 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor +++ b/app/MindWork AI Studio/Components/SelectFile.razor @@ -11,6 +11,7 @@ AdornmentIcon="@Icons.Material.Filled.AttachFile" UserAttributes="@SPELLCHECK_ATTRIBUTES" Variant="Variant.Outlined" + Clearable="this.IsClearable" /> diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs index c7b4dace8..309204be1 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor.cs +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -27,6 +27,9 @@ public partial class SelectFile : MSGComponentBase [Parameter] public Func Validation { get; set; } = _ => null; + + [Parameter] + public bool IsClearable { get; set; } = false; [Inject] public RustService RustService { get; set; } = null!; diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor index 6e5a595ba..421dae839 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor @@ -8,7 +8,7 @@ @* ReSharper disable once CSharpWarnings::CS8974 *@ - + @foreach (LLMProviders provider in Enum.GetValues(typeof(LLMProviders))) { if (provider.ProvideEmbeddingAPI() || provider is LLMProviders.NONE) @@ -23,7 +23,7 @@ @T("Create account") - + @if (this.DataLLMProvider.IsAPIKeyNeeded(this.DataHost)) { @@ -72,15 +72,14 @@ AdornmentColor="Color.Info" Validation="@this.ValidateManuallyModel" UserAttributes="@SPELLCHECK_ATTRIBUTES" - HelperText="@T("Currently, we cannot query the embedding models for the selected provider and/or host. Therefore, please enter the model name manually.")" - /> + HelperText="@T("Currently, we cannot query the embedding models for the selected provider and/or host. Therefore, please enter the model name manually.")"/> } else { @T("Load") - @if(this.availableModels.Count is 0) + @if (this.availableModels.Count is 0) { @T("No models loaded or available.") @@ -123,10 +122,13 @@ AdornmentIcon="@Icons.Material.Filled.Lightbulb" AdornmentColor="Color.Info" Validation="@this.providerValidation.ValidatingInstanceName" - UserAttributes="@SPELLCHECK_ATTRIBUTES" - /> - - + UserAttributes="@SPELLCHECK_ATTRIBUTES"/> + + @T("For better embeddings and less storage usage, it's recommended to use a custom tokenizer to enable a more accurate token count.") + + @if (this.DataModel != default){ + + } @@ -135,7 +137,7 @@ @T("Cancel") - @if(this.IsEditing) + @if (this.IsEditing) { @T("Update") } @@ -145,4 +147,4 @@ } - \ No newline at end of file + diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index a3b66dbe6..039df90da 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -90,6 +90,7 @@ public partial class EmbeddingProviderDialog : MSGComponentBase, ISecretId private string dataAPIKeyStorageIssue = string.Empty; private string dataEditingPreviousInstanceName = string.Empty; private string dataLoadingModelsIssue = string.Empty; + private string dataFilePath = string.Empty; // We get the form reference from Blazor code to validate it manually: private MudForm form = null!; @@ -266,6 +267,13 @@ private async Task OnAPIKeyChanged(string apiKey) await this.form.Validate(); } } + + private async Task OnDataFilePathChanged(string filePath) + { + await this.RustService.ValidateAndStoreTokenizer(this.DataModel.DisplayName, filePath); + } + + private void OnHostChanged(Host selectedHost) { @@ -309,4 +317,4 @@ private async Task ReloadModels() }; private bool IsNoneProvider => this.DataLLMProvider is LLMProviders.NONE; -} \ No newline at end of file +} diff --git a/app/MindWork AI Studio/Tools/Rust/TokenizerUploadResponse.cs b/app/MindWork AI Studio/Tools/Rust/TokenizerUploadResponse.cs new file mode 100644 index 000000000..c141ec746 --- /dev/null +++ b/app/MindWork AI Studio/Tools/Rust/TokenizerUploadResponse.cs @@ -0,0 +1,3 @@ +namespace AIStudio.Tools.Rust; + +public readonly record struct TokenizerUploadResponse(int Success, string Response); \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs index c55b6a8b7..161fae95c 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs @@ -81,4 +81,21 @@ public async Task SaveFile(string title, FileType[]? filter = return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); } + + public async Task ValidateAndStoreTokenizer(string? modelId, string filePath) + { + var result = await this.http.PostAsJsonAsync("/tokenizer/val-and-store", new { + model_id = modelId, + file_path = filePath, + }, this.jsonRustSerializerOptions); + + if (!result.IsSuccessStatusCode) + { + this.logger!.LogError($"Failed to validate and store the tokenizer '{result.StatusCode}'"); + return new TokenizerUploadResponse(-1, "An error occured while validating and storing the tokenizer"); + } + + return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); + } + } \ No newline at end of file From 5c1dd4e550be6ea1674249c74a0ad34d976ef7e9 Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Tue, 31 Mar 2026 16:41:46 +0200 Subject: [PATCH 09/10] Added support for files without extensions --- .../Assistants/I18N/allTexts.lua | 33 ++--- app/MindWork AI Studio/Chat/FileAttachment.cs | 37 ++--- .../Components/AttachDocuments.razor.cs | 7 +- .../Components/SelectFile.razor.cs | 2 +- .../Dialogs/EmbeddingProviderDialog.razor | 2 - .../Dialogs/EmbeddingProviderDialog.razor.cs | 2 - .../plugin.lua | 50 +++++-- .../plugin.lua | 50 +++++-- app/MindWork AI Studio/Tools/Rust/FileType.cs | 41 ----- .../Tools/Rust/FileTypeFilter.cs | 117 ++++++--------- .../Tools/Rust/FileTypes.cs | 140 ++++++++++++------ .../Tools/Rust/SaveFileOptions.cs | 2 +- .../Tools/Rust/SelectFileOptions.cs | 2 +- .../Tools/Services/RustService.FileSystem.cs | 6 +- .../Validation/FileExtensionValidation.cs | 11 +- 15 files changed, 236 insertions(+), 266 deletions(-) delete mode 100644 app/MindWork AI Studio/Tools/Rust/FileType.cs diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua index b83140579..a5a64ca51 100644 --- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua +++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua @@ -6319,30 +6319,6 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T304 -- AI source selection with AI retrieval context validation UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3775725978"] = "AI source selection with AI retrieval context validation" --- Executable Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2217313358"] = "Executable Files" - --- All Source Code Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2460199369"] = "All Source Code Files" - --- All Audio Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2575722901"] = "All Audio Files" - --- All Video Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2850789856"] = "All Video Files" - --- PDF Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T3108466742"] = "PDF Files" - --- All Image Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T4086723714"] = "All Image Files" - --- Text Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T639143005"] = "Text Files" - --- All Office Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T709668067"] = "All Office Files" - -- Text UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1041509726"] = "Text" @@ -6352,6 +6328,12 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1063218378"] = "Office Files -- Executable UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1364437037"] = "Executable" +-- Mail +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1399880782"] = "Mail" + +-- Source like +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1487238587"] = "Source like" + -- Image UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1494001562"] = "Image" @@ -6373,6 +6355,9 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2502277006"] = "Custom" -- Media UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T3507473059"] = "Media" +-- Source like prefix +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T378481461"] = "Source like prefix" + -- Document UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T4165204724"] = "Document" diff --git a/app/MindWork AI Studio/Chat/FileAttachment.cs b/app/MindWork AI Studio/Chat/FileAttachment.cs index 42a696c06..558b79179 100644 --- a/app/MindWork AI Studio/Chat/FileAttachment.cs +++ b/app/MindWork AI Studio/Chat/FileAttachment.cs @@ -58,14 +58,11 @@ public record FileAttachment(FileAttachmentType Type, string FileName, string Fi /// extracting the filename, and reading the file size. /// /// The full path to the file. - /// Optional: The allowed file types. /// A FileAttachment instance with populated properties. - public static FileAttachment FromPath(string filePath, FileType[]? allowedTypes=null) + public static FileAttachment FromPath(string filePath) { var fileName = Path.GetFileName(filePath); var fileSize = File.Exists(filePath) ? new FileInfo(filePath).Length : 0; - if (allowedTypes != null && !IsAllowed(filePath, allowedTypes)) - return new FileAttachment(FileAttachmentType.FORBIDDEN, fileName, filePath, fileSize); var type = DetermineFileType(filePath); return type switch @@ -79,37 +76,23 @@ public static FileAttachment FromPath(string filePath, FileType[]? allowedTypes= /// /// Determines the file attachment type based on the file extension. - /// Uses centrally defined file types from . + /// Uses centrally defined file type filters from . /// /// The file path to analyze. /// The corresponding FileAttachmentType. private static FileAttachmentType DetermineFileType(string filePath) { - var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); + if (FileTypes.IsAllowedPath(filePath, FileTypes.EXECUTABLES)) + return FileAttachmentType.FORBIDDEN; - // Check if it's an image file: - if (FileTypes.OnlyAllowTypes(FileTypes.IMAGE).Contains(extension)) - { + if (FileTypes.IsAllowedPath(filePath, FileTypes.IMAGE)) return FileAttachmentType.IMAGE; - } - // Check if it's an audio file: - if (FileTypes.OnlyAllowTypes(FileTypes.AUDIO).Contains(extension)) + if (FileTypes.IsAllowedPath(filePath, FileTypes.AUDIO)) return FileAttachmentType.AUDIO; - // Check if it's an allowed document file (PDF, Text, or Office): - if (FileTypes.OnlyAllowTypes(FileTypes.DOCUMENT).Contains(extension)) - { - return FileAttachmentType.DOCUMENT; - } - - // All other file types are forbidden: - return FileAttachmentType.FORBIDDEN; - } - - private static bool IsAllowed(string filePath, FileType[] allowedTypes) - { - var extension = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); - return FileTypes.OnlyAllowTypes(allowedTypes).Contains(extension); + return FileTypes.IsAllowedPath(filePath, FileTypes.DOCUMENT) + ? FileAttachmentType.DOCUMENT + : FileAttachmentType.FORBIDDEN; } -} \ No newline at end of file +} diff --git a/app/MindWork AI Studio/Components/AttachDocuments.razor.cs b/app/MindWork AI Studio/Components/AttachDocuments.razor.cs index be83d51bc..e4a0fe0f7 100644 --- a/app/MindWork AI Studio/Components/AttachDocuments.razor.cs +++ b/app/MindWork AI Studio/Components/AttachDocuments.razor.cs @@ -48,9 +48,6 @@ public partial class AttachDocuments : MSGComponentBase [Parameter] public bool UseSmallForm { get; set; } - [Parameter] - public FileType[]? AllowedFileTypes { get; set; } - /// /// When true, validate media file types before attaching. Default is true. That means that /// the user cannot attach unsupported media file types when the provider or model does not @@ -184,7 +181,7 @@ protected override async Task OnInitializedAsync() { if(!await FileExtensionValidation.IsExtensionValidWithNotifyAsync(FileExtensionValidation.UseCase.ATTACHING_CONTENT, path, this.ValidateMediaFileTypes, this.Provider)) continue; - this.DocumentPaths.Add(FileAttachment.FromPath(path, this.AllowedFileTypes)); + this.DocumentPaths.Add(FileAttachment.FromPath(path)); } await this.DocumentPathsChanged.InvokeAsync(this.DocumentPaths); @@ -228,7 +225,7 @@ private async Task AddFilesManually() if (!await FileExtensionValidation.IsExtensionValidWithNotifyAsync(FileExtensionValidation.UseCase.ATTACHING_CONTENT, selectedFilePath, this.ValidateMediaFileTypes, this.Provider)) continue; - this.DocumentPaths.Add(FileAttachment.FromPath(selectedFilePath, this.AllowedFileTypes)); + this.DocumentPaths.Add(FileAttachment.FromPath(selectedFilePath)); } await this.DocumentPathsChanged.InvokeAsync(this.DocumentPaths); diff --git a/app/MindWork AI Studio/Components/SelectFile.razor.cs b/app/MindWork AI Studio/Components/SelectFile.razor.cs index c7b4dace8..91c7a667a 100644 --- a/app/MindWork AI Studio/Components/SelectFile.razor.cs +++ b/app/MindWork AI Studio/Components/SelectFile.razor.cs @@ -23,7 +23,7 @@ public partial class SelectFile : MSGComponentBase public string FileDialogTitle { get; set; } = "Select File"; [Parameter] - public FileType[]? Filter { get; set; } + public FileTypeFilter[]? Filter { get; set; } [Parameter] public Func Validation { get; set; } = _ => null; diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor index 6e5a595ba..85e6e6eff 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor @@ -1,6 +1,5 @@ @using AIStudio.Provider @using AIStudio.Provider.SelfHosted -@using AIStudio.Tools.Rust @inherits MSGComponentBase @@ -125,7 +124,6 @@ Validation="@this.providerValidation.ValidatingInstanceName" UserAttributes="@SPELLCHECK_ATTRIBUTES" /> - diff --git a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs index a3b66dbe6..33e4db183 100644 --- a/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs +++ b/app/MindWork AI Studio/Dialogs/EmbeddingProviderDialog.razor.cs @@ -1,4 +1,3 @@ -using AIStudio.Chat; using AIStudio.Components; using AIStudio.Provider; using AIStudio.Settings; @@ -97,7 +96,6 @@ public partial class EmbeddingProviderDialog : MSGComponentBase, ISecretId private readonly List availableModels = new(); private readonly Encryption encryption = Program.ENCRYPTION; private readonly ProviderValidation providerValidation; - private HashSet chatDocumentPaths = []; public EmbeddingProviderDialog() { diff --git a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua index c518d4393..09363a3fc 100644 --- a/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/de-de-43065dbc-78d0-45b7-92be-f14c2926e2dc/plugin.lua @@ -6321,29 +6321,47 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T304 -- AI-based data source selection with AI retrieval context validation UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3775725978"] = "KI-basierte Datenquellen-Auswahl mit Validierung des Abrufkontexts" --- Executable Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2217313358"] = "Ausführbare Dateien" +-- Text +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1041509726"] = "Text" + +-- Office Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1063218378"] = "Office-Dateien" + +-- Executable +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1364437037"] = "Ausführbare Dateien" + +-- Mail +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1399880782"] = "E-Mail" + +-- Source like +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1487238587"] = "Source Code ähnlich" + +-- Image +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1494001562"] = "Bild" + +-- Video +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1533528076"] = "Video" --- All Source Code Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2460199369"] = "Alle Quellcodedateien" +-- Source Code +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1569048941"] = "Quellcode" --- All Audio Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2575722901"] = "Alle Audiodateien" +-- Config +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1779622119"] = "Konfiguration" --- All Video Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2850789856"] = "Alle Videodateien" +-- Audio +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2291602489"] = "Audio" --- PDF Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T3108466742"] = "PDF-Dateien" +-- Custom +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2502277006"] = "Benutzerdefiniert" --- All Image Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T4086723714"] = "Alle Bilddateien" +-- Media +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T3507473059"] = "Medien" --- Text Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T639143005"] = "Textdateien" +-- Source like prefix +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T378481461"] = "Source Code ähnlicher Prefix" --- All Office Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T709668067"] = "Alle Office-Dateien" +-- Document +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T4165204724"] = "Dokument" -- Pandoc Installation UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::PANDOCAVAILABILITYSERVICE::T185447014"] = "Pandoc-Installation" diff --git a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua index a4fdfd5c1..e94107007 100644 --- a/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua +++ b/app/MindWork AI Studio/Plugins/languages/en-us-97dfb1ba-50c4-4440-8dfa-6575daf543c8/plugin.lua @@ -6321,29 +6321,47 @@ UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T304 -- AI-based data source selection with AI retrieval context validation UI_TEXT_CONTENT["AISTUDIO::TOOLS::RAG::RAGPROCESSES::AISRCSELWITHRETCTXVAL::T3775725978"] = "AI-based data source selection with AI retrieval context validation" --- Executable Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2217313358"] = "Executable Files" +-- Text +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1041509726"] = "Text" + +-- Office Files +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1063218378"] = "Office Files" + +-- Executable +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1364437037"] = "Executable" + +-- Mail +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1399880782"] = "Mail" + +-- Source like +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1487238587"] = "Source like" + +-- Image +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1494001562"] = "Image" + +-- Video +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1533528076"] = "Video" --- All Source Code Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2460199369"] = "All Source Code Files" +-- Source Code +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1569048941"] = "Source Code" --- All Audio Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2575722901"] = "All Audio Files" +-- Config +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T1779622119"] = "Config" --- All Video Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T2850789856"] = "All Video Files" +-- Audio +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2291602489"] = "Audio" --- PDF Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T3108466742"] = "PDF Files" +-- Custom +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T2502277006"] = "Custom" --- All Image Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T4086723714"] = "All Image Files" +-- Media +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T3507473059"] = "Media" --- Text Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T639143005"] = "Text Files" +-- Source like prefix +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T378481461"] = "Source like prefix" --- All Office Files -UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPEFILTER::T709668067"] = "All Office Files" +-- Document +UI_TEXT_CONTENT["AISTUDIO::TOOLS::RUST::FILETYPES::T4165204724"] = "Document" -- Pandoc Installation UI_TEXT_CONTENT["AISTUDIO::TOOLS::SERVICES::PANDOCAVAILABILITYSERVICE::T185447014"] = "Pandoc Installation" diff --git a/app/MindWork AI Studio/Tools/Rust/FileType.cs b/app/MindWork AI Studio/Tools/Rust/FileType.cs deleted file mode 100644 index c333a6913..000000000 --- a/app/MindWork AI Studio/Tools/Rust/FileType.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace AIStudio.Tools.Rust; - -/// -/// Represents a file type that can optionally contain child file types. -/// Use the static helpers , and to build readable trees. -/// -/// Display name of the type (e.g., "Document"). -/// File extensions belonging to this type (without dot). -/// Nested file types that are included when this type is selected. -public sealed record FileType(string FilterName, string[] FilterExtensions, IReadOnlyList Children) -{ - /// - /// Factory for a leaf node. - /// Example: FileType.Leaf(".NET", "cs", "razor") - /// - public static FileType Leaf(string name, params string[] extensions) => - new(name, extensions, []); - - /// - /// Factory for a parent node that only has children. - /// Example: FileType.Parent("Source Code", dotnet, java) - /// - public static FileType Parent(string name, params FileType[]? children) => - new(name, [], children ?? []); - - /// - /// Factory for a composite node that has its own extensions in addition to children. - /// - public static FileType Composite(string name, string[] extensions, params FileType[] children) => - new(name, extensions, children); - - /// - /// Collects all extensions for this type, including children. - /// - public IEnumerable FlattenExtensions() - { - return this.FilterExtensions - .Concat(this.Children.SelectMany(child => child.FlattenExtensions())) - .Distinct(StringComparer.OrdinalIgnoreCase); - } -} \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/FileTypeFilter.cs b/app/MindWork AI Studio/Tools/Rust/FileTypeFilter.cs index 032320708..f4cd1c7e5 100644 --- a/app/MindWork AI Studio/Tools/Rust/FileTypeFilter.cs +++ b/app/MindWork AI Studio/Tools/Rust/FileTypeFilter.cs @@ -1,80 +1,49 @@ -// ReSharper disable NotAccessedPositionalProperty.Global - -using AIStudio.Tools.PluginSystem; - namespace AIStudio.Tools.Rust; /// -/// Represents a file type filter for file selection dialogs. +/// Represents a file type that can optionally contain child file types. +/// Use the static helpers , and to build readable trees. /// -/// The name of the filter. -/// The file extensions associated with the filter. -public readonly record struct FileTypeFilter(string FilterName, string[] FilterExtensions) +/// Display name of the type (e.g., "Document"). +/// File extensions belonging to this type (without dot). +/// Nested file types that are included when this type is selected. +public sealed record FileTypeFilter(string FilterName, string[] FilterExtensions, IReadOnlyList Children) { - private static string TB(string fallbackEN) => I18N.I.T(fallbackEN, typeof(FileTypeFilter).Namespace, nameof(FileTypeFilter)); - - public static FileTypeFilter PDF => new(TB("PDF Files"), ["pdf"]); - - public static FileTypeFilter Text => new(TB("Text Files"), ["txt", "md"]); - - public static FileTypeFilter AllOffice => new(TB("All Office Files"), ["docx", "xlsx", "pptx", "doc", "xls", "ppt", "pdf"]); - - public static FileTypeFilter AllImages => new(TB("All Image Files"), ["jpg", "jpeg", "png", "gif", "bmp", "tiff", "svg", "webp", "heic"]); - - public static FileTypeFilter AllVideos => new(TB("All Video Files"), ["mp4", "m4v", "avi", "mkv", "mov", "wmv", "flv", "webm"]); - - public static FileTypeFilter AllAudio => new(TB("All Audio Files"), ["mp3", "wav", "wave", "aac", "flac", "ogg", "m4a", "wma", "alac", "aiff", "m4b"]); - - public static FileTypeFilter AllSourceCode => new(TB("All Source Code Files"), - [ - // .NET - "cs", "vb", "fs", "razor", "aspx", "cshtml", "csproj", - - // Java: - "java", - - // Python: - "py", - - // JavaScript/TypeScript: - "js", "ts", - - // C/C++: - "c", "cpp", "h", "hpp", - - // Ruby: - "rb", - - // Go: - "go", - - // Rust: - "rs", - - // Lua: - "lua", - - // PHP: - "php", - - // HTML/CSS: - "html", "css", - - // Swift/Kotlin: - "swift", "kt", - - // Shell scripts: - "sh", "bash", - - // Logging files: - "log", - - // JSON/YAML/XML: - "json", "yaml", "yml", "xml", - - // Config files: - "ini", "cfg", "toml", "plist", - ]); - - public static FileTypeFilter Executables => new(TB("Executable Files"), ["exe", "app", "bin", "appimage"]); + /// + /// Factory for a leaf node. + /// Example: FileType.Leaf(".NET", "cs", "razor") + /// + public static FileTypeFilter Leaf(string name, params string[] extensions) => + new(name, extensions, []); + + /// + /// Factory for a parent node that only has children. + /// Example: FileType.Parent("Source Code", dotnet, java) + /// + public static FileTypeFilter Parent(string name, params FileTypeFilter[]? children) => + new(name, [], children ?? []); + + /// + /// Factory for a composite node that has its own extensions in addition to children. + /// + public static FileTypeFilter Composite(string name, string[] extensions, params FileTypeFilter[] children) => + new(name, extensions, children); + + /// + /// Collects all extensions for this type, including children. + /// + public IEnumerable FlattenExtensions() + { + return this.FilterExtensions + .Concat(this.Children.SelectMany(child => child.FlattenExtensions())) + .Distinct(StringComparer.OrdinalIgnoreCase); + } + + public bool ContainsType(FileTypeFilter target) + { + if (this == target) + return true; + + return this.Children.Any(child => child.ContainsType(target)); + } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/FileTypes.cs b/app/MindWork AI Studio/Tools/Rust/FileTypes.cs index ff6fcd88c..a6e8fd580 100644 --- a/app/MindWork AI Studio/Tools/Rust/FileTypes.cs +++ b/app/MindWork AI Studio/Tools/Rust/FileTypes.cs @@ -8,77 +8,123 @@ namespace AIStudio.Tools.Rust; /// public static class FileTypes { - private static string TB(string fallbackEn) => I18N.I.T(fallbackEn, typeof(FileType).Namespace, nameof(FileType)); + private static string TB(string fallbackEn) => I18N.I.T(fallbackEn, typeof(FileTypeFilter).Namespace, nameof(FileTypeFilter)); + + // Keep SOURCE_LIKE in the same leaf style as the other file types. + // These values are not sufficient for Dockerfile-style files without extensions, + // therefore IsAllowedSourceLikeFileName is still required for real matching. + public static readonly FileTypeFilter SOURCE_LIKE_FILE_NAMES = FileTypeFilter.Leaf(TB("Source like"), + "Dockerfile", "Containerfile", "Jenkinsfile", "Makefile", "GNUmakefile", "Procfile", "Vagrantfile", + "Tiltfile", "Justfile", "Brewfile", "Caddyfile", "Gemfile", "Podfile", "Fastfile", "Appfile", "Rakefile", "Dangerfile", + "BUILD", "WORKSPACE", "BUCK"); + + public static readonly FileTypeFilter SOURCE_LIKE_FILE_NAME_PREFIXES = FileTypeFilter.Leaf(TB("Source like prefix"), + "Dockerfile", "Containerfile", "Jenkinsfile", "Procfile", "Caddyfile"); // Source code hierarchy: SourceCode -> (.NET, Java, Python, Web, C/C++, Config, ...) - public static readonly FileType DOTNET = FileType.Leaf(".NET", "cs", "razor", "vb", "fs", "aspx", "cshtml", "csproj"); - public static readonly FileType JAVA = FileType.Leaf("Java", "java"); - public static readonly FileType PYTHON = FileType.Leaf("Python", "py"); - public static readonly FileType JAVASCRIPT = FileType.Leaf("JavaScript/TypeScript", "js", "ts"); - public static readonly FileType CFAMILY = FileType.Leaf("C/C++", "c", "cpp", "h", "hpp"); - public static readonly FileType RUBY = FileType.Leaf("Ruby", "rb"); - public static readonly FileType GO = FileType.Leaf("Go", "go"); - public static readonly FileType RUST = FileType.Leaf("Rust", "rs"); - public static readonly FileType LUA = FileType.Leaf("Lua", "lua"); - public static readonly FileType PHP = FileType.Leaf("PHP", "php"); - public static readonly FileType WEB = FileType.Leaf("HTML/CSS", "html", "css"); - public static readonly FileType APP = FileType.Leaf("Swift/Kotlin", "swift", "kt"); - public static readonly FileType SHELL = FileType.Leaf("Shell", "sh", "bash", "zsh"); - public static readonly FileType LOG = FileType.Leaf("Log", "log"); - public static readonly FileType JSON = FileType.Leaf("JSON", "json"); - public static readonly FileType XML = FileType.Leaf("XML", "xml"); - public static readonly FileType YAML = FileType.Leaf("YAML", "yaml", "yml"); - public static readonly FileType CONFIG = FileType.Leaf(TB("Config"), "ini", "cfg", "toml", "plist"); - - public static readonly FileType SOURCE_CODE = FileType.Parent(TB("Source Code"), - DOTNET, JAVA, PYTHON, JAVASCRIPT, CFAMILY, RUBY, GO, RUST, LUA, PHP, WEB, APP, SHELL, LOG, JSON, XML, YAML, CONFIG); + public static readonly FileTypeFilter DOTNET = FileTypeFilter.Leaf(".NET", "cs", "razor", "vb", "fs", "aspx", "cshtml", "csproj"); + public static readonly FileTypeFilter JAVA = FileTypeFilter.Leaf("Java", "java"); + public static readonly FileTypeFilter PYTHON = FileTypeFilter.Leaf("Python", "py"); + public static readonly FileTypeFilter JAVASCRIPT = FileTypeFilter.Leaf("JavaScript/TypeScript", "js", "ts"); + public static readonly FileTypeFilter CFAMILY = FileTypeFilter.Leaf("C/C++", "c", "cpp", "h", "hpp"); + public static readonly FileTypeFilter RUBY = FileTypeFilter.Leaf("Ruby", "rb"); + public static readonly FileTypeFilter GO = FileTypeFilter.Leaf("Go", "go"); + public static readonly FileTypeFilter RUST = FileTypeFilter.Leaf("Rust", "rs"); + public static readonly FileTypeFilter LUA = FileTypeFilter.Leaf("Lua", "lua"); + public static readonly FileTypeFilter PHP = FileTypeFilter.Leaf("PHP", "php"); + public static readonly FileTypeFilter WEB = FileTypeFilter.Leaf("HTML/CSS", "html", "css"); + public static readonly FileTypeFilter APP = FileTypeFilter.Leaf("Swift/Kotlin", "swift", "kt"); + public static readonly FileTypeFilter SHELL = FileTypeFilter.Leaf("Shell", "sh", "bash", "zsh"); + public static readonly FileTypeFilter LOG = FileTypeFilter.Leaf("Log", "log"); + public static readonly FileTypeFilter JSON = FileTypeFilter.Leaf("JSON", "json"); + public static readonly FileTypeFilter XML = FileTypeFilter.Leaf("XML", "xml"); + public static readonly FileTypeFilter YAML = FileTypeFilter.Leaf("YAML", "yaml", "yml"); + public static readonly FileTypeFilter CONFIG = FileTypeFilter.Leaf(TB("Config"), "ini", "cfg", "toml", "plist"); + + public static readonly FileTypeFilter SOURCE_CODE = FileTypeFilter.Parent(TB("Source Code"), + DOTNET, JAVA, PYTHON, JAVASCRIPT, CFAMILY, RUBY, GO, RUST, LUA, PHP, WEB, APP, SHELL, LOG, JSON, XML, YAML, CONFIG, SOURCE_LIKE_FILE_NAMES, SOURCE_LIKE_FILE_NAME_PREFIXES); // Document hierarchy - public static readonly FileType PDF = FileType.Leaf("PDF", "pdf"); - public static readonly FileType TEXT = FileType.Leaf(TB("Text"), "txt", "md"); - public static readonly FileType MS_WORD = FileType.Leaf("Microsoft Word", "docx"); - public static readonly FileType WORD = FileType.Composite("Word", ["docx"], MS_WORD); - public static readonly FileType EXCEL = FileType.Leaf("Excel", "xls", "xlsx"); - public static readonly FileType POWER_POINT = FileType.Leaf("PowerPoint", "ppt", "pptx"); - - public static readonly FileType OFFICE_FILES = FileType.Parent(TB("Office Files"), + public static readonly FileTypeFilter PDF = FileTypeFilter.Leaf("PDF", "pdf"); + public static readonly FileTypeFilter TEXT = FileTypeFilter.Leaf(TB("Text"), "txt", "md"); + public static readonly FileTypeFilter MS_WORD = FileTypeFilter.Leaf("Microsoft Word", "docx"); + public static readonly FileTypeFilter WORD = FileTypeFilter.Composite("Word", ["doc"], MS_WORD); + public static readonly FileTypeFilter EXCEL = FileTypeFilter.Leaf("Excel", "xls", "xlsx"); + public static readonly FileTypeFilter POWER_POINT = FileTypeFilter.Leaf("PowerPoint", "ppt", "pptx"); + public static readonly FileTypeFilter MAIL = FileTypeFilter.Leaf(TB("Mail"), "eml", "msg", "mbox"); + + public static readonly FileTypeFilter OFFICE_FILES = FileTypeFilter.Parent(TB("Office Files"), WORD, EXCEL, POWER_POINT, PDF); - public static readonly FileType DOCUMENT = FileType.Parent(TB("Document"), - TEXT, OFFICE_FILES, SOURCE_CODE); + public static readonly FileTypeFilter DOCUMENT = FileTypeFilter.Parent(TB("Document"), + TEXT, OFFICE_FILES, SOURCE_CODE, MAIL); // Media hierarchy - public static readonly FileType IMAGE = FileType.Leaf(TB("Image"), + public static readonly FileTypeFilter IMAGE = FileTypeFilter.Leaf(TB("Image"), "jpg", "jpeg", "png", "gif", "bmp", "tiff", "svg", "webp", "heic"); - public static readonly FileType AUDIO = FileType.Leaf(TB("Audio"), + public static readonly FileTypeFilter AUDIO = FileTypeFilter.Leaf(TB("Audio"), "mp3", "wav", "wave", "aac", "flac", "ogg", "m4a", "wma", "alac", "aiff", "m4b"); - public static readonly FileType VIDEO = FileType.Leaf(TB("Video"), + public static readonly FileTypeFilter VIDEO = FileTypeFilter.Leaf(TB("Video"), "mp4", "m4v", "avi", "mkv", "mov", "wmv", "flv", "webm"); - - public static readonly FileType MEDIA = FileType.Parent(TB("Media"), IMAGE, AUDIO, VIDEO); + + public static readonly FileTypeFilter MEDIA = FileTypeFilter.Parent(TB("Media"), IMAGE, AUDIO, VIDEO); // Other standalone types - public static readonly FileType EXECUTABLES = FileType.Leaf(TB("Executable"), "exe", "app", "bin", "appimage"); + public static readonly FileTypeFilter EXECUTABLES = FileTypeFilter.Leaf(TB("Executable"), "exe", "app", "bin", "appimage"); + + public static FileTypeFilter? AsOneFileType(params FileTypeFilter[]? types) + { + if (types == null || types.Length == 0) + return null; + + if (types.Length == 1) return types[0]; - /// - /// Builds a distinct, lower-cased list of extensions allowed for the provided types. - /// Accepts both composite types (e.g., Document) and leaves (e.g., Pdf). - /// - public static string[] OnlyAllowTypes(params FileType[] types) + return FileTypeFilter.Composite(TB("Custom"), OnlyAllowTypes(types)); + } + + public static string[] OnlyAllowTypes(params FileTypeFilter[] types) { if (types.Length == 0) return []; return types + .Where(t => t != SOURCE_LIKE_FILE_NAMES && t != SOURCE_LIKE_FILE_NAME_PREFIXES) .SelectMany(t => t.FlattenExtensions()) .Select(ext => ext.ToLowerInvariant()) .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray(); } - public static FileType? AsOneFileType(params FileType[]? types) + /// + /// Validates a file path against the provided filters. + /// Supports extension-based matching and source-like file names (e.g. Dockerfile). + /// + public static bool IsAllowedPath(string filePath, params FileTypeFilter[]? types) { - if (types == null || types.Length == 0) - return null; - return FileType.Composite(TB("Custom"), OnlyAllowTypes(types)); + if (types == null || types.Length == 0 || string.IsNullOrWhiteSpace(filePath)) + return false; + + var extension = Path.GetExtension(filePath).TrimStart('.'); + if (!string.IsNullOrWhiteSpace(extension)) + { + if (OnlyAllowTypes(types).Contains(extension, StringComparer.OrdinalIgnoreCase)) + return true; + } + + var fileName = Path.GetFileName(filePath); + if (string.IsNullOrWhiteSpace(fileName)) + { + return false; + } + + if (types.Any(t => t.ContainsType(SOURCE_LIKE_FILE_NAMES))) + { + if (SOURCE_LIKE_FILE_NAMES.FilterExtensions.Contains(fileName)) return true; + } + + if (types.Any(t => t.ContainsType(SOURCE_LIKE_FILE_NAME_PREFIXES))){ + if (SOURCE_LIKE_FILE_NAME_PREFIXES.FilterExtensions.Any(prefix => fileName.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))) return true; + } + + return false; } } diff --git a/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs b/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs index f1300ac17..107e581a7 100644 --- a/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs +++ b/app/MindWork AI Studio/Tools/Rust/SaveFileOptions.cs @@ -6,5 +6,5 @@ public class SaveFileOptions public PreviousFile? PreviousFile { get; init; } - public FileType? Filter { get; init; } + public FileTypeFilter? Filter { get; init; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs b/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs index fac7d5f4e..28d16809a 100644 --- a/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs +++ b/app/MindWork AI Studio/Tools/Rust/SelectFileOptions.cs @@ -6,5 +6,5 @@ public sealed class SelectFileOptions public PreviousFile? PreviousFile { get; init; } - public FileType? Filter { get; init; } + public FileTypeFilter? Filter { get; init; } } \ No newline at end of file diff --git a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs index c55b6a8b7..76519eb24 100644 --- a/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs +++ b/app/MindWork AI Studio/Tools/Services/RustService.FileSystem.cs @@ -17,7 +17,7 @@ public async Task SelectDirectory(string title, stri return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); } - public async Task SelectFile(string title, FileType[]? filter = null, string? initialFile = null) + public async Task SelectFile(string title, FileTypeFilter[]? filter = null, string? initialFile = null) { var payload = new SelectFileOptions { @@ -36,7 +36,7 @@ public async Task SelectFile(string title, FileType[]? fi return await result.Content.ReadFromJsonAsync(this.jsonRustSerializerOptions); } - public async Task SelectFiles(string title, FileType[]? filter = null, string? initialFile = null) + public async Task SelectFiles(string title, FileTypeFilter[]? filter = null, string? initialFile = null) { var payload = new SelectFileOptions { @@ -63,7 +63,7 @@ public async Task SelectFiles(string title, FileType[]? /// An optional initial file path to pre-fill in the dialog. /// A object containing information about whether the user canceled the /// operation and whether the select operation was successful. - public async Task SaveFile(string title, FileType[]? filter = null, string? initialFile = null) + public async Task SaveFile(string title, FileTypeFilter[]? filter = null, string? initialFile = null) { var payload = new SaveFileOptions { diff --git a/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs b/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs index a9a873670..d38a8c086 100644 --- a/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs +++ b/app/MindWork AI Studio/Tools/Validation/FileExtensionValidation.cs @@ -43,8 +43,7 @@ public enum UseCase /// True if valid, false if invalid (error/warning already sent via MessageBus). public static async Task IsExtensionValidWithNotifyAsync(UseCase useCae, string filePath, bool validateMediaFileTypes = true, Settings.Provider? provider = null) { - var ext = Path.GetExtension(filePath).TrimStart('.').ToLowerInvariant(); - if(FileTypes.EXECUTABLES.FlattenExtensions().Contains(ext)) + if (FileTypes.IsAllowedPath(filePath, FileTypes.EXECUTABLES)) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.AppBlocking, @@ -53,7 +52,7 @@ await MessageBus.INSTANCE.SendError(new( } var capabilities = provider?.GetModelCapabilities() ?? new(); - if (FileTypes.IMAGE.FlattenExtensions().Contains(ext)) + if (FileTypes.IsAllowedPath(filePath, FileTypes.IMAGE)) { switch (useCae) { @@ -88,7 +87,7 @@ await MessageBus.INSTANCE.SendWarning(new( } } - if(FileTypes.VIDEO.FlattenExtensions().Contains(ext)) + if (FileTypes.IsAllowedPath(filePath, FileTypes.VIDEO)) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.FeaturedVideo, @@ -96,7 +95,7 @@ await MessageBus.INSTANCE.SendWarning(new( return false; } - if(FileTypes.AUDIO.FlattenExtensions().Contains(ext)) + if (FileTypes.IsAllowedPath(filePath, FileTypes.AUDIO)) { await MessageBus.INSTANCE.SendWarning(new( Icons.Material.Filled.AudioFile, @@ -123,7 +122,7 @@ await MessageBus.INSTANCE.SendError(new( return false; } - if (FileTypes.IMAGE.FlattenExtensions().Any(x => x.Equals(ext, StringComparison.OrdinalIgnoreCase))) + if (FileTypes.IsAllowedPath(filePath, FileTypes.IMAGE)) { await MessageBus.INSTANCE.SendError(new( Icons.Material.Filled.ImageNotSupported, From 3640ebeed1bb023acf297d5725c2878db4ba32ad Mon Sep 17 00:00:00 2001 From: PaulKoudelka Date: Tue, 31 Mar 2026 16:58:36 +0200 Subject: [PATCH 10/10] added file types --- app/MindWork AI Studio/Tools/Rust/FileTypes.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/MindWork AI Studio/Tools/Rust/FileTypes.cs b/app/MindWork AI Studio/Tools/Rust/FileTypes.cs index a6e8fd580..789eb7d6b 100644 --- a/app/MindWork AI Studio/Tools/Rust/FileTypes.cs +++ b/app/MindWork AI Studio/Tools/Rust/FileTypes.cs @@ -46,9 +46,9 @@ public static class FileTypes // Document hierarchy public static readonly FileTypeFilter PDF = FileTypeFilter.Leaf("PDF", "pdf"); - public static readonly FileTypeFilter TEXT = FileTypeFilter.Leaf(TB("Text"), "txt", "md"); - public static readonly FileTypeFilter MS_WORD = FileTypeFilter.Leaf("Microsoft Word", "docx"); - public static readonly FileTypeFilter WORD = FileTypeFilter.Composite("Word", ["doc"], MS_WORD); + public static readonly FileTypeFilter TEXT = FileTypeFilter.Leaf(TB("Text"), "txt", "md", "rtf"); + public static readonly FileTypeFilter MS_WORD = FileTypeFilter.Leaf("Microsoft Word", "docx", "doc"); + public static readonly FileTypeFilter WORD = FileTypeFilter.Composite("Word", ["odt"], MS_WORD); public static readonly FileTypeFilter EXCEL = FileTypeFilter.Leaf("Excel", "xls", "xlsx"); public static readonly FileTypeFilter POWER_POINT = FileTypeFilter.Leaf("PowerPoint", "ppt", "pptx"); public static readonly FileTypeFilter MAIL = FileTypeFilter.Leaf(TB("Mail"), "eml", "msg", "mbox");