From b452402174cb6c70b583b2c221b53ee8a760f254 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:49:42 +0100 Subject: [PATCH 01/31] [#maintenance] [Suggester] Switch to OpenAI-compatible chat completions endpoint --- lib/ai-commit-message/suggester.rb | 72 ++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index 6879041..e2cd8da 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -11,31 +11,55 @@ def initialize(git_diff_output, git_log_output, git_current_branch) end def generate_commit_message(url:, model:) - url = URI(url + '/api/generate') - body = { + response = post_json(chat_completions_uri(url), request_body(model)) + json = JSON.parse(response.body) + json.dig('choices', 0, 'message', 'content') + end + + private + + def request_body(model) + { model: model, - prompt: "Create a concise git commit message with no more than 250 characters. Exclude anything unnecessary such as translation, backticks characters or multiple suggestions, since your entire response will be passed directly into git commit. Consider the following messages as example to follow: #{@git_log_output}. - The First [#XXX] option is the branch name. The current branch name is: #{@git_current_branch}. Now Do it for the following git diff: #{@git_diff_output}", - stream: false, - options: { temperature: 0.8 } + messages: [ + { role: 'system', content: system_prompt }, + { role: 'user', content: user_prompt } + ], + temperature: 0.3, + max_tokens: 100, + stream: false } - json_body = body.to_json - headers = { 'Content-Type' => 'application/json' } - - http = Net::HTTP.new(url.host, url.port) - request = Net::HTTP::Post.new(url) - request.body = json_body - headers.each { |key, value| request[key] = value } - response = http.request(request) - - begin - json = JSON.parse(response.body) - return json['response'] if json - rescue JSON::ParserError => e - puts "Failed to parse API response as JSON: #{e.message}" - end - - nil + end + + def system_prompt + 'You write git commit messages. Respond with a single line containing ' \ + 'only the commit message: no quotes, no backticks, no markdown, no explanations.' + end + + def user_prompt + <<~PROMPT + Write a concise git commit message with no more than 250 characters for the staged changes below. + Follow the style of these recent commit messages: #{@git_log_output} + The current branch name is: #{@git_current_branch} + Git diff: + #{@git_diff_output} + PROMPT + end + + # Accepts base URLs with or without a trailing /v1 and with or without a + # trailing slash, e.g. http://localhost:11434, http://localhost:1234/v1/ + def chat_completions_uri(url) + base = url.chomp('/') + base = base.sub(%r{/v1$}, '') + URI("#{base}/v1/chat/completions") + end + + def post_json(uri, body) + http = Net::HTTP.new(uri.host, uri.port) + request = Net::HTTP::Post.new(uri) + request['Content-Type'] = 'application/json' + request.body = body.to_json + http.request(request) end end -end \ No newline at end of file +end From e7b1c81eaddc97bdde7478e39dcd30204bbfaeb7 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:50:14 +0100 Subject: [PATCH 02/31] [#maintenance] [Suggester] Add HTTP timeouts, status checks and error handling --- lib/ai-commit-message/suggester.rb | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index e2cd8da..f3cfadd 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -4,6 +4,13 @@ module AiCommitMessage class Suggester + class Error < StandardError; end + class ConnectionError < Error; end + class ApiError < Error; end + + OPEN_TIMEOUT = 5 + READ_TIMEOUT = 120 + def initialize(git_diff_output, git_log_output, git_current_branch) @git_diff_output = git_diff_output @git_log_output = git_log_output @@ -12,7 +19,7 @@ def initialize(git_diff_output, git_log_output, git_current_branch) def generate_commit_message(url:, model:) response = post_json(chat_completions_uri(url), request_body(model)) - json = JSON.parse(response.body) + json = parse_response(response) json.dig('choices', 0, 'message', 'content') end @@ -56,10 +63,28 @@ def chat_completions_uri(url) def post_json(uri, body) http = Net::HTTP.new(uri.host, uri.port) + http.open_timeout = OPEN_TIMEOUT + http.read_timeout = READ_TIMEOUT request = Net::HTTP::Post.new(uri) request['Content-Type'] = 'application/json' request.body = body.to_json - http.request(request) + + begin + http.request(request) + rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError => e + raise ConnectionError, + "Could not connect to #{uri.host}:#{uri.port}. Is your local LLM server running?" + end + end + + def parse_response(response) + unless response.is_a?(Net::HTTPSuccess) + raise ApiError, "API returned HTTP #{response.code}: #{response.body.to_s[0, 200]}" + end + + JSON.parse(response.body) + rescue JSON::ParserError + raise ApiError, 'API response was not valid JSON' end end end From 4549f3a7f9e5937195c54c83da1b5c75b74c7c85 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:51:04 +0100 Subject: [PATCH 03/31] [#maintenance] [Suggester] Clean model output and enforce message length --- lib/ai-commit-message/suggester.rb | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index f3cfadd..8551cb1 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -10,6 +10,7 @@ class ApiError < Error; end OPEN_TIMEOUT = 5 READ_TIMEOUT = 120 + DEFAULT_LENGTH = 72 def initialize(git_diff_output, git_log_output, git_current_branch) @git_diff_output = git_diff_output @@ -17,10 +18,10 @@ def initialize(git_diff_output, git_log_output, git_current_branch) @git_current_branch = git_current_branch end - def generate_commit_message(url:, model:) + def generate_commit_message(url:, model:, length: DEFAULT_LENGTH) response = post_json(chat_completions_uri(url), request_body(model)) json = parse_response(response) - json.dig('choices', 0, 'message', 'content') + clean_commit_message(json.dig('choices', 0, 'message', 'content'), length) end private @@ -30,10 +31,10 @@ def request_body(model) model: model, messages: [ { role: 'system', content: system_prompt }, - { role: 'user', content: user_prompt } + { role: 'user', content: user_prompt(length) } ], temperature: 0.3, - max_tokens: 100, + max_tokens: [length * 2, 100].max, stream: false } end @@ -43,9 +44,9 @@ def system_prompt 'only the commit message: no quotes, no backticks, no markdown, no explanations.' end - def user_prompt + def user_prompt(length) <<~PROMPT - Write a concise git commit message with no more than 250 characters for the staged changes below. + Write a concise git commit message with no more than #{length} characters for the staged changes below. Follow the style of these recent commit messages: #{@git_log_output} The current branch name is: #{@git_current_branch} Git diff: @@ -53,6 +54,16 @@ def user_prompt PROMPT end + # Models tend to wrap answers in code fences or quotes and sometimes offer + # alternatives; reduce everything to a single clean subject line. + def clean_commit_message(raw, length) + line = raw.to_s + .gsub('`', '') + .each_line.map(&:strip).reject(&:empty?).first.to_s + line = line.sub(/\A["'](.*)["']\z/, '\1') + line.gsub(/\s+/, ' ')[0, length].to_s.strip + end + # Accepts base URLs with or without a trailing /v1 and with or without a # trailing slash, e.g. http://localhost:11434, http://localhost:1234/v1/ def chat_completions_uri(url) From d9e6d0516116cf6ca69cc965a310e724bf5a29ea Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:52:51 +0100 Subject: [PATCH 04/31] [#maintenance] [Suggester] Support conventional commits format and omit branch when detached --- lib/ai-commit-message/suggester.rb | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index 8551cb1..d4b9740 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -18,19 +18,19 @@ def initialize(git_diff_output, git_log_output, git_current_branch) @git_current_branch = git_current_branch end - def generate_commit_message(url:, model:, length: DEFAULT_LENGTH) - response = post_json(chat_completions_uri(url), request_body(model)) + def generate_commit_message(url:, model:, length: DEFAULT_LENGTH, conventional: false) + response = post_json(chat_completions_uri(url), request_body(model, length, conventional)) json = parse_response(response) clean_commit_message(json.dig('choices', 0, 'message', 'content'), length) end private - def request_body(model) + def request_body(model, length, conventional) { model: model, messages: [ - { role: 'system', content: system_prompt }, + { role: 'system', content: system_prompt(conventional) }, { role: 'user', content: user_prompt(length) } ], temperature: 0.3, @@ -39,21 +39,27 @@ def request_body(model) } end - def system_prompt - 'You write git commit messages. Respond with a single line containing ' \ - 'only the commit message: no quotes, no backticks, no markdown, no explanations.' + def system_prompt(conventional) + prompt = 'You write git commit messages. Respond with a single line containing ' \ + 'only the commit message: no quotes, no backticks, no markdown, no explanations.' + prompt += ' Use the Conventional Commits format (type: description).' if conventional + prompt end def user_prompt(length) <<~PROMPT Write a concise git commit message with no more than #{length} characters for the staged changes below. Follow the style of these recent commit messages: #{@git_log_output} - The current branch name is: #{@git_current_branch} + #{branch_line} Git diff: #{@git_diff_output} PROMPT end + # git branch --show-current returns nothing on a detached HEAD + def branch_line + @git_current_branch.strip.empty? ? '' : "The current branch name is: #{@git_current_branch.strip}" + end # Models tend to wrap answers in code fences or quotes and sometimes offer # alternatives; reduce everything to a single clean subject line. def clean_commit_message(raw, length) From 34715a4c9f9f1ad1538a6dd53b93e235f838489a Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:53:16 +0100 Subject: [PATCH 05/31] [#maintenance] [CLI] Skip LLM call when nothing is staged --- lib/ai-commit-message/cli.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index 0bdc529..ade2060 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -14,6 +14,11 @@ class CLI < Thor def commit git_diff_output = `git diff --cached --no-color` + if git_diff_output.strip.empty? + warn 'Nothing is staged. Stage your changes with `git add` first.' + exit 1 + end + git_log_output = `git log --format=%s -n 30` git_current_branch = `git branch --show-current` From b7cb65c402f958a63d43c3c29231cb72b148ea72 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:53:38 +0100 Subject: [PATCH 06/31] [#maintenance] [CLI] Cap diff size sent to the model --- lib/ai-commit-message/cli.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index ade2060..0514f15 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -7,6 +7,7 @@ module AiCommitMessage class CLI < Thor DEFAULT_URL = 'http://localhost:11434' DEFAULT_MODEL_NAME = 'qwen2.5-coder:7b' + MAX_DIFF_LENGTH = 12_000 desc "commit", "Generate git commit message" method_option :url, type: :string, default: DEFAULT_URL @@ -25,7 +26,7 @@ def commit url = url_to_be_used(options.url) model = model_to_be_used(options.model) - suggester = AiCommitMessage::Suggester.new(git_diff_output, git_log_output, git_current_branch) + suggester = AiCommitMessage::Suggester.new(git_diff_output[0, MAX_DIFF_LENGTH], git_log_output, git_current_branch) commit_message = suggester.generate_commit_message(url:, model:) puts commit_message From 5b45270e0a9e3ec0da3df3a982d97fc348252a4f Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:54:05 +0100 Subject: [PATCH 07/31] [#maintenance] [CLI] Fix option resolution to respect explicit flags --- lib/ai-commit-message/cli.rb | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index 0514f15..1c1c07e 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -10,8 +10,8 @@ class CLI < Thor MAX_DIFF_LENGTH = 12_000 desc "commit", "Generate git commit message" - method_option :url, type: :string, default: DEFAULT_URL - method_option :model, type: :string, default: DEFAULT_MODEL_NAME + method_option :url, type: :string + method_option :model, type: :string def commit git_diff_output = `git diff --cached --no-color` @@ -48,15 +48,11 @@ def config private def url_to_be_used(options_url) - return options_url if !options_url.empty? && (options_url != DEFAULT_URL) - - ConfigManager.get_url || DEFAULT_URL + options_url || ConfigManager.get_url || DEFAULT_URL end def model_to_be_used(options_model) - return options_model if !options_model.empty? && (options_model != DEFAULT_MODEL_NAME) - - ConfigManager.get_model || DEFAULT_MODEL_NAME + options_model || ConfigManager.get_model || DEFAULT_MODEL_NAME end end end From fab2ad0cb2a6311a1b647c9ab600948bc5fc5b9f Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:54:36 +0100 Subject: [PATCH 08/31] [#maintenance] [CLI] Change default model to qwen3:8b --- lib/ai-commit-message/cli.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index 1c1c07e..85e3fe1 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -6,7 +6,7 @@ module AiCommitMessage class CLI < Thor DEFAULT_URL = 'http://localhost:11434' - DEFAULT_MODEL_NAME = 'qwen2.5-coder:7b' + DEFAULT_MODEL_NAME = 'qwen3:8b' MAX_DIFF_LENGTH = 12_000 desc "commit", "Generate git commit message" From 91068ac32712757fa437b12ae7080beebb4771a2 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:55:11 +0100 Subject: [PATCH 09/31] [#maintenance] [CLI] Add conventional, length and apply flags to commit command --- lib/ai-commit-message/cli.rb | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index 85e3fe1..69330e1 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -12,6 +12,9 @@ class CLI < Thor desc "commit", "Generate git commit message" method_option :url, type: :string method_option :model, type: :string + method_option :length, type: :numeric, default: Suggester::DEFAULT_LENGTH + method_option :conventional, type: :boolean, default: false + method_option :apply, type: :boolean, default: false def commit git_diff_output = `git diff --cached --no-color` @@ -23,13 +26,24 @@ def commit git_log_output = `git log --format=%s -n 30` git_current_branch = `git branch --show-current` - url = url_to_be_used(options.url) - model = model_to_be_used(options.model) - suggester = AiCommitMessage::Suggester.new(git_diff_output[0, MAX_DIFF_LENGTH], git_log_output, git_current_branch) - commit_message = suggester.generate_commit_message(url:, model:) + commit_message = suggester.generate_commit_message( + url: url_to_be_used(options.url), + model: model_to_be_used(options.model), + length: options.length, + conventional: options.conventional + ) puts commit_message + return unless options.apply + + prompt = TTY::Prompt.new + return unless prompt.yes?("Commit with this message?", default: true) + + system('git', 'commit', '-m', commit_message) + rescue AiCommitMessage::Suggester::Error => e + warn e.message + exit 1 end desc "config", "Set global configs. API URL and Model name" From 940ece9e6732269d391992ac8804e1cf46c9854b Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:56:40 +0100 Subject: [PATCH 10/31] [#maintenance] [Suggester] Add list_models to query available models from the server --- lib/ai-commit-message/suggester.rb | 46 +++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index d4b9740..4495ed5 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -12,6 +12,36 @@ class ApiError < Error; end READ_TIMEOUT = 120 DEFAULT_LENGTH = 72 + def self.list_models(url) + uri = URI("#{normalized_base(url)}/v1/models") + http = Net::HTTP.new(uri.host, uri.port) + http.open_timeout = OPEN_TIMEOUT + http.read_timeout = READ_TIMEOUT + + begin + response = http.request(Net::HTTP::Get.new(uri)) + rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, SocketError + raise ConnectionError, + "Could not connect to #{uri.host}:#{uri.port}. Is your local LLM server running?" + end + + parse_response(response).fetch('data', []).map { |m| m['id'] }.compact.sort + end + + def self.parse_response(response) + unless response.is_a?(Net::HTTPSuccess) + raise ApiError, "API returned HTTP #{response.code}: #{response.body.to_s[0, 200]}" + end + + JSON.parse(response.body) + rescue JSON::ParserError + raise ApiError, 'API response was not valid JSON' + end + + def self.normalized_base(url) + url.chomp('/').sub(%r{/v1$}, '') + end + def initialize(git_diff_output, git_log_output, git_current_branch) @git_diff_output = git_diff_output @git_log_output = git_log_output @@ -20,7 +50,7 @@ def initialize(git_diff_output, git_log_output, git_current_branch) def generate_commit_message(url:, model:, length: DEFAULT_LENGTH, conventional: false) response = post_json(chat_completions_uri(url), request_body(model, length, conventional)) - json = parse_response(response) + json = self.class.parse_response(response) clean_commit_message(json.dig('choices', 0, 'message', 'content'), length) end @@ -73,9 +103,7 @@ def clean_commit_message(raw, length) # Accepts base URLs with or without a trailing /v1 and with or without a # trailing slash, e.g. http://localhost:11434, http://localhost:1234/v1/ def chat_completions_uri(url) - base = url.chomp('/') - base = base.sub(%r{/v1$}, '') - URI("#{base}/v1/chat/completions") + URI("#{self.class.normalized_base(url)}/v1/chat/completions") end def post_json(uri, body) @@ -93,15 +121,5 @@ def post_json(uri, body) "Could not connect to #{uri.host}:#{uri.port}. Is your local LLM server running?" end end - - def parse_response(response) - unless response.is_a?(Net::HTTPSuccess) - raise ApiError, "API returned HTTP #{response.code}: #{response.body.to_s[0, 200]}" - end - - JSON.parse(response.body) - rescue JSON::ParserError - raise ApiError, 'API response was not valid JSON' - end end end From 8f96209dd2391f0f8b6712c6571f8930a5c2afc2 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:57:18 +0100 Subject: [PATCH 11/31] [#maintenance] [CLI] Add models command and config model picker --- lib/ai-commit-message/cli.rb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index 69330e1..4034a70 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -46,12 +46,27 @@ def commit exit 1 end + desc "models", "List models available on the configured API URL" + method_option :url, type: :string + + def models + puts AiCommitMessage::Suggester.list_models(url_to_be_used(options.url)) + rescue AiCommitMessage::Suggester::Error => e + warn e.message + exit 1 + end + desc "config", "Set global configs. API URL and Model name" def config prompt = TTY::Prompt.new url = prompt.ask("API URL:", default: ConfigManager.get_url || DEFAULT_URL) - model = prompt.ask("Model name:", default: ConfigManager.get_model || DEFAULT_MODEL_NAME) + available_models = AiCommitMessage::Suggester.list_models(url) rescue nil + model = if available_models && !available_models.empty? + prompt.select("Model name:", available_models) + else + prompt.ask("Model name:", default: ConfigManager.get_model || DEFAULT_MODEL_NAME) + end ConfigManager.set_url(url) ConfigManager.set_model(model) From 501f8b5af83f185244d09febdfa1aab75baa35f9 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sat, 26 Sep 2026 23:57:46 +0100 Subject: [PATCH 12/31] [#maintenance] [Gemspec] Bump version to 0.2.0, add MIT license, drop stdlib dependencies --- LICENSE | 21 +++++++++++++++++++++ ai-commit-message.gemspec | 18 +++++++++--------- 2 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..62f1aa7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Afonso Neto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/ai-commit-message.gemspec b/ai-commit-message.gemspec index 5c07731..048949f 100644 --- a/ai-commit-message.gemspec +++ b/ai-commit-message.gemspec @@ -1,21 +1,21 @@ Gem::Specification.new do |gem| gem.name = 'ai-commit-message' - gem.version = '0.1.2' + gem.version = '0.2.0' gem.authors = ['Afonso Neto'] gem.email = ['afonso.pontesneto@gmail.com'] gem.summary = 'Git commit messages suggested by AI' - gem.description = 'Git commit messages suggested by AI' + gem.description = 'Git commit messages suggested by AI using a local LLM via any OpenAI-compatible API' gem.homepage = 'https://github.com/AfonsoNeto/ai-commit-message' - gem.license = nil - - gem.files = Dir.glob('{bin/*,lib/**/*,README.md}') + gem.license = 'MIT' + + gem.metadata['rubygems_mfa_required'] = 'true' + + gem.files = Dir.glob('{bin/*,lib/**/*,README.md,LICENSE}') gem.require_paths = ['lib'] gem.executables = ['ai-commit-message'] gem.required_ruby_version = '>= 3.0' gem.add_dependency 'thor' - gem.add_runtime_dependency 'tty-prompt' - gem.add_runtime_dependency 'net-http' - gem.add_runtime_dependency 'json' -end \ No newline at end of file + gem.add_dependency 'tty-prompt' +end From 5938de8f68eb01811de0aa22cdd48764f622c858 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:00:17 +0100 Subject: [PATCH 13/31] [#maintenance] [Tests] Add test suite for suggester and config manager --- Rakefile | 9 +++ ai-commit-message.gemspec | 3 + test/config_manager_test.rb | 60 ++++++++++++++++++ test/suggester_test.rb | 119 ++++++++++++++++++++++++++++++++++++ test/test_helper.rb | 34 +++++++++++ 5 files changed, 225 insertions(+) create mode 100644 Rakefile create mode 100644 test/config_manager_test.rb create mode 100644 test/suggester_test.rb create mode 100644 test/test_helper.rb diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..d9b28c0 --- /dev/null +++ b/Rakefile @@ -0,0 +1,9 @@ +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.libs << 'lib' << 'test' + t.test_files = FileList['test/**/*_test.rb'] + t.warning = false +end + +task default: :test diff --git a/ai-commit-message.gemspec b/ai-commit-message.gemspec index 048949f..b9465ed 100644 --- a/ai-commit-message.gemspec +++ b/ai-commit-message.gemspec @@ -18,4 +18,7 @@ Gem::Specification.new do |gem| gem.add_dependency 'thor' gem.add_dependency 'tty-prompt' + + gem.add_development_dependency 'rake' + gem.add_development_dependency 'minitest' end diff --git a/test/config_manager_test.rb b/test/config_manager_test.rb new file mode 100644 index 0000000..86e4c24 --- /dev/null +++ b/test/config_manager_test.rb @@ -0,0 +1,60 @@ +require_relative 'test_helper' + +class ConfigManagerTest < Minitest::Test + def setup + @config_file = Tempfile.new('ai-commit-message-test') + @config_file.close + stub_constant + reset_cache + end + + def teardown + restore_constant + @config_file.unlink + end + + def test_defaults_to_empty_config + assert_nil ConfigManager.get_url + assert_nil ConfigManager.get_model + end + + def test_set_and_get_roundtrip + ConfigManager.set_url('http://localhost:1234') + ConfigManager.set_model('qwen3:8b') + assert_equal 'http://localhost:1234', ConfigManager.get_url + assert_equal 'qwen3:8b', ConfigManager.get_model + end + + def test_persists_to_config_file + ConfigManager.set_url('http://localhost:1234') + ConfigManager.set_model('qwen3:8b') + + reset_cache + assert_equal 'http://localhost:1234', ConfigManager.get_url + assert_equal 'qwen3:8b', ConfigManager.get_model + end + + def test_loads_existing_config_file + File.write(@config_file.path, "url=http://localhost:8080\nmodel=gemma3:4b\n") + reset_cache + assert_equal 'http://localhost:8080', ConfigManager.get_url + assert_equal 'gemma3:4b', ConfigManager.get_model + end + + private + + def stub_constant + @original = ConfigManager.const_get(:CONFIG_FILE) + ConfigManager.send(:remove_const, :CONFIG_FILE) + ConfigManager.const_set(:CONFIG_FILE, @config_file.path) + end + + def restore_constant + ConfigManager.send(:remove_const, :CONFIG_FILE) + ConfigManager.const_set(:CONFIG_FILE, @original) + end + + def reset_cache + ConfigManager.remove_instance_variable(:@config) if ConfigManager.instance_variable_defined?(:@config) + end +end diff --git a/test/suggester_test.rb b/test/suggester_test.rb new file mode 100644 index 0000000..43652b3 --- /dev/null +++ b/test/suggester_test.rb @@ -0,0 +1,119 @@ +require_relative 'test_helper' + +class SuggesterTest < Minitest::Test + include TestHelper + + def setup + @suggester = AiCommitMessage::Suggester.new('+def foo', 'add foo', 'feature/foo') + end + + def test_chat_completions_uri_normalization + [ + 'http://localhost:11434', + 'http://localhost:11434/', + 'http://localhost:1234/v1', + 'http://localhost:1234/v1/' + ].each do |url| + uri = @suggester.send(:chat_completions_uri, url) + assert_equal '/v1/chat/completions', uri.path + assert_equal 'localhost', uri.host + end + end + + def test_normalized_base_keeps_custom_paths + assert_equal 'http://localhost:8080/api', AiCommitMessage::Suggester.normalized_base('http://localhost:8080/api/') + end + + def test_clean_commit_message_strips_code_fences_and_quotes + assert_equal 'feat: add login page', @suggester.send(:clean_commit_message, "```\nfeat: add login page\n```", 72) + assert_equal 'Fix the parser bug', @suggester.send(:clean_commit_message, '"Fix the parser bug"', 72) + end + + def test_clean_commit_message_takes_first_line + assert_equal 'fix: handle nil', @suggester.send(:clean_commit_message, "fix: handle nil\n\nAlternative: something else", 72) + end + + def test_clean_commit_message_truncates_to_length + assert_equal 'a' * 10, @suggester.send(:clean_commit_message, 'a' * 100, 10) + assert_equal '', @suggester.send(:clean_commit_message, nil, 72) + end + + def test_generate_commit_message_returns_cleaned_content + with_mock_server(openai_chat_response("```\nfix: avoid nil crash\n```")) do |port| + message = @suggester.generate_commit_message(url: "http://127.0.0.1:#{port}", model: 'test-model') + assert_equal 'fix: avoid nil crash', message + end + end + + def test_generate_commit_message_uses_chat_completions_and_chat_payload + request = nil + server = TCPServer.new('127.0.0.1', 0) + body = openai_chat_response('ok') + thread = Thread.new do + client = server.accept + request = +'' + request << client.readpartial(4096) until request.include?("\r\n\r\n") + client.write("HTTP/1.1 200 OK\r\nContent-Length: #{body.bytesize}\r\nConnection: close\r\n\r\n#{body}") + client.close + end + begin + @suggester.generate_commit_message(url: "http://127.0.0.1:#{server.addr[1]}/v1", model: 'm', conventional: true) + ensure + thread.join + server.close + end + + assert_includes request, "POST /v1/chat/completions" + json_body = JSON.parse(request.split("\r\n\r\n").last) + assert_equal 'm', json_body['model'] + assert_equal 'system', json_body['messages'][0]['role'] + assert_includes json_body['messages'][0]['content'], 'Conventional Commits' + assert_equal 0.3, json_body['temperature'] + end + + def test_generate_commit_message_omits_branch_when_detached + suggester = AiCommitMessage::Suggester.new('', '', '') + prompt = suggester.send(:user_prompt, 72) + refute_includes prompt, 'The current branch name is' + end + + def test_api_error_on_http_failure + with_mock_server({'error' => 'boom'}.to_json, status: '500 Internal Server Error') do |port| + assert_raises AiCommitMessage::Suggester::ApiError do + @suggester.generate_commit_message(url: "http://127.0.0.1:#{port}", model: 'm') + end + end + end + + def test_api_error_on_invalid_json + with_mock_server('not json') do |port| + assert_raises AiCommitMessage::Suggester::ApiError do + @suggester.generate_commit_message(url: "http://127.0.0.1:#{port}", model: 'm') + end + end + end + + def test_connection_error_when_server_is_down + server = TCPServer.new('127.0.0.1', 0) + closed_port = server.addr[1] + server.close + + assert_raises AiCommitMessage::Suggester::ConnectionError do + @suggester.generate_commit_message(url: "http://127.0.0.1:#{closed_port}", model: 'm') + end + end + + def test_list_models_returns_sorted_ids + with_mock_server({ data: [{ id: 'zeta' }, { id: 'alpha' }] }.to_json) do |port| + models = AiCommitMessage::Suggester.list_models("http://127.0.0.1:#{port}") + assert_equal %w[alpha zeta], models + end + end + + def test_list_models_normalizes_v1_suffix + with_mock_server({ data: [{ id: 'm' }] }.to_json) do |port| + models = AiCommitMessage::Suggester.list_models("http://127.0.0.1:#{port}/v1") + assert_equal ['m'], models + end + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..9802218 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,34 @@ +require 'minitest/autorun' +require 'tempfile' +require_relative '../lib/ai-commit-message/suggester' +require_relative '../lib/ai-commit-message/config_manager' + +module TestHelper + # Minimal dependency-free HTTP server returning a canned JSON response. + def with_mock_server(response_body, status: '200 OK') + server = TCPServer.new('127.0.0.1', 0) + thread = nil + begin + thread = Thread.new do + client = server.accept + request = +'' + request << client.readpartial(4096) until request.include?("\r\n\r\n") + client.write( + "HTTP/1.1 #{status}\r\n" \ + "Content-Type: application/json\r\n" \ + "Content-Length: #{response_body.bytesize}\r\n" \ + "Connection: close\r\n\r\n#{response_body}" + ) + client.close + end + yield server.addr[1] + ensure + thread&.join + server.close + end + end + + def openai_chat_response(content) + { choices: [{ message: { role: 'assistant', content: content } }] }.to_json + end +end From f09a01d9a960e7f14e3fae16c03e233d0c91b7e6 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:01:17 +0100 Subject: [PATCH 14/31] [#maintenance] [CI] Add GitHub Actions test workflow --- .github/workflows/tests.yml | 22 ++++++++++++++++++++++ .gitignore | 2 +- Gemfile | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/tests.yml create mode 100644 Gemfile diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..d524025 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,22 @@ +name: Tests + +on: + push: + branches: [master, main, maintenance] + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + ruby: ['3.1', '3.2', '3.3', '3.4'] + steps: + - uses: actions/checkout@v4 + - uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - name: Run tests + run: bundle exec rake test diff --git a/.gitignore b/.gitignore index e3200e0..e93407a 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,7 @@ build-iPhoneSimulator/ # for a library or gem, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: -# Gemfile.lock +Gemfile.lock # .ruby-version # .ruby-gemset diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..fa75df1 --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source 'https://rubygems.org' + +gemspec From a77f28691590b49c00ee3fdf969c18b222aaa1ea Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:08:09 +0100 Subject: [PATCH 15/31] [#maintenance] [Suggester] Raise token budget for thinking models and strip reasoning blocks --- lib/ai-commit-message/suggester.rb | 17 +++++++++++++---- test/suggester_test.rb | 13 +++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index 4495ed5..b3fa941 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -11,6 +11,9 @@ class ApiError < Error; end OPEN_TIMEOUT = 5 READ_TIMEOUT = 120 DEFAULT_LENGTH = 72 + # Thinking models (qwen3 and friends) spend tokens reasoning before the + # answer; the budget must leave room for both. + MAX_TOKENS = 600 def self.list_models(url) uri = URI("#{normalized_base(url)}/v1/models") @@ -51,7 +54,11 @@ def initialize(git_diff_output, git_log_output, git_current_branch) def generate_commit_message(url:, model:, length: DEFAULT_LENGTH, conventional: false) response = post_json(chat_completions_uri(url), request_body(model, length, conventional)) json = self.class.parse_response(response) - clean_commit_message(json.dig('choices', 0, 'message', 'content'), length) + message = clean_commit_message(json.dig('choices', 0, 'message', 'content'), length) + return message unless message.empty? + + raise ApiError, + 'Model returned no commit message content. Try a non-thinking model or a different model.' end private @@ -64,7 +71,7 @@ def request_body(model, length, conventional) { role: 'user', content: user_prompt(length) } ], temperature: 0.3, - max_tokens: [length * 2, 100].max, + max_tokens: MAX_TOKENS, stream: false } end @@ -90,10 +97,12 @@ def user_prompt(length) def branch_line @git_current_branch.strip.empty? ? '' : "The current branch name is: #{@git_current_branch.strip}" end - # Models tend to wrap answers in code fences or quotes and sometimes offer - # alternatives; reduce everything to a single clean subject line. + # Models tend to wrap answers in code fences or quotes, inline their + # reasoning in blocks, or offer alternatives; reduce everything to + # a single clean subject line. def clean_commit_message(raw, length) line = raw.to_s + .gsub(%r{.*?}m, '') .gsub('`', '') .each_line.map(&:strip).reject(&:empty?).first.to_s line = line.sub(/\A["'](.*)["']\z/, '\1') diff --git a/test/suggester_test.rb b/test/suggester_test.rb index 43652b3..15ba8ec 100644 --- a/test/suggester_test.rb +++ b/test/suggester_test.rb @@ -38,6 +38,19 @@ def test_clean_commit_message_truncates_to_length assert_equal '', @suggester.send(:clean_commit_message, nil, 72) end + def test_clean_commit_message_strips_inline_think_blocks + raw = "Let me decide on wording.\nfix: handle nil diff" + assert_equal 'fix: handle nil diff', @suggester.send(:clean_commit_message, raw, 72) + end + + def test_generate_commit_message_raises_when_content_is_empty + with_mock_server(openai_chat_response('')) do |port| + assert_raises AiCommitMessage::Suggester::ApiError do + @suggester.generate_commit_message(url: "http://127.0.0.1:#{port}", model: 'm') + end + end + end + def test_generate_commit_message_returns_cleaned_content with_mock_server(openai_chat_response("```\nfix: avoid nil crash\n```")) do |port| message = @suggester.generate_commit_message(url: "http://127.0.0.1:#{port}", model: 'test-model') From 1c7604bcf9a241902dd09e83f232f7f780027a4a Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:10:30 +0100 Subject: [PATCH 16/31] [#maintenance] [CLI] Exit with failure status on errors --- lib/ai-commit-message/cli.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index 4034a70..466fb6d 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -5,6 +5,10 @@ module AiCommitMessage class CLI < Thor + def self.exit_on_failure? + true + end + DEFAULT_URL = 'http://localhost:11434' DEFAULT_MODEL_NAME = 'qwen3:8b' MAX_DIFF_LENGTH = 12_000 From 77a3eaaba459e165fc2b7abe34c5c2db6b73e0f5 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:12:35 +0100 Subject: [PATCH 17/31] [#maintenance] [Suggester] Raise token budget to 2048 so thinking models finish --- lib/ai-commit-message/suggester.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index b3fa941..3a381a7 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -12,8 +12,8 @@ class ApiError < Error; end READ_TIMEOUT = 120 DEFAULT_LENGTH = 72 # Thinking models (qwen3 and friends) spend tokens reasoning before the - # answer; the budget must leave room for both. - MAX_TOKENS = 600 + # answer; the budget must leave room for both or content comes back empty. + MAX_TOKENS = 2048 def self.list_models(url) uri = URI("#{normalized_base(url)}/v1/models") From 27b4decc0c0de6e3d4cddf25f58ad2774970efc0 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:18:12 +0100 Subject: [PATCH 18/31] [#maintenance] [CLI] Fix options.length collision returning hash size instead of length option --- lib/ai-commit-message/cli.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index 466fb6d..19bb866 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -32,14 +32,14 @@ def commit suggester = AiCommitMessage::Suggester.new(git_diff_output[0, MAX_DIFF_LENGTH], git_log_output, git_current_branch) commit_message = suggester.generate_commit_message( - url: url_to_be_used(options.url), - model: model_to_be_used(options.model), - length: options.length, - conventional: options.conventional + url: url_to_be_used(options[:url]), + model: model_to_be_used(options[:model]), + length: options[:length], + conventional: options[:conventional] ) puts commit_message - return unless options.apply + return unless options[:apply] prompt = TTY::Prompt.new return unless prompt.yes?("Commit with this message?", default: true) @@ -54,7 +54,7 @@ def commit method_option :url, type: :string def models - puts AiCommitMessage::Suggester.list_models(url_to_be_used(options.url)) + puts AiCommitMessage::Suggester.list_models(url_to_be_used(options[:url])) rescue AiCommitMessage::Suggester::Error => e warn e.message exit 1 From 8b41c76534d72b3a8fc1b31a59921a1bfd1261e1 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:39:31 +0100 Subject: [PATCH 19/31] [#maintenance] [Docs] Add terminal demo gif and reproducible generator script --- docs/demo.cast | 94 ++++++++++++++++++++++++++++++++ docs/demo.gif | Bin 0 -> 79486 bytes docs/generate_demo.py | 122 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+) create mode 100644 docs/demo.cast create mode 100644 docs/demo.gif create mode 100644 docs/generate_demo.py diff --git a/docs/demo.cast b/docs/demo.cast new file mode 100644 index 0000000..49fbda3 --- /dev/null +++ b/docs/demo.cast @@ -0,0 +1,94 @@ +{"version": 3, "term": {"cols": 84, "rows": 13}, "timestamp": 1790465952, "command": "ai-commit-message"} +[0.8, "o", ""] +[0.84, "o", "\u001b[2m# ai-commit-message: AI commit messages from a local LLM\u001b[0m\r\n\r\n"] +[0.875, "o", "\u001b[1;32m$\u001b[0m "] +[0.91, "o", "a"] +[0.945, "o", "i"] +[0.98, "o", "-"] +[1.015, "o", "c"] +[1.05, "o", "o"] +[1.085, "o", "m"] +[1.12, "o", "m"] +[1.155, "o", "i"] +[1.19, "o", "t"] +[1.225, "o", "-"] +[1.26, "o", "m"] +[1.295, "o", "e"] +[1.33, "o", "s"] +[1.365, "o", "s"] +[1.4, "o", "a"] +[1.435, "o", "g"] +[1.47, "o", "e"] +[1.505, "o", " "] +[1.54, "o", "c"] +[1.575, "o", "o"] +[1.61, "o", "m"] +[1.645, "o", "m"] +[1.68, "o", "i"] +[1.83, "o", "t"] +[2.73, "o", "\r\n"] +[3.33, "o", ""] +[3.37, "o", "chore: add docstring and type check to add function\r\n\r\n"] +[3.405, "o", "\u001b[1;32m$\u001b[0m "] +[3.44, "o", "a"] +[3.475, "o", "i"] +[3.51, "o", "-"] +[3.545, "o", "c"] +[3.58, "o", "o"] +[3.615, "o", "m"] +[3.65, "o", "m"] +[3.685, "o", "i"] +[3.72, "o", "t"] +[3.755, "o", "-"] +[3.79, "o", "m"] +[3.825, "o", "e"] +[3.86, "o", "s"] +[3.895, "o", "s"] +[3.93, "o", "a"] +[3.965, "o", "g"] +[4.0, "o", "e"] +[4.035, "o", " "] +[4.07, "o", "c"] +[4.105, "o", "o"] +[4.14, "o", "m"] +[4.175, "o", "m"] +[4.21, "o", "i"] +[4.245, "o", "t"] +[4.28, "o", " "] +[4.315, "o", "-"] +[4.35, "o", "-"] +[4.385, "o", "a"] +[4.42, "o", "p"] +[4.455, "o", "p"] +[4.49, "o", "l"] +[4.64, "o", "y"] +[5.54, "o", "\r\n"] +[5.94, "o", ""] +[6.44, "o", "chore: add docstring and type check to add function\r\n"] +[6.84, "o", "Commit with this message? (\u001b[1mY\u001b[0m/n) "] +[7.44, "o", "y\r\n"] +[7.48, "o", "\u001b[32md087e34 docs: add type check and docstring to add function\u001b[0m\r\n\r\n"] +[7.515, "o", "\u001b[1;32m$\u001b[0m "] +[7.55, "o", "g"] +[7.585, "o", "i"] +[7.62, "o", "t"] +[7.655, "o", " "] +[7.69, "o", "l"] +[7.725, "o", "o"] +[7.76, "o", "g"] +[7.795, "o", " "] +[7.83, "o", "-"] +[7.865, "o", "-"] +[7.9, "o", "o"] +[7.935, "o", "n"] +[7.97, "o", "e"] +[8.005, "o", "l"] +[8.04, "o", "i"] +[8.075, "o", "n"] +[8.11, "o", "e"] +[8.145, "o", " "] +[8.18, "o", "-"] +[8.33, "o", "2"] +[8.73, "o", "\r\n"] +[9.23, "o", ""] +[9.23, "o", "\u001b[33md087e34 docs: add type check and docstring to add function\r\nf7c9626 chore: initial setup\u001b[0m\r\n\r\n"] diff --git a/docs/demo.gif b/docs/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..a3f55e45355a6393474b5634ee866adc78e92207 GIT binary patch literal 79486 zcmeEvd0fnU`~GK^W^0>P?afq3Lb7F_7Ftlr7Q&QJ3CWgy+V@NeMWs?nB`GQ-Q$ks@ z9I}^v-yOStSACp0ojA_&Jm>j6&+F^_b6&4r&dI#*>%Q*mzVG+@8e99}7X95Bv`!Qe z@#PscT4W4q3D9*ki>lDZ4I3mt3p(pcr<;ZvCCeoCilspU570G4jICv3K8}eDhgR zjuT#!`8;Bz$%f-OFWIpUThHaajymB}cBSx*tU~mWTgC5U9P=+cD*Yh8=Gfg=dq2gU zdidsJWwWA&v4x$hS1nhZn;Xz@?=35`)IxKj_tMCBz4s(ty#J2vQ&Oif$!A&A(ViQV zEHfTleAOhkUbA=ftylESz?Q1@#I92i7;CX?c_nX(!GnkS zPS0Z-2S@kaerdPw<-IFq`xRck1p<-eYrAr zVA+$a70W+-mLF99tf?kiduZICJuhw_-!yQw!r;BH?w`w_d?0S{zMmgo*|)q|VMxW> z=eLe+8oFl4{`apRUEa4^acJeocds5^KCou!fzO{le)!PbtSA&w73_q847~_p5T|>s zFj!#-%RNNd(at?oeQJbznAY4{_i(*cERP6-I6IHXPH7PyQ6`189?{(^S<_?8Pufk7 z?Rza^dfb2~wbR!O`ONYZTPfIk#t+wv^h|K*Ugx>iaR_@xqKl*bjCJFuM$TA2X>Q$& z4O3UKXC`^X+0RU#nHD*7qfcSo%uRDE*|SpoPukB)U3@KaR@$;Bb+b0F`pou94^nXO z$_Ueo^2&_re$;DA+z^g;R)V90clP?JQQkQl=N|RmnzoALlbadm;Il0!Ey^b^ukff( zeqkkNc0ut;huPapuSLx+-23F{>>ZV#Ile{J3L|`X9@dNYEj~K4`!U~=lS5?Z>^kE( zV$SaKQ={jUUYdJsPT93pvUAIC#EqD{=T2Jm+`SJ9kImipq*8WX#fy_8=I#IaTJ*fi z_fL+^JMj6lte=FcIMT0*p&#Q{&FOL6@1Vj^x%oB9P9x_ZQlAzx|8TrIGV&c=W@t+q zvI$w@EoCSXX6rl>nJ5a0?9r<~@^OVIOkiz4+`)PIs^Fz70{s^+U$A85a#3i8hY`)1H01nD%lWJJG>$%n(akui5iw&s#WVg4_6s)11ak z3Ro_(7-(r}btWoO*ge1`X2e#fptPoIH; z;Wl=oI(0GY(yh0faHhV2G0(7z&)fwgoW{=aTRh5n{4@_QJ%i4jO?rZt#=1@!H*spe z0fN=R5oW#ngT=ao&Hmm0Vm6B?LBYX9Sa?KaRCG*i+!}Fw!rH`j>o+7NZ`_oUnzlJT zBQrB3d&}0`ZF%_x+Y5IT?JQ2n4k;-s-?MjL#s10zal1n$HHQu#sjWM@tvYBUm04MT z>|Dv&pLS@QvwHK5YK&xW^w`pLvoP4)hN3Z%veDS3@_D2YyCIiJofu(9ZEha>EHk`T zuX2ojh@W?HO_IE}rd-N0jh-$t6nWJt$0H&l2zGc9i`TO@D&5rVnr_NDN|nQC{S;Hd zu51dIqM_y6^Zbh$#uT&l9mNqoxx-?#;uoum1F3|;(BT{te;cu^iHT;sP$^RsA{*{V z#He=(3Z-^h#_g|aX%(%h*eth5ED5ZlsmTo|k|w{IJJs5wIlfN~webKu?(L;R`4{Q~ zWn>x+2BfDGbfdLhrw!S)`{4weK~_f2O^0eTj>O+Ipz?{3EcxD@%(!dqe3k5Hp3a-` zaQus@d!w68e!gt+tWR~A3~z4ll;_^HmAbPJuUIxKaBWO?2C>5Efg&a$Ck~|bH1`w8vEMcZ`qLUB zw!|IPv?0kRfv&QR&%IV7?F|2d9|7GJq}w;j~z+vUzIR)Ko_I< zNS*$-3}gCg-r6)~{L&fg3EzviH>8HKB}qg;`IThv!i$}Vq{DlEicT+bpj9q7v#}Ch5ugMM!seYT!7v+>^Ce>^lz#A=N5*iUWVlbah7#0n8A#8oQ zM29gJDr~kzM{^G&eZQhwIV~OkV40pAXBio)FCilO$O(H?zJC#2yEo!iql?k!Ynz@{ z_93286t)JA&0~)o89{bs}<9^3w zWmmAO!Zl3UCn)`Nil-}2bDM8qH7h2Nud`gvyhfny^2$hWQF<-)n$eA7{>$_Eey0-B zm%rM1j_TKkm`JOCVmQ@lxoS|ja8tTJhZ{I-+4UzpI|aq0V=Ng1Q?VtL>a}D+d_Q7g z@OB4N7h*Sq<=lf%VKpWaw70T*Zhdg*A7C(`tIOM=;Y0P_-EvVEyHUb?Gps2i8yge( zc_mNY^H+S3FJH{gWr$SrH_p{~u)(d~DuI=lQoMPMs<_-BTK`P>y`(X7-`z`Abo0C` z9;v_b{?>z)%O38aaR)ZP-Sy_vlE$!Gt5{FN-YRgP-8`jWf3DlU4R$ZX2JIMpKknSB z%EmPU_0Pn!L4@%Lp9Kg=X}J z2$MlI4C`LP2H!0fX(AM&r=;e?snBt7F>NAqtJ5~6>%8*~M+C8d&)#8WuU<*8;Y zHg7zrT#y%@>SyKeCSqN-@eoC5q*L5-4<2PV`hVQye$pp5tB1?HaA!|CH`LCCD0m)0 z*k$sE*Vb5DoaTCe%uu>q%X&XCcKDmwO|mm;S^b~LisHEGym93$>$qp!S|1yle9tOmJeFW|^&(O_JBFl3Uj~ zaYUq^^Jt~Y6vHmI#uR-W4@&-}j-7J_!JWr8B|EXKIony0W4i~f3lErKx}P=Nii+r! zcdYiGIC#bogCxnv+s5*v9jsMfCe_`#-GB9c)=&cvhRBBAS3cuJ_W>TMudO@{#k-v* zRG;zPZbKJbj*PG~_edaeJ;n8g>u7`c#1u1oV>S06L$Q$7-ODn}%E&-x-LRH*ppx@RxU?zYm~WANUF_+_TMo8z;HLG_|*{IH-zU9ff$lTZw9;EwKOwsw2W3|lv&{~ z`kjs`c%-S{r}4}>fbz;!z5D7BsXV*)XQmYP&gmB$VYlG@ z*>r{7xq(ghM{jz6F4wV-vBUNUPwT`958xEg%G;`pGi}i7(yS9#c>@)eprG}HGrDZ1`&t3lEa-%|7`H@ji z{5O5La?i1B?}Zaj7VrCT^;uk5#obX)mtFpF?d{33$~PyTdU6}D6U=}E%(%xQ?UY8= z*3v3k+Osh0^;vN30!ROj%QL%ed@y-I$Xv zTz6F5Hko?UdL@op`WGpmqJGBd`3!MvjOG;gcT!`6r3im%FZ2t+d z{J-`8WF$&Nein3%HMW8NdyEFeJLjCU4>8Cd>2unrrf+zNNr%R93|`7%k>w@&;amO^ zvwP`QF;wbQ^^pu2iu+`@l^PvonSmkWS5lNsX*7nu=Dg`~6h*ym9GZ#N3V)%NAx$ZB zs*O9F)?u5gdRGQt-axjCYS9>Gr?k#IwGE+Ltb(ofO`LQv_R!e6X_M+_9y?1tc6{^< z%hn#yx+PJy2^FH0(yvXT0xn1r01@pK8X}|(G80LHd_WqY#Umk(#*OUG(0QRV>So?= z=dQh%uird=>RjsPoc)r+l~sq+GIG|$Z@6%&@zmLdBS%j)T)tkuPm;7Lz5d+AYfX1< z-F@76<8I^4dw1?XL1wl~%XYnIyT+63H^1L(woStCXCRq=Xam2Qcw~7M*r_cP9d+z+j zOP8-)y>`8^>Bh}lx9{A&cmKh|M~|O8efIpt%U7>|e)IO-`wt&KeQqXb938u&^r~Q% ziiuloQO3b=uAxJU-OkKI(HgycuGH?_a%2t9I!edBIIC{0@t8cfy5j6(8_cF3O|dV@ zIkCxN!GkMxC0kEz7A%#~a7fG*ZLy1IOc_v^dp65C+2PZjUB>6K#+1y>_j&bT^mbwX zeBB4HXE&4_KFl!gN^HL@^jUMUGWBv-(K;pmNKt^G)b#3sJybi1L}(eJs&@Xp%<-i4 zXQ_mo@z0ma{R;?|h1hsLMIx%3&@Fndn&2RVLtzClbQkTKJvNUoH?C;XlZThHr~$Rk z!XOz{rt9=Wqjbg+H2skgUiD2il*@;w?i-ojCeL-`b(7_)g9w3%(A5P0w!!rFJMIsvcR9xSr!IaDD5Q4fK=O&4EU2Q z@ZaYd(6V%#)vmz*9@T)Be~)dzy;9-zCkY1({~h54@`v^!`5y`lB>*A}RRG)$s)rgw zIe;KTMSvzFivpAxSrLHco$r9n_4m38wvU%-@I62CvCn}kPhRia9(lym(t@XzUiVNi z{W)XPsleXr^Lcx=E%R9-C&yU5blH5F@W7~;$R%T=7fp&woY9*S63PmR@OI;NX2-^R zWG4sY_6peSmortoZC1Yd_CS7XcG{5&q7PvNssCk)45>eG=rGjD=rwCmGkHcPNLC;e z$%?!LipesF{Lt3#h%$(TkoE#3Dv{GFHajRpbvjdYi`36rPI zfHrB@Ea>t(L9LK21Be0mwH+}U+4&t5gGi96|8^{chah?WX*e?$3PeDG0fD79jK``Vh*$0fM)$KjM$bW2TR&A{tPKq%MRuf`*&u=3&se+oFKgU^FA+?jTC6 z0g_TOst+GKfARX^+7pNCPR5GYtxw*(CLt*|zv%Y8#~>6^H3C*7pa3Pn4QK+CfFR%w zzyWGV$N(=SSV)Wj6m78}4LF#Kl&xT^Z)(>6Obq`my9LIimYzcuJx8W;-B{&hyID#; ziJWcYx{eph`-aBW+$~-jurrWV%kSx`KFf#LGJn-z+CZ%x8)jLobf&2ARp~5_?))GM zS4N+yCKo+wlGl3wq!^cJ8`q_{wh8ypZ-pC2hiIaIz}}_q`049SckD-vK?Ko#k{z(8 zmoN545cjB&XMVbL@W}D2jkizK|3p@T+GF(yZqu#%i1Lj)4-syXKco;Mc?IA>d`bL} z!3Bx{1`ocjDh%%yY21eC2O#3S-y}GK3tGjVFD`yP zB94IsA_$(w+7By3>b#Avkei9{)z~sut1pq5;A}ZfP;jE z6cZ#Meh&>m&ksP5YiXIWze5DJQM8=VJ>6E62f8N|Idh5XxrAsCAA{qM_ct(#dkATI6ZvVk9`lx?{EuJ^LuZSr4$K${}}L#0Dq)L^o}BaskvkTOZf z;9^iP$QJ;R5(HEn$q|U}H)#Ta1`9~Z0xUrC1yBJn006*-w2-u`BH#`(&tt^DbQP_I zx@-CBoOTCBjF2W^a&XXg^Gg zT6=5e)k2NJ=S!En*wg8Z)s&?(Y{ zV_BgL`OwI~JZp-=aOT>QH6DBRF4?(dFL7XhNlkI(l0$h=Ok;dzhYc6I+sg!u2uiTlNVZBDOIf#cYT72- zG^@n*o?CLVT(JLvd{>8I)^pILBj znD^1C4Hr*dxSD(Y%jC1QZ}I&?Tfd@N+PC2BaP&An96iE-`i4V9BygHIeQ6|cUN|W- z7&u}aS-ZN26GV`3*3vlP(2*F37LK0OCM3iW0K|-pA0mMel9BkmQ*JwVqnT^$?fQ9* zy&OF>9oYxQ*UzG;huYqtCz6|*R^ToA z>KO3pNyy>jNTK&xSl0>3QHV z{>(A_F8k@P=Y(0dvY#c@exyMQ`vq7K9C~^S`-z7A3HEC}s2Mn@uD?+~SRUb%LfPPO zAa|g3Fk3fb{M@cuIzYgdusDI7!3>RDknDj7R_ideB=CTVEp%SOYnb zKm$MgReb$3cb?iJ_^oY!zl*CcxzqP+3{s*85x_LQtdi$+*apUQREC2 zWmxK}S&p=Vu@t6`k%k_n$-j`g*xO;8h};0PV^4`XM_!HFR#2Rg zwQX1VekfV=E@2UISf&(}>_MIYC_o8liUcC?0RRC;Bt8H~z?1|BKnXemdO$=ZIssV{ zpd=#!og`35i~?i;G++uKN?SBk2q5*(0n750gaWNu zKD?J1rl*sv>Rt-nPFtyCV5BwQ*^y@$K8m5EMq$Y?Vn(az(mT?WWY^hG61hxE_s@#R z8I^0-rh1FN6?ii02tOJ4KN)r4<8KF^j5;Xc|6s_;-Ol#|AIl;GA6=#FI!L1>@X4m9 zHLU7xx+3suZ2~W&qe@}XWnxAv>oPjhxSVeVzBS`hY5}hRL;g!vNUIo180r^Uynr**FDWtnH;@4{=gayogc2DQMU9P%3y)7AqSvk2 zur@hjUCajY#*Mf~OT`Y4k`MUjcc7B8Bsim-{N|=OC(Ul9;Fp zQ!`HaM630t(?Zt}3{!Dq6_sh$Tkx^QOhn=IuoBvZjJi?ar#o!j$hye!yk9pkSwNCz zdu0mHAfiACf`=qVAb}^q1yfTTJxGEiA*uc#6(};Elm%_moy>J)c{^oF;uRPLH~>>% z6vzO40R<+oB3|2vm`n2Cx8YuwzTp zzd8i?Cb2@o>pNHnpn)eT;sGq+8(T?G9ng<4AV3L_0r4crkPl=s0H%KfaEzr;rYzQ% z%RUM%mwmcOFZ*n}QaB-9o_W~QPh*OLn|ivu)uV2+=B}}{ru1KPOhwC9Np004p@AbW z%ykBzON)<>86(uy8}BPrFw~$kb(9k)`lzcKar7Bmra8{sSU7t+%g3$AX2Xu@P6*#{whWGjRyqM%^iMurfQlVmK^7b$50d?arn zmgtzs7WwOlBAh@NXa+$Ii(CV_+H&pa%!RK*3*;fR|ACst^!vgql!(YkYD{cwm^eOa zZQQ!}4Iyiz*2N{IZH!KdNlQwPz_pTuoLp*Ne){$u;v7n`cudyrvXbP2-2I{ZBvru& zGY=g;P@B~$v=4D4MQ8u;qdRNr&a4kL+i^Ly?)0&g8#fz{U%GYW!M&8gU&l!~06~}E zfB=Jb1RgO)FMy=Pv6AQ2Qbbx+0(NmoILuO|V|C2b(KjN2S_bE>i#Rf4$VoZcawHA% z3CKWg0>a3G1puLnp}`?>1CW7rTByjd3y6nA3AAuql(g$az)4bw03Y802ao{-qo_&2 zAw>oN0YW070LTIdZHpbk{~y@MqM`X^)EN3pv+A|be&wWWSA#{~D`y^pSf3ARaJ#1q=WQ?Cy}gKm{N{f(_gOu(gai zeu0@32EZGTAcY(-L-GZH*TNT*gwp1;MN#}RJpm@c6fMm43mpJ>05geFKopP$uY&@l z`#ppkeb_&wAO7|vgPHa>g-4{ah7L<6a+gzSIEBk*GUPQ?AX=+g^e9e;V`(SCC|a~A zTH>zrp%lGKkqWx!lCB3+UY=Ne?Vg^GML&*&o{q}R8{M3dhgJ@p9VSPR_Lb4 z%yzF1`>bcaz}UgPCMu6g`ISx%05S%@p%Z`t)g2=TbeqUCa@ z+TH8<^T3o@!Q;hwvguwMIlh-SKFd8hSNBNCq<#HTb_^VU>Xo%jsI^N^KUJf3hwdye zj51b88h*&nU2pT2FMFRLRXGiUrzo+a`V~|?At(~ouBT2*m&>f8iR^=jkk!+CBcsD? z#|Cr`4h^>+ku-Q?tT5HmxAW*Ur}TlDTl?^Tm7EO##Bc9eyxT06wday zJ3nYM4Eo#c{Qhv^hx9?^MM1<67*Yxeg;Mx65&u{0{FrL3J3m&-&QIKC=O<79Q#(I} zFFQXuLXoM&C3k)*>K#;N|8VCQ*K$RTjT3)Kn6%ko7GC9j7UsH+E5CPdixIDX z|94)IHpxr(XeQd%u`k`6s5xm;FB9*)_dzB_@AsbJ3>;xFVtKxM^uEa%$3Dn5$quUE zja=a?j2T%_A$R4`aarBifulyvUMat6`~IU>=e(EKn?z2-T62L-I1oqSMbPqK3|C0e zg~O2mJq2QdE+0(<^cw<2)(D^-W#Z_`v*=AAQxQFYAFzjrh1B1&wE*~s+Jp*4D%sdO z;#v^qADA>??12$NNO&ydBJ?DlPPORLvkj1-Si1+*;>pS(m}gZe#mKd7VWhCVs1%J@ zXhbaZE#@d_VX!CaZf*g=jNOp*G97dn*`uM+MK3nG)rtX2AINwJcr@YI^`OJTfR1dx zaS;!S8Z9@PCbDxzlMFux4Cr99fR|}d<9MZlcD?G*QFL2tH>8j=I*fBLDY^gXIiAK~ zX@%C09QI(olA691Jr^cDW5aX@(s1^?g;-MJW!kujQ{lsaxz3)7s*LQsh?oRS zEHSPuDXYlL$wwcz|G=Sw9lO^hrQzm0IPlMlr2pwZ$!aE;EFBB3=nvk3I2hTv{N^1< zzXT%<={t}yw~q%64(8}O?8-g8g}a(V=She&p>(=n-GH7ZrwFC6Nh_m@yls^!7HU^F ziVF_vJAHoiZl9PoIcyp^$gxN7c= zDyou)W3Ae=t%s7R)Jt0Qs!q{j1~ZUub}%D2M4M@tl%ByHP_0NAV$*!<)y$X>&J+dn zJ%NpqbsfiEC|liQV8)6!&lJs`-dc8_lmCjIJ_^j5l3q3tOXpn}H?xOSVOo68C z%tc}uS2~|cQ#WSVcAT!0?$CAIAe*$M_ogH@h3RT7)L*ICv0O;VpX5gJnW4(;x$458 zS_(6ZJ7V$WMIBDBmZS=~^AGd4>JXRaU(hG)7%b6jmwV5L$MiarJ8i)!%Y`?V-rrNJ zx9WK+dy94a!uyg0y3Rt4FfIRFjdhhBy~Q!IeJ$KW*^fKqSS~ECts{DxH3q2<(Fi=~ z#|mkxVyHB_bLC_{@{Y;E+Jq}_Z+zyE>PF*jY6MH*79li=-GZ=NBDLU=2D` z$6%&=nB?UZzvq_342UY)vu;SrgS_oj!Ojv!$MYdwR|{UvlQ7-$x@=85+_mfWQmvXD zJ3ri+R8Z8Yr7YlIGU-fIr1V_$bk8x9NzY3z%-q+lJS8Gpe6+6Ax5wcna?VtGub!`S zEXVnJh`Fjd^r|XGe4v2JUS}30Qu8}!LyXo~NLOYK7W{N&(M{8SR~Z+ZKP_rt#LlVz zNj8ud)LGWsd85_LE&JO=|SDH&<8C8sAuV zrc11>h90x;@MP@-1<_-UZgaq`I;LaaH|bk?3K$$u$g@k@yF^rG7eS4sf?1}RKIM!^ ziEqKftu8L1sgXrYwW#fo8zhics_a z?IM{~BQj+>yf2A3(Ty&m8l_W`gR0YqaS4?b5iEKCAk&)1GAho>W17cj=r>bDt9zMy zSepmz)6!!^%9%t3a>AH7T zKBq}kRWc6+Cq3i2?Mm;^lvMqC_YR|rBlwK2EMkBvWpy`aJEZ}oO18#s{MX-$gW%DqQPtl*MOW6r1l7aFvs)EFatx*_hvo^NX5J8S5wRSnkY^3&}E? zrD3PNOgT|uo1vjPh3IM*(M4=gt9ni-9_Hd1=kISgC1o4eE6kJ_YeDT)Ty7CEa(<#h z-3+777wt!QoJrwMH2hh#IO?(e+Qi6*IaWf=qrsw*4Wl#(jZ2Nql}o7UR1uAkIU_o- zo?pXqYK)j;5)ouSzHtd-CuN-8GH&FMkW8giF9Fj>ywb`>uFh@!AlXUPwM}cg`<7Q* z*7}VIF+InVznwj_Cx?i3^vz<#+jL^YhaNS(Pu*^4OmH2P)?7Qe*(P+Pwy48;OI1sn zQY6KZvWy$o_f|F$vCY!UXG~$v=v3BHYdcChYsul$xtw?(dnK!J!LF~fXcpEAGsOhY zxJv%u^Q}~lggWt~h_Z<1Z8fAwWNk*_tgH>rFL*5$^v+}tZm?EZC=_#bgftfxg_`Rz z@wm^=fvI@y->r7S0qS|4e|G+qt3vK54I+9_QAj5R<#3|e*HXdQFG#4QY$g{Y^zPh; zrR>{CpO|Gu?=~!AI=}10qvnS;XM8fX@mYTPia{0#&1OQUbZVyvDy7h zRVC^OokI!;ny84Pt}~1K%nx5=f{61e8v^TWmS8gyvRsIe27x^9V{n)q z1O25ZA7&S?GYp#9r{o=P3rmtQCW6kZsy@!xGe2&LoKp9#4YUXHT7=Q|>3Wkd9eXuS zj^bdJ6|TDM1hcLp-`s%bc<(ooXdCp)gU)FHrcjv`n(c>S>_%$3~V@fD@eAGaKDq!zb9|QL z%Z-;m-my5f=j4);FVjAJyem-LTOaQDDpUK@Jv*npXEvOCl{4_uedjfM&uw*loj3W@ z1J_e~&zGHiUAX+yL!sipqfHgOott#;cuuIlc;V!WT};tqKmFyGZaOYW*th>l0Q23| zmnYxEKHdLRRQC2d&FO8pV&$_4+qX?BrvjGusC+JFzPV}W^v=tv@qqlpVTAJxw z`7-^$(JR(Y%TBGSe3jc_@WnBwmZh$!d|hN)_i(z?a`ExXpUbb?3EC{X*@QK5fHJ(z z6V5;MgZPur62J4B>pNx;=r71#8!d*kzd&;VWlqkqrTqnjIwUmu3$oEbi-AT1Z3WqA zpv6G%K(-sd*Jz;2Ky!h11A}X_-9VRt=7MZA$o>ND1_o&8GSEtVv(X^?3$z=pd$pD> z1AWKWjRqQucD)Ar3v>|ZBieNt=qcJZ8o$?Hpt&I12Q(V!AimRRV88Rv^%rOXzTaYy z{RNf|f3L;(kF^Yt_Y~H*o_Y7oEROnX&%A$;_jYSdrX1b1?d(?PEe@#;yYqg^cP;U` zdUSXGg&o3!QMw~a3oe#;oz0tataSV3GQXQgQ%95)I`m*axB6*B!j36hR-I*h9#LM@ zbkLP)IQ4k>&YMTXh9lBO?kT=~EUDM*YsdGL+&z_U9j!NN@2>l2bI0UQJ+XK9!wW^z zkEM;;SNiyJ`GSYnPV6gtdR-DMtM6D*{`_Vw4BAds?0I>&e#?l>j{En%e%Mel`})cK z`<7Hws-tgq*z7EN_ww$6{2msSE0?~yci|Ybe$~h2Z|~gQvBOD^|M}JXmHqT6Kfimk znV@jqN*MBT5(!I-?x(+sy{vXbew|{I;{{`icR$1&RjJ4jH@_yx#N*(0dp88 z_tHbPw63NHoX_2wS>JP`an?zD6Qj_?0Ufx%&dKEnN8$)&U>n{;j+2x^uGq1UCus+x z403#daRk<07%w2@k>(%-3=NRQm=7RH(efiD$*W*koMXw2RvmphdULWR$EXA|6Yv!% z4s#OBC_rc=%VC5<(i%x+;4zF!+A$cI?VHmQkQf*Y^woAk0z$*q7{o=An3TA{?c|Vz z9Ep6BsiZW8c?kR-K~R{1NCzO`G3g8h^o7v}_^R#n19a4mi}1!+I`;qpH&2vayb}Ci-Q5$9iRTZ0&t9Y8 z)g0Js6r4K|Twcf@=BV6l>Xq90>kr5MDSM5-$Gc}q;=Q^r;H8heq-@?aiipNMKO!Lg z`oSQT4pToqExKM4q&ec+-M2kFC2M+VMHu!-3R{a_l2P> zxQ$dsU=FYycmhm-#6@;uo(K8?MYS98f(t=cP+_1hk|s&U0-uqyUg?OJDRnPj&H$UU|EvAppQtp{hG!=z+f_PFy_0U;jd*^TQUPl{~n)#w#l(B z$>QH6HjHdRY@qhG16^<%n4Y9J@I79_gWkaU*uQ_1;mC_sQj#Mp13BFNL3RJWX9nN! z6QbLi)%FkFzrp8tpW8_j0?(f#4%)dyWCms0td|vTePOB;63FaD$$kc-^1bZmKaDn+ zAeYu8p*_$kHRZX-EE+b=DPS#q!=Vz^uNp!Jxn=m9%NNpzYCjA%VC;vC0hjy-u5&RL zlJ|9je!b8aLSE==xzD#DJ~?_*OsaTu1bm`GvngAt+w!uv??~9WHP~!NesM|o?hNgq zk$WgI!7@3e6+{G`c9LG3LFfhb-L|)`qTx)1{^dK?Pf8St(tf{{VH|ifMV%vLqD67!(Cz(jhc-q2f!e`8j3=WDuo+*Ka5i9qZqr5Es!pl#0Yn>H5zy+8bYgAJ}6^B04STGC)67X}+A+8S(ZkQ!_hwHj>L zO#hz2#=_q-*uVk)rHfT)m!#M15Lu)%V1v9ye9602h%)*_AO|Tgr~?y-c30-x-P8ohL%OwPZ}Q3_>Nj-T|9^uG?L_u) z{?3-G#xgg`ZS-2M8he=$5j0_|!G_JBH`rL%?kzReIryaH5&baO_($g!Z7bt{v%yAt zC4_sO?R*xXcK@W+0_JZ&3^x8=+x2~)g+(SJ8OYF5R92UZ5E%+I|>p z{6&Keo`KO9gAJ{38f@tCI~sm5*wE4a%3woZ`!@y~)W2Y`(H=TjHX*LK&Vv}^t~w?n z*xX`Mjn~QF_t+rs+GB5pkr=i`f5v751DLjNk)_T8n89E_jC~eHGCvG9{=l0>hON%v z8}oK#$+j45=rNco%CfBn8%FF%1%pK!F9sXkyF_(pG1xHSXv^p; zwHj;)(***{aP_V&1{>RKS`9V^2?%O1)6Am9V1o$a^ce2-`vw~eziF_6*(vA;@23AP z?ixTLiVI2%2@X8O0A2ys9|jvzjq>LWHe6MCCoCUzn?5&=V))!*%`s(7TdwM_1{;c` z!G?}53^wEqJJ1>0N-)?^Q!!%e$^2rl!Teo=jfFo9HhvgvEc~YpHpnd;sX`z@Kn5sP zAcG$U8*Sf4{~d!3C#k^(ubsh$-Zu<3_-zd~^#7E>Mtk9bJuMb@C=_iMci6pWfM z>x;pL#h*3USonJe8$VV&-;C`)^uxbmun}Y=r@=Vn(rU0lnk=*$Z0IS745(hM1{+2H zg26`nfroVG_phvirF-BX1{-aQi1c0k*FXH-o!`H1s^7YoI`U)Z_fMGWw{D;Or0p93l>#+<+kfI3^s>|93BaDG^YO zV^(MGyCmgy|rsIfOs^~2tHx6`p#CuXO;aBbs~_3^6@FTJQq z9s#+q!-vNwZ~K99MmQG|9pq(XOsH`*m@{Gd1-#(wq)*5IL!1{LNMMH9A_@P2n^k}N z8wFak?h%fm#V9{S`ZXcaW00mF8EAZHsMxPRG5K+E#i-q9ZI?52H*T$cel~x0x4myB z7*i*|OPwCI?g~54i(S$lR>V6^kPQnH+?25&(|x|p){bM6RLw`;!gU5EGXY>UvPL+T31-a5AYUHFEbviMoP4aiyl9TPYHE-L9FJBYZiiQqf4)51njJWlWCzqG5-N4Kh-`0Y;I_{$3 zgm4UaV1uVJXlnoqyobSebCQm)FdqRLU=ac%W4v#{v!$BDC*UvwD#5cBm^{LT1bq^6 z0nHG3RP90pBz-eV(h!mHkp>4s39UA{9YBc4_~1GtG7iIF(nIt=aOL<9E5n}&J1LbJ z-roy;vV694u31HcglO`%;i&f>w?BZT*rET}SWO3;Wus{N)*N2oXqt{SQ!B!r##dl) zSt@JB(dcYXT}G1IM#pKHBfPVnyeH+kOv@i@`D^O%z7>6h9su|kqmOX61AsL8ZLch& z-r`}$kLZ6t`kD%%0y6r~y=_=uMW1KQ(MI%j+eKf7?Wy;B(QnOtZAAaKUl<3UXHXzA z^z^w)$S*wcfkfhWGQ}Pq9z%F}h!GdoBP2yg5rTkz%@3H2gCY=LumnQfjwrwbBv&Bx zBwc`HzKI#o0;C)s(@2^7JDflg!v7o_(C461dY5ZNpIG{7OsB<0tSHTk$@+QQv?t3% zxcBN|I@xlxPH>7(hiYz62iF*(hl9DTdn8L_Ky#q%_NkazHvWE;mZM44l%3%*^NrLw z1!vx6Ea(w?kmmfhc*-i9?lT9hHVzyZ>>nBw9AO?cu}$eT|0@6CG6ix6q2rb@URq(I z1vDU3fC9pgN8adj@kR;Peeg}oc$A6vk=WDWStQ;>!ifrz##2tXRY^^u@roUORIs6i z=@fjqT3*!P#I+S5nvKwBnW^r=ng;) zQHT0y5pbG(p~n*i;)+0X{aoH_j@YB@$`i+j^3g|(U>WE*@c4t$O~+RqyL;Z^ zQ(V7GFF#h!dD_7^iE7~$kUKh}yq1;Gz|u_4GMebU^jW~R`y2M$U)s4NZ@_@}-UIA5 zF57!)gTqnI^1G9?CO_=k)hB;bSl6Nt1JBD2y3!Grfiq$%9%UW>=zB|U@MFVKE9Xp) z-LJdl#HZ97@($5l?vIQdzjNnz*#p3~}i!Zl9Qe&aO~2`fR9udD4)C_IQckUr=IK!ftbKpyb~#L(lTY>*Bg2rN`4b}_&s`PvlA-nKr1KmqwU9#sLX z1@Vf<6L@n<;tN0qLV+wG2&ln(EVA7}NdxG}SEzV?fmA>dLNOy91j&}~JMTykHNj;_(QWHTu z%|`+uM@jB&_qP6PH^H_(f~eDA`xcMDHjnH{6G76q08j1Px(OoJQ3XKeQa3^59Ql|Y z7K0cPkhOsH`9PLC{s{*`6cN0<2VsCYKr^5mP{lu!X8*B#{^MWtAF&ctA*}?DC{Z+2 zTdV}Fb+@R0wB+4sZzX8gHTsb5kgu!+r#O!qkl5Zzu;Lq5g3k3^>lQ1)fE$59+-U{1 zYK^ustyY2`(`VYlN^moswk)XzbF%zZ&?Wz3u^hyJytAO37W%7us~`h zIMMwpE5W&sPJi1|S{;KY<5)24D$WXrJE|!yd#qm0+jCCaZqWN{~6< z-;N0L%1pK09>q;)_a4hwQx`@J3#8T@kvM!=`lWJf(EZ z+;>m8W+8)aC3Ni(aPeyRs>6h)QTlFTwC_AIm93K~;pTPCRtKB_=aJW~+W@+kM>7)-0vnlNQe6sSC;`+@teslSR zDvu&xo2bg^7DOa9THAPWyP8_g?Iso_G$#ddKD|{WK5ja#q@7T8>Ebgpd$)R}O&S$M zmK9}_n59S&4E@k_ir-U5NKs4@u+58N`mf*-1>yS(>5t8xt<@)Tlf>QhZiO)KXUZJV zuvIHQwX);sG)_-Uc+Lf~^2P*OMbz(%9b~|cCPci$tSUvF8X37=S(aw+#8fY3A|+)y zU(vocEYVUXFrAQ9@UUeXp9x7&xh3!9$L(0*%wH38%gEdK*uj7o2|l~F7${RjonR#x zZ^2SMBjgTu35oMxCbbeAZAR_1tJWgKIUZJm*+yO79UC=MIf?5&{pX%@Fpwso*Qf7Y&(C6wX|WPaqB@M{tzazu+Dh=2Y^#;vCGN5t zW8!?$t1YX)wh~MZG2-kDIcmzLP5)vgc)rC-@VJ(GLXs6XkfxOUm6c!~tOUJbC0Nf| za+I_Z>}U%s!QC4e8Y0cP66&N^Jhrb!+)x!~LX{Q7lr5s!tK6W-@NRG%#ld=RGq#5l z)k+@q6#cnHv|v#qq3uUwaRuv+&0Jif_^M!L|JhZQpZgRsl4nnOdXy3DSxrp*Sk=*d zzPNugT_C&Au1bXw&2RF#cw7R}pq`6^Yk zW0g#SP`BEx&gFb@lJ1;YDkHBxn9_qU?;50VO&rcm>a+L$j5%}OMNc8#p7)lFlM^`& z6qa+cC>qWZneigp{-a8S$-Q8zgIPzWhAO{PxkP`ebLbIG`k>fFEENYqpx_mcDw|uN zv5_$1^Qx$fiT-Ohf8=)2m()4;wTqcGsH19r(ji7wl_ob`q+rv?VI@~njh~4$p8ed+ zQ@-ayOd_Ua%&%t11X$`tycF|0ysNb@eCb{gb2}n8`NZ5IcAcrtoz(OwcH0Fdmi`qt z^{i`-bv;a3zD1UBc-e3yiLqd%nl+&$cb^|V_oZd&$mtPpFV@&J7K zZ{nZ%Tw31GC6Zdy$eAP#F^)1|I7#>l7jOPtes}O=zq22%sdytF8{si}NM<6>wc`0G zzru!nuo5hc;i`Qi*Ya$7AwJuUIxL6lDZZv z!MjGcySG>g&Q(r2+iE3f<68(TLASeun)lR)pL~(70xQ8&<)_!eO0dU@`;M>@JR<*k z8>|G~whd^p5=`^j-(n>=vaZyP*o26XP+_6i+t8=JrC~^pKNNUJv=w|3$2z|(LY}%l_ zp{mJ^3ZyDruOWQn*KLF{Mgsux4UG=%4)KkR9i%hHx{$(nF%iXiePUA+H&i$zI2^oT-%Vb`gOWyL3w?|W z&7>wCYGqfpR{~ot=zH|D=w8s4kPQRoTQIC4ML(KfJmQ8^46L?=)4g5Y++D^`p6Whp zh^6g=$1nC(9)w(mUpgk=Xfx0Yqw7FBfqnq?TyW(=!+@b0{AeKVafgXC(IUk?M7-3L z44R%)?XasNUA{?wZ#2Vm^!cJHYy-E*LDXIW+Skpl;7cNCXHqocDz*97Bq zvTs2nft~~n19Ut@JQ@RNdiZF;Kb*9^`k&DBzv}_GGxJci2GhK*cITEOYyLqms#Yti z$A|ZhlJ)&*;QAe|2LfoadMS6iTT3P=bujg<_p>}Sj=#k-Ccb!BZ9?)Sy`*=-S>Y$b%#pX1VAv5&W-=02P|G=shbw5A3d2F-Ofyz%G z-oAWz{nUX2&CLYExKTuRQI!O;3|x64YVUjL!LkO4jUh_!-!z7*Y4vsw(tNR`DOgu| zS4I&3&KrJ6N2=M4Kt5YU*mv*STSC!1k?R~YdrqUJl2UA=NL_ZNgrLZ$HVC6k7!ph7 z#6(`8Iwiy?SVg8u*~)gz_@y%}`&xNsTTU@Z%pT`v~n%@!8lfWwO}X9 zY}h&j(=*QWK1LF8Je8*@(jj;m)+$}?ly2J_XDxBwB0R%V%5rniT5qbGR4-7JMyFd7 zJkyo_3-IlXeqBf;AT$9h!1dos|O>QW#PD6f;tlF{uNQN-yg zkn8PN#axgeV@R_X47Zj&ZeK4$HKIxksD2~rJL|pbS+6%*lpZL%{H;Bg?N__ZAi<3g z)rApnoki?P+;p}+!6hs??jeE@HdTYy=cn=0N6n?Oor&&5H)HwIQ|vv(_Lj^d9=E|m zW$a?gEXCdus&_@B41JDibMGZrsaI3qTw8fS_vePrrbVX}bp6un&ySmy+J~5JT0|lA z6NO=d$R5`$?ncohEMS^wH(%#)+^f!>P)@S+IT1GXn zC8pF07qL+|x3_>D>@>w$iR!%cWprD)`~_I{dWrq zkwS$%k7pMo(6}cF@^j`d<4W}DF027^bor9}Mj48@D#)!#qeBth`h0z8a08WN#uaFC zT*CXEvs}uc6Wrz?p?G+RJ6~jVMv)M)vIaNy9V7~RLkJ1VBZAmAKwoWp#ISK}n?O3B zXZ`3IK{)eS9$uD)-TQIP6l`J^4-CF)x{hnXaEuGwVn|$J5hL6hDdU_iWz;hdnN00D zju1*h2l2Q=sV-vLeAuGHn>!+dA;S$MHu7LbEk~r=WfQdbo6`8z1ywE?IKZTSVgKH?!~t&mspRF6bo29uFTG0X6=lA{&!sH6@wyrj8GNH?xI@G z*Eq;qOQc%qtW7>Dr)s{h{6J7hU|)mUs-6Uo&Q8qBrZ4T1WO|gF>L0n)VsM03!840> znX2)gxwoytOvYyVP&maG2?50~c!XRQqsvGWTl3KegNp>jTtk*=@$0kwwX$R_1O~4y ze1f{$QPk4>4ytC>1XEvG%69UzoOCt$Ot(rEVzNk^E$Pec%W9;{H%OG#g2HWM2x3Jp zr5jzjp-5hRPS~&l4;pi9sAu1u(YjkFQo6cUQw3CJ5>2g#V0_3kwRoKXk5V*+1BV=kt$*lB!fi`B0)(Kw1^UwB!Z$8hzcSKii(I@MNUGIqhu8j zl^_|l2m*ouL=XfO5D_tFF!3#S^`Y5&_wL)L$L;%_GsYdmpALuh&b8*6Yd-5)4=!|c zFnJkwNnbnLSrYLFipnQ9M;CM|qziN&uB+WNVp_0%Ral5t1$u%)xLnq9n;o08F85KN zLm=5KRf=OpLA#*fGL(q{8P9fXC2EQTA%t|tY5Jou34LJ^;l@Z=g6ECQrEb*I25P z!c>G?*<|{86DbbiQp0Chtw!k(RP4BQwW5+b3^xL2gJ<@!4~wW%g&v zQ!iYqtSYal-gOyPvNi=b`_^A!wzk<8CA2$V>$2^1zu9xAumA4Ay}_aT!y^wy#~wa< zJU%h`Wa{bkvzh0!FJ8X#MZJCZ?)Aq{kKfOI{`zfb?)`TJBl$sRV?k@!$*ZLBsLDbU zCk~83uEjh1j#%L{BH7O49Z^Bz8-ltms=cxi4$h7+hEb8_p&OYUsnce+Y-CXaoVrM2 z7iKU+EsXsZ9}PjXqxdq(NMPx}xsBry2rttZ7imWyyjjkXM-Y@CSulGxWz+CJ;&(2!jWM8y*!Co~Joy}oxYaA(hPDW-stv%Cr@66ew?`+~0 z=doN-5mq1jmh4}(UN7xgT2SM$!0ICu_w~_tV{|sI+jw{rY)F<~xgz65X6}d6h2IMO zN&`}+Qde8(t5URA=xd5g%Q*yZW=tf7^+q_Ja8=M$3%C&Ip5%3$Nuz9Azo&4Yv8N?$ zTHX@vZsKL7W4Df)ypwi4^hjN>5!Iq#zCcNDmHBQP-{O6e3W~?BoH$eyMC%Mq7)=c8 ziCDj9gQ2TwaLe(y;ZsK%f_LZpu3W3ND|e4uyhr4nXiY19+dxMZLrqx44D5NbBlJW& zz4Uw)oF)Rf$0w%s-y7+_*MGJNcBqSmNwaRBn8U+b?{u zWauJw>)rTn0<)-ehoQW(b+Y|~d|$(KL*D}zdm2`^n|Hi;dtrNw#DX;E-Vf);+j)sH zk=`x^lh=R0JYVG5liUC5^8B@TFST}d>=fI0J4+Ro=XiiumLVRg9#&ir28Rwvnk!0EpP*bOV#Ifu*@r1F8y=v`bSgfH z*BpvYiPN4g-C?b+{AoOaf>)YimzQn$;N^rvTq|O`YuW5NhUK= z49vQ~ZzklenjI8=y$S}J-%FswjIHGM>kmab?aKj!w8O4y|X(9PL#dEi10K~MxX3!M8s97?aS3PY2Ii(PFZ7qG-|?F zKsmaNG-bzFu0FwuLA9aHVKReagvWV=33C@j(uGlIZbp{Lq|UXk^XyncH=Vt+lFmag z#R}-Q^OR7+_z1E%4zi%I=lEs1`h`d?VmmhVEgPJk?G-P{|FMAOGv(1X#gPMPd~A2= z>YP&;f9eRjt}>igoV*ROBV!~8Mv(<}5h{UF2)dF+pi;41m8S*8<|y=#fQXd>gsY{b zD0W@bD1(n4BWMJ-y67F=G&P^3wV5H!&5Mu)q=>cznoi`q2n{Tg(>K}_tEl0Q_G#n) zOpeqr^&nflM80+ocdgcjlKi$6H8)OMsZxNfx0&R_C3o|tt4Ha-oZ!KXw3>(}Gq8ni z?05!R?&nIR(ktuA+)S5alSYKUzz#XJGG(^tWOA*WY_HY)dXzXFYm?2)R98pD$Nae~ z(M)dDr{Vs~I@mPG7M!|vnzpWc5rJ+d<*xq%T@#^%am`OtI+Pe96`Y7-v^3&L3k?fr z;;c!;W%xcEo!~^q;+SSAhJBB8kBMnrtVkV6;?RqCt{UaGwnMb)fz9OA{ z3jaBz%;-@EUjMR(9zM(4tV_`m$u!~+lxwBX*Dy})x>umMsdNL!`@U$=sbaQ9CR*K< z!4|*jEM`r)*#~tJhwMNxS&ra@OYVy%Xq8z|z$Z zc`&%Ij!&y%3yFzOX39#(*W~Khpel6zQHc2jdIMID-;_ea5fV>gTti8+6uK-j&U1`1 zyl!_o<2rXo71|QP;M)*|1%fGxqD#O(Vj!yi6r#`#W1?y$9m7dJiTGcjP;=Y{R5LE3 zi7H0JOSAoIqvQ^((CGQv>>kP(MLbi$#>-}I9@Xtt+St65i0sULXE1Cmu;;&eSxxv z`J3cf!s<;b_iyPMW-mh&227s?Sb))z&SS?PEKdf=VEF zMlwcjDpL+__Z^$o(J{S+P*)e>ik_}e=;);iu8zdrMVm{ScJ7ehL(3l?01sSQ}X)obTVz< zf&pT5d3;r9-#GSM=V3x9C(T-qhLISbHOk!P>~1t(AgUWmAu};iK~i@FG%_RC({>%^ zm>T);a|MDtBJp;+l22G5k_Hr&^jn;`_jqQ#obmol{IN-V*<7#$ElPeSW!Hw``jW6$ zZ|ElVQ`m)*UnrA?Z-RBE9(~okD_|+>VpNc8fpaT_1fF*S3GEXzU?c zLDwY6mZ3E+h8#n*!?k{DWN}~zm4yhsX%}ozrsIeVlY$kbm8!`i1glbGbTFBrlJu1!lvAf!s&k7!5-L( za%>0{!&c)krh&Nq%p%IZIg*e8o!!_QgA>Og*W*sVLZ8urgcv0x_l}`1$jq5x4#rTwDG~!3vAyO zUKFl4HjH7uV`LaST}}S+6jSgapXUc<&&h9NcgF5v3XK)lsQ13vortw#;FZTQs?39U zqmvEw9*IInQ_dYfml1qk=-8yrv5ESi>H5GUW+eG>l<`{(-#FS~z0b=dM+bCHb~v3x z7oHsII5{7Bg45#Y&)o=`f>Y?zUi%iij3Vz^r?`?rQL?}b6(ACoIR6yO?^-0aJ`|CP zGVos$?62ueLC@B0;Wi4>jt<-Cg(Lc-hVh7erJ@80D@-N{7vMN5!$s8vOP-Ook-~SX z<3vex=O9GKdp)8ab!d*HKtZvqqXt%ywy7gGi*024w6!SwmJQ*yGbHy+#A87>(v9r| z!ictswmdZ#eIRuMj)XA_BKegf`-P(t_`;N2!UCfsIO$QP1Y~(Zgj*?{su=0z9qFwr zcx*W8WY9@`KVm1pvm_`=t`cQOMm_E#)z3t^HbiWTCglsq9`KGm8Wh#n5G$WfFL1&N zP@)vaHIiK1GZf=60r4lh3x>H>%Nl!PWz0yQKFJYL7`CSpFG|DojBz1U z)GW^9y#*!X-|9O2p7{M!KkqBa%d7l5h;;MP`z?PomgJ z5?Lf!dQGydYqI>&WW}sx<;G-{k!02RWOb30Rclf-T~oA=rsx)DrRX)L7>uN>oll{N zq#CbDHFZrjKbmThm1@8pRlKKAN`KGHr`1pUX(v*7-E4{xlb2 zx>qBwXI9$ItaO2Zbmy}4eImSjEs_0eGPrm%0*_{}d1M4NW}pi*LSiyb%x46OWQNYC zhr4F(Ihq;mnjYJjNgc^dXiQ^>WI3(LN>xfrKbmEim6iQGHFqS-WKsw6Pm$a z%l=DsS@HWvEO-Fd#y@xdE9&~m~XH}H%OG?>su!rMCebNSG(L6-+j-?mep(6zy9 zIM6#oUkqI{^l>ot4~;WfP8m9AXq*opJqefaz|I2~4;o}}456#F^0NaY&n0r3<8fC; zYF62WnqOBs#}b22ghj!>lZ6fx`flg}VUihI zPH4cvx`Iv_8pBlGBLM-78rVAXrG}|hThga*$cX9@BzWY0{0C( zK4?_8QFlQX434C-s;0+IU-09=D})}|e$!Uyf5GN6_qK($^sk!7zkGZriu;rfyycvi zUr<<-zdzK*JgYcrb$M9D=}Q-?YcAK;)q~Shu)X=}HD+s!V{}R4XT2|8zIprZed=qSPZuUWjDE}4xNH3t%^u?X<`KmX z;TH)^?XznSgTAf8iSf9@nL};QSa&~PU2NpoAulh}{wofrtRx+75X6wwCTc>i)DlkbuaEj2dxOTv;6dk6i$=n9?FUwe8)He?o%qv#@p$!OVh@5va&v!#=}k5&;pa~? zsF6y$QcjKl1f2%fXA70*MqW1@5JK7U>wpQ=tlp%j&8 zq)zGe%wCAfB^$w$se0$7YA2Odq)_qHUyrmEpt0GjtY#|v(x0OU!c=txSE|>mbh%AF zI24B|VeC0QHks{>aB?zR8zRzsXR$)UOeTs~meI=g^7C`m^C(4TXsuKM*|_Gic9Yt* zT|HZNU9FQG^C{r)Jzw6=V{%h{+4W^?!5W>3#y0Ae_=6#(U1D+Hce6%Qe!I5Jj+{dX zXzL|s36RTha===(!&(vth7XwgaK->f3t-*A$Or4b0NCYV;J^i6NLBE5;La{&Jq#s- z@eQ^+*wEm-!?WgKe}fYZ7CCt6V3C9M4=lvGJ^(KN;(9pN4nkN321gXYS3sC>Ho#&n zIAi#;-6u+x1r`FM@0aN(EeGrb%mX|LbPBWsR0ggc>)9`G{J{4EE(Mwe$_3x=ml^nw z0gfM7f8h9mK?kNEF!Q462OJB;3q~KjP&Gh!hM!U}<1=pmCrwu=RlSz~TcE1G^7QKd=FT%-6Y@1BHS|2VNhT zeqi(gC4#>PtPcJjIFmrO`^pZ0-3Qhm7=U0H0>gv32QD9&ek{%h$_3vKtU@pV;pHT- zBB7uFCxh@Aums~DoC@oS1XEF3RYlXvK-E|WDh`}Hv3x?{_M=T9-uZivGfzU@fwL&acyj2C zaMlGDIE7-}aniKb2R@gOSAZcUVDI%l8=#P}t~|lf6x0Yff`W=BzgmrT?4)772ChGu z?686(E5j|OPy~P7VL1`zOy3FxF1Y!)f5kzMlwD8--~7O^F-K`v=ccuAHa-gXbxKy^;n*U4QBEH5!bj z*!+5)GMazI_PuY1yCe=5YM3h>mCi{@3*(c?5}DYURLcDxJ${P1J93&K{&Zm zEV7aGjMy5lJDs`gIPq0qfh`Bx?(~MwMw;11YmEg;POcNY?B!s@?dk*vq%X}?~k z3>VxpQy48@K2sF0Jv&p(FjszFlIpzY`I*dJ<{BAwzE@TR&}AztJrmD$GxoSHScw- z=~x?Aad~*s)URqtH0M>lrr(Oa^^Zb*RV}vZ%I-s^*!^EOt6UgWZTVOvKtr)r7Esuh z`!iJ=KjCd05K%=tCRYBkI`i5?_Lu4ws33n@C8tW|+ZLYP@%D%+NnHgigsFJfEr4Ut zup1MRZ)oc4$^P5mYNimfl+gK0)WqXmVlS_xVvaUc2!I1-9TBr}ZIrPcSY?ziJN zeT9+JT^V@Kp3RPe=5n(`aS6K|UpeH;Mqv^)bSbS3(kZr=Tl|_&tsYb9HLPzC9_89c z`TLp6a- zYVLo6u76!2{6~zQf(T8#m)D34ez}`^efw6(E7r7cJ8u%HCK2S8&ec)#( z{lL$x>d&HR&I5KgsQ!Oe3!nr*Fu*ZC%p$;!mlM8S9E>j>lUbr30^*V-g<}jyg2c4#hu+YkAp7033;=?EU@zu`v>RGy|02j zh9{5M+>So;%%SP~mZ-6p4IvvYjlP*{IdSLBw*?v)rzwwTp3F|a zOq_W<`{dP!xHsePCO&?RdL)7QGWVG%{?QMGp}oT^f8TLQ>}m*y%q+2h+O{r=M{ZBc zz$+#SBeV@;AW&H~mAfBjoS=E5n$s#xWNXjM_k0sgS-Lg%I)v5FZB*1o2YnxA7I$Z^ zOED(CWg3U3Sru#h1YJIN@4Q8+@%5ff(at5?+CR_j*;Fwi?!}+C?U>9f+dBV^reKcG zV{yM}P$KdW(f-{te?T|Tk;1?TaLuB)gc*~?=tmzM!D*@pMlO}LB z2}}f>#Y!rmEqK%xv>h+xD3JCJ&ybwH`G z-mHb=Owfq%VC~Y^YJm+|asN-AW(T@lngbwS|BwcM$N^AntTae|k^*uTq%-&eEcFb6 z5(M-gQUcT)h+v@OeJr%5)-47Q)3NzU zMWx{-XU?L-R+bgTVwPoG2zL*akgY1_!PcF8>aQTrK)L3hN^s347sfVW?hs(`I#B#s7|LlEAEGI(X;w2_u;mFvZS40$4wR0hp zwzis_7o9xjtyr`wmb7_Whd1M%c|w@VRSc0*QnsXKX+s3@{euW%MFE5W#1TZ((hyi0 zRxHMY@PR0R5CG&^fwpuz5i8=Ly8)0P?f_>9J)k(i69RB4q)YLHV1ywm*2BQ zAb6LO+rNk5zrGgbKk+yJo#j#M{s!LPpNaYNt_+x3TDm9$;vd2uSONeBbXi2fQYU{# z4v+@$piup%_e%ZY1ypC6@XV@Y2Yc~$b_Y|Hq^C~3r}wexqFxD!zc;?RL;h&Hy(qUC zdL~z$n}<@USXABQWgYs(*V4@nkqmm_d1k2{Y)1V3`201?w?Hh%}fH1d9)BJ%~o&Klqk#6B|AxYZt*H z(L&1)-+t-$0~~;fAq8N9jm5qY4ZJ*>`^h5_KJQU?A7*+~CWyt=kgTr!a2fJuL3NI>Jt5!*L35?DwLrhbJ?v z1ee8Zk26P!W2`VvC(|q>vn;tJQe5&(P{N6pSpG8`&y`|`+&DH-o=Y1PtDI20eBwgK zn|!Yv^zZUMUDX}i<9YMk?bJTEz$LqS?Egd`P&;6H5k4{e9;g~X5G)e}K0SPE_@?kF zL4PbdAn=)%Iv}hn@MltB37thESkyPLNrB~qEHyy@82FT|Z4rP9fDIS}-T)i)(k!q6 z8yI*5ya5%MtpP}2#1c>kTo+LX$XR&*8I}KA<1Bx*+zB7}Pj+=+uvqJU-hh^2nt1@D zU<*c5tB*oZ$eX*rNjUPO50TeIiFS}j#$-jL9ZD9z3@audZ%a}j;zg9@4xF+gbL82w z5rqW>)P;)eQ8;e3<(!*+w$wVf*DYPzwB=8Mz@j1mA0h(4X9Wdh3d99q0-*unu!szV z34{jV1`x3-GsFmB#R?NZ46+O&1(I|TH&)aDdMxqG!Vtm-V1(iVNG=T`K$TTo{w$bT zXtM$eG96?B#1sqp#hL;s|8Izb|3sPifBZN9n|0*3TXt4|zSsvQjFqRr6K<_G2sI(7mV_Y1eFYb~$Qmqm+2>$6dXCd9SL&-k`j=V$>h? z^Gc}@c%L3{5_aLR9}BeCB-ZDa2#(?C?aE57dkr$wc57N*Ii5e{(r_F4D>vPkDj;82 zB?e+1zSZ9(#eY453!mi=k^({+5{Ff2SgHcxfYgHo{Lj^$zkZ*Xhm*~tVFG=sqp+Zx z60#oa;Z(Tved5bAAzR^nV)Zp$c%u14Wk7=?J^C-+C;lziPWc|Kt!xB^9LmdAMl@lcKEO? znp!OGi;@nw;$QjBI6Epip_rPdP*zl7Rb9HZ?X1e(+EW~dE7>A%NE>UALmHTf^cq=Z zc3Inb;WeTTnaLWWr0NSsh2MU}+!!Brow7YQ)N{Z=C*#MAV~g|S$ztQbJBLw!`$&H$ zU?_H=q2SxFu5hsav+yPS1B2mq2i!>U+_jhWco_(J5HE1H3n#z7?0s4UOccX`GFbX> z5qR+aLy(s&Cm+tK;fe@+36P!e!Qf^E3kvwCK=bf*;iJOWU3_l<@PQbF?+TwEfcisF zvu>CGZY&CCK?h}*h2GMS4KPAs1tcNA;bQ}m|H}7X%8N@E^#4bd7k!6Sb|A| zCnoKV7gN`+Pv7A4dhUV`}@C6_HDww$rtGr)db zxz_qM|51eVDz%FDhIc{jY^e^y&0#&u^bA@%gbOfPkHzAT2OgpuTjHWl#v<_vhuG56 zJd^itip@F^*}|NBiV*Z)8u*J$R9Ru+;z3_NsuIhNG4F)mNxXWJJ-Q_5%)9?mQU8tH&;JQzKnbt~xBy;2iIv8H(x2-(4iN#x0Ac}X1`w5^e7mHmbN*J;MZ`9^^T-hRNWy|p)VbMYMLD$oQBnV`N4Weq-2dJq zKytHihX4R7XMq9%04dJOQGfXfW4pf3aCo7B1Sx7-_08&e3AE5T%CGzn`n5)JDRQPKD-mis^ z{x?(ax23TEB$P3Bgr=MCNU@ea%`0YmG=_LL9~DxJ;UCH5$u1Xp!S28Jc5NH}L(-du z{F`YQ1NJ!MI7L~`yl}a4g4a;FqsHr!NY=uIB>}u_6LC!V<~vJiVe{PDh-4q)NjB9iUa6-mS_NfZLz6<4-Xu* z_{jk%_}Hup0KEjj1+oC>AL0kTB?Rq144(g}O#gqYAHXO6O9q0bzeT2S#_BCA(+Z@q z>&y5k95d!9K~YNy_TvX>rduS*(Vnq!Rs>m6qFa)y<#HK;1B@)h0x!;m^C-wd@rVfX zZ;dGzqKEuM^)0U){X7d>$kV`m3MoxBtimf2l7MY4x;?~ zL}G;rE1muv5iBDV!si!-(;^^(SkVFMjujv*iO!0MrNP1qF$kGoy6(643RtlN@$yeH z2p#nG*Yen%$FK`GEZ!d#|#7+!kN` z*qj%Qy*banS&OKAw{QyyiZ>{2`F{Up3!B7o9b3cAtc+DbA&3efg5WXosHnyFNr25t z=}upp4?sHw2?m2aka%!>4*U+e1lM*Ug+P+QY0ra_U63%Zs`f&j)WoKrm3nmHKmgDnsMsfmT{(~3Q?B;oiD)AzOe zA$wsLgqM#WK>GZmFSK#6)uHpoZE-0%s3&immMpDgw3$QK9&HZyo-`UJWerDf%Tn+|ItYz{cU z>>=pS{9rp!C(swdxG0Q;TCQCMya2qD^C36&plwFrhVfEwZzse4yd5wB3d8d8epZG? z=5Rg?<~l5|fay*ckOv!a^A@VGxD=2}z*Zx;iJtT%Ww>Z3OZUR4!3HBuASo9M9T-rR zm6cOdQGyvp&@Lc@VCo;PL4!B%wVeS$Zq$w#VR8-au>hzu z-hR`T%)=XDeinv6VYxVDKMc>p+$aono})QNc&~qWZZ`~>dfDm2Edf}*Fs}^*WPUEk@{d59fi49n0|$cR46$xy9(J9uap-r1;F+>e4 z{38T1I88fvjWTI;il(>+UEJ9wsTDy2=RBfi*e_GVu*BB!IFh25bhLD`A_F7$QsZ_c z=9EJyL9xP!kw{@zB4KcnnFW+E&JR5p$4tjwitcRplS3bj6r~~rJxiscB=2TU#w$K( zfD1H=&nDy09i@^!`zJF_2eV&SdUovg!^Q{xy{|HMXMdA3RVX;BxBFbdN!3*Mf)Kvo z?%=5-r`Gu>ZE0CI@VBd@Vf-6)m-4)G| zuP#;YdWpK-Hb32Q#93&@NPunq>CT>j`0TFW!!~1`GCafQ@*~q#-W7Z)7bfBSg}?SLKbo3&4@x-=$wQ)|>lsU(wskKMTgk=%O0(l6q@Lv(j! zt(h6fGSE9%da|PF>gg51ABt4od>_)D60i?PpBXE#lX3U=XJXJQYwVt4uDqS(z@Yk> zMtp8+c9?iOE(D9Ngmswsz#qrwo`{j_?q-O|8iw6F#&dOU3PVQcpkGSa>GxPLZP_PB z-4}ieQ4sRRqc^wS#at|jVLnW>{puL~sq#K@&;QP`C&ljbeVW%k8nFla>~X(gx?U+} zrNWUWnZoH^k*AHd$`4D`JiNZ8vq`k+_Ri|wu~&8kli|}9hpNs`1TQE~>(}SX3+kvx zq8$oJK~yvz5jOq6IIC%$J02T^VPd(e&5%G7?)UtNz>VE&-=4BRerHGi2)n153VTVs z=f?u^_lFqV-mS}|X&9rI(d!M-%ow}W$>d)*y~#5E2g5Cdh@OT6A-rJ$vNCKkWovts zRv^-v9=Dx>+BS41q*Q-%?Ag0pFX@76)EN^GC9O4WgITH(7dal%EY4bq-rg4-r7XQQ znm-Pq7@?RJ-DKgyD=Ibt$GNInCAcRG=`Ivu4+9zTJJB|w9n@2O*|J(VBlbuODL%IO zT>>#mq#dfy2@iw`Z0IiAXvKqplB;g5#!#=mvvkanyj`kR*2g4xl5Typ9SB=xxXdvXG@;Dib5PB?#Z+DRGTkLt=7O~vF}ur zxD~9ui?epZ+-L+oW#8p9I|}z4z29%tUlt+psnq2?`P9V1ARXK65-ojVDpt~E{0!2K z{G2^U;&h{+Koe)GJluxEKI4jbzE&gn0CkurH z7zn!x)d0!Wx$?sA%|5ff(Z_9?BzIk!(4+<;&MDjSWaa*Rc2Bn{Wg)v;$6tFlnY(C+ zIydbqdF|gX9QATvee=(c=eXC1+D9MIK2*sSK(rqkF&(K+U-e?Q57(ZNzR=7fxqVeJ zCo^k$iX7^^`s00b5iN1HdtDUn>dj96i0;@pS8gAYptWL3USDK|up){SR5>J<|M`Z? z?dtUUn@?4b&G%BdYcjiRrdQ?6-}K&4lYRf@w086S!Y%)Vn%rkL&-CJUA{-OQB)^bVuRm)rEst@+DI$k+1`o5iU}YI;t_#Xv1WID(T_XG=S9xj3}a z2$}LEBy)xr(8rkK0&~k&?G1br;=AK9$MgED^C5+t+la{UG~dJtff9NJ(HyPxrE%aw zk&qGx+Y#aG%gkw*v)a!s?X#1Or!SPyscuii7j~C37r6F@8RQyigklulYcTx%C#!Vl zLRBT-B2wXE$fi9yCVUtD_8k)&dr`+{6s^kGRKG*q*rmI-Om1ITufF9c!R{W^Rh1B) z5UE_|avtm|8q-hz4x&5XslS$V7DJsqqnC1*{ihtg)bQz0B*!&3+=^;P8henP5q?r? z#g-BF&6tsPeylwP6IihQe$P-H;r;6%HPdZH(rFY23SD!I$*zP(o*D9dO&9X|n9p;Z z$(_FfdHK-&DLSKJ@`w6vUekB+N4`^p&sLyQqdo49^i+xvhS++q&X%qoPgB!aiIHkPOd)5J`p-v7j8Qjs?iX}ZXb@J zqZFxO&XmKGB(3EQq2W7pt@*=o6R>zZR5@sKL~-aI3sUO=Vm65w)<<$vBpDKrb;Bg5 z%&=7!VXlhDu>nN5&hG1dnCKm`VSx}%sEV@e4l|sN8tsZC&qa%N3&w@h49yOEXBc7v zjPy$P;oecy_>A}hD7^=5*eF;`AyNB%Y?XI3+9(b!1%F~k2Mm$E81&RS#FUh*7CPxYk&r>EYf?ADHKBY9J*C5smycn;injs8YP)v7AM*1XTQ}^C|E3 z3G*_f8DSM&GRn2&R5u=JAs{80q`Nb*m6>rh!->P*acFvUtObdU5PL70<{g!Q*u|q! z#$POAdrBEO!-6wGjGJ?D51yD&OTxBLNipHPGy${kx}*(n6Xlf{_k)sOHzXyNBqbbP ze^irny&JPUhIC`0JKB4_MI`nVRwFso^swI1IOIn1#~{*l0TFqN?b1cYWl2S344OBY zJ0Qt~h&bJ_5VMRz+YxTPRpXS3+4eD+h)R`HBAGWPqlpN%F&fj);T@Hf)yd!{B4o{U z38f70%}IOSZIB2`yCqAy;}v#cJ?T{-Z@ZICS0HxJ3{JZ(6El&?fyzQlWg()&nUkJwHripX`^7n|lex8`+Bn zpKZ3c%70sy=VMR3QR^nXCmUf<<^27Nj*<}b?Mg03xis8A;oRtNu?9N0jpOc!U1`)p zb}2_|soi8LntqN=;T+ra_L(!=Uz(8wJGX`VkOr^I&tmfD&bWU+Q%aO7y^3=y*;ASn zTh88J_E3uyOGawgW7U`k9s0H-edo}1q;#uu`)AL`2v*oCAU0`;_S=I*sq;6Vx*hEy zmG5znn=OwnFJ%N@7*#@WjmNsx(RS4sE7x<^iAbj&>9(jFzjj$)u-tz3b8kfj49@cV zzm32*X1vS3^wo;rbeEUKSuY)4f-(&qSs6Lkbcv8txq^46qw`Mf2`mroIR1R4z}70k zV^zXARie#R;-giP->S%B)zbRavRkX=k5wz?R4X@Er}J**H{;hy7t-jh))eEvvap(W zwJ%@Xq>%pBnzbwV8$SxH@f9-pR%33xTxPYstaeShmQ~J^E%A3f>!*wl^3_UrdPq;N zac%Z+%klhrVCQ21@M`vuls6%Ka^0Z6nsCU<`$e6pSFPWQ zx{w@R9kDHn({`aNT=$IX8;Y5R+%-wQ>mhgs_9-{ym8^;otEG?Dr}y%nwBFI+RJUxW z9Z#*R&Df_7k!NzzFE0j zTV?L7UzfTi;YEY?lSXBHQ|`Uy#1+lA<9Ia>de+4$c3U^}=-b`wy7gai@LP zf__8OipJg-&1T7xRjaso+kAGT zv|F2y7*jsCO}V8_Wvos0dz-p=`znKWO}BRKkapeNcD8&zHUMqM5Y z6(k-~m%`_2Iiqgc`Oc8N{6A6TE2-DkC&T_7gT(t};&;h?Y)D|2jF*Fq9G|>m5n1q@ z{G6k5;DH`gvtDDX1^9qbUB-xL$ah%6zc2fVculF=l1^7?D8(I@?{~? z(rrB|$@aD9ThALEaLqWZ*L5&%&k;QZl6{oisd&*<89Zk_4kljrI$K+-D%f*m^!D|w zH>C!yZvWPN?R>Xkyi#_X()-+y?A^*-nEHDYCn6Noqc^J$pizVi>L}(h?g5p-uB#lj zD?jtG%~g{g9YCYhk3BCs*~5l(2&sLLJ|Sp(BFwlC*%36S)6afN9e+@Tf6lVH<68g1 zi#umlArHSCpV&>(_Y-{*FM5Bs=mVWQuV36gZ$0ql*gYkFYdha2h2qAKZa0?ouU^Nm zY4YJpp-BV{ZEV;<$Mr|WhiSXlXnU?)vv-H(j8u%e(@b;O;X~U-@R;} zd)OQsH(YY6ri5;4)nRJrm0lr%xIHviV3^HBXS8o~dFVHhW-4kqFj|b6NT-g4MNHU< z@S>ROSI@8CXqp`6WKkSo;b^%&prCi&aAH}id}8>hy8o!uYih@)JheDI$)6gMYe}3N z4nGn}!vst@5S31;h+8(Mb_G2~Za=OwwT|Q(uTO3Mc0sT3)#Lna<9w~w$Xn}HtjXZ> z?77xKJ()aoKweX_yl}#krc*=bQKz?WpD?(%wv~8eGBvY=K0Sj~EceNclCa(@iO?5B zkT9iZLV3@^SGMGCTfX~*4W=(=?Oe{`=Q)`JQ}+XM8XI#qxm`J;+U0yg53AZ$ymlN{ zJDYT3min4RmUEEZ>7Y1hqQtJQq2)NJqqtMF#E#v?^!kk0J?fh6>-J=Odp{@)lzxd& zN{&R3yv$rgtj_qF75U3;{t~lkevNL+iIV*8vqn#YgSNkHSDoyVy#7Vy&b7IBQWqXE}_v)!6xM=CH1p^Iq$yRfsa2QJYzuOi`v(vd-HW?{^qXU&(nug z&K>%C=Mb^#5Tb!FDbnjhGnwlC1)`FC7cCk~{GEuribIM5(v)Iz0_GTjMnXpr4r288 z1{RQz1pVTR@yu50c!9?yNgIvL)=zKKIm27{0!ku{(^Wlsu>S4h5o`|_#Hq4XPs|y} zxPQ+%b@6jLE3VB1zol4^Be<VQ0TDl>pcx*L(Ea8ZGk^Cly2tU=`=j_hFK=2kJc^I zIJ3|b%JwCDZIkPleUGjjU%*Sc&G}DWKec@QT7yo4amxn6S9At?nSt`E4zY#_TBH%) zE8MQ(SxkW_UXN4LRElG-T9H#VFLPJDs-()k=;XJ0xCl+13NPB8Yd?R6&8nk*VAPvm zHGSJx@HG3Fsvh#FU>u9MR2p3^xxAymB&|c{PD_`tqK9@vOTq0XdwljJYMHQ0SZJSk z@tw8bw~HayXIHuK(lEramw0YN@lxzI0rpnR^C6~8+}S?IM8hxQ$NJXHlvuyhQ@sD8 zz>qDg#-WWVOu*)eNbtX>aVMcE`mb9siJf0x_wFxP&i^rK9hSpw1tSC-RNUT-*FAWd zf1&1ORS$v9>Y#0!o{GJkj!69K^`a`+U6BFr6mhJ?QK%p`|Q+u~N2No;zB3$aPZ_ z(-g7URGPjW&$mlB!cNz*-tEZ4&rV3o)4}^YV$#wdoK~kyY+fM&Bui1|Csz6>@bZnCG?-rp!;hOwNoV7!KIQ7`IA75@bTkj1y(1rd zj_J=JKZt(1DduHS;$cqzvNB0RK$TxqhC-r|v*lFF1p2hsolUz=D>O%_K78pH_PFur zv;3&FU$dj$T(O(5eq)~CUOR4?pcEIz#xINrhaWy)CD|Qwp`VTN2H<+OfOlJoNh&#?ywZP4I&c3i&{**JRRwejJz+Zi{HM4oqV z`FZZbeCyk&!j$cNX$_|G+Wq(=ikmQr%<^A$+ic8#U(4Z(fP(Izgj-z04G^7r@>~I_CQwlst&?9lO{=BK<|&i zQsAkRFe7g&R)ZIIFD|?l{e(!Lp~#w7(&=^+C|7T`Ws1nMW0Q{g z4Oq&$4~=(<{AzL@nZCjv>^V$Mxlmyx zI6B0+hf0x~2N524UL&5NvoR%cR8gre2Np-qkM-DSQa^ln~y-f)TE z-fib|p2#0*1S1Ezol`FqZpMCHqI;MAH`j+RhpHH9sy7g_`DffsXH6Zc-CN&W8nM#1OKdywh)qVKaVKG4br}2fW~qhiZz$X$+n>qHHz9U!w^wGl z2-Xi@SBngYKlTKxtjf>*Y4-Gqoh>^gzYKS+!yjNow1_PeN4Rx@7BC8$l{YD+2riP4 zl@MjHQ+e}9&*shp=}}>HK7`Ju;#b5k>0hGgJ92Zk`N8bLmR;KQBe(WP9?X4euv_o` z$n7JY2lGC)>|Xn2^jkgR50-IP!ERcl3Bi(?sA!jVr#}byg#L zD^aAD%1Bq9-Gllg6w$+NG&WgE_sc|4V26hYBg0L}>y35-Ie`f}t74LOyEzzTn(0 z?(Ms@54Ph)X(%a0N@sw=9Q#`w!iA+hF>*sS>APa&gAQWUKK`GE&N{5AHVoruNp}rN z$s-6ML|kbKw4T-CLnzL`(D@i=Y7w6 zo#%P(``o`Yb*`ZsA8cl-fJwCEV_UM)tYbmHSN!eph8|9KY*N85eq7^a)d2Rr3&2?W zXuW;Xm#?$80bm+bqc(`v0Q0mBzm>m7hYonwRagCWN!}8tfy{F1 zM>SBUy9T&K5inpa2dFgC0pV8rz@oU^V|g0Zk<4{fS`T5*7IoM?dceDq2l&TIkcrN| zue%*AE~m+475)SqR(oN`wwwNE%P!nmNN`EUIAQIpG$4`@XB7%YFB-8WJ%hr*FQ0d+ z1^ztaVE3!JBCxjqs{&73rr?GsOc@)!{4Y+8$xTbUhq*H!=TG#KIs%!Tu5#_(ocijb z7*LX#j4ChLrkM@8P|fy4i=DvTi8P{{jf{QCnkt_zLM^VlNrKT~rf zD<=jdjN$0x4x%G)YpGdXO%kQ50u3p^Hi4^$>jaXh3@wOAB zczRfslfRqY8uTuPd%T3nm#y8hHxD?EY8K_OTzKSk%oE2zBZ*ImE~ZqXpq6R$XXb8D z4OSrQYPw1$U`D!gl@5rWYbUy;B3j=lLxI>iZNb(@I)&$;q&|a_G`>jm*Z0rLK;7rU z9mtIc5ad~*1e5rJ`wQBFQ+kMUHLFp8&OY6R3Z{xQ1HSn-dzd)ULQ4Y?=EWwP!Cu?N zrr|3+&wEu* z4j+s@?e-EqxTdxLyb|;*dkZwYwJZY|S9+E(I#{>vZa$8 zfC(pnSTTe&^qKGrSuCnp>geEfdVQr*X$YV&{A)9fx7Hgf*Elbp*^MdKi}hR`YvPj8 z60Akjk2Oh5852*8r(2(%d=u)@zWk4ume--UR2xtoP=(B^{7z3QfD$x{Ukl*j#9pHy z&UPPGf=`1w)8sjk(wHjqUpRl7w=7nFO#3`Vnc=_w%#(qeeIHz|!efwH00G1i!{?b@ zwlZ&gs}>7t?Mo#0J3;_}p5R{nL79<2V-Jx$ANm@AVscD$jxZHswav3l#v>*y0hrB& zcKF!4m$H{<8p@sr4%&kW*QB-3ADS`qO>!jTI6n0pv)*O|9K^~a=ilDDClD@{Z?gc^ zi~r#HK+LqXw^wDbHs_Nm1Hd#3y@)5OBT`Lv(WEv6HngFs(f6TuVLS=>HSz! zaMaPh2*{il@UuV_BVl2`Cez7sc%b=eyZ+ALy>9O zl_{}ElXx7!D#KKI9wb+lB`viRDP8u`l$rd=bMH+hb#U1FISuvB+PBZ6i%lx5gl=VB z07fXBhx^@m_pJ}_!T^L&pu#c9?#KpCKH7Qy&sqDX{xXWy8jTtV#ms%3h|E496dyF( z#GYi-q@%-aD8EEM1QXB)5RHNYLqwA=cile9@N2U>f#e`sd2k`B~c{ zTDwcur8WkDfCjSzo*?F?>Cg9dn)a)9Coilud2eIFiGSSUrd`*Mug#ONI3!rKI0*ye zifx_{ykn=F2^GyG>zIt36mw$Fs;@UVsT27g=6Am z>ZeLD$^_;Sn!@kvm^+**hrISv<6F`AgvGkbLuZF~#mVAn-z>H5C>`U(hHud}Y0vJ` z7gR$!QOkh@edX zQk}G+@oB?=Z;~9P)o~JhhO&pL<7uOOoh=Q3D13T?Fwt?~2hiLyYB5cIk}8r%qh740 zjD(5iL0yYedPP&^wkP${+It~z7y$pYND%{Qv@{^%Cdn#MF5}J)qlV7ZPUkoXO-84^ z2S700rtuh1_1I1w)+PJ3rtlAdLQ#e@2hOu~u0yX}HpXX&Xy80~SZe?VHJP3H=Ufv% zyHNqRc=Zi%OSS=Mcq-KPZCwA@q#4-5!}G`@8svi9pTC%#fG6%pa$3r1Gplto>j!RI z2Qym0PhzX<$+#;(3xf&6!z+`Nx08vJu#8Tazo$D-iaW0he5^CYyTSP#(j!CnJhsh! zwPFUorEQ<+W{M|?;axafRE^;T6PNEg_FxAD6g>b7N2IACNv3Wv$IKKz1nu==h$Af_ z2v5Q-x9`aPg!9|TBa`v1AY~LuG}_DL;UaOx$0_=Y{>YLT>X+pYQow*}_<$p{I7!bf z*}wRQx%`sGB+OcE!A)@4L(hjU@mCByDHaA;)x+cZuLG<;9%?>baNs z^D}{=XBSJAf63)}^nUUsY^{Ln;r=TStp?9`nXBTcUt%jN&dc7eTPr3ND}ggUp%Q*! zf~&?8YbF-wARFh1loxbe3;Az-?=Ji1E?-Y^S$k%iUc|jZB>3lSt-Rv)H;OK@r$UpF z$${Q57y$K)hQlUj04g+NIu*xA2pG0c#)IYYwBf!R#BCT1Nm9e7;U`IWfN;%dgg6|~ zk~m=Ts~PcY!X+3Mm{%>&TNeb2Q@;ro=<_bCTA)$$xk1;t-*nPIN)awPp(WVk7k_Z z))-OS>_`aK7Ymu*YMNmVvRvP!VFCPsz*VDA9kt(UU0W+N>Bla2PHpMnJU^o0p`dpG zPu{~)1!$wT11Q`ZQ3oq>lgXILWI4h{uNjG-uuRl|X!d(0yCplfCX0kl@@1wBZ*DBz z9phn{xm*uUt^~taccp*P**4IK4%5if!gdmaawk*H{3c0G=NaaqOFX|-c!g-y?(cjy zw4P$xvMft+hXZIJ>7Nmhu(BW`6n-MNOLGY#_h>8syj5b3%z*7nQ*m!?2nHyyZRS;G z**#@kgkApv_USdL`+MC1=u|)Wd+I~yBXtLYTj*0CM9Jqq49QI&+HBT>1O- zhWBlSqY|9A-+|mr`s_+Uk?EuerD@TIoof_+_FFwqqx|=hv#!S! zQJv&oz|(P?mXL&%hY5GTnpa)wIK!jBj!3Z2!`Y>OWP7C6!2RJy8bBPC(8_ZJdg@$+ zK8iFP(sb`vQMr?+J3`SG0sn|G33hN=aXk1OWJ!a;5CJe$!#>l!I~mGjbrmr2z=W=e zn2ugy1*NCa>YU4>vLdEH(8F@9)GD`WGOWbp7_lq*{-M^5-Hp{f$>C!CRCYQ4edI_v z=6JEPznVpW3`p}ZGxJ>vq|Hdthtj_H4CZ^O~l0DT*qaR?v}>=wH>FQ;*N;;wW5?M119 zLqF?Liz{YJ9pCc7*MC$ezYH`_*XyLE!5O_Mq@j>|OdAKj`^phH^EUat%B;ga6*F^%rnb$|8^Fd6e?0-vpV0Br#P3(b%)?cw4y=h@H zW=$v2j~7{%E~cNc)%e;DGaUzp^>ZIjh4LUoOBegOjm8=oRbhr2%iK@JFpr#n64kwP z?R?r;d7==F$$T83StF?=Qm-kdRv4XHfM*Qn@o|lW_Hk&zkEU%0q@WR>t8r$%)el>Eu9b|t?^#>O=T6O<+j`V=s{IIR|ED$;#^aTd zJIl`3Jni<;S+(GLPU-RtkwH&mE}1V;V?JG`OJm`#_Nm5VmYJUBQm$j7=5l^Om*%f0 zai^LqC3p0+Rx1h;wbrU?y0q5o+E2AM8b9i3Z#Mr()ZS`amyh{^`(xQua{1rAk?o>i zOk+E8;%~I~K0V!X$m!$>$=UDb6BzqFD*3CmYT)pw^WdY*i_X2Jg8MfQH6FaM{xfkl zruS?0*h~Ga)z$Uq1M08!H@6mN*RO>gn!_j^?{SjjW!yW(#&WwAFNl8(gijZ*E7G3+ zcAP!F5V!J650diRdR*BW)bfslDLC_%gpT|8Lmo8fB_2l?KTEZG$qROnB`@?AgRk!Q z9AHC}J08!m&h+EoDpMXcwc9cn`lQ- z(r%|ja-Vg5VqnA&Q1*Ogq1G9}vd9CrH zk}|x5c4{2CiaHfCFRJ>To@K|1?~ALJt#(Rszbagge8yIy{_z_77m~-~oLpF*r4A{q zh#_KD`FENHOwTH9=R}f~Pt%fFi6bw9e?^m{dN?dQG-Z3^x>AG&hQ!QvmuqqPcq5-* z<@<2fxj$9>4lUkW%{tS7SCH;^>%a}^uoC$MDf86VdLb`4r52lf%pO|%c95^ea4=ODaq^--O$E&QGt8F`_ZC_Q7*M&FNxcrm0@0Fft%xh->7P}4bXXcG84lY}Nkm=sOAeQT%5e28pa z;*Gi`GgZEy#9=`IE-Inuf5KaelE&+Pe<-j%C_T(=F8mgi{zJ_JiKYXk8HydKrMY*^ zgRY{C<>*I1Al6AxEE|}}!AMkNS7=9G>|rChff<4XC+Ba-zc(lR@%h2KNY z>;gXAbT~23=B3G_+PSRKh+Z3JQE?te++F#lSS-AOKuQzthR!7Qn0*R`;Jg6e7yI8q z!_h6h|4O(Z?SKo4qMCt*eAH{3;iq1EYo)ZKDOCSn;0={jeKysJx}~#tc_!fT{Szy< z9G%a~XE#52TK_UmGLijU4m3HP0RCyTO4)*hiZaJ(C-ba3bYOB7PdQ&WGHu=cr*EF4 zNRwm()bzHHgPFP4A=^$u#rwKHqyY?P7}A9QJSr{OvwSY-DfNb6W$q9b~^mS{&oWtEJ2#h>yQduW~Cvb|>2~!5^sj5If(Ium zv>0M4c7INY8_NGZpa1(LU@ro=l}dz{O1hMkZ4!7?dc+6k#RF%SH0K*M9T(;bA71%U zru*aGGs6{WRr-)i{jR;OG=q@iv z{pU6VBXH#qpfTM7)NipJo;ojoYGjvba(gjzWA){|3|{Ayy$3Y?g_YRL@^0p{Ui`M0 zz^QQW+JkRaN+LG0L}O*JO;#hPF=!z#e^DX3aP%%`-duqS^Ib=-WRA+>QAY1&>#KHe zzv9Ak>G{vmZxp^z5*%f5RnObnvSLXm(~8~3SWeu*9Zd&-SON*7gbMrYr6sW;+wdie z*b2ukai{(Yr_bWf6BW)g;x5Y-E?eTRe=1y0#oge~+?XZYxtGm|00_$LQUA%~HP-Vr z6Uds7U8oO2fj;X<;N2ufIM2`wjQ4!F`>wA+MNqv^Duv$O=X2;Y_q9P!BMg*^h7Mw| zjQS!OM3!>M1#BNHClIo`EOCP6WF#__8z81kv0fx?EO3RqJVus?D1~wi0%O=^FWY5r ziD!5nNh|F2D}xv%EZvQnj0lhCxEze6SFey)?*sC4%a~vO%jTZ-Nem|xp%VfNrvXMx zUn^cxq!v)&gmO@cgd>o$7zrobEn3?vwB5~!K$=GCLy^DmzLH}Zzi@>;Q1j1NPUfl>h!S6>SJd~_qd@TMnCK%GW(RAF;aOq`#NVJSS%3yz=$k5No2u7 zxTzRyJQ~_cK`cs`W@12@AUujFRZCz9>`@q8&X`!a`{8ntPZcgt|9qQ-0E#x1Qq0{a zL`C1}AxReZD)J{u@%v@VOX10@c@L#>dU|MT0dZDBx%BEIZgNF-RX!M<3ML3Kf-?V* z3rDJ+z*p7d(JJPEZ1HmLn$+#JzPcknOrYPR6lows`WZL$akW$d7$}CXm6Ym(PP%C_ zhzxERjIe%4v_$O(>ALT0>cdEt_}-LV?8`sPC1Apf*i~GU|C1T1ryi?CU`qY#GZ`Ee zUCd2kMN6F%7^A>|Y~Nb#gmm6*sVZ)4EB#uNZGdS`K;@Rq>m!+rqrPVny}}y$GH%aV zDrJDoZc)y28Y4u6QU6wtlqt2FvBLm+LZOcY0mA1m1?GH3fxlM^+ozoa;;^pjtq1x{ zWurfLLkso!S3u(NXv_%(%9$kOWq>L)z-)KZS4tvtKm*+50;3>YagqR`M;J>iVVC)A zw9ywH^f@sI#|R!$B7QT%LW_Izzk_n>feT*xJYy@vMS&mcYjLb~UqtFgzyPRKZt69u z`LXPWYT1uqU`8-#gd3Zx1X7!-!P(1A_-~f56SO;mcmVmy*t4Me*L}VI!I^qxyA)Ih)^%`b1-TbWccv!ur^}AgH}ej_uaZbE7LiL<9x8P)k_Yg?_Un ze2Yb{oCXf-ZH@bEPJq$B)&iGJ6>3f~pzZFR?=oG%$R!8)eIeN45KJHmfyE*kg!pGPRxf`*g&24-W$ zXpeJF4vOv2pLQMkWeuxUxNJEk&!Vju4ewRQ_8}M*aFJoA_Fd=P+NJxq9E=hz4;&M6NJ82p>_b{SMOIf-7rI_-b?AKj62u0&}xWZXD z>QNxW^FCIS07Tgf-H;VVa^^R#QEwhBLAjIYY!?C4=A?+?=QgA+EsW;n`hGK!4{4a*@)0)}?CqU;ZM{v7RF7$|!fM_FDyuy$0n z4QR%!_pu^E&6>{6pN~=&QU!F9un{|^kS5Q=KDYJ&`vO&mvezCwWRnMxnc**d_71!h zR7}fNNd6(_qx+VDq?7+3(Mr9%JY-2qvwf;R13!et%nu9gt$rCGC+?&JT!)UIg8#itp;?fQSMVq`| zsTde&0MC1`*F>6$?Iv@CB=Pj!tO+37DJG}x3zm_kG7fbquL);|*gdFE0X2~?I(R+W ztoW>3F_I_*Rfy*9l}#dvQYlijwG!{nzgXx{9&=Hr zTDYN`Pky#lIsD>p>Pgsx7Bgs-@cnoH=}`&G&C(ZYWim&PTmBZj(5h;W6+_=xR5D^rQSIe4?FBesd<|R25?jL4_d?-J>xFtO zu1U>Q7Az)A5^6%LOj7T^)2w-PG~yES3R1agrR^^QD!8vb;BagX(Imw7l<6l)QuMKd z-2u#)F(r&hxgS(a|B9JXUe`12c!+;++++6ZQO2Q(dr%J4iK2#1A4h-|MWR8zC%}jx zMTwBuuVcx;g#EeM_8TfxE~Q*dLYNZ*pT+lHI_VKg_;|JoZ6yfIJ|9epGEeO;^B{(4 zk=`Yp;0AO8CpxMgDNh_z-o+umj_T+oFtAca4$rW2+PY%~FJ>S$ zLy*p4j?TX`3DbPK({`tpl(Fdl9*V?G#qTe+Q{= zsP`}Zee~w<(@RIs-yFTTblmdh_|2u0cW+LHF8v!i^L;3R7_!CJd24E0v{p%=0agtZ znn0vsXwqoSyhtE3@hV+b4->%N;ZgJ%Yt8aBzAuDH;nd9by8J-$$}{V>Y;Uti3aZ?) zqf$Sf27*&LhpQs4_9F|N7%xVk9G@G%Ye4Z*J=5;cp5uHCt2xiai1esS+=UNn-Mdp9 zd6e?q*=qZ}-Xkw6wpz*BwuH>}=W0I+c5c71v&@9@<$g+X$)~byq+S!rh!CthP70oo zA|~3RA>-ZyG{p7z6YAC4Tzw!@{OW6`1Amtk7vrMG_}$-%%>h@d)pQG@gMPGx{hH`J z_5g&mqnO>PqTq4h-Uc--!ie5(cWCdY6yu6X14u%~c6}04))O5L+J_-}X+B{4N(cON zZoD$A^%(kcyM&mB@`mxK{Wa79oEU~mSwuqJ8C95f&sfkP&@gN3rQrhR&XJb}zw$iI zZ{BaYm@YdqAev>aR1V}(%K*K+wD60Ud}6Lw(cRt=EpYqHmX@t~sxK-))M8uUH<`NZ zm6@`om~5{6#X5ol{dxp4lWW6ZBZ7X1HxqRm(z~x{{yw1blkJb7wkRp!68*5}Xi~A%La|bh z1{)Bm`4-Gh+#q-{OIT{c`;+wuP_CGzinFgXn&aL)v-tCV1Pq3L$7T?F8a#_5ZCS&o z4KA&uUyWj$;v(Q!M9{4yX1Iop#U_7@@I5|{bN6B7TjXtDCHG3k+j4@@&B=v9YTvmK z@~uCf5}6%VO727Lrouq1X7)rUwEncA!(Z_S$a^K&;z+k^>yR7Vrr6=b9Z$E)dz>?Tj z1ltt$+>0^jG(rtA`WNS`_WbCx*xACr@Z!}snZlh)G!M z*%zhx`2tTT?}Y6*EzoAIIW@3fS?3dZvqyAGf2~a{ZE!d^10m3$($BtyBqq>eW2Tbq zpjU)+2D+;;y}7vC{rwtL*&{lWHvBf}yW{LP9lHz3OjyRY-uESNc1Cq3Sx+V}lf!3w zog-ux1F?lE2EIO?r6~6Vc;HjxhK5UA`hAHI#kZ$G=zU*9g1ZF&EJq2#P-^*^aIL{( zfvsjvla3_1N=m;nlyvW6B#1M;7+Q~?11l2d1vpsoh^d{_ZWS89&&iVyhJCIT)Og2r z@XB|9K&D%{$XtER!TSuM4;MPe+_s|MRWOn-=+c+luu%y)`Y_TPYF+jt6=tC#mHY(p zPgjdL2k3RWq1ah{mk4@-c26dqmV+1@SK2orL0Z7D-jnrid^sBZp5_X@7h5KpEabp? z*SEQcEy<*x9LD$Da7tb zibl)lXw#Qbplu0_w}0O)gJvPCfaG0(V3MLSU$8|@2?GvEpEn&WDTWotH#k8SEKcjcYNrGsjZ zY#Q(7)BVd2H9YmHQ&$VBHnOXWzD>SWQyh zaAzy9pJI)!z8$sUd6Dm0F3R?0Zu5q>;t#$apNFrW90Ynu9bfx$?_pCEQ;^@40*7&r zgQl9O%>eh~zKQ;aubZ1UhkW83r?(!qw7(AuA@VuRF-O1ZRox29iu*J#@u=-nRIvHO zW2aTiuWfHCwxSx_9oKyxwNE>5MtAbL>_l^SEU5mzDdgy~U;n7{mQ6_99G~l`kzLn8 zvx4)_IM;t|TaT*2+rMv}eRKt}*w+ARC?Z>-Tg3$gg+6*asbpXlFv#oS(tASw7vRnm zLcNaQ22wHn^I|vc`^426gH7T+xLzO>qBROl%X2YsjgXXifO zh^H{i-*@^FyIDbjUSbM=-Ebl)0yY7v;pFilW twwM2<&`0$}{->bmy@EOZ>zYIPpQB#yJ=rO|uKPQGDB+LtV+a_~{vVAQk8}V4 literal 0 HcmV?d00001 diff --git a/docs/generate_demo.py b/docs/generate_demo.py new file mode 100644 index 0000000..55eaf90 --- /dev/null +++ b/docs/generate_demo.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +"""Generate docs/demo.cast and docs/demo.gif. + +Runs real `ai-commit-message` commands against a local LLM server, then +assembles an asciicast v3 recording with realistic typing animation and the +real command outputs. The GIF is rendered with agg (asciinema gif generator). + +Requirements: ai-commit-message installed and pointed at a running local LLM +server, git, and agg (https://github.com/asciinema/agg) on PATH. + +Usage: python3 docs/generate_demo.py +""" + +import json +import os +import shutil +import subprocess +import sys +import tempfile + +COLS, ROWS = 84, 13 +PROMPT = "\x1b[1;32m$\x1b[0m " +REPO = None +EVENTS = [] + + +def run(cmd, input_=None): + return subprocess.run( + cmd, shell=True, input=input_, capture_output=True, text=True, cwd=REPO + ) + + +def emit(data, delay=0.04): + EVENTS[-1][0] = round(EVENTS[-1][0] + delay, 3) + EVENTS.append([EVENTS[-1][0], "o", data]) + + +def type_command(cmd): + emit(PROMPT) + for ch in cmd: + emit(ch, 0.035) + emit("\r\n", 0.15) + + +def main(): + global REPO + REPO = tempfile.mkdtemp(prefix="acm-demo-") + + # Prepare a small demo repository with one staged change. + run("git init -q && git config user.email demo@example.com") + run("git config user.name Demo && git config commit.gpgsign false") + run("printf 'def add(a, b):\\n return a + b\\n\\nprint(add(1, 2))\\n' > calc.py") + run("git add calc.py && git commit -qm 'chore: initial setup'") + run( + "printf 'def add(a, b):\\n" + " \\\"\\\"\\\"Return the sum of two numbers.\\\"\\\"\\\"\\n" + " if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):\\n" + " raise TypeError(\\\"add() expects numbers\\\")\\n" + " return a + b\\n' > calc.py" + ) + run("git add calc.py") + + # Run the real commands and capture their real outputs. + suggest = run("ai-commit-message commit") + if suggest.returncode != 0: + sys.exit(f"demo generation failed: {suggest.stderr.strip()}") + message = suggest.stdout.strip() + + apply_out = run("ai-commit-message commit --apply", input_="y\n") + if apply_out.returncode != 0: + sys.exit(f"demo apply failed: {apply_out.stderr.strip()}") + + # Assemble the recording. + EVENTS.append([0.0, "o", ""]) + emit("\x1b[2m# ai-commit-message: AI commit messages from a local LLM\x1b[0m\r\n\r\n", 0.8) + + type_command("ai-commit-message commit") + emit("", 0.9) # the model is thinking + emit(message + "\r\n\r\n", 0.6) + + type_command("ai-commit-message commit --apply") + emit("", 0.9) + emit(message + "\r\n", 0.4) + emit("Commit with this message? (\x1b[1mY\x1b[0m/n) ", 0.5) + emit("y\r\n", 0.4) + emit("\x1b[32m" + run("git log --oneline -1").stdout.rstrip() + "\x1b[0m\r\n\r\n", 0.6) + + type_command("git log --oneline -2") + emit("", 0.4) + log_out = run("git log --oneline -2").stdout.rstrip().replace("\n", "\r\n") + emit("\x1b[33m" + log_out + "\x1b[0m\r\n\r\n", 0.5) + + shutil.rmtree(REPO, ignore_errors=True) + + header = { + "version": 3, + "term": {"cols": COLS, "rows": ROWS}, + "timestamp": int(subprocess.run("date +%s", shell=True, capture_output=True, text=True).stdout.strip()), + "command": "ai-commit-message", + } + here = os.path.dirname(os.path.abspath(__file__)) + cast_path = os.path.join(here, "demo.cast") + with open(cast_path, "w") as f: + f.write(json.dumps(header) + "\n") + for event in EVENTS: + f.write(json.dumps(event) + "\n") + print(f"wrote {cast_path}") + + gif_path = os.path.join(here, "demo.gif") + subprocess.run( + [ + "agg", "--speed", "1.4", "--idle-time-limit", "1", + "--theme", "github-dark", "--font-size", "15", + cast_path, gif_path, + ], + check=True, + ) + print(f"wrote {gif_path}") + + +if __name__ == "__main__": + main() From 352b9a1e05d453ebec1a0244b2886f78304202e9 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:39:31 +0100 Subject: [PATCH 20/31] [#maintenance] [README] Rewrite docs for v0.2 with OpenAI-compatible backends and demo --- README.md | 75 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index fd3f014..f4d3c68 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # AI git commit message -A Ruby gem that automatically generates concise and meaningful git commit messages using AI models via [Ollama](https://github.com/ollama/ollama) or any OpenAI-compatible API. +A Ruby gem that automatically generates concise and meaningful git commit messages using a local LLM via [Ollama](https://github.com/ollama/ollama), LM Studio, llama.cpp `llama-server`, or any other OpenAI-compatible API. + +![Terminal demo](docs/demo.gif) ## Installation @@ -26,7 +28,7 @@ bundle install - Ruby 3.0 or newer - Git repository -- [Ollama](https://github.com/ollama/ollama) model running locally or other OpenAI-compatible API endpoint +- A local LLM server: [Ollama](https://github.com/ollama/ollama), [LM Studio](https://lmstudio.ai/), [llama.cpp `llama-server`](https://github.com/ggml-org/llama.cpp), or any other OpenAI-compatible endpoint ## Usage @@ -44,17 +46,37 @@ This will: 3. Consider your current branch name 4. Generate an appropriate commit message +### Creating the commit directly + +Review the generated message and commit with it in one step: + +```bash +ai-commit-message commit --apply +``` + +### Conventional Commits + +Ask the model to follow the [Conventional Commits](https://www.conventionalcommits.org/) format (`feat:`, `fix:`, `chore:`, ...): + +```bash +ai-commit-message commit --conventional +``` + ### Configuration -You can configure the gem using the built-in configuration command: +Configure the API URL and model interactively: ```bash ai-commit-message config ``` -This interactive prompt allows you to set: -- **API URL**: The endpoint for your AI model (defaults to `http://localhost:11434`) -- **Model name**: The AI model to use (defaults to `qwen2.5-coder:7b`, which I personally recommend) +If your server is reachable, the model prompt becomes a picker populated with the models available on that server. + +List the models available on your server: + +```bash +ai-commit-message models +``` ### Command Line Options @@ -64,14 +86,26 @@ Override configuration settings directly: ai-commit-message commit --url=http://your-api-endpoint --model=your-model-name ``` +All options: + +| Option | Description | Default | +| --- | --- | --- | +| `--url` | Base URL of the OpenAI-compatible API | `http://localhost:11434` | +| `--model` | Model name | `qwen3:8b` | +| `--length` | Maximum message length in characters | `72` | +| `--conventional` | Use Conventional Commits format | off | +| `--apply` | Commit the generated message after confirmation | off | + ## How It Works The gem: -1. Collects your staged changes using `git diff --cached` +1. Collects your staged changes using `git diff --cached` (capped at 12,000 characters so large diffs don't overwhelm a local model's context) 2. Retrieves your recent commit history for context 3. Identifies your current branch name -4. Sends this information to the specified AI model -5. Returns a concise, contextual commit message (limited to 250 characters) +4. Sends a chat request to `{url}/v1/chat/completions` — the standard OpenAI-compatible endpoint +5. Cleans the model output (strips code fences, quotes and reasoning blocks) and prints a single-line commit message (limited to 72 characters by default) + +The URL accepts base addresses with or without a trailing `/v1` and `/`, so `http://localhost:11434` (Ollama), `http://localhost:1234/v1` (LM Studio) and `http://localhost:8080` (llama.cpp `llama-server`) all work as-is. ## Configuration File @@ -79,29 +113,32 @@ The gem stores your configuration in `~/.ai-commit-message.conf`. You can manual ```bash url=http://localhost:11434 -model=qwen2.5-coder:7b +model=qwen3:8b ``` ## Models -The default configuration uses Ollama with the `qwen2.5-coder:7b` model, but you can use any model available through your API endpoint. +The default configuration uses Ollama with the `qwen3:8b` model, but you can use any model available through your API endpoint. ### Recommended Models -- **qwen2.5-coder:7b**: Good balance of quality and speed (default) -- **llama3:8b**: Excellent for general commit messages -- **codellama:7b**: Specialized for code-related commits +- **qwen3:8b**: Good balance of quality and speed (default). Note that it is a thinking model, so expect a few seconds of reasoning before the message appears +- **qwen2.5-coder:7b**: Faster, non-thinking coding model +- **qwen3.5:4b**: Current-generation small model for modest hardware +- **gemma4:e4b**: Compact general-purpose option +- **llama3.1:8b**: Solid general-purpose choice ## Contributing 1. Fork the repository 2. Create your feature branch: `git checkout -b my-new-feature` 3. Install dependencies: `bundle install` -4. Make your changes and add tests if applicable -5. Commit your changes: `git commit -m 'Add some feature'` -6. Push to the branch: `git push origin my-new-feature` -7. Submit a pull request +4. Run the tests: `bundle exec rake test` +5. Make your changes and add tests if applicable +6. Commit your changes: `git commit -m 'Add some feature'` +7. Push to the branch: `git push origin my-new-feature` +8. Submit a pull request ## License -This gem is available as open source free to use/alter without restrictions. \ No newline at end of file +This gem is available as open source under the terms of the [MIT License](LICENSE). From 531d87195e40b0b5f5fbdd9ffa10c11f8c459d8b Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 00:46:06 +0100 Subject: [PATCH 21/31] [#maintenance] [Docs] Speed up typing in demo gif --- docs/demo.cast | 127 ++++++++++++------------------------------ docs/demo.gif | Bin 79486 -> 63357 bytes docs/generate_demo.py | 8 +-- 3 files changed, 39 insertions(+), 96 deletions(-) diff --git a/docs/demo.cast b/docs/demo.cast index 49fbda3..c772a84 100644 --- a/docs/demo.cast +++ b/docs/demo.cast @@ -1,94 +1,37 @@ -{"version": 3, "term": {"cols": 84, "rows": 13}, "timestamp": 1790465952, "command": "ai-commit-message"} +{"version": 3, "term": {"cols": 84, "rows": 13}, "timestamp": 1790466332, "command": "ai-commit-message"} [0.8, "o", ""] [0.84, "o", "\u001b[2m# ai-commit-message: AI commit messages from a local LLM\u001b[0m\r\n\r\n"] -[0.875, "o", "\u001b[1;32m$\u001b[0m "] -[0.91, "o", "a"] -[0.945, "o", "i"] -[0.98, "o", "-"] -[1.015, "o", "c"] -[1.05, "o", "o"] -[1.085, "o", "m"] -[1.12, "o", "m"] -[1.155, "o", "i"] -[1.19, "o", "t"] -[1.225, "o", "-"] -[1.26, "o", "m"] -[1.295, "o", "e"] -[1.33, "o", "s"] -[1.365, "o", "s"] -[1.4, "o", "a"] -[1.435, "o", "g"] -[1.47, "o", "e"] -[1.505, "o", " "] -[1.54, "o", "c"] -[1.575, "o", "o"] -[1.61, "o", "m"] -[1.645, "o", "m"] -[1.68, "o", "i"] -[1.83, "o", "t"] -[2.73, "o", "\r\n"] -[3.33, "o", ""] -[3.37, "o", "chore: add docstring and type check to add function\r\n\r\n"] -[3.405, "o", "\u001b[1;32m$\u001b[0m "] -[3.44, "o", "a"] -[3.475, "o", "i"] -[3.51, "o", "-"] -[3.545, "o", "c"] -[3.58, "o", "o"] -[3.615, "o", "m"] -[3.65, "o", "m"] -[3.685, "o", "i"] -[3.72, "o", "t"] -[3.755, "o", "-"] -[3.79, "o", "m"] -[3.825, "o", "e"] -[3.86, "o", "s"] -[3.895, "o", "s"] -[3.93, "o", "a"] -[3.965, "o", "g"] -[4.0, "o", "e"] -[4.035, "o", " "] -[4.07, "o", "c"] -[4.105, "o", "o"] -[4.14, "o", "m"] -[4.175, "o", "m"] -[4.21, "o", "i"] -[4.245, "o", "t"] -[4.28, "o", " "] -[4.315, "o", "-"] -[4.35, "o", "-"] -[4.385, "o", "a"] -[4.42, "o", "p"] -[4.455, "o", "p"] -[4.49, "o", "l"] -[4.64, "o", "y"] -[5.54, "o", "\r\n"] -[5.94, "o", ""] -[6.44, "o", "chore: add docstring and type check to add function\r\n"] -[6.84, "o", "Commit with this message? (\u001b[1mY\u001b[0m/n) "] -[7.44, "o", "y\r\n"] -[7.48, "o", "\u001b[32md087e34 docs: add type check and docstring to add function\u001b[0m\r\n\r\n"] -[7.515, "o", "\u001b[1;32m$\u001b[0m "] -[7.55, "o", "g"] -[7.585, "o", "i"] -[7.62, "o", "t"] -[7.655, "o", " "] -[7.69, "o", "l"] -[7.725, "o", "o"] -[7.76, "o", "g"] -[7.795, "o", " "] -[7.83, "o", "-"] -[7.865, "o", "-"] -[7.9, "o", "o"] -[7.935, "o", "n"] -[7.97, "o", "e"] -[8.005, "o", "l"] -[8.04, "o", "i"] -[8.075, "o", "n"] -[8.11, "o", "e"] -[8.145, "o", " "] -[8.18, "o", "-"] -[8.33, "o", "2"] -[8.73, "o", "\r\n"] -[9.23, "o", ""] -[9.23, "o", "\u001b[33md087e34 docs: add type check and docstring to add function\r\nf7c9626 chore: initial setup\u001b[0m\r\n\r\n"] +[0.89, "o", "\u001b[1;32m$\u001b[0m "] +[0.94, "o", "ai-c"] +[0.99, "o", "ommi"] +[1.04, "o", "t-me"] +[1.09, "o", "ssag"] +[1.14, "o", "e co"] +[1.26, "o", "mmit"] +[2.16, "o", "\r\n"] +[2.76, "o", ""] +[2.8, "o", "docs: add type check and docstring to add function\r\n\r\n"] +[2.85, "o", "\u001b[1;32m$\u001b[0m "] +[2.9, "o", "ai-c"] +[2.95, "o", "ommi"] +[3.0, "o", "t-me"] +[3.05, "o", "ssag"] +[3.1, "o", "e co"] +[3.15, "o", "mmit"] +[3.2, "o", " --a"] +[3.32, "o", "pply"] +[4.22, "o", "\r\n"] +[4.62, "o", ""] +[5.12, "o", "docs: add type check and docstring to add function\r\n"] +[5.52, "o", "Commit with this message? (\u001b[1mY\u001b[0m/n) "] +[6.12, "o", "y\r\n"] +[6.16, "o", "\u001b[32m64e62f6 docs: add type check and docstring to add function\u001b[0m\r\n\r\n"] +[6.21, "o", "\u001b[1;32m$\u001b[0m "] +[6.26, "o", "git "] +[6.31, "o", "log "] +[6.36, "o", "--on"] +[6.41, "o", "elin"] +[6.53, "o", "e -2"] +[6.93, "o", "\r\n"] +[7.43, "o", ""] +[7.43, "o", "\u001b[33m64e62f6 docs: add type check and docstring to add function\r\n23bac7d chore: initial setup\u001b[0m\r\n\r\n"] diff --git a/docs/demo.gif b/docs/demo.gif index a3f55e45355a6393474b5634ee866adc78e92207..e13bff8b7189da813dcf8aa2a2676ad761f200fa 100644 GIT binary patch literal 63357 zcmeF)cT`ksnl-6?&+ECo^NJW&p)$PubDe**5&z~y`S^Gr=~bLm|J)< zX}T0X@u&aN?2~e}pFPXg+Rfh7(3nQSf2{dkV&$q8hMU%`A~ZkI=`-;k8T|O4{_(#j z7_6rG^34YobuHDQ+SISM^0M_<`erCt*jPH!jboqQO-v@azBP&Tz%?J!Ov2%5$7Kje~NU?yZ*B5i%d+* z(+?HjqA$Jp`D=BboQj^gqq|QdN0^hd{YG~$E3C|1b^fXyVV}%SC*6GZNpf{blgfhC zJHwkzQj%^x|IDr&LQGw_X4lAFd26%^U$pH1a`Q``vCHnX!C#H}-f49%Pa|n(?C*L- z?asZUy{B#HySr)pdp=~Y6$6nVF#OpF+pf9s_0?TS58;|uPb-u&X$nTYWx?w#5F*7Y z8Y0!K_DWk6KWa)CwXizUqU6cNG^<_Tr7cUl+q0&oPKvTT`TXkfg_V0{tjb>AEM0TE zI?C$Q>$_FEzI>ONP~Ov3AE7omdcx^iZ1RqGog}$DVWz9o^8Is{ge^a?U|rMl z#3g$rS0s5wJFQ4wksh`pWpzQ*iqv)0k}K0TwmPjmxbD?vojA*z9vSdJ=n8R-CKzs_X+x!dD$hS=YSkX!>6E>YU7I=herKq=&E0%`IqN zomWuJUUR&-)p<>R*}d>J1r@KG*PN*S&h{;=m7VHabWS6}x43zQVT*4`>m;eQrI%f& zu045eNyOT+TkBfZp1QYJYF+t*=&9>YKS_^RSMj`{WnJa#YN_>A?^>s>Kl9VQi1pQ< zU$?A3`~AC=pO`A=;#b2Q7U@^ZHoD+fCp%esL%qUumkkZdOCvX&i&e%%exfr*{}@9_ zLW=06OeTV-xVc~w`GH|ZV=OR_yZOO9TPFu+w_SS!cI*~x+`4PiwmrM}LBmHHIl9cW zcbdL=`(E2A)7Ed?uBmIFJz})!xCtA!>@=TXGtPpybC3VbxeG@bna!B9z{Jebbgb37 z4cjJIPuaF}-~7eP7A)}|qM@_IbLG|@d;{aLHuh6jt=;4@eU7i+mU#<2cI^vXwsNiI zB)hQ|lPB6ZtX%Eqw`s>-{}2O{aU%`JxXqsL>^f_b^%S2q8`iAfJZs*fx$~D!pS587 zF21>ywY8nI_o}t7Gv}*wb@dI$cr07xzR1&c#yr;om8yOTBzFv__23H-SsD-51Z9zht~6 zZ(l&Dv6%%FGlXXU?Efaw$EWxQ1Q5X?p<&?>kx|hx!q~X@g#8B+laf#N<=D; z^bexy?&Me~TH8dZ%JoTa5sC#hG$m;VB5C2z>z3Gh^~H{@r*@u|jPAYFkaxXJz+iN0 zS&BpiT_=9j(n+N!U(Bh{g(}p@$D6E$o zu0qXDn7v>JYt3St+JHfXOO4H1>K$fSm|kvUW~|XU^JP&kREwIp$(AE^V#Cxe9%)C8 zQ+<>=YwnKa2MFJrj}s3DONx_-?d5lpR~6jUC6dma9+|Xd^;No?qsC0JywxIOvE*oF zeeJ0I`nj4R*#}f51%b7_d7Atq<(WzKDVE$B4E>-`!PJSGbV9q(VJ0!fmqQGmWj;t! z(tNn7m(DQ1!ba&K>Kg+XCTuqbgX&B0iLufiM%AC+MKo4~KI)vQ^Zj1xo9eMd4@LH< zV0NzL96bd}U&DuNDKUG3I<+QOZc3UHbvi-R*LZ$xDyR$>k1{$VNxR^8K}u>jt0qLn zK=LAGyn696g{6x&XxXfc6lkjNk~Xd9sm=VLqp?NQNWG`?pjh+$wLHH|aiU!xiaMx% zV~P2+w%6KArtebp5AjG9ZDex<_B-#t<~qvCCAF{^S_VRED%EG(rr7bs=74->gPFuh zCdQ{f7aan zMW%eKWDb)*C@*E5%JalUZ8mYNgtX#AF^a-+t%zZl%e#|it^3rSEVsz}snBKEo@Ynv zs&~FPLE~8U^_KqpZChvXqrI#*!M(Dao`;uYojOKWCOW~!=X+pq^X%}F-C45`uTWbsQ!d{rtKJy z8@>(ZOkT|9FM0Q#u!BwQl6o|4BQzfqV!~qd1G=oxno`Y7;>xyjxQZEDO*`upj^~CP z^t0Kxh|juh=fw|I5m6T9)HO?XZv2|+*}6I>%V_5M5I1i+C&@yEOwv8&yWXqBZ?g|~(&dGeE}9!JIw ze=4h%;hyJArK;bk-DjzG-7tG|_UJvUye3xMh}~&$vM)A^n9#<*xABoy)yG$}blJqT zXucHX1|bz(!;6naBQ+^7V5Kih{mr($$!q6Nk~evvu>Oj?RrIr<>cDQuH=V9!#E+ZKa1SC^!ZZ;w3wQgzta zMna{^j;8YMQ(GkKgUHj($Ii-9Vb5N(aT>%yuH)y+iwn$-jE@R+-1Pa1NcLoopzGO; z)XyC`u4DC_^PkVH{Cu@A`sDGI(_SpN{rOsX>&b#`7hf#-^7*=0wyZE@+Dk9BFE<)p z%Zd}vU3|I1>dVcx=(5tI(_XD!_~q7(*0Qow7hkR0_2qV_?5Xne(_U{({c@+<^;E_6 zi?6p-!m(s-BoX{cv$p>-#Bhs-E)hzrPgV`oUc8Ot<6t^X>7in=xU}+>Fj$IqdpziOZSi z?&s~fWVAFQqvcpajZh*&$Y_aBnfWy{v^_kmBO>x<^zzSK4tZ;GJFjL#uK*waXiM_@6>60DTOjpy?;p&f6)6y}YF?nO*)|KgN z<^?QT9Obp8WV?5w&-&bryU*_3SMQ(tE-k1vB=$jE+{5^!SIJSgqT?SW9O^xk@+Jk@ z7Qq(r6QLDJ7P%E67ZLCGIhPE%2$KCd_wP@*$e0MZ$hKt2B@-^v>)#H!$eRech`MAN z9T;^HUH>rcBIF|QBE}-~{wD1r>LTYN-jY!lAs1oxHwpK@C)oZg!t(#FeiTgZf%=0x=PY^HEH!WSzwxZ<rbA&#_*ux;cpbp>%yguh?w}t-LI-^&ZTD@ z>3r}Mf03OJyD?^%7CxPAX& z?YWkNhmM>PpSyPR{<+4B=bBohg!>O9ABu@hynd_m(v=(Mn=jqCeLp5Hsk~C0lUJCO zD(ZUtyshKry{;#Zp1#6_4p%X8PBrbl`|WMshyM`bjEDjwop*8Ys9#2^}crzm&^=cE|mnKDOxKgnvL_ z(4RYagh6y{tT67E4jz?|l9YB39sF=s_K|@dyrlGGS$_u?*W?|lZ3wJC*HqfroO~hw z(#4SW%U5$cuHC$K`_A2a_dB~DJbd){$-cO&ueEs&l zkD#&D9ScP@0jxp#iy8|v>Owf$&S{QCnGF#tV^-g3EINEXhHD$H?o^!B6t6cccTrPu zc1xo1vgS0Wk|P&W%{M*2(^PWw(jndshKh4Sw;shYURS1h_Pq9^Q}*kxb-sG-O6H7g zt^DRW*XA6~EH!-PTz2((Mj&0fQD^I#o2QQTwKBO0BKqwzzxOF|sdMt~oz0|jDYXHO zvhqGtbQa%c(E}M{)~Qq4<`SJPDO3@^C!;QmVeo{?^S7fswAa_aV=`&p}{h?`&UYBQzU2%P1_{|PpBq-Z6hD&prX@7^xUW`(Pnd()rJ$&2gdJn zZL~S`UO8u>k>aAtFE(9r(pS0ZoKN;+cP<+IrTVOhu&D3ku}3cwiWg<=FQcrANb;jd zGR=%@(&raxqqBL)+Ti7^9Y1ZNNmTP+Y7 z9eV)Wz(*{Yz$L82oHw?#J$Uj0N@8nv&w=}X>7X;PBe!p`9xFLuhipQ62l`3!z&*K) z>rW^H)f*U0fIFTdSjJ%!_Z#(KH1=-TxRK=H8Gttde+@pcPCj+WM-GxBo;PH8{KqLI zA3Vs9&SBfQ)~* zo%|1EtgZXgcCzIxrS;OKH0qU(j-s|3m#<#Eexp70_MO6e_fxvAJ$yt-q%s4aUb*`y zQD5&(&%1lKp5E1w9j~Tq-qP7Arb!Ov>?U|^T$`W(XSYq`S?T;WBOLVj;^hvZ1dU_o z(o?jDK z-PQkCUGwZo{(*@3cVDdiRD3ab@xn5T?E6qVl1)YSCz?W+AMej6+jMv!Hlk0 zwI1pK5}*QUU<^coB1mEw^oLJgrlcRnTn^RL#jKD@K?slorM7I}M-l~!5PLur$RQoV zRFS$sBRDaCkrx*7m|Cpg5yp_j@V5^zP?o$__+mQE%qL-Fv4=-$+9L>Vx_G(xre_kkZd~u4*QVF#78vm_%b-xOBPJh|v)AH`P%`&yZ}7AQra$c-;VW_XYlqG70mb z0>mX%fV-p$a2GJZ;J?_=)cW_p0Hptq+3>G;AM)!Y=1+-^iHVH!r|v&+ARcc+f`#d6 zVTqZdtnAQq;gO)s#N2}HoY)h@@uZSd@kP<6PVO&18xbwRIaG3nDsBpimSZ%WIPbsu z)S8f?XDLQObV``qFjX1Z;p~wCDkBD2T`xVOd}7qbFq)X6Y`~cQxiXZ-*3#e#JGp#< zP`B10+&k;+D;G3t$!<&#&(GaU4K(Hyiv9Tn%u_LlLyI$E;x+3kUINA$dC~GDAcSZhJ#~sD(|liHRzT()Otf zjQG;nk~E)|}+vV9T+`+m5bbQ2&x=)Zk0ZVKXfzlCD9{AMOi}_nFvA#N zFo7zF;Y4P@m_Y{&7}^(Hz(W(yO8oU>ErE1#?09iT*0I=xTJi#VN0h>SrSva8pY{KLNCUR&ot7Ln`V;ap6*#mDJ5wvpi zOJ2Nw?;jL#<=X9*OIJ$DD)LU0#vMovk50(S$?tyAb2RtFq0FOd!-kVKfnYESf1w!U z1*0UpKo*z+UoZ!h`!NNe&=Yh5G7ttmfieJv%diZF0x6Ow7(^Nhh5#s(fuWEEtf1?H zQ8Zh`31A8}{x8Lee+3!;sek6LeZkw-07`6JTudZ2F)3;PkGHL9@fnALlYe>J8l4fJ zOJpY(6qn>2PslAyDXpx^E29*gPCQfJ5PVi#UVH9BLt{dDVtIQvBVmAA(za&#q%s)nZcqZ08+lRmPmofj-*NYh`1iaePND(&9m zxG8UE6Y>hPLu+$vVpS+Z=_VUYx}EJjsrtDu6}b-n3?pZ=P`Y@yOL9Q?Zbwh9KOy1o zyGSMLvCaf*&$;^3bi!z1k_@g6ty58-ZtWVZLg73)%B4+a?lDOj_3Uzqi|s+a$(FVS z1#@D2SeLt$c(R58GlfAxWp6SFw)=6Gm@A-q2<8!b$9Zk>x?ZadH2tmHWCl6ay2KV< zPq=@{pUU^K_MrIFO!-lUdlm$XWYyR%tc}E!$0oz1lZ4bG5q8z0$&;=2KNhdQRP#ml zepU@ZSCy->v(OlI`rXoWL*H%zBb1wP?Zj>WaVB4HKF$%RE)D;#*v$KjQT8w@{#Qn! zVPUi(62O5`Kmb@_3_%ds0XQ%LP=E!D8wM>>n1Bg|B$!-OBn&ScgK|&>aDh0Gg4l%N z#YBTCU;?Q?9Gn^G6}W>iNJx+b!wY{P8xX^EV}ubeFym0@HzSOB#}q>ta*#=&$Pvc8 zW3I`eh6z9t=)qoS0BtbuAQ#R68L&*c3I@S1kO9ju5Hf>VfJ3Gzk{tv%;EenSnc*}1 zA>ksK1ydjqG7t0?4uf1!j35P(fG6aHkRS_4l75m@{-KkktI!g(_Javy|83Mi@m$Dn zjf$WMV`HPEs0R`g6MmcsNsSYwha_cXVjC4HiaX|?m6TspoS7G&e$%G5PLN5fv8SHQ2Xsv^OZg1QI0)w^GRm?O)Yc|W+TC&@+ zgmK})9BK2}9@!$w*CcUBrDqXWCZ7wa(j%oZIDfLezZ~ zH;e7tXHFShEXBC0A;02f;7SLuzzy<2kKrPl70dx3(B?4)U7;20yJb_E#h13IXV0baPa04R=SYQRF4?~CT4Sa)g2tQaE0V_xa z6Mz*c0C9j0z5y#R1)~tC00ImFhDcVB3I+lPkb=MlRRG!#yY>Z=s|?^k+C>rpANp}1 zOBab4LI?=$hk|qr`XQl_H4H`}ZjpMxG!hW#0T2627Z?F_h&26@AlUqEOh_tGr9cXV z9HN zoc&D+Ms+ko-jWa*^Y~LJnhZB?0+A_V++=y0B^YUsQdOtW3rA?)v4taL!ya^$r^%l&U%VPTtf(Mq~YUw&%*+8h3~~&)zAt*R8hx!NO?U z7cZBuN%g6^=3#Fo)4F2y+`Q@Wd!qEqe6MHCNv%E@`_nO>Kdp4U|NIvGJ)u8fg^W~! z=RBAJHW+$5@Bs{}4{{3F003YB-eCG60j3}D+`QWb2}qVmgdh-r0YdNq5`Y{e1zMr&XHgYj6YBfav<_Rmwq{54DtmTE`S+H2=F64 zBO!r0WE1L#1jwP}K}TdFvI&uSsvnhpQNZWGNb(z0z~sQfMCt;u$o&j}0axgDe;8Qc zA2Q2tm;q*gD9yk7*1sahF|KpD(cY`leR2zYUsU@UT-rR5xjp^%?l*m6kzdXz*_g(x zjZIZb+b-s8c8;2qarOAtmgS2#+%4Qb;TyBDyR>5ElFIvjv#ngG%y@Zn*WE97zw|BK z#19B`_74gT^W7636>Sm{6Bj=`HX$+QKvHUGO4^})>7v6MGP91ZK9ZB?m3#cef)&(~ z($d0H-X|-{s}@(BJX16OY+3EO8TBRSTc$QqFSJc*ZSUY+xq4&V^_zE0Zr|-RxZm|? z#KXtkT2G%ne(|#F^_#nI-`)K1@#@dL?VrC~`1U=TBCTgY|4X)zBqkCy6qjFS9mid; zM8J`1OfUu=&s5A4p6i%zj6UWb1B&^^gyG2w05JN<{V)JScKGOVj55X@qmKtUwyMpo zR{}$#FsYbtyvV_09$Q!h2qXiX{Xl=faAVFe_oyWxq2yF0f(V$w=wnhb?wC<>jRF8L zN#x=ala1j60}badU_=s<4r2EKpWq6{7fztwAZ=i9!2p^J-sq$r%EF=~?NBxt02_b@ zAdMM65xol_p&j8ljkij`AiuB-CSl@{eh_y610L;|t(@aU*!y5ok)Oa4W*Q!lqe(vO zktBjbqYyHH4Ica;0c&G0Np4%93%NtV))~RV(9|3NfIw_>5NS#pG)(^WMY*|~5C0+pPq$~=;XrP7(R4aZNM+@F+=H)nADUolw! z1OJ(gbUv9o zCu>N->buP+^RA!ps0$xDwe0xK5}zx%i(AU_Z=dpe*nDv6se-$e+utjzi%+dzdWKJv z8rOZQr?W2fjq*>aXde5rXj`a6=^eu)~*hZsD=ylQ7 z6W&~=lC>F6C?#vqS)({y+K$eY?`fZ6tx0cFv^`i}<3Lx;F%k0VLs;tJ42|+ONlLxS zGASa5>!d~7q2;ts$+x(XB9X>v;SCZAgSfJ$^o&47whm8ceBlf}aY}ObqgW?)>7zg; zYNrO_$a-+jMl;&|0Z(bWb)baw>>iB>eM9=u2kX#rojefte>zJVZY$mB>9&RG>! z#M=w%Q$5BIW7K(J)ID5oo{fRt!MsaXmsAQ{-kclN*7}oagi#)2OPnJS+Osg5ShlS1 zLiz=>HPbdWjG(z~rF?zDCa%ssEK?fqetm*icEX3p#CmInYS(2T3B z5ASaa)tG7FZTVb9O^&DHQTpBTF8!Dx=VkKxd!ODj!dxq?i-&z+QrX#4@ZiEpCh%pcH*mx?p}i7XL!ck0#qrQ0Sy6};y5Sv7uTDewqs z<6S?|>Ik-5Q1v3gcqvCQPr;2Yz}a7>b*+XnAt~?jKr2{WqsI2*6Wu(nj(VeHpTM1= z=^w*YRd+zJ=kR`lUHPr71cTp3^vIzd+UQ7WVdK&Q|7> zNJ-T?nOhu+lG`KsDaLf7lkY?*a%r^W;hfl!oaN_a_tV?$v+)BnKcI(A ztWThaiPTO%yXeo~#6A3}R(4!F$AcZ8v_^5IR#cMK%PkCkD53D;{MV zF{n<2ZznS-YpLG-Zht|qI94T4*O1}W5>&n^so}!PF@nQ0c5R)>mD%lK{v|m4?C8yz zM_u%+dsXx1&FrM?X(!g}i7W&>ku>!gb%=^7!`In+vT=g7$x=&BGCMGbYVy2ZN1rp* zFOxI7GdkX|&?1e>WiQ}|x`u7LoVVhmrB#r|Dt1?(tN}fTD!+O{W%z7DZ>;9pIr`Hi zHeN{!o})Q&sH1e!>NZjK#;nD3zDk0za6GSryK8LYqP45%1d5c1)f1mH?y}R$_bL*a zqeInpvk8|Zv%-ZF9lai}JlQ}M6{sxiCd~c#a$Et8)j5sI7E;ao2mxgyho!nvL}f^K zu~u;!he>;!Q^vnxy3;({ubnL23D$BJ9Dknsiv>5RAr&X0M%zB;5F_iYnG3m%Tn8e| z&soecP+?FxY(B?8q+r0W<%%+ecYpfnRL!)t9(Sdd{x~*X%`j|^)@Dm8dTCzRVz@aw z@BRiVQF(1KEAV8C^Q~LTrz#$=<-fPO^FU)8_s&Pd?TlyFkIk4ypBg_Rf4fKEXtAb} zhPkh`&DXmyPu*CvToH6lzxqFDPVDW^cC{q}V06WT_(VWo+2C#z0u_ zNi@7k9vy9R$K$LFU($)VEPcR@^6m~HC&ivR=JOdn6smz^LC6p< zhN7KF#+FaevZPj+#LwpjO%f-KYU7MH=2B(1Q>-23iCL#(C3yb!=?pKbG{=UvB=o+` zjh8FTPj%D~-5-wHPUOryYtg#I(shf2aaQ1mPnQH5n-f><@3uF}x*nq3n0%$`$+)u% zS~r)CNtb-!<2ZEzS52>or_*_i`08=}uIkEM_5vy;{++r#^j=Fx#UHI*}`=yF& zr&>Q2?E3b?L$311dDowcQ@_3RnO=G8dh1VRmET_Z#Z=yT>iToV?QgHQU#h(KbL-F5 zU%tKBc%m$lnBJStn&c2PeYdOZFrvX~$=Hy6Rgad{_BJi79=`u<)f1<b9?Gut?bEXo)3-te6@0tX8yi2FC`Ve+`Lr%Q`x?WuQ#3jeE0qL57m9&x&w^9 zUK(_^H+Ax)cSa|^KAt{_J23j&5T__p2Gsoj@UZ(oeqQNsoODO`AU6!CA7uByniKT{ ztpKl6P(RQ#P!CW-&^k~;&_M8Z1#eCe>#=!28$ta*-#`^X2|*`8AwkVR8$lJpE&^=? zi5yh~g#>Mc+%2GxppBr1V0(aOf|F%vBV_kLqd@DJx6otC)EOuz0j}=pF+L3E4wXOHf7n4|bt)peJBEfh7zUvE=^Y_YGuV>p*Ql z@jxf(?;a>8C=ys%{HBDUu3!y!H-1H+HhIpIoYr89gyLs93>!cHC-#1pn^wO`&mH zw)S26-cwos)~qP?sM9X(odGYD%0_HY^4NY*PwL51m!#)k1s{i&-nShiG!yNU8S3aJ z@RM}77r=4Q>vE8F_2~*yS&`EftiH9oD})=Y_aIc~fX{<4y(2jf!VSv0A4C|R(|Z_c zcFpHul=+jKhtU&$>V6o*V~%_zv{PR7DArN;*rPa?anBybyE%+}oG^Rts>l1?S2%eQ zi?-feZbJohpj zc1_ZUkd*eQIk|bo!j%kt6~cz5iRV4Nvsiy!Dn;GRzgTxS&$=*I;d4Ri?aK><`Cn4P zMkKys8uW-6YR4aod#~l5sGV<`W?Vnd+2CcC;!;)4UtpFcT!|`*)c}|wA8h05=))dZ z2;Q&&fj~eJ5R(2uJMxtYyuscB+YG!$1(w*BKu}Uj+(Lkzpphhy+{QpSat}i;Ua)lm zdw>?Z7wlDj>~6 z!-K_6{~8Bs;;bLg1*mvRKuT{PU)YS*4ZOtCrXNdkR|6^gmoxoF{s6Kgf&>!h1j!W* zbR0+{xvs&^K~ztF7+1ZTP)NI+$qehqq+~* zA7xqi%=(x@zNMm+Lf-Y{m19#bvXnJ%3f2c4IayxzVo``%`SZKC#~9s@+1qzcx~e!I zJDI6NTrZRtJv=Yeo|=B##MrYrN$%eMRTd?+t?3s21-&CmpCw04&AYIAW66}OM^%eg ztmTw-woH7uv*X(pt=BiA_R)s9R+Ybf*oe;pv{s#d|FrG!)I+XkDn7orQL^TK>zT@* z-*nbR^bMO{UG?dG_m#Y*m#WWv`MKv|%c1FKtG|8eegESArL$-I`Us|8C!em2GsG<2 zoKAn~aowH2z#OPJ_g66AV{jjYYH!sMhv{Xq9)ypJ?amAvd8F|{r15D-tw@t}$A{4d zH{G?SSmZW76b}ESr)5o*_M0KJRCwm?=)mL&sd@%YkK)~TDh`jfSn({|fuhK_m2=o^ zTo-F9%JH@xZd}NhFyc^%cq|LW{kDAnLb%eOYoTT4tJ+6gJEMIwHJ zqel?ID%G^BV`wRIYv|+6Qu51Mm^_N4!wqf?Q(2E7BrFOF-I#O(zL+(v@%HdDr`Ab& z=S%N<-s8~hU{Dmh=$wy9&Y(53-=5pHHLd+Tci%`;2c5*Po&yg5OeQuHqkr{wo_t#d zMZh*GF3g7C;OfWwcOPG{1j~_Gp)ybe=b#R@k=7z6!Y9%mQVUEf#tuV|unWB5CFBPG zaga0^cWJS9LN+{JSMPlz4 zxATAb985ShDmpqaHX=SDBqlL7aDQrKqA=M%Ei)J&g*hBgWgf_;iZXJ-hwB~BK0zr; z%`c#6OPi_4`wx+pkX2M-4I}E$H8uwuMCWDYQ${LCacG94C^VMZ990b|D!mgg=jp+6 za)UaEN{Wg^fTq!XDt9ndc^rMSiulqno*-1Q@$h)<8WElNiNfXb>#8X95p%1O{4!3e z$uesExUpV>2-RsDCu9{KI7(=}mb7fk%;LvWjoEFXn|MiPSxNkEl<-;o%2c?!VdrQd(sto<+jKlJMZJVBIS z-;oIGzatUx=Q|Pwf4(D;`lmY*@zG2r@{UA!G)Dq=B%0$@3EAL|YmpS=AGahpKW<6r zvh@R0^af2Bns6pS`Le%bhz2n{_~%bYl}AfVr@po^)J@oLD`SJ$#95X_dLgD(z5PsGjfr-a` zR+r9yN%21_xBauC8&8kVRGPPVcJ77Ph*X-~M|w|5Ec?U`P|Vp^NX_))E-^3Dd=u~wzGnA}PJRm&sX3k;Vmw0d}1 z>88@k_EU}l1wo$^S1-$0Soc{v_2kR>Co(>=2fWS?`CS-6(L&3@;~hZ*8#C;|@KnT; z5TO7a57iD&bv%CY0v>Sy&wOl+@TdexNF|6TNEu`X0U-z%c%(xMEV$6n5JLtYJ;q}k z&u0ul|5-frAH3BjkKDj5?A#Cv{^wkk0KMe7AmlY9HRLs9G#HGS)(~Z7kWl`8TjF2xrMdt7E&RVfjAUjgJqYi`b_17$m9D;J&ev} zj;!Dm)<`PhVsFdbt^TgIXtwU4(T*CmH{+V6Z7r5i#YK-f;VJ1B-BAl73f1+}J{Wt+FuCIGZ4CA@muUH=H^dK{3-g91f{}wh)en3dtU-k@*l5}-X4*BcVf48Hh;pjbE$rw#4O7){zd=iq?W)YP z^idi!=e2q-p=gw^74;wsxd561zAxJcu zJcKP-tV0Y@ni;(yxk>jhp|C_Wb2Gh3Q(_Qfs9#3O)f4`zv_L)nLmTEWJ#S@G(?EKV znoV4ii(6fozr?VVTMr~py4`k(o;bmPALq|vvbbSM=bz<{PDp<1RiQ zPHga6+&tUzTz0S0!=?mHBaP5cbC%CbwAyve_w>90?;p27l)rhc0RsmNUNF-8vYe{{NX?I*P=xJqt_bP(tp0zAk%-XK}K12=pYrA+8OfCuO|c-W&V!2n=` zvO;DQv>*5ZMesx?0|)jgs7ly)B8y!9SFn}1R9Wu$c40o)P)yM;PW@v9q>ks zyh-&pE;^9ss7Y@Sw)!t;k|(SGeY4@8zUz_r^y_biMH9cdNxuItH_0RWZ;~JW-A(d9 z@+SG2Uv82YUrL*&ry(&|%fFUt7TTHq;7ZliRBa_WgCWxF6YY=R9eSERk}BDA`u*2~ zSLsPC4t2Yeh|5u)WFX>-`IFqgX-&$V>%niJ2I?KaQcsU;-QyPdol!J5PTt(xQO~xJnDIOB@;sTDu$2eQxwwdYiS{#IbAfyazY?! z)+iyCquwAqmn)U|WKaw!ewtHMlFA;eHZ1EM9I17&SE#@<;M1(-pE!0!n|$sTa!h#+ zIuQ;UpW>(5J3L!F*W4OMpk}Q|o<+W7{?nDr&4d+Y;FV0AjU>S$2OD5PE{r#L0#YCh zT4BWkr=S%Sz^KDAPz71=8X49=Hz)vW5OMlf7v$K39+EcFKF|Qs022^|R$vSEK>@&o z^Mp_afd<$C4tNJmNDXmp@&^sSe69*Kz%n#4ct?T=R$wBm9LOR70x@K^fR8W~d;q&2 zVP)|$2tpoEgq3gvs6jyNs7Z;S38^7W0f_jLDr^ESB%P>uWEz8^{Z^t3{e?-Q?^JZB^Wme$ z!J$th7KS`{{QAw~S3U1PTz~hm_fw2T*t6j8v9F)0B}FbRH8~b3zo^mId3;ENqG_6A z`+hObiY}?h!S_xb)F+3lTj=RD#Sfj9xyY$KnV)FvS)BIChl7`oxSgLEelNwihb4|oYr#f z>a8+AjcI41rjGBpQ?cFX?!}gQm+w{c)xOENsI+(1hDr}-OWw_0UeNZ zF#jL}f9{w%97h2Pm?exQXu!aO55yL<93X<{f6JvSm}*c01<141fLh0TT>Dpa2=91sHpn1syPEWK2M&AZHlk3Mp`M8ubWC1Y{r?VT_S$ z$kWomg*-@2Ug$*i0aajvj58pBJoJYcLY|_AO@IvOK)r!y05SRG5o*YYb18s~Y#|62 z{X-67$aB>=TLP8HIs#T;A~ZyfgHzxMX$3GrUgVnJpBY3y1CEdvoRN5u7dmlf5FU|7 z1<8y9dT`Pj@dr%^F$bp$$s3&D4}`%fGIo*Ys?pnEBFx3nAb5&gN!qt&{buyAf!8_* z-swaf1N7h+(Zf1?XY&P7 zT2$`|O*cKCrBL+ECr%WOwb4DIY-iKcuzYp+exsGjg~>nHE||A*Cv)_W>@`8>ji`w? zv_l#nXYCp6vZPQd$2oX5KX7lM#p{{_CK7!UUH6F6skM{WNKd@wy(8ewi1h0glXtEU z=I>S*A?JS8}xE%xY|v*sPtt#VwzIDk#2C z`^hyU*UMulBc1?5@z#Ub8Y zZibV}WRVG{dPuM3+m^voxnl@Rb)nPfjohAGn+Ym+(_7nJcde^d zUXDair&Ttwbo%l17UP9|i(g%mAH0~TenlZpc6h(PpmWtkPIQjFd!i^+o+I5MK1&3) ziLF(3i^HZYrHcZ2F>*SmdD&8%Kig=C<_T$j(wha6F6TUV_TmO3tuSa5 zHAqyMUbV9Nv~|Xe49B5-p5o{3K@w+!lygoPw>_84mK8rwSQvf!4Rg!))7JUJHZ!Rw zxe0;}vE1f~&r_x8Q|?J-FLmpsF8<#3;pXl1^;PH31iEPwBlTGKJWh^(;W>Q=tNp(9 zy(ygU6!E^R@rRU|Zu}8F_UwuoJSsDe7{;onYMV8xeHHN?dNL%HGH5cbZhRV@&!9f* z7b)f>GXStjqu=AKTZ8nR&FOk8tln)=_;%RMjn9abC z0hwlH$ZRk#(l>RQXsL)JB5@AH@fm?SW}3v292?~dPB1N&Yi;Nk7U;&AyP_kNSKv3? zzSAg_DLBk?E*BbK>j|Ft)l=sxt3E*8SU{iOshX_V=-w{B$HuI27$eh>FfNXie#B+= zZlvDbtsv*t=w;K^<8Nxmrz?8ab66CD$5S8}Vli()vaKgOFzL9|W1e9Ki=b=Ha7n4- z<#L$J8Qx2D|!-Xd)i1SBrkvO|+3J;18i+4jO0d&Ay!AxOb*rz|!2!+|f#n z(-{i0LxL2E{i1sA0nt$1<>HOT97n}+A~xlF>tQ14x%Khp3GLEUwuXD7E93I4EnZu4 z2))%dZ3{XQW$liboqT5FXUS1l|45yfD&pm{h;izk+?Bi>>zAuJr_OCYBB?rxXx8s| zoPBk??-?I!Q)kYYM~XyBx8BmzmNyQwy|aQD#G>gb&a&zvnnx!=-5k%SX5pvI+<6-G zxZojuLXk30#b1s7PJ*`Egt@nuX5D;MXm0R8$|c8EW+#_(C3Eh{>J95w&uigW(Z!P6 zgcM~~Tqws(D_+5eA~!)m@TmlyT}YQp5wa#3Wc~6BH%^sJ?~iOd^C~-k?S{OCaY`YI z3M%zBkr9g?nl}5a_X?4 z+E&6?z|_*D8f(m$F6%3<9AffvZoXV$s3bwqS=K^@%$1YAsJ1Pb8CFg_p8mDdJIkU* zsrTfDc&P@8UZI$=u5)9k8-6C}(vE5C3f`xG`KmLa?{r(pJ^592p}5&;X&?DrD;qaE zr95{MBHZkhvU@)FQpJ^`f{z7q2VX3at8A??#LdpMmn)`Mdbbt)R5mR5)w-B3OFIpJ zuDBlbdg~>tMLh*SSDy%avsbQaK4H{b8xqtLJbl7E&WYZ0OM~7<$9$c|HTu*%D(KyT zOS@+npZL^D8$RH@s3hS}7*R|HT>nAQM-E1CM{Y)TM$rxw85PZpaibg@Ed8BRflPSp4N-x(GiRir-7Z&j~z#^{%qI4i`*Ob*XqfZ)iJr>o0OpDidlRb6}jY+d7t;&LQ-v@f(NeBuU8gFHizx`LFC3W2zfhJf0D ztdDwt@4cWB{I5v-e=E30s4!ME|NXx$@<+k_xA!uaDX=3p**cYY|L&74o5w%6+j8mz zKKn+K(r`g=uL~V?Rz_UDVOfK4G&{*9x!C%AlJ=Sd?x)``zYsG%V%?3??^d=^9P;M6 z-`Z&15oycj@iuO)qez%OSTW7&b+DYhRd-gV>##<1x4<$CIuuXqWr3v3heE#m_f>7RJUy02FmHhmm$#AbDr=!D&nu&g-hP2T+V)IIIV6!tMK zYwNL{6n;Yd3`zd}{hpFyVy<1G4TaWS#7V{n(~!z5K0Qug?BG#o%Eyb`;-~1I&f>A^ zdur5eWV1#b+N)o&@(^vfaRXagFJmyVpaZ`(dc0Jjo)@H%qBml`nW>Pz(yWxfhrXE0 z*CLGjwD^hiJ?{j=Xsu(P&iqf|3}@M z$3y+MegB_XjF~YQOR_g(-;Fg&HHPd7AxRn{lS)Vnm1f2^_90m!4JkshL`WJ-Qd%r2 zm5NsFv}n(Lbh>`u>wBHob^adb{rLUyyKjH{Yd){z`F@&HvOrn&;Z@x#n%A;Kqp|=uJ@2a2VC~gghxf`l2>z0y66sg)6%SwpT#>^=rcfT0D?{ zAFEl`wLqdwWp*s|Jwg}#KzPcLMq5k7+Lr29q#$g(xswW}$oAv2B20a(tsiNpttP2? z=#p&<9hHED%3?)TNRQI35L+aOuO4JzF0fsJ@Oh1r(=@WA$9{1(3O$7g(^wmi{hBo( z_FCB{n}uA)AbzMsc|$91KK+TL_wNf^#?ylsAH@PL3cp~;E0EY$A*NcuB^p%h8yk6; zh6vd=_R}dSWmumeZHrd)phS={5=06bWo}EMI>{pRhIX9qa}I`@h)bT}%Nk5j(#XO^ zSR{cv&c!{t`>5!CTXb=o$x|Yl zoP-}2BrnBJ_^tU=yx@IvyNapC!7x4b*oiMK#w+P~QdJP6RQ}S_YwS(?b#5|n7qY&o)Q0;a6@)w@EndcXwL$iAO~rSZ69lbFqF$A6L3xQkRZcvyl^Bw$E> zF~5uLGIoTn<>9F7nztK;;HFge*+w}S zHo;&dSX6RSR(jdXIF`M(9xcSkzC!xM6yo;ElgRd_NLvY&>h^GUt5pcDObRiN2f0Lf zu8+ylQ>bv_nxf&eN5gfJRO$32=V@^yN2g2jY&}uD*1gi^vu=$R+G33Y_UJ2FyeI>4 zI8hWs2~6yt&`hkXz>ZMC7URUsHkCaa z+G?xs&&fm7aIjW{qBVi;+-^$}(cvf$nv-u;=Qm?h8N;fLTzrYyQOpop!X|ay?*$rY zMT+kh_v5vr(^yjVPoAg?&7a?^BXaMv+j`F@4~pLi5E`qCzz9m=Z=>RFEO5q3{KkHeaj-*9a~Uj3XF9uvzeE`(IuVoEBI&aD?;j z4SeCeft&Ahfqeu+20jc-+q|U%Lk9i~JlX%~?f$PYYX2`y8F>06QJO1N@~0_-=$?Rw z;43O?vQO7F9I7ugI=-j8C8fRbLT746R#$QB#lEDTgey4`mvbeP&L(dbB#oXLOu3uh zGTeBpXyW4itfwc_9w*+p`r=07gOrB_&l5h?yhNtYq-{^Ne3$fHMOxnZVZ&yGKqbki z3d#;1A(`ISkbJC}l1R()Z+)M0iJ>fWHCLyx!rA@Bg8geXOl}b;bTr8&)Db0 zwslu2*Eg;(S@+Y=EUbLj%0otqaa$@I(h_)j&9dI)k*qZj44<5}*jiql=iQDG8_Y0n zJkrj{CGrcFx$l^BY&d<&m+yB*a^}^4bBg+be_a%JYioQqP-wRG;kCA=eneoGGV9iU z_N7Ppnqz_2+jkwmRlZ@M^sVA7>t5^5ADOOKELjhP32SCm=vKjJ9f}p_eD;uMo(;;# z>04az*u_vVSZFmv{gf=DT7HJ{+v$b_8w2NWgB|$4}|<$;OECuHfMKj zck(Ur)pR8`j+%a#%GKOhmWj}D-u_!oMy+xm4q=Iy`#mp;>^tQQuglZexP~jRx8s5{ z(zQSKgYJ|d&Bk%6j7JP+m1lftn<_)w>z%5|^sRnTQRrX&vZ&C#{bi-oZWrCEig2B9 zc+*ht;VE?0tLmuQPQ99lh8y8E+nOI%zuwaJ?$y??3%~UYHg`#EeG_s?wWfB{6{FYN zg0C;vHw+qb-}-jrXkg9hz`GHzPkTLx*Ee#V%-R~kcvf0dXY%)_tq2GoA)tf*!S~3T zov;`c?mWVh)R=}nyPIS4UlqWThLTT54^QR8&IV--Ew|`38?!gTo4v45A!|GvRzbjn zYsE9gp~c}oY=6JxK)=KdaD&)-4c%hZGFYnsud`A0^jso5;4vq7CNuj1Kl@?MB3&I# zQzLjicx%OuwA&fM`J4B5#(T&6Z?B9>xR&I#-_K)@FFYN*{Zy2~BK7dH2$o=5@*pqo z*z4R1w9RSs4UT3`OTFUOuHNm#pUf$EU8uXnl-MFqNNY$Dez-#kxOPzC1mSLg6+xxACH*Z`&zo+|> zKIez(@2JIp-@|d(;e_>pQ`1whhhtI1__??Iri(k~?!+Ik8U675uRR=(`u=kdNA`O5 z+}zxZHghK;XEnjOvH(xvk|ZjbY;lLNM+xW-jg^X$1_HLU@&Yp5OI1}?Z4F9(P)Zs@ z6Atqv8d^sXIp(v+bThS>pk$?Pth&Q*&&f+<(Q5+xBuwa#Emr&+zJiZ2nQ=g?*Lw1? zfgYY*DU7ayMvCO9RbD}$T(3}J#o@idY5MVFCyr1uojq~x{HM=dn2o2%hkb(;hD$`d zuBa1M+-m5-$so2B^hh52DT7UP(IKOs)eA*6>rtEqm@BlEvLY5sSY_lS1@EII9}c}p zD>|_}E#}@8ew9Me95JuZ~7gh5dm=$%#`gVGp-Au>i= z2R6mVgnZxL`h@t@u=Vjn|3Si7;CeLTXg*U<*EH|a#hcVd2^F*>2}t8r(}BVEx1IVP zhzL`Fh@$qAJ~X~+gaxTcEs-s{qokgE@i*Frj9-8R^#azjcO*tc1y9A~I64X0 zB7LT1LLA~Wgpoz>`W-vPY8IFwE_pP%EQuyO@kWr|33uS{9Y^>(+!CmJs&trtVBfjGBISG`^fq)OI~{3j2n~bug;^0l4%wDU${Q% zMGs;`8RRtx``C}LjRGN+2t3)R21l9>aFeR9`Y(N|leou_qCUDzc&jJ2_inKy)Fm0E;#4 zXQ&PbinIwaF*LF?iH;FDRY8?%h8l|a1C`>O$^d!YZQm>l`EF|%oa_zLaJ<6-IT?XwFs{36tOF}J9W#o ztCIs>HAaqlVnst!ia`~Y zo%r2Gm&6LNHdDl17-xD9j)vuQ#86BPd2*@|erSs}7XQm&h0O41;N`_nPFVYV(_ z1LbDL6CJKctO5`*1wxOwgOFoJqKKlmyjn9_;me`>6!vO3Dd`AYW$5h9D7M{591%Hc znQ?~D^~!wBv!R-Id1tu4o+Eqf*$0g5YeOvb{ly0Q&Mp}}{r>D5e-SmGYX9al>n!?x z&wuyf^7AORcqN8goK?5lJ5r%5+HOI#|BX3!ABxX`H+}8`{AmeuPs<4CL81GZP&7i~kVMPg(d(9yHD&48xK|oc1hqg8 ze=QZiw~OvAIEfvXL&TvUE^dk=^-@tUDtOBNWZcEia>&flGe@Ki$ltp^Q_P*vh@aqI z_x2!)#{`?+DJJ#9eP;{rNxiL2tsf?U>Q7RL!$Wl(W99 z9vWd=a{rFf$I(mZDunp^30uv(YA&AC%EtToVC0nTuVc0}b$L@nCFSi0FkMabPy4lZ zpaq!lTtr_)nyZhuM-w*mlZ@P?Rz28_5zS|pN&T8ywaGdwSPs8HjxIv1Sd8>>Imb~R zVLbZxp3@7QYQ#T;UovGA?Y`38PDZ|zJE(vhQN>q^8NRVMRzx!6V=5MyzT`|$ZXx(+ zM*o{&j)1~OD|F>bec0x|Xz5)-!&y3Q*Ic#WbbrzE$6};Zp^;s zIPXt%VdiEP4FP)TL^q~0vTBpUfP`2-hcqbQI-!M+kcF-N%s~!~Kk?WcgPdRV`#oE7 zKUKm?h_jhMM5<1q@Nu!74;$v z3IC@Wi@yyy27XxW7=&z)_f~)L8goHa0v+PPm6EMrnW$efDG?TZEiCZkp&$ z0A@{g3x8mJuh?{bE8*Y`rYBmiK|P)4M$zX9(e{z(6^}ARiGD(5CiBoSGkcOc zABhrRsLU7_kN6h_@y`<3QzU1&)@A|u3MsW^;a@wPm4SR`Ujkr{S8aQiZOX7Rz# zDf{z8kVSq6GR?T3!VX$u5RnOt>P|AE!^W~=Mw6G4s@PA%;>E`d-n@v%c5yZL9{hIh zpe2eU?Zly5#-dTE`=cAItFViOsAWu)$_cWI6^A|+|Gt21VFlIHJ)%FMr9o>MiQMO;>Sq{`UQP|79o{5@Nlg+FPw$z(H zDpg$SQ9H^0yLgmMLX@KbyP+Og`HYfSsHzu<`HC-s5(QTE{>zC2DH>1BW<7#WhwXuvFUo!^fGl#7* zZ~0~3-kUjAn0c=?b9^lG;n&Ow`K-rQSx^14o_}44*L;RanI~GyzHMm^7q25U-EpBnQSbDk0T)1SU$RlPrRE=y37Cil~1uG+Uujdi&X_U7ueW$Lx%-W|&|ip``c92%AX+ZA{MQjQ>K z4@bV-5G}>8sw^w=*7h+gddN9Bowk&r~vx$UKpT?|jYK4RgDua-*?rs0`Zu^FyFvty|o(S0}^ev%O2Pqij zq>v9n;Zo1YT-VwZvP;Mlp+3mW4TbFQ-_OhbWxXjyBGVcMx?#suS$R1fDLS5FUX@UN z^mI*qLu1p~=6?(UpYOPEp|TT(fd8MTy{}y_5F*7X!#A$qI)7&L-u?0MJBg1TT$+6R z?D>nSyr2vSv>DkhcsoyexCL^zuoa&hx`$tIKA1dq1dQx%(RC9ZY za?Ruh!MgGOsB!ZQu3o(KH+ShCue+?WH~s&ZC?p(CbDrNz_-ef9kjBkp^#76%{m%6oAa z8nrhqWy$Z?&NP#OWSZ#m{ilqUUC*SONx#*NmJP_!&cW5k?NSq#d2I}qIhUJ#uN^-j zry<|cEqeY5O0x9EXS)8n9GSIQyS^GdAg&aw#4fx0Y4fPcW^K!Fv1QswgjxFpdzL!= z*sv_+(m4Nxb7f|Z)(%y#eJel7JkXB$17hcu9wxs`yFr(l7q8Fjh^6+idZ_w=j0@zi*5^^(;SN_seGm%w*l?g(3M{o)@wF z6@*8&H5T!Z$UcRzBQaNppC8?ERX6PD{_^Os;@DS&uw#kb50%9{{F1P;jKEEObM1fB0!eZbhF##7Lp2*fwZes`f6O>S)9X*u?R2CRb$S)e>DHswwsLk>4M#PFJNc z+)gW3$*c*8>Q&gfU+1#QTK}l-J|pGm1cQ(U zC_p0usway7SVRbge0E|QbSmIV2LJ`a73wB{45)v@jS48+FH+Zm_5w5tVD19?576s? z76+7Ipu7#O2Iwk4#{fDNFx@eKQ50@$K=%Vm>@X+-BO)*n0V60dngRtK=oQRQl0a1+ ziu5oG4sYu~cLG`mP`-g_5NJxklQhshfTjVwBnGep)UHk3aCEkGXTzSN_eH?I%==lp zTVlQT`7v`t4n4~YJ+ft0j5oAF0JvL^?*PaG0imD#81(zejT0L26Aeq&YRRS(&?S$tp4NXxf%AqO=Afss9Gh= zlOY;A6$bp)yF828B_q7CeZ|(#`xkio3~e^j^m1)~P1HX5S`eY>YHVx%_s9zD>~{iDrubU1l9jd+x2p?2#HZ1>@{=P}||NA1tsFAHsSUYGBqDgscTv9cH$ve@9s^RE3}-Q z=lCeHT7pCp?4VY6BnqA$&Y`vOL@*w)8u?61sK?8GWh0V{#s)(q)a9)45(Zp>)8U}o zMNWt~WtxuC`^lsqLS$jMHG;^s#bWUOLbaHCFLkJ>Ji2X)O60UQRa92b3BAE`cD?t!SxQYhrb&Ni6%lDe=1|suV--|%p_d7DU|<#WFQJV(KcNOKG;kom4*(TV3VMxz zD8Ld>2hakIPw1*bPZ1if^H=Qw2>>BzuR=o+NCwOUL;<$|c)%xUQUYn9JqhT7Mk4?T z8j8R+z!d-qPzMA8Tmi!XQGhz==>m{|WPmilB)AvobVA1zywiNY5W0!bRfTRMG+AM+ zY#v=eBj6T5E2M}8o(;GKUJ;-LrFf{81E^AOr7?3t!16h7U+sO+f5ip|f8Iv$jQ}t$ zb7M>Q{d?;X3-JU&+SuymwoVlwmD)S)M@-@Sb| zlQUiX>O)d+$?O+i0P^YLha73v)kXApyods}**Hj(MkZLu`dlib9?Ti^Q}*?g>D#zS zd{>2qC*R1OO3lphi9W8wO{z0jdooPD=Bd5tf%om`ksC+;9dq?RJj6BkpD%I!+s(Yc zSDSy}{H`C_rH!iJblH8?`S92G&x8)tU0?d@?d`T*J?~a^yxei8B=M%v4dpEeNvwR1 z-s${p`uSLD-DaUch`c&dE7tG6oV6AGXszhNz|ISL;#_> zr1y|AcrPAuPSPpIbUwAsLV1-%=aS{{nE$=O>MCW z^}--E99Ku(QvKfAE+l~@NT5)rwedt_HR&fA_Q76=t_7NcYRlq&txuqc^wONfY*kG| za{Rm+yLFsrndKBwHws>4J&|j7I60u`*^#UYw#HV1GTk0GEABxjDC$gbMY$Dxp{OD~ z5_2S}>dNynUPh8Td6Oexoj}~_#cVjZ;iEkQUu_IfEC~ikOk%%02#mzhMfNsDqNKL`r0e1jx^R^1oRG=7u z60*?w`?Zi{g7t#b6s#RMF}J8c`6nc$Fs(4ZycmW)z?Fezf`#+o3BhXtOx~ zm2LU|>tgJ`__6-Eb;l24r;w?ZB|3ugmFY5OaQV$Ms5e_hDo|OWvEs@h>&T}o z^J$xwcz>gvbj>i``AXKQN$Xnif<45{yJqZF0{mgph9wPCL&a{#cgIwddy`}(9@9`L|iG2 zv!{nHPDAW8#}ezGaU`Wk_7gIkmDkaW$*7?YOM&xPwS=#-Oia_~T21d+g(4B=$_U!EF z$syL-G%*P1AWAPg3}Otc{qVA zahvHZ>#H-GL=CN?u2J4??>m1b{~zmwQUEc3_P+mTH3$#`aDiZk;DNvf)&OWA&LN}$ zJ-`%*UWh;-4j=~50HFd~jK*@PH0-NT62sHc)PXMOBPzXo@8UmF7h(IM^;=e-DJS724 z0Lpnb%_9kj2|Su75nu>F1Bd~p051R&|3cwgz_9##d&d!5iE5d2v`ERHjh_gKM8>9T z>()0kp?IQg$B&-iiYTmDEPpn+o2Qj^CPhk4mZB&{M;g#5i|u+inz*?z(pp-k6vI2RDmQWTx9)w#%%S6bG9=2n) zq`I0kk3~nP%byqNpHy2zW2fKp+^5ClE%y+NAu zk_8olB0;qvV$db%Z{F^Lr2Z~GnDYZofIvZoAVD~tK!0#FflNVy@ZsT0!x0BpC}0K- z=Hy^P4(>F-kRQw%!bl%T6J!dyoR2GzCIr>IIw7J+P=MQj*qWLp?K7>HEAappxA&@|h^N|K}he!iugRDW* z^Urm|0SoH?>x_j1c3#Aw;D1u;-yC&nT6zZWpPsEx{?BLYkL6S*9xtdlQ=fh+xBhft zLu(t-l-7r+2M@_Uc$B>Ww~Q!vp~TWE z!Bp)2#Rn6QGEszBJ&eXe{Y#bBHt)AxQgSlJp`8>hKj|mYMbp@)@h)z%2%}6@Olm>B zw{TE`q+8fk?3C-lUZjt!@-CX;W6(4eaxQFF;@FP6ydq7Y9je_|298g6g;(5IEBjp2 zM^>1~CrP^-Fo&XZ@i=i+)&V5vmS=9Zi!!BK(34-C$;db|I68VKb(k9dD|gyAczmt( zYl)8YdS@O+>|g!u*AIjGQ(cJ(3Pz&_^F{Xm*mUv$xe1TY{}-%+YJsdEUyvhwdr%|@ z6x0BE1vLX%L8%~U&@L!-o~fW7&;*DEWC2>4C+oaqVdW8sdww1Wv^yUF^ZbJ_0C9t` zAQ(U~kuh-~slRI)oySjK zzu`W3dv17||Ni6bwa;I^U;6gr_k~}-33&@51-3pSl6nS*Bg=Z+yRl9sRx@Rn*2tO# zj^p*zS7uSHV{7FbD=KoNS5@y%^b%ezNcZn9iFJaZBks1x6{mJ;Un^a{7A+ngtuw@T z$c}ca{-ic?Qt}vMgU+s3UDdv#!Pmd<(7$uwKS~h>CVO629*ISq~*nIIZ9_zirqChu6J|KQDE?tlQd@>Ib|8 z>3~K#n;p(1`vNM!j*lG=1>%Byfv+&X29x0c=Dg@taR(AUH1C)_w*%AwN>Zh2!-5?U z3M?jrX=j*K{-f{Oa1T2R$Pl3a11BbQen1us2e$*8>_G(Ee3$3HE`VN8!7g`@^^SFP zpcg0-N~NG_n6-`xV1SZf{=D>SDd?>C@-@gPARZv7Y7%`wSa36NnXQA;B8}9o&Ty>5 z7D9%#G0fsYvuIO(7;tgpswEJ9kY+$Uz!W#sWT6oR6VyYco3u2wV9y}*f?x#ic>Eft z<)+Z@@^e}YB@GC+n!2-~*V0%I7}$o&ECBmSHM|U(52X%>(#0nFW=48ix+WB=I*gjX zZ`uwy4;(cxEe~cOF3295SJ0#yIkpK9@Vb6mCqE$KR5Uc8X3j>iyq7_X2^w6G6lF!Y z%+F&24xm^fuS|tmMHrTZa`5CS76dbz#AN&+}R9Ayb0bhH>=x1Rh0K7ltt_*=u0Bb4|RzZ$bd%Y%tvk$&azVE|g?o z))GcOVXA+$EEG!5Fq^5j#0=`rR|+@YC<%rm4lWDSC$EL+^q8hS(d%tt_9X424DnSUj$%5dkroEz+~v2K!&N)64*WhW1&fqaM8`+AUc=6F2rN$ zUZ&l^5hm2Hp)m+Uns8)6+YRPDq4NgAo-p7EgP%`p!ViY5gqsC0-Kl1z4}+h~L!mIZ z9^cD#*s^M&GL=7(3zL%noIL#LbCK0uN}T@t`&)mKhrhkQb+zQLKG&6|%73rV^*@wi z{&y-dhh|u^6Kt&)-N)>3c>eCQTZS!HAAeV+*z}s)5Vy*X9K7gEx_sT>wGHr2ZNo`I zwdz~`V%tYbsbU*{HCx;mp_G}C0{P$RuWxT0Se8VWDKVx-+Rqg!K0zX%p;OGV{Q@<< z!?P@%U#u1d&3^h==6XlrXza|21uXmRaQ6+ zap)$us9nmw@(o=G67v<-T@cSQ6R;}X6X|j~A!7C{jtjIeeDuE$QUfe(Hzu?uc;1+m5a5vC9)5Dp6Em22C! zp1Fu~tv*#Hop`DCB%^+?z7u_33n6*XafmZ7D2>kah(sf1gORv%54rkv^ir;#-YEz3 zK@4`Q2cJzJ4J>}!l4*J_yyi?FQCQpj@QD7|OT>Y#XZuQ1YcW?1_tBdoT6Ck1=0>-N zZ9Sw{U=ps>qi{+vyi57irEl-f=|m}+h4cGIOtc$I)V0%C2fn;?j6Sg?b`p!mm!RDY zB`;9eRFReZYFN4u$(NNTY4l**iNby(v<4>$Std`h81>z>ia#XM%nY>iU%lb;=rV+k zA!1I^6X~m!b24qCZXV?i+GCKFi!eoVv@`d%i9MZVI2#*sidQ>s-+gD@jsq=sdN~J< zj(z21G?whHTRd@G-f_I@@`9VEqDqwyNwnMXZ*OZaEj}~eUNLas-3vzbP32>+XirFM z4cY^|2t|JIuqzToy> zw|R!MzDfCXcgLe&UyuyJNu&sm?boxxCosOuJ~^{u4xyCJ@GET)bAbyY=y~+C^5l2j zia1=3YIt42viBDx_iv6~^lh_t+b6;MXp{3LFG3s{_f}rpNn4snT&;Cp_Mvmkx%9~w z_Et;nPF+iGs0k3)pRK&}Y+%_S6MNPEy!=BhN zk%%{2JL@*$WQI(B4750JJ?AXp?^S$yyyCjU-T^(!X6zI&Lzn}wlJJ(sM94! z5fC*6oIp_?O3umyE$^{2&24%Wa7gnIF|MG=}WO$vSNkB zBEGgn4%??TWPy|GM#YgL%hjawLatQS^tsxI<{C~D%YDy1Sk3@5JSyRyGrDXf&jiVF z)BBl!@75>!0umy4^~TF#X#4?fw_v}5xE-%DGv2MK*nCoN#gTR7$GKkB1{+u#3SDjm zZaa<<+2V93IDOOHPYH<|yvq#Iq`FHL18piI#692Bml#7q+fcfwhzZ${r`G1vu7|sH z=jP;%GyBn77z76z%GS@PVXPTVP^BaXzgi>k2Z>NJZ{mGEY&b#_yl*lM(a%kl41#r~G_%aT{zynlbh$ms|Z%Qkc? zSH%SNYEafEcnp@K#H|uf?8rNAWSBVak7gfi9!$cJn3G6hZqH?vvS_i2TWmhpRPIBB zhIj?;z??^yl#2(Z^5OZ1-+blH&0IJUDT96d97oTN&x=6b6x&vKT{?1>$(7P!tTbMt zc-7}dbb;9wXAl4Wo0TGqjZ&4Un%U=aH%ojxJ#zofp~7RbSX1^z=YT=ijj;ow+?^b^ zqu!yxs;w%evnRur8tVvz3j&!*vcJ-OTe=U^XP@c$<-A@$8Gep_`}E$V3VrY6(oPS* zJlvzSs`P!lwpLSw9$9*@yv^f~mB?+rxTU$E_Ew`@%h?lpz6&01#KO{*ZJu4qn}=*>eVM3 zBSXXDxx3>pJMMcWiX>j%cmE5m#4+B{?BIxY)Km(4Ps&0M;c|qAvg|f@mx)WVTO8dZ zwO5_2U`1ADaTN=>R?oJnFwr_Jk&rtgi*(3aM=WKrYuT#{lh^aeJF46w3zN$BB(Km( zS~$mAC>j}hovEH?Z;J?=uu&_%HLX}crC&behLBS+CaGv@8rn9^kVPJt#@ILMKet4> znN*2hy76N=fs=|YOrJ4ZA(5DVVJ*gnxmav66)VeYXQd(RGy*51$}e?nXKFxR>hGRZ zOcW1I6?w`hukqd%rcD+#CljA0-*}$U<7acskA97%{<5FEe=21&YxkwT%uCPH(LtGG zc`I*!%=n#}d)5HF8|q79j5>(UZ6$jSCOI@V;7A~NkRU#jR3`5XVuSjs`x?obc5bK4^>aNW#`a@^cNTOEGSO)_lxRKDw*`-BnO+nm0a; zj89|EX+=p*n2%tQnNQ@8y$Kud7K+RiI_%vxP7^h(C+{h87wpaFJ}*F!LIUat`&<6d z*}^>M0_9U|yLEZ@_L`UKlHWXaf4_%}_>fN$kSJ%jDcNhVaiA~rz8VU zrJr&ppNq|NJXCyMp?Hh+LjEAK4Z-v2C`+^-W2Lu)2(s_en&oq$zCkCJZLuI{+#zoj zS<@wgjK&_lyG8wd>d|{w$k`S?J{IIXbW8&)UdaP*94R8}ad7t~pTMLwOEgPYXdY_! z6YTZLCfr+l;e`Rj;&?sz^v7CQ0uEGFXMt zBIn#YdE)sNb9R(yROQ750mCmVL&8t)Q9pSwyqZ;gvj5V__ac=aEXdqf8;rxrva@Q> z)Q^5^-uNrDnrKpU{d2&Ut7JjkMuc9?POF7cJ?A)Of(P1N4YSbtlqLZwav=-#0(z4+ z)P%=x{B~lZU4+I;{@J>DIj(N%mAtVKr^U}@t=sI79OBX!^3wlIY8O^~I`*Jn-Db;B zpWUIeiuLHF_1N|GxPA5b;(FrwdeZ%Ri68Z3r3UGx4YKPSQ$ z=Cw8c>y(;T7q`?#t-#kb}7Cy(+IXASMm&e*#uEC|s{_KaHJ67kw2d}-^u zt`;w)R;`mBGAq{!WJ55~!H0L5+Pf~{pZ7@K=Xw&$$k^&H@=Pc3N1I3Sxw2=iswZ0y zX?iGIp5vTvQqpR*6Kf&uI!B&qtx0G zOv}=Wb7q^`kJLCD-fnAOdO_L5BzS9!^^fM8`W-o2&&J-rpf-2Axkj_i=e6BEr49~ zgQkwx6>T*&Vs6aA660VmbyCAl`(aBBVe-~`!ii{&j9QJ=Uo?JJMX3nSXN6GLf=5?Uu&@=ce|z-YITVzuxqy zL;K9=$WxN^k{+|=81sRF;LGsG|c zqzzWwTJIF3K6$%Ntku{$3~DsBP}TdbRmR6r)|%u)W|naS9Tq>WcUd7D>IoHPN%3#B z{hgF=W+)oVCj?&`k(4^0KX6WUB_sCqtpl#-top|6R8%^iEESrm7O2pl`(>=UPQ#Wh zM+-Qg`kf9YEfasf9IoSxV}f?CT6%JsNZ+92*(Fcst; zQ0Lxw*Bw3Mj;0nZsj=Kyq#6?O+(30Q<;3$lQN@Q=Jv%(Nv!KHE1us?6w7w9-FFZao z^;~>J*{m=r7VRj}K^|>(HEP{=^pSY8wWs@|!VS-qOuRIAdFeKL(GHcpEjrPkuQI7y zrgrZrQQl(9yT=KE%NyM`!sob;#oApbeBSL6lvte5Y8R}( z8saeee0%53%3;5-;qq^>of@Z=ue$G^Q-E7W?+`t~XGi5=3W`19eZ1k=qXSRxWsGbp zem~n8obqm@%itZ7^-9?mf0<3dv)8w4Uc00iaPBH4B7V`GIIWtiOitGG?uXOu4_dl@ zGZi+HcPMUj{d#hne2rN4#_yLl{thK)5trPOnnBTK5}RM&pUaxbiwU}KQFZ0Q#jBnl z!V0Ry>#KOxRelrJ{*j0zU-XfwVv_&0H5nJb{yw)P)Ai@?r`yD@#pJf~jHYF~Hcdx8 z(u=CwK2w+Xo&1>i%768RW#%^&rOr6FghWthM_p3hgue_wIJ>2I$*yBkzr#a!puR*N zBY$-f+qvya;>NGZ2fy-;eNDUgHRI9OthulJMc;B)e9JrY_1diTu$=6{MN-AYt>mb0 z>eL=a&Nq_OmP5W<3VbIIXG;klNmra9w>fP4=^}OX*fz)ZZRZwAH9R7(>X14wDSal} z{Osnfb#mdNLqBScNu9na-IYxq!^sp&N;Mlx3oia7&HSWseo=>h-kQr79epEp@7Pb( zndnEGcP+jXB~`g|%9s4|WkmJL!}10~nIh9lRekP%N7I$OOd zABE5a$@xa2xDGmAh)Q+yT4E3PQUtb%%2+yrIHj3pXi70WZiix}SW;U*c}7*(i}R6s zo$^7Z8yBVJ`e#XmcDMGfc)#ANh6&q5J*Ny>gVtjz%BRMkUgg3TG1PLHx#OM4gUc3)wMA9FbB|2h2j=?xc?Ro2hWZM)aJy~n|J@~W7=QgX1B z5S5Nv=uhs}q4Mq#*7=aRWszthNimF8D#cW>I887MEPUK${pH<5yUQPE4=9R7;@_(0 z3Kn<{VEbfmhin>Q%QA4X{fHBTw8q`e-THZnYyWck*ce;o_fL$6@Ja6ay0)z4akhlZ z?oVzkowib|?jv5DouI3dxwIxbR&1 zbCq*!wZd#7X|v<{ADl886Qyow?!cIP*otbN^{|_hT=~gd=OmBCEvw*D)D)&LY@EXW zxW~M0$N^i#j_iMS2nN>sJ#YD22`ePrSht9M?fg71MGu~nh?;xTtxA-f9g9=8`Sj=8 zF2)vDj)zXQV#IDQ`DIQGMEMCwiB2Ly@1Ck=xnV!4tD_Zei!BH~$LIpV&O6JzUV}qBf0+Dw< z=k6rQT(a7fx%heOrff+erF?VpV-ANW-;XKFJ%A2bpqgkKlsqOpg-*mMk_F<4^eooX zqjnDcFGiHJSVfDLTQD&vapb-_H?ktNp>j@q{oRVi3h4&n?I-KnHL}AeP~#)47KN~* zGHIl@$M&hZ7?&n!-3|Heg%fPe@Q=6NoWaX-B1V7Wer0x{SQKMqig#|(+x3;=vxcpm z)-ReTOO=r_jA|=$v6TCd@bg~+e@@0IRsINXUgofD*XY`?WuGynJYH(6diQ3D!_Q_< zi5luC1c{C1c`#IpHAE*qkENKZQtz%7S5c3iLIi|*`Sa>(YXa!3EY#W`B@J*wmqv}7 zd|;t;7|!B*CmSdanYDY8H+*Y(;-boa_PX!F?ETNfNB2CEdaT5#Agd1r^&Y5PN~fyj zvU|U2us4hx3%a$qqiOVgyj;n~0IUOT4&!x-gohOYvZAd+&u;GCt{CvzyOkl=GME%c zg{+*CTt=pP;i1IX`mAo`T6tVu7en=_1Mcx9nwq&iPfChwkG3#Y8{dm8j;E;f+0(t2 zVA%#ogo=vO9y=38%2&5f$z;>nN;_GcxI`XVt@JH>?V86VGghvZ=}@xNl}QQDCp|o& zFcqyKa7Mql&@~!Fl0w;HRy}rH@{o+g)($J82KzLw4rb+-9Cx<#lMek!M!qAH6Ma)M z4t=4prdeI0;cMU73xkKxB!(J@iKOD{QDnYA=pi4;mS=J>nrsx}S}%gHVh~t#yslim zu2^mG3aPHF-R>h$xt#k)>2i>@#Wg@8wD{aL&G6bBEfs#yLisj~_>tK{aoNWrYX$U- z8$!%>X3)Ytg2O@nv}?hthxqR?LYvpIH}}6gRM=;)gh!QPL?gx)~vK%JzQGwIQ2OFSCw0+ zwQpnoXl-(=t&HMezSb@J^7083fh5Y7u&30eAh6in6GxmDVx>Lg%$p7=+Sw#YSM!DT zBkjKGXBSZC(nD+3dyXVZXE4!RA&-h3%uQGobUF=hfYj2tqP#N6=V`7R-XB>ji}pTS zVX-~i+ZEjrSfxb}po$-RjY%n6Hc(~sLzMK_UBKUIzz?AVp5604Kb+sZ@9pc2c1jnn z2Da?r*!Sb4)e+3u*_io~s6tbHYe@6i8nQ^~(PVk@seR6L!aX(2 zRP3FYrqkQ)Z*1Lwuojy<5TQpu3Abt}9qp1#j!e|7Jz`jYm3_J-GI?nq)-imnXAv%n zx6 ztSxqk>6EQfyC7qmk{<3L_EuZehIb=XKQ6D5!--o7py@_W?#;g`6$ASz{N%+PCnB8Z zoXW7HOk0v3Q@pe7LS(X-9%9ZOC>3uYTBd3ln^YxWpEE_&D@30tzOYKSInGLCJ=c@! zYB{EBo0fNmBaMPEkw3uWmDo_lw)ESP{#Qrm{ZIA#|MAyZ&as6gt7FeN_U0T;99#D8 zWM^**b+(i2$cRu#B3mly91bZeg`$*ER>(-wcz3=&-+$ox@w%S3=XHNP?n1!TcT3AW z@rdhzFJrFO&AvJ@mqyg~7QBr2J^@3d;qmkZ6-gjgYYalM%!Aq zYTrVBRv!n901Etm&dvq`<4IaP!i^939yI^gUoZZcsOwcYCf^XM0_G9Yl3+$w|2H`$8)Z=D zH~!;#N06?S{jaWj!EE^QqjTgiz@y=aAH~tRMLM-lE*80dhT#8oj#mE#2(K1aCJyGU zKe5?AIa>rM#X?ByhsPiSfYme%gahxdfuL?^jwE!BK|O##x~XM7Js~~@c3h+Q;#u-j>{5N zoP>ebI;=JA77(FngyPdlkWFjQQsZ>40je3zCqzwh5QNZhu-gO+n8%vmBD8;g60Rd= zi6GRS&2|Vf(VrZqr4wzC+=e>RMzh+WagfWGLE}lHFSgB0h}A92`u9ONCLBm!CAs_3 ztTM3XgRG~$X74&!W`it?$hKA?%uVfKE440XthEa^_upF8aN-EN9Jx;%Vng5PaD3I? zoT21G2@Z|A$GxZtt_FBH9i_u)`iLIi2$b7-_+s$z2wulKXIMAm22gN=96T63`7GL( z>V9AZIK!0-%H1x=Nq$v7t@hMZm|!Mnom|IA;v~2X*!;UPq>Cp3UWP)9;S7_!qs6R? zZkiTXY+J`z0@-wuJ!b2JHdW4==EiI0V`;{9Q@W@UK*>4S)tODmM2+bMy7r3DEvk`l z(1Cc)cvgU)@z3+m!i6ohDs7aCZl07dpa1aed0i(kPq1<3&;uaKy=2orD*1v>scyD) z!MIY=o&L|tEfw}rbx?se5>V3<8fSXX_Jt`oVao5$@VE|k9m6iJsPi9xy#9eTf_^b` zg_{{PTBmmED)Nq*jxvB$HqLR35Ni_oWmM6jTq)y7bP>rIa9HRxce`cIlp9+Q2O3su zK2e^TJtBQ~9sOfTPZFegk6MkgoJ>X?LI$#L9}fz z;zhUkm`TPf%~fs4qoH~~V~&=4peUhzd(2mh)`h)s@P~WLYMecHhr!Wy=p63VT~)># z)&3$QQ5f)Pwp>FNx1is;xt7pDMTW9#gz?cx`* z2$LNw;suEo)%WV}7Z+pgk?31v77J~d(;!V$_xn|CHaV!MT<0>E(5O0f!a!1+X(xP) zta<#FCPuSJ?v(3HbI%<$P9e+oq5>yF-AT(KEm?r@Tt0yz8fYx~F`H+-;`Z zFu!Q2y->wzvXU1sbrb|Es1K~N3C_$tc~aQQl^}V*nwW<|1>Rb&X@|J;M!8Eu889mM z#Lld{|I}N$=)2z4sWZGDxeIUoa#86xxHJOn(D;_#3pWU-PR4nrmAs>GlUxPBhk>&q z1~I7(9vGKJA9XB;+bHZb{ob{cX5z&N+XtJcnMOY`Ry} z`;2{Vb~3L89UeR6C40*IJv2_ShAuiyGMz@B_pWyKPRVTZDdWJ?VP*y}f2GSw z1>|&7-kPI6H+6jgB@V@HXrLF|KF#Mk8t_!&Y><3^Gt;%AYKGsTir&&)0RtQn#4AIh zVbr%12-kdG?`hNr8t;e5!D%|$cN#zA6nwvrI^&=0)j33JJ}La<#|%F=Efe(y7|D`g z!0JyS{0bn_22{W8PFBgQlr*SAI>il*$Uqauc|W?M5o1#>s#6qG1WAM8;XBP?KTY#P zKRAPeD6T>s8mWU5)Mr#O8@rmd-OK@Pp(VpNwPPu!ig$KOl^_AV^ zc+Kk{2mt39@Ic0kbOyX-lWGmnkO)#t<6EG>?|F%ToT=&iZvWX+2-pY_KTQ^JCVY38 zd)}h^^YO=7Q{M<)f{y_;2GJj-6Y#}7z^hf)qWUT=E9Lh*3gJQEF`f^j&6`x;4}eSLBP zi1VNBo&|^YK^#8?ZfkRJw_>_ckOz{VZ(tV?xh+-<~glH@uDHL(f_v9QT8rMM8jscqEH=<&5E zAZSvPY>T8Q%~Oy#C>ap!3usLS&oB zdU>#p$pMLuBA0*UkfYNz=%E0EsDan_U8SVctrlTXDObSI0ysq=YT(Aqi;L?-b=Jgp zO4rHDegyIyFX4Ia+&SEaa=?1`1nho*rB&pHmK#BtgCJQp!+vK)pY~X1<_(`~fu-T7 zXFq%xeHo=?DamUA;M!=waY``+)^HW z`E3--3SoeX2(~iZ;uu`FLJWnvR$^nm=6!p~5d#!_o4MEB_bD=`aq(8(nOUpY;ZIvd zgxG3iY)(NeP!s#ziVm5J$lHOh^oJPWf=$MKx?*7FLg4jNfHa!U{Z7YYJT3=EvD^Ma z2eyk)J7$(UYa9dtB!y1MDo+M$%zHx72$!TxUI7zKFVSIn+*s<;X{zb>q zM16fuyQg%He7Y+f(7+}8w{GVd(nPEf7a4G19(IJ^-wXik=a-9cDGovVPewq7Bi_f} zMMl2bYaLC&w(dkYQOmm%qlPKgiVuMU8a@p!jf>Iq>~TXXc~eL=bWOl??-8aU8zc8`_??n%SqF7N<~R*8(1SE@)3Da-;J#al7to85R>$$ zKbgFH5~6#m@GoYNw1l6jl<;5KKS{~4i7D%ysrf&@goeM-8+H{4+4-cso8sZ8xOWEW zdHUz53p_rc`WFEX6un9F}U_W@fUJz@bg*u*(f zE0y$`fK+6@4KxGRz7_wHsgA0_eeg%ZcDq` zdfA~g6AULrPsbXfFBH1{9(KAo?3p~r4jyZbUR=p|ar;L(^sh!h8o+?GR%dSgJp7_Z zbcAiNJpbLyV|Tq14H5v$0d%i*^(8QX1O|X!9~f%nm5rv_uuHpExIIFU2<5#PG55%TYEF=|Q$6b=2GLdRX@&!5hbOyo#>`WRq+TGFPs ziIE}@RSzq<@b7Oa&AGVCKwT9auAd2e+c(qEZ%66_ny9|M8c}46C1!)Udlx>`jKG^-=qLf!ACap}9P!>GY z!xQCm_!=9g?*BcW)UklYm1s%cxz^%)`!?x;j_6XagvV2x6;V`61yv8FrWM}=6_OnW=1Q}NvH1$Fzmh=s2dvG%~pBJMu{cRv~=JU>Oe>iB6Y z#Vh%?|9vEx*XRIAIbv%dO+D(9CQUmY(JM^>Z71Xiw5$fc_vWtMyCUJpAhHPXOwmO; z2aE{h>d;UwHj1@hr0Ft_?j`O3MF=avpiGS7m|h@Cu5oZq6m@c;a6@eyK|gTtyp<4y*ph_k~+ZgD>J)sW4l5(o zE-crd1EH1WOAZQYJ^kDMBT%^!ll-ZC1v6MnwaL}pJ*{GK+iC}gh?`$r^?nCK->ynCl8?Mf z&pxJ79(r?axsbR1p+Y5wqx^I7=`YSUg=ZLpeivoEv)6F_KHNb2kW8E!Fm1%Sc}IfF z1jU4jXP^c+Rr^qbl10-2gOE|k(`1l!hUPFgM|nH*P6ktRMEZ(})-(C*8CvY;%1@Oy z2URp0k4gl%L1*BA#hQMWa8Dk2vs!XHr083N<35N4SaN_>Gd7q2Q@=Bw{osc zI%S{FKJOm+SofWO`hU99XRny*&4gUfJXFu!eXRE(`q6)Sv+<**`X7@&Wa@u9zy4T% zF7wZS`tw9?GlK=H_(g-o%c}hbpL31>8GI?UGc#N&Irdm{ploh7fmX3KVmN1Kr}S|6 zhVMnAua_^Cqm~{F(b_s3)=U!H(KQp8ihv z^~jPm`;{Ag+f%;m{qL8vf3DTub(K_Ht5#)ard8{{LVjDb=Iw{Lf@kDhs_$-?CUM}&s^3p+5Ry1dtC9!uc0mL4r6@RSQry( zbvI-D`zH>01Jl3MHsbu}k9&3cjH4X|;V^75{755O&{2t^?Iy+dXQgjxO(1aLY7OY@ zH0Hq2DcwF@YBXoX@SnRgRUin@@2fPVd}D*!(sA~mTKIsXQ8?LQHZZ+d)L6PHjwmx0 z$m4Wij)>T%bN`j*KY_CplHn)3CCVQC-e^tpK7#UM$%x*`!YICdeOYEqdLtv1`K^06 z`ODoioQ0yNP~QaTHrOwsTl&vT6FRPzPh8{cE<1%5e3OTroRe4!e{Ny+x)5MP>qK82 zU}QV8E+}`&$;;c=Am6{a+W&V6asOw%xz?L2QC**voEls75>6MMNRpL1J~I@U;#Bs= zK2)spd_ULY?Xz_g^~vADZ1F{%mDjIG$!V9_2X(x@Bvyyi)?XV#DF~eWAbdj1v~etR zxUJ&p?2=BrA=Z64jfumHptsunV52U;u%`LwWy8uF2So&^}@0 z{ublW5nrib^WfK`;hR5#Z=(qc^V?K`q-^@;hX5Wvg5xLMn%0t~jR7Cyx4tnrasF^3 z4B8HIPP*4oHdJ;d^R7)h*ZuohYKsH-4>Oe?A%`kkw98RLLAAYFZeA4FPy}Bfg{XOC zFZoRRp=tp4cA`ql_XIGb6F6r<=bElYgdk2?G{t4%UnX=P?P>_BVm}y5wQ^?3Ui*A` zlzV{Rx07YF*Cu+_J}|3^ze4NYO3oRRz$NumOD_gR2tg#Lh_Mj7t03rGG!be50}CLD zkY*B$M}qN8fU%>-A0?oY2yk=65k;~yzQ}3(%9Fep27j;-f)Wn~0=*!IxS}r^MF0m+ zV+C3G?3dxckdCwt_gS7W!|x(Ma)08DpAxoei73F9; z9f*#-#n4%7Q0)7YMG|ZrIQulSq3Qf_Kc9X6%Ad>n{SSP`d!~pt$d`Mp9kZ{K<%=4C^ELH_JX_e{IO;ysof5spjITX-&)W}n7ncXxv zo@=qn0w49szfwGS>EtEDp6(B!wfX42k1wDP{JG1D_%r1o$cL|Cggq|fQ!C&y3$V>; zFkkrZIhD8f4XA6wtqK{7zi-4cxg+*RmWvj{;0Ck2J}J@_FG~^?(}xW8j{ZN`J}>kW zh$C3!$bn?xzyz;FlyJ7wlA1n3Zy8^}%xAN{G!iZkd|^j7(D^(l|G(0=Lw8h2vM${e_Z`wNNNpMgAqWks+~y3gM^yFNTtem z(QmeA_$rP|z`vb&Vt69@g@|xGe(#hYr=XvSd^LNv>L19B|M-dg4KN_eJo2}qq!8dTV3)gkkpTjc@36jzHo>M7p}+uHlL2A@B5`O=1_5(0 zuZ|}QdU&S#EU34ND(q5=5necAHVus381G&XA6}5K zIIH)JAW9h2l33Kr5!-hcqt{kU->Ja)``iktDBmoTo)VR#mC@aA$~1Y&am~KNEaskH z+;gwy(aSk0K^|rjwOJ5;4Em@9L9}fUm?U7L(36}5kOWIX2g8}efFejg9?(Q27?3Z_ zEf7J3{=fFkiy%Plxy;G;GJi%&8;`TJ^ge5UlZHr9jutQ=bj%6A8E@gwn*XHKtv;$J zd=>*U^l6_BD%c|C573iGKQu~8m_#F`V4ql-H+37z#6nzk9R{=eH_ql^V+<08-?0zsnQA}!3LhC(j<&XJU!VZPCP!b~p07>wAYmIo@@`Az{j9D~@zBE*~L>Z}nCQRTb z@cQRr1N3m77el-fa{ObKhKfnDSPPD6kY64}EMowML!1>;2+V^D@CoR#34Qo{J<;wA;DGXLB+K%6*w%s0`4~w~3f58YLLRcAC4U5mt zf%}okUSRD5bdnf_WHo?74&a29$j;1@IjoZm5~d9eidv=dkuf+WDxN4gjpnEWv>R6h z)drAiU`ifEpU&V~B}z78C;<$v43fNGmYgs_4u?bbk$9UKG8AS~E<614jYbSz>2gK* zC9M(FxK-M3Fo1<{o|b?v(t-fDTCTi~+7`A|?)$^+~>lOQlvUqKFT4Ig}{bcbgonlI5cen5bN_ z!c}uA7b@H-)KdXaDn({=n#G+gFi?@liU6Z)_#$c*mh0Z$X|`Hxy!JJDI-*iNvg!E> zL60uW!#v3|pjZdAVlBm>B$90dZyyMVV=AfyIv| z_GYV68kLXXnT9!}7+Xu&ECA$K%6cgZxS@3#G0Jk5R4`g%8XfizBeu7S+faIHK{uc? zPT-k>&4dyzHKy1`)_Vp+r1@q5Tm-q%udocGTT-$aX(adsb#<0SW$U!(3HkaOcLI>3&SA7*-^hAr2+U zPcz<{Aw*`Q17(^Aw3?HRaPNxP&Cl*djW$KiG;Ge8A^N|nev(=*?+=^)*1S-3a#p70 zqX%Q`CU%}r9dM5M;1l*WZ?ngWj^G*4h7Rx^G-D1xDhD8-@-C*1xpaXcBZ}Sn7qk6O z%{GmJ6m7*cVn9l2wk8_eTwCNi3|9^XvAQh7!^G7AFTucp)`;MkWtE^k5@`HQYyJLp z`S;scipd5E309%UUJ+!NRL1^RiKXam{d}{PEP!qY6F8=~cEz^;3&`?q!Wc3J`WBo1 zs%+zQ;&x@W4=ixdODLeY6-Y(>d8k2N-6GWtoYA7s-=uJeL*Wp#R#_{iX5h0Ko$D5q zQylu+1^1V>@;95^`rn1^(d@8&g*ZONNFMFDBl;tJ8YA5KSbhkDUwj?>YWtfJLd6+F zxj69nCRspM184?{MbL7yZO1MtiQb~fx3vT+Xxb+29J9p9;!Xm^H!DP{oypR_h1D%>*OJxN@ck}gj4-nQp4>sGy0Jscg8*2PK5E1~ADZI$ z4(@l@HX3g%&ax24TAJfv^X;<2ohJr6v@{UMgjcz+mNXNRWlA-vz@uM!Q zr#kMPI@TvTt&MTGGlMvDZ8Fc`lC9=u#Wyp3(rE~w9j7g9`5nhfI8vEFHu=$N^}`N= zwu3PISALM&It3vrUmbPL?st=Cwf(Mkc(*2)Ym5kpq5v<8-!G$(X$%-6M5~t#BJ1qq z&?!Ym1G>|@Kc4U4!h0}r`(!mR_!9WndlbNf(UQ}MG^R^#bW#7_*37qbyS0yN?7^(| zV75~fwCN|>(8@d(SRn?ffe|@@3U$SavG$$6e-F_fNz}$=T(gh^K$Pho%>2H(;(q#X zJpi~*rt8Ofwnq-8P{#DUH0WN(QoOl)(mu!idzc*CnR4Mz7-%*n=CH-XUE4lz z^es!gP;&C^w#*OOn>T+Zkbeg1(@!)r1pZ=l+|YGet0db2t}=+o!C?SR4X{t6o=LmX zz)<{46l*^C!*zfw=%of3P`pTsO_-0-}x|i3h8^Z#n{bL$WsAp(tb%;CaSgG*HO+rN<#>42@jTm(VC1GS z697LBVHh4t1u_N%G!R1k3ALojsKVhJ?cqJ56t`f_}y9+m;odYbYLl)f zZaRA!JcBAuhF~zfe=*hp*#}YyPhD7_6xXrP!Lu7y;;nUMs5~XJsbj(OG!SKh z|NU>r3AcMiT}6kjzHYX6%pR~04G9HZRs)6Hw0QFKALHChRAqb6BkZ=~_O_6D{O^Ci z@+ooZxZjpI4if)5c1H;8c*D zTmD(l2f_lIveG5eQhRPSS_XUJWv$q!`!FNDbCdvPcF5|u{HJ^=_2vV&!uc=HOF@jh z7rk3<`9N{@Xu-nN{H=HGVek5@(o?tQm|5@Ejsp)pxggYM_?Jy+-OpNdStUo-2{k*9 zF%F>4LPxj0$Xi8PSBuV3`=pn#Sb6&EE|0?hSW`4Ostuc~Z`JNl!4(7GE3Hh>N`m_1 zoIw)m2=D++ADCafDvz3A=XAdE3gl`tu!{a%Vbf;)VV~j_XUqmA+9j z=I`Oy0#*S6o16s1WO$3f%1A!a8ywM=+94`ji;WhpWy+l;32Wb_VQ}P!BFDkC!dNuo zsCcub4)$>M_~nhev9H@x3Sy+I)oRaWlJ9m{%&F0&u)OrDTF7L zC*ft&c{ARUm*?)ZynP?p{=(xCO>IFyL$`PPtbi!@h3qyf#P81{Zeq`BfPKJgp*|P< zj9^C*BevHjD12n+BG3PKa@CN?&b(7A!-WnPHIDe3`T#8R?5G0VKcqueT%+d*;JdlF zrA|$8Nd1^H=iaDasNlmq68{e!PR){a)RYe$mFq=X3;4){MxXySvr#ZrK z3GIf4HYG?=k--JOWC1nXywrf)G4I+*u038x;YCka+EnNZwX%Ad6sciIo$L-rt%F`+ z+3+b$&p{1MOZ{?C!?h`;V4&t&MMPS3l8wB&NpC0&0t!#R)&C4j&(?kc!*eE4U;2H2 zVYpS9s3!5iszpo#9djAeTqHsecB_AgXc)d@lq=AEIUFR ztQLZf*s_On3BE6;VjpQ^|R^! z0{RR2=8piEgD?D-C*zc;JOc-^c}~|n3*x(#Al}FklUV_TIwMfv749|i<`INBl6;)= z2q+#Ac$udU!+WibSvS&o0%2P~dZ8>1WHY3JnlAx>^9KvLcJTfINMyIYFh^mz<{si1 zBuHfh?p4$->tB;a=0r>I{K$&`Vq;^nCk;M2f`-3W0;+LDG28khcH!ug{WS*`hRbu;x%NzUJ$hf3+)K{9>bF_p`S{yWW%Sbe8Ibt&jd}Mrs_w>FO|mmf{aQOoJ}O9B ze5T9HqobsI!$UdU`$bI3o${rPFw6(nSF~$g_0enL4%dCA^4x%y})3i0F3_+Me64a literal 79486 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 diff --git a/docs/generate_demo.py b/docs/generate_demo.py index 55eaf90..9347b69 100644 --- a/docs/generate_demo.py +++ b/docs/generate_demo.py @@ -37,9 +37,9 @@ def emit(data, delay=0.04): def type_command(cmd): emit(PROMPT) - for ch in cmd: - emit(ch, 0.035) - emit("\r\n", 0.15) + for i in range(0, len(cmd), 4): + emit(cmd[i:i + 4], 0.05) + emit("\r\n", 0.12) def main(): @@ -109,7 +109,7 @@ def main(): gif_path = os.path.join(here, "demo.gif") subprocess.run( [ - "agg", "--speed", "1.4", "--idle-time-limit", "1", + "agg", "--speed", "2", "--idle-time-limit", "1", "--theme", "github-dark", "--font-size", "15", cast_path, gif_path, ], From edc05e54f7fa7fd610a6cffb3b7554c2715997ee Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 07:54:50 +0100 Subject: [PATCH 22/31] [#maintenance] [CLI] Commit by default after confirmation, add --message-only flag --- lib/ai-commit-message/cli.rb | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/ai-commit-message/cli.rb b/lib/ai-commit-message/cli.rb index 19bb866..6717f40 100755 --- a/lib/ai-commit-message/cli.rb +++ b/lib/ai-commit-message/cli.rb @@ -13,12 +13,12 @@ def self.exit_on_failure? DEFAULT_MODEL_NAME = 'qwen3:8b' MAX_DIFF_LENGTH = 12_000 - desc "commit", "Generate git commit message" + desc "commit", "Generate a commit message and commit with it after confirmation" method_option :url, type: :string method_option :model, type: :string method_option :length, type: :numeric, default: Suggester::DEFAULT_LENGTH method_option :conventional, type: :boolean, default: false - method_option :apply, type: :boolean, default: false + method_option :message_only, type: :boolean, default: false def commit git_diff_output = `git diff --cached --no-color` @@ -39,10 +39,17 @@ def commit ) puts commit_message - return unless options[:apply] + return if options[:message_only] prompt = TTY::Prompt.new - return unless prompt.yes?("Commit with this message?", default: true) + begin + # tty-prompt takes the default on EOF, which would silently commit + # in non-interactive runs; treat a closed stdin as "no". + confirmed = !$stdin.eof? && prompt.yes?("Commit with this message?", default: true) + rescue TTY::Reader::InputInterrupt + confirmed = false + end + return unless confirmed system('git', 'commit', '-m', commit_message) rescue AiCommitMessage::Suggester::Error => e From 4dfbe2ce7d3ed0062bb99ee782fda5b4c28066df Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 07:54:50 +0100 Subject: [PATCH 23/31] [#maintenance] [README] Document commit-by-default flow and --message-only --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f4d3c68..6af32f1 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ bundle install ### Basic Usage -Generate a commit message for your staged changes: +Generate a commit message for your staged changes and commit with it after a confirmation: ```bash ai-commit-message commit @@ -45,13 +45,14 @@ This will: 2. Review your recent commit history for style consistency 3. Consider your current branch name 4. Generate an appropriate commit message +5. Ask for confirmation and create the commit (answering "no" keeps the printed message so you can edit or copy it) -### Creating the commit directly +### Message only -Review the generated message and commit with it in one step: +If you just want the suggested message without the confirmation prompt — e.g. to pipe it somewhere or review it yourself — use `--message-only`: ```bash -ai-commit-message commit --apply +ai-commit-message commit --message-only ``` ### Conventional Commits @@ -94,7 +95,7 @@ All options: | `--model` | Model name | `qwen3:8b` | | `--length` | Maximum message length in characters | `72` | | `--conventional` | Use Conventional Commits format | off | -| `--apply` | Commit the generated message after confirmation | off | +| `--message-only` | Print the message without the commit confirmation prompt | off | ## How It Works From ba44c6e9595993c1ebdead5b965557a0b52e34fd Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 07:54:50 +0100 Subject: [PATCH 24/31] [#maintenance] [Docs] Update demo gif to default commit flow --- docs/demo.cast | 38 ++++++++++++++++++-------------------- docs/demo.gif | Bin 63357 -> 61179 bytes docs/generate_demo.py | 6 +++--- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/docs/demo.cast b/docs/demo.cast index c772a84..ad4baf0 100644 --- a/docs/demo.cast +++ b/docs/demo.cast @@ -1,4 +1,4 @@ -{"version": 3, "term": {"cols": 84, "rows": 13}, "timestamp": 1790466332, "command": "ai-commit-message"} +{"version": 3, "term": {"cols": 84, "rows": 13}, "timestamp": 1790492059, "command": "ai-commit-message"} [0.8, "o", ""] [0.84, "o", "\u001b[2m# ai-commit-message: AI commit messages from a local LLM\u001b[0m\r\n\r\n"] [0.89, "o", "\u001b[1;32m$\u001b[0m "] @@ -10,28 +10,26 @@ [1.26, "o", "mmit"] [2.16, "o", "\r\n"] [2.76, "o", ""] -[2.8, "o", "docs: add type check and docstring to add function\r\n\r\n"] +[2.8, "o", "docs: add docstring and type check for add function\r\n\r\n"] [2.85, "o", "\u001b[1;32m$\u001b[0m "] [2.9, "o", "ai-c"] [2.95, "o", "ommi"] [3.0, "o", "t-me"] [3.05, "o", "ssag"] [3.1, "o", "e co"] -[3.15, "o", "mmit"] -[3.2, "o", " --a"] -[3.32, "o", "pply"] -[4.22, "o", "\r\n"] -[4.62, "o", ""] -[5.12, "o", "docs: add type check and docstring to add function\r\n"] -[5.52, "o", "Commit with this message? (\u001b[1mY\u001b[0m/n) "] -[6.12, "o", "y\r\n"] -[6.16, "o", "\u001b[32m64e62f6 docs: add type check and docstring to add function\u001b[0m\r\n\r\n"] -[6.21, "o", "\u001b[1;32m$\u001b[0m "] -[6.26, "o", "git "] -[6.31, "o", "log "] -[6.36, "o", "--on"] -[6.41, "o", "elin"] -[6.53, "o", "e -2"] -[6.93, "o", "\r\n"] -[7.43, "o", ""] -[7.43, "o", "\u001b[33m64e62f6 docs: add type check and docstring to add function\r\n23bac7d chore: initial setup\u001b[0m\r\n\r\n"] +[3.22, "o", "mmit"] +[4.12, "o", "\r\n"] +[4.52, "o", ""] +[5.02, "o", "docs: add docstring and type check for add function\r\n"] +[5.42, "o", "Commit with this message? (\u001b[1mY\u001b[0m/n) "] +[6.02, "o", "y\r\n"] +[6.06, "o", "\u001b[32m36f6d52 docs: add type check and docstring to add function\u001b[0m\r\n\r\n"] +[6.11, "o", "\u001b[1;32m$\u001b[0m "] +[6.16, "o", "git "] +[6.21, "o", "log "] +[6.26, "o", "--on"] +[6.31, "o", "elin"] +[6.43, "o", "e -2"] +[6.83, "o", "\r\n"] +[7.33, "o", ""] +[7.33, "o", "\u001b[33m36f6d52 docs: add type check and docstring to add function\r\ne36ef4c chore: initial setup\u001b[0m\r\n\r\n"] diff --git a/docs/demo.gif b/docs/demo.gif index e13bff8b7189da813dcf8aa2a2676ad761f200fa..86174600d807da3397739ea772e086d885b3874a 100644 GIT binary patch delta 35936 zcmb@uc|6p8+yDQW&5W7B$JqC=?~)`+nHhVjkVI5tNk~ztR5FX9A0!b%DlkPhNe^NHg1iHOT2dT-t<`> zix#uDa0Erg`*i7MzH=9>S--h>Zy8UJJ(J}%^zP&SvV*;x=L6yFnDZAdZ_gL+Ej@7P z@G%1;3tNY2^8!Mc9o$qR zyTg_(ud1yptE@hJgwxP->;9vs{au%OO7>T*h)+6q;qv3&7gu_2=NA@N)ky6eoEIz# zx0&peAG>+ImJ~(qZZhckj8&B4aIW9a~Pf6%_5>Cpk1QG%Ox* z&}mSbVu;a7Qarz1b4vW9uDXf~`E>VeUElhCFAGvYiI}UVC0@dy(B@8$q+gt&Wox%@ z_VL5FYY+#vnB!>7d2Q<=IkxQV792(Y^zgBWcA*Nz>HDI(=NFQ-aG8EB^@}_4cq&@* zh5c$<=_)yiY>Hz5M$V~(#I`gN&82>z4`6PNG9HqaUD*G2t)u7V5*Ny_t8Vg|d~&Cc zBdcO`M9{siJow7=z9JRjqgr8>4r62b-G;>RaZNqLk54nFa1s?C{FuS|tU*+3CNGnu z4pvV+y81`byj&;83P&OPzE%D+0f{Hp~9H#lsXE-bPdadIm$xE3)^UGqR?MYyc< z0@nXS_l6m#*Il!@JDH(4eN2s+RlnW)e3WzU9nS8l zD^qc}ZU%YAx4O-E><&izHZ>c;Y36MuRWFO*PL(o5BDcG3SLrp^5tC8+j*M73qHf_c zf^R>`bDgwVS-$j3PgC2|1J~$EIdrC`M(u@yNn7MRNFQkqGx>ffqNZCqF0V zkgj5B_9FZ(23@naj5)qj%GpNn=i_%Z3yl)!nOI#q;*1Ivh=uN!i+R}wCS9t8Ku_e2 zbekKVfhw^)jExHD){Z_nqc+y-tz`nNR(d&omKPTjz;@As(+w}u_`z76i=rY0@ z5kj$WkT<%{;$As^cKOH?l7Sv!z4zpw>JNoR` z)92^D4$=s`&7&HY9ZJ2&A>kt*}9%sW`hkC3(YGfhEw&rLic?QK^z%JDbK8t@7ni{mMoM;F7$~d z7!f%&(6Fw%$@#y6>T)Y>jAt5bUB(S|~s7CLxW?tUD^tbwr&A8)}wrWJO z@z%xkZ59|)FK3?SX|5`%*c|baa{W#tlZ?XfLnJT~iyS|LyaIQtk72 zTAS#;+?2D|_Z?--`-UnW+IZ&e%y+5JYhHYt-cyNN!%*Y);=Q=^rW1H>!B$rhhi0BK z-d19*CHQjl(JQarRUL0ID%h#%dg1Juwz6~BAc-Y0fsN4>@kn?htUaBLN#)8YomriIfik} zX(z+7?S4BP_Shom?8!S#SH-pK#8Iwx9In#oUgG?*cAejch4WAMXz!+!rzeC_m0+mAygtA78;8gwmW%->upoP`{ie`emiV_)xV_ZmH#f5tCl(zgdq zf=?%|&Gbz=_U#Er@VQl~)r&jnd*6J)Sm*p!chRx$FUvvu|-&#PAEA;D8{AjXc6aWMajc`#AR=_4@b) z0vpDyTK97B9Z+X)-z&gR;6I>1Ku&;Dz)~Fp)AcDFfYTgN5%4K+=mePpjRK|Ky7LGS zbplHPNP#^k;1tLd&I8TKhXQ*7 zicat;0O=oy$|(iv1WX0U10n^Y1Wp7%1+M%rI&AY>aBQv z;vpt^eA=8Jvm%z4zA(6ZgAq=CIS!Ej&Ha12I66-akBx z*fA7xGMkBu*>yjX794Bnsk&6Wkm=8} zaa1;!sL4KDC6OJTeh{Z8mBz__qK0F^j|9r~K@v6KRK>{|Y%I98x{eH`i`V{h9ec zY9=Hcata|W|6V@PCLzL5C4a^9S2iJ%5JpHegb^YL?Qp7#+ppL`<|bO-InIU45NU|v zL@9*C39n~EY$0ONu?Y}WNZCI{>{s)HctIYa>cJd>st4)*l`x1`)~)T3uwU`Yxt}*t z`6hxj(fa1ES6K)V(=|3-zB>+rRx(@y{ZG8lBSx<5z+qudq4><~DPlKIzF4-2$WfuN z|Jng7yTv+F%fq|t4_w-1A9ZnWcYx`YJ`nn-?QD-P;Rbsqxt1>T@HEbVzjy& zyJ+nRf6d?6x3?{FSHJf_WZhj&YjAk<+Of>xAnp=vVVJTFs}A?fZuIaDJLHt+G>KmI z#$!*f!s@U^;kk~V*q7@=`|eoYjY`Zow&dN_x#DcE1P(pZ!U(|>#g=F3$xHgO zt@8#V=bLvH8*R5~jeS0M@_uLIT&pJoQGPDvUCQ~kzsH))Vea%1A-Euq=zMRlxWGaT zTFI54H_P(HPUC) zO|g-(c5GDRaJhRZ)ocuzrP<5EZ-}pcRjGQu3qe#-D-}AL+EK*p$ux}@V3&v++ zi^9r<1j81cSi)d-U}V6&fYk~+6Gp~AWqKmbFhu@LGw0ru3FQN`1ab}I1fmVOo){_< z(T36TE8XC6{yJuUg&npf1brgnuqQ##K)AuoOzh7IEdz1~w&;J4xbM%5L%{#@bX(a? znZN$;lWi{EGTT*ra`w%6=9aYwj$!Kd965?Hp*m_R^L401MOAf@0n*XgburT>uLhQ( zwF(8r*_mQ+B<)ZweF_%e+t>dRpQ)royM>&>XcE&6Cq2c|HLz;phjV6Y`)Oh#csX)T zTMnM?R=zMp-t5Vh26cvKj+RA(o8NI|v7RjvliXlxJA@;oA{Q~!#A=i293V5mvR|Ii z(A4_htHQtag#U>o1mOD{NyzzwwEjsF{)dKe;sXJ|gm3WQ8$$Sm{|8CP0ZaH(62e#a zf9nb11OCrFAxOo)RfUTtT;VS=`&&;4U*9iJ_*Y2?hz4{C7zc4)nV39-;k7VysfW+p zc>#-l(i#;aZei^JD@Rk;Nc>Fcl^9)4qo3P`8qePAY>)n{R_rwUZ(311l0N(YFRfTe z>a~o__oEEcrP#mMib@?mx<>!dibh2=;e*QmR4dx|Q2(1&l;A-tiUf*n7+ITUAn7{7 zoa7;q5d#|S{grimq(lQk#!s!diFQGU79{((S`q(KE4HLFJn+&?;uar{jL%r~hgM7o z=pa(UWy|O#r`I4>HK~866|1rIRn$>3Xho?!Xhr0wR^;+k{-G6%YKOi4St~|p(k`&L zJzB{BqgFJc)6;2Ye&{15!Z0eNtVp4wC}oW9O`hLFM?ovD=q62Q#i=x&>Fn6D|6MB% z{nUys1?k4&%}JmY6G1C_HP_)uDm{k&RATrC1qeF<8p-&0Yl__up#8E&o<4-kdB`aQ>+kSqys-XhnNIj<{x+X|5lt zjQmepu}A)+7G4gkM6diqE6OyMlA<%saBu&i74!Z}D=NIHJ0(Bk^G~gqOaG-6M+tvu z#q2+|VqBZ?2hfU*|Myz)G-yS?wn+;~d4Fid%YSOcb_s__@MGb3f>w-0{?Lj}e`>{f z|Fc#k;pm_h*MnA6PA}L0d#!i_YuS61@KY-W))|}styWxUA))<$(2DMgV+TMhF4rpt ztr#9bND^_$7DiddpcQ#PwW93bYQ-1iKegf{O`+o7YekZYJ_a!Xt;o?7s$Zp}X8)uW z2ip~#{%5V&q55}PQT7k5D5GL|ENxBNpIVXn@3bQF53QJI__tb-uaYGKt$5%MtvH|l zPg;>=w)Y=e(f(hxBJB^YDEn8f$W_!u@DT%lYDGHg8Y0uh2WDzl^gDMbRvecJj3XhjVR<{w&- zB|-cw%H;nCtw{dgv|=1rbu)dNXX?Mvij7zrRxMo@w4!x$I@VuOEf>qc=y2O;_zX%ccF)ivAb^jf+#JOaB9{D2f2B$W{7NE82lpbY-SvH6#8ftyu9>D+<#YEuaOLk`{ZzkapJ|l$jr(`6e#)<$iL3${YWd+)%flb< zDAhBbe7?F7894Kv%h~nqDQ^B)gHr3TaQy2tm1`+AlUhearC**K&);;>uk}Om{L3$< zT>BzRX#FTTd+C+?{LL*nt)o?mmj)MH+uT^&`kU0?(ood=Eypgmeri5@@$I^6-wxpM z|L_j-2oI5A9FT3^{(c%dhHu`FmX;p^kqEU0xUia3TMs4?Fjd^O!H@$c56TE2JSaqH z8PG>S=0O>m(10NA0P3JFJbd~bRN+rg7!U&L4oU-*p^17Ab)jHK2|y%JFmNRF7brkb zg8(Q28Nmer<3Vo#M4Uh{s0iRQK_Wsua^yJA`s2>r0E%t`!x-+qz|s>o6S@@?D`;U* zmY`BW5dzMIwgZ&}WFGVpI3WX~O^5+tIS`%TS%ByOmEp7uwF-nLv?eG^P^F;9L3e^) z1lMmULC|+Hgq&PZ5O9>9P=6CQ=ZT&I3Ifyu=mda5z(F^bPt!>m5G#=Igm8hr2POq- z8I&+kBw!%nHV%hz&>dhcYL6XfN5zGNM+63kEsa<)i|PIP?T1sX=dRy+0JRUg-Gm+u z0BoM1aA;=G&nC1Av@!50pe#Y7Oh`zmS%1}xz_4)Qo?un3Ad8=|y>REAGiT55DBdq_ zN-;N?P^i%2;C2o`3;+v9aUfY>To5A-O{dEb)&S2|{p4Bk%sP@Sq%A1P z^T>5RQ}HiKvYq`eO49S6mE;Fdl4a!oHzmpWUzH^H-zmweXPLSi2A*vLXVND$*%{lH zr7ri=nUoKdGq4>N6*-gaI{I>_mODSsb1_Rc-afOW`FRdge>7^lXP&c3t}l&~T$ybs z&qaI#og8Htoh8-&J65eiS<1?}y+|^ClZ+vt*lIJ73l@i?J$+DLW z%w-Hho9qf*oodJTO5t*zQL4N7?sL45Cnp=u4cTQgi7^8(qZwtY5=JMzdOLK5B9#h?{k@4@aO zC-aajL@Gq^DwV#ZEz}NgRfE`GtU(3MgQauduEiD!N0PepkuiUU{9;t*Yk;5#lkCLh zjN5z2V>Knyo~Gfh4y%XxbL|n^uH2OS@+~)fnM5fa?aNlVm4eAva+G1?PWKY3(Y5r_M!K99pMXha;aA6U>QM#+_2~lJ@UUFL%-^?9P;L^v7ncXfvYY z<@|5b-z2}{#@M?GdbnkZrd^&ov&#ZSZ3+)Y4lu~Q0-hf>TUG4}LH~xIV2p{RSqSx5 zGAVcQ4Z6{=neKg6E~PQjbG0VUK#VeYer$9g;nnoHJLWO7rSu47faM`g=S)HvBpUn9 z0(sg(mR|B6xj`#QEBPFm)?u7s@ zUZ^9~#wYRR5_*Z0HqJR?FN8a5yqBwfbdGMkVbg;yPOi7v4*ZlhaCwu*C7x+9x&R?jO?9n^AeZ+DAFMtDQU`&ESN1N>C*sCZc=}LdGFj zch*gXa2eOwwToUsiq^wRFaNB?I`5LWatJ%4^4>YwLYvHujuH(d0;43A;X4VBj~A*V z#u7xw56!@nIy#;2j5Le(KG&n*(aCHs`nx?wLy$y?wBXA3^-6j8OMQR=l zso*U~OR?`<d}r{dJIDuXXv`4lQ`4Fqli1Ot@}${4r@5DfSWPzLA+ zj2A!|P!(usppKuGnVSLr7^E-gY2X_GG@vc;t-xh~X@C|$X8>OSbU!b(f4mO_W&&OV ze)@U-@%ZCT3t$FV1WW|*24Dun1c(F|9^f00&l6k+xHN%g0B-;~fKESIE;a$cPh870 zp8^LYfUpUs19$-%12qgl1|S4H2rL8;0#EcnJx{K2uQD=~~KihjE@=8;R^;BB=9##^u4b4b{EVtwat&0!HM zceNx^#6mA4PMF-d=KTGsV;={ab}cJyJ+ozS=+fEJ`EHw1KmPV{XuLQ&GBNveZqrjP zK5%r8=SqSmgGY604#1jO4)hAT^fZezuxd%|a{cRJBB-9k8}jF^%7|EGdf2HTOQE{U zz*{)^*3%e_Jsa7CvZZXHeke~XpP{bG#o~1B^_7%3Z!{}CXWME$_nwbMO}%4m)e#IS z2xVZ+P)UCwJM+u+6e9u3C8&}tV!YW|C(JfC>N!3k+HkoHe0-~A;9gdBzfmx;+e<9j zZ050_s2I&%RwkXB^@yWNScF#Q7EHq;8a5XP4(=tpEX8=nKNzf1HETxXaY=N8>e^Y; zIM4ksK3Vo{xiu%^R~FNr99}7EdG~rqaOSI(Oxi*FHdLpeUSm^#S+Odi?uu8~(}vF3 zD_3o~rMTtoiC4?5k*40wuU0kp$4^_`G7!9R^~pD^rq!p0?LMzQJ*qt|@yyth4T-Ja zSD#2ci+F!Zl;Nj1CAE==8qw+SaoPkASX4%E!@k&dwS7}9Vsnam=Qj{tNeXd&i7nC zCwzMZTsqS)XB55Mk=Y}(m}YN1!!hyj+DRVM)*MY{Ec1>pTb*??+m7KhBiMaWdbsdL zmbkwta>t6~`i=89EYvkJ^-BtLnm4QLTiM=^`y^i^%L=0N9_FvATH~J*EP7TLxOvg^ zg&bBeKWuss)5yl!J$m-8q2krmYb~57&kFNgoV9G@iOuU9Qn;P`^oto=Wt?gLZu;gH z+wbMt&YEgD-GO_azxni5b4Ppgsgt(0alK;a&J6Xindumw6A`m7-f{Mfh@zM!xshq- zc$wFP`^yi_OzMn) z#&vExkDO|H|5TPvG03A$8+qPk8n5;xdDDkiJr#2%UEGo~B)YAzwDjtk8D8&u&ut$! zm_O^_$cKTOHOsEGp8589`1z$$rBLpVZ=VN;#&ge(|32RG+cpC(zSWGKMlkbv!22}W zBwb6%g;g zk}`d=KP5mIfR<-FytddDAGoHIv^P(ptw>22W-2HpU;>JrZg-;^q$2rpFQdY7pF{ho zWwVuQoSsd$E^5@rS63Phel0)}W0RI4j$`-Q^oetsFN&s<8f%Z)Sqz`2`Be?Fw1^ye zOecd8F7>C}Ub^Qk!>rc6jjVgeC2fP2(~;;k%1T>Mhk#das+ z3s>5usGAO?tihpIAVv`w`z66w^GOD$s+AQBN@b!FqFo>L=Nt^E-~vV=>(aBUpA z%_xHU)1z3_8qumPYiA)8Kh7{ib1%1ps>r6-w7>kc7`;iQ6umn+6_?a-5qp38u~w|h z_k{Cqj7J!Pd^24{4O(pJf8E>s%&6X-2WyC03U1+(kp&Hx{CjX3<2LB6S6HO^Cf?;6 zJYkf&igqK?+{PQYCHorg1_kGA*g<%)q~ZDM=byJ}EW7;7Slb+#jNuSARlV#W;)ECs z-m`G^^w)>iNEqlm*)X?+5Y9-)nI>_26y2<&XS_REGl;=1ZWLt_^hnX^xT!g84KQhwt-VXiNoqy{4P(9WkyX!`9T|G7^*^rOf)Le-5 zKoBj9XJpFmrN15J>^jq7DZyx=ZMfP|0Y-h8d!u6iZ&Gtnh|4poCfn!B)m^RG1cp3X zB&kLax6fMdH@sb-|8Xzz4AoAQj@(=Nx%G3?mos_vKq=N>{Ip0;i`u{5)IY4xU$ZSx z-h{YJcFv$m!o_weVMcYjK9qbuJzyCv7+6rsSX^c1U>D6bC=Ha>6 zY4>F6W70H)QBG^}ai7#$mlf8WPm$~8DmYe=6^CU8jcnv7hKR*d{kYR3@2vki-HRh9%xcswbCgIHiGijjP+rj^!iqNKmZYclz`>h6Ve4 z##jUWlWLc>LE+VnZ{ifo$F+Dni79Daa`aE%vIw z2KsdShYZT>kj|}TF^;iStbQxe)p2s=;e5T7q1WQ?H+>3jNZM*Lf2LJf=j6QlGF#Fr zdHxOFJ$0n{fQ=8Kh=3o9(8YP#2NNa zJyt@qU&tH7)cuwbKzt~x3I_v35_0J2nXZdVX+rl+T-EN4eCs9b>13E1=5mIp1_9%{PB=YF<;V)B#)K3qe z@*G2mOI_obZhP-2Pz3VzbGz2AOpVH@Op%HA)s<9UM)TDBD_BX!18Si(F2~TLO6oyhxXc1=?!n$)SMjlS5WjyXeSHX`V>bK*5y^Js$T5_bBFf%d zQq~+>{2Md;NC-*FBcEJg0rVPRSZ&Bn%JokS~|qGmkTZ zr2<|hy_*zqf+;*Q5M(U4fvp>j&e$3|k9hYYK7dz=;mC-#b99hKC*g@jbI{c|*}bf9 zQp9mMLwk%tRh9Dd(?ndAF^QbwK*L@ND=FRh^fd*0F3F(>Aymc5t821!HARSV0~eb# z5OkGB8_8M}K9@SqV2~C|2*i8zql%jC25Cuht1(Qafcpl_R zPQPl?*mcwWqrEqnyJm4&I;6Ecqpr3Jr7pfojs%(XgpF~IW$M_`=bBzfeK~d6{hep^ zKh@1yhg)%|<;upF+lbN#L#Dyz>oX;vHX8rvr+hheqpW7_&QrQC9d?~!BpqG1U#Wj^ zvheFI!iP6}XH1svSVZen1*~af86m0|b3%!O-PHZ`#IP-=h4o=xas`et9M9jnW7`Z7 z*^eP-%xI%NS`v!LW{$*Z_zWJf6J2trrRB8HV0!W z!KQakf!hy-fzg)fxLrUei?H&&a&8igmpA9-wzTu!X=*7P@(5N@ged#t@X9z`@3d8T z>@qfDN7u3U#}ZSp*yHH$L@xGT>W$-k+c7?ZremDBGjIsOA5UM0DvWWJW0Rvd@P1pt z8xZh5O+&vlaejQ}%&<7WK-!aUgw)GrD*n6G1YS#;0VC z5w}fskD*3xeKHx}-5(&>LDvw)HU?xpd4^A6U_uXM;rT>MtylQTQe>_go!Y0TF-)i! zU5x}{6g4rahjb)W^wT8mQ}?#ZnzhbqiUs1SoRqwQ;=I?*d2jCJy&KCL*3AFloIe_p z|0$M+7v+Dg%Kv;XU!^V|8O+CiL6Mex+$IqvK=fTGqQ;@*-T4Yy1-KCro?bxnEl}4g z(A-@>Z7I;*B+~yu zSUf!|&-K3e<(Qb^n+Ffc?2D#zpeWF-ETKsN`)kup0Lp>ap-Di=fF=Qb0;FQ6EZ{Aevl6nWyjNZJ}b)FSJu%DXBN2fxXg5iJ^=?AfcUL#VDwi) zJ%KU;mmDY%&=tfOg1xvkPK&dRxvON)-hKN^C1u(1d{1O|dG+C%+9OAgN$ctx8jqi7 zYHrzCb@EK>Sy@~AxsLOl7rHu5cVE78^;*yM8#iy=zH|59{Ra&WiJF52NfoI~l+Id@@>bEwhl3y5Q>nz&&*khByThj3b&*fQeMXg4Rf#KtA z59lk_Nm8_ziwf(OE8f<)zoV#BoH_3}Cp09|=YZutujCe$s5PD%XFfTHEm^g=ddrnr zB|a4H?H1yfrE@K-4$2U(?OVP*dvEw6yTqD*mFn`_VkUVROW!)>z)-=?HE#Vsu8)OX zT{mLZ_`Cnt@O>3=tB$3Ge3?ILU9-0K>{(98_aAq&7uLzg_VP$(RlR(w(?D-J>Sggv zJZZ1I_`MfVyoBk%xq+AT4;RicGm?q@Sy}x><@Rw0!~tHuFLv$^={DIJI;;CdaY@R3 z6QhXPzAsC}_P(-Ru?H=YJ;^K@LQ=P}N3hmKC{i48$I`+Wqic_lbs1bPW^1?0D~U+I zupN=Z55L^K%~^Z!V0?s#i`@|!FFd$+t+tG0M75V;%s9@&EB40ijE_gO{rs5(oNG_j z-ul(AV=x-jVT>g7lXmqUjH5k+*byK1MnV%LF>sUw5kk;+ta;h6UQWU#H}7Y#TM|J+N({;NWZr{_XzbXOL!ikqsdRB>|ZZObyxhX@694ESQM= zC!&yyB@l5K2|4$3=OzciP=VXu()=ixAJby z+pcF#_Hu#R4q>%*n+g*Ka_F^UZdyAJYCAlfgW!2W@U*en#$r*)6wRY%SN@u$M~|O8 z?GlZ&PvE&Sg?Z`xpS+3>zxRl4#En28bgJC)_wmlZ_|+w7(C*NAi9=y_&Y)4w+bXLYCu!FM zYV%}v2Rd)pn3QDqwBNY@QTySl#PP@H2?qj?95{J;Sn)>Kd~!l)<%zL_kH5{Avg?fu zc6@(Gs<`c*Lr`13yn#~PC9t0#{NkQXf7CvmRqryi7y~D&7St@gauN#sz1ipX&pmbG z?Zf7ELr<>!S>VCWnTS8_QRNtfaleg?Y^2G~a>l?KGBuy) zZNp0tf*ZXzo#?#xo;$}tv5)_PXJGNcDBoX^hTur9{tWotWfI2-Q4i^56!OE-He|_S zX_q*FrG?0=KDy8*x0tpTDdwASql{w@wnQN$M{X%;jiSQ}!woNE%l5m<*~=(nb!Zj5 zQVX=$Kix<>3bFU&J|*X4(LuWFqi&!5J7Y9ucv_GI!P$0%9>f_YyO0#HHd1%0nsaDe z^})qR8xl>EAWQ}G_+B$j)h>&G8Et#V^!Z|gh4Uw+L*K~5sSW1PkN_tDMa z_C3SR6OsYHzJav>w{A!Iy$GVkqb}Qmy{`^N=YGlIUFUZQt&Dfq-P*}Kdn<#UaxFkC(Xiw?>Qt=M)?t+8m zd!nkds%lFs^Myx`9Y2xY*i;>V@=U?9R@jXtvW^Q~4c)@dORyW$Yp&nAom1CwFE{4S z&qP1#dtTkr|LWMwfuZi#Z@NyGjJz*jGWvP!`KK@6f1G>Jj*w|%xpXFn^Sh#vgK&5! zYc5qs9Xs&u-mDcNq$M7mZy#xSUC~_iNOf)Wk-WzaiVl|73oiOt4A#~D_Mykscbfd% z>aKY63jb%Rk$v|Y4%n9!iuAGZszJ5~nuSlI9yG#F>_Zyj|6=2ITHmh!!^WLB@~|ms z{7)Sxwv;$?{wu=Ls7wDEVS~Ks+>z%Ow#bKE-Rm;)YD>YKMNdwulR+mrj z*Bv*%d;77=*vHj4w!ds?*I3w#GZm%B?u_vX1i8~qYRixxcCLqbGc=7EBh>=*gsRt z57Xr%&%iGv_nlMXtD@)VmMNP^#gTV5&7oW<*6I*(__}l+U8UDjsJK>}b!eZE7MWq< zT(l`1ODq!c1UOZ=3aFp%<#ZD#SWP0U1Jde^9`N-+q9RDTXtvzMA8 znw2F8(N!vq+H^>6MqUbGHWpX9?1ROd`rN9Mhf{JK{kbGfk(8-;R=?}biCd_(p)twc z5M`1S9RsbJ1`hkw@@^j(I$F_Fc<9Zk(XV~Br|#U|!=^VpEQ`T$@OlbC4vm8y<=%H`Zq9mJoz%{kbF?q&q9<_$n${szu>tDU+Q+#n zi#-PzZ88O56qsAW^^iOhxGEi za3q70yG%k}kfgslYeV6c;>T=~vXV`bno{rR$6Xy^O_Q`-IrHcWZ#4orzZ1;Z-gxy8 z-7vQuhkE&ro(CSJqlZnN`TX@xxD9!XH257HB67Z-T3f{ng2@F44r2vS8MZpWc3i?* zLlY}_bOo=d;PwYo4yXZu{B2#r!viZCvO)mS;b)z^7_Y&jD*-Uzv*wT!ziV=*eEFqoH=#Gc?DThcgozB}6UJ(CI7?I45MDvS zudDWt?T7m&TmYAs#97%+fx!%q!4iUJbzHa%vky+9FlD1wa8~tJ#j;!`fuV;>h-6E^ zj&*Zu1PkGhoPg|yQzA_A>-(eNRTE6_+=qEEq6?mj@0BmFNL#Q>6a`}y=JWQ1+0PHh zO`B{D3jrDvJoJL+VlW`#_5Z}{ulEhB)`T(Pu0l67o?>SO&!-j%!r{(2(zu!f!xjep zuJ!Za78&9*4Qfkl(9EBI9Aw_~R#7;dX= zyjdFMGt&WPK3sHRdJjnxwnTWqIka$%A21i3Yv9rf_nG+{7eZ}=8|#(5ku#^-!Wjr& zl`Z7(7Qb&;op3OzyLj2DyfAnf7Cy%rPByS=;KdnScA)l|nwrAdV~*PtpOy3Aumn{K z78l%*;KAA?Ys(b2yEJprA?|{GoBZLVlyY(lY${;4% z&2VwfTIma?BG@7eJULE}53PU$RKTX-NmE>4-*xO*0u>M*kih|JRrQ+U4fEj*nx(lp z^i8<50A)t|&w#y@5$g@BGe2=o6Z~-l3p@BF1zelp!USsyj!bZN>aU6CM0-O0gu5-= zdW>wXVSPafg_m)#%^c^g zHif!W^p!DmXW1p&1HDVNR~T%z8Q&e>C$_KG=4cf2^)a!*%Mz~%m@N65)D9j(-Earh zXL_&&wr$i~d|h{oIv&HU%aErNsLE?YkmR3#5c~H3_ z(|9j~PhLMfU@XE-_3!1$laq;h5w89n)6Y@`6?r;#P5J^_V60*0jGY69xt3Rj;_i9| zhj7l!uNF(M#7|WbQ0*I0W)600k4#?CE(k~FHLKvPqe$cZZ5X{r5nM%MgpJ5aZVhv_ z^lDpH9y=>H=Wulu4S%lopp&#m+KN48hEV-PSVTABI-e2XhvE>25FVlF3E%oCV?W=@ zs@l_4;)7f7C*m@Go0_vahltkK8$pW|}gWWC=qOex*{WYMfHU%Q!ur@}AWy>hv~JIT;Q zpnF;Ie7m@Nb;ic>eM2!JEvl{aHd-X_9*kL3=XSX zScEEuN6<_V9P^FPdnQ%_e|4lBqr~v$naC2?2}m094l{421Z;Ua#aQ>sKwAZYF4#XO z^m62d?wzaZ*H1RNHDKjE+dt4sD4lbFY#hvD>`+`kJ+-W&%D7?YGrIt1lSpOXDMG}R zi8<}lrAJzGM%8B|RiUo^2{n+^?Ktk!N_qzJu8= z?-@z%D3&Wq*OD{Bp53HkbTK@1%3RzPBwSjet!rSKB_8iYq8l=6@%PQ1)SEb4M z$+);o29G#9qgJgr-q4AG(bT3>%!_zSiS})J)462oFE;*39u=b&K4P)`w8^u>|Z3^o-ub0inpIyGbX2}mL zlvsFk->1<-7&gOy+u|V37WjG4a;i+T+PC|F)6|*%xmcv?q2>6cc$Tld3c$?H6` zl|qGz$d93&iu$|KR`_8zo}nz&*+6aBeP;Kzk)V_4$E@|X)ZH-Dx7XCOh$)y498Dm!zxxBkmb~{YL9Nm5B(BT29Ya94=n&l~-SMte&SbMkgh1 ztxq^4R&KW7q+DIMh{mqiH~fXpN%N6J(6mda56p2P3@`qRTicS@Gz*~&-?zQcU8&;+ zX;X5gd2S(V$YpYIt8bP2J~S{4@1i_8uk71iH0XlK_3i463cbh-<5V2>X<&C%=swZn zr_=B1t~t&O`VrSry!kfw$Mg$~CV~{PsY8*+(u;#tFv`}hvx2fHelgR6W7qq^Ms=Q3m)^B>lPW9iP;!4pg zQA>la#O&n56$)(1`Z0HMim7PB8SABS-opO7 z>o+_a+W#3Dc73H>|8)N?YzviXJQ4mAbWQ)9z{9(nV`WS8!JB z+Hh;bmX@Y15=q(tjSZLkQXO~L;CLJ`&z(fx=FjRuJ+lxL@6_%%&wZ<4%Ct4-ls6iq zhR&$T0N+S6ojk(FGSkg0P@&jqb_G9#+LGR}}LJ$~JAi zq|79uf-)7$#u5tB5otPNFYvsF+7?fn5^L<_%n$WJH+OBrkMlNoSH;G2yfcEk;30!x zfg_sMoW8P3;5WuwwFY@0=j`U# z?MU}_>YDugE^c90&Mmoogq!7Mfqog={@S@f(yUJ8PC}C4KixB5HD`UY_a+ZzF5a_2 zSfHJiYt|yPa6!!n3$WJ_qf}l`zSks2WAQbnaa+Wh&?-fk@f-*x3y;};g z*9$*2Z;LP95GfMP7%Y@~Cc4|<6ZOS2e%h}8)6rQ6MfLt|`0TQ~EWI?+xir!(F3Zx0 zbjQ-&t-uDgf`POkrHFK=)Y90bf*_)#f`AB!z*l~}@4si}%$#}VnK{qg&;7YB)@nA9 z%v49L&|5{sq%h)F8)8kEaoEaa{4k$_u>c4DS^x$;q84}rpdKZOBT^nIn-(DMPyrX7 z2<^-1yym+R)uuZv_aMy$n~^5AarXf1qnv6)xjo_wKlK+`2w53mUs0Tb0DFgsw7+?n zE03Xak0FD;UshnsnQ6g>h(}aFks7h08&Ribe~+qwSX~VL`1XE!`yic zF)xBW)SK#l)cEpl!X38EeL#GlGE)|$ENF+;wbGl*R3Ej}in8%|W<&8SmTu5S*4ha` zl>W9aRen--=vPYfwTzb9>aV?(|7##wRKvzR!u3t@O#26UJ(~no)}f} zVT_JrpYHQ_QkAORDOHl-D+`&ZvJlp%bP}Zu={W!*&q)=+y+Xf-g{-MPOjs|yeq?2S zR4(+&>RnoCa(n4dzk7ReY_gLOOZ;NjL^ZVw#UK?pQ+SR9(@cZs=wY{%NU*Rfn$(IWLzj*AI*PA#cl?92 z{Gd6h2v7B@8S5&D9IlW-pt@7tviMbPfq!-1tNLYo2`W6;^nk*Is{V~{ebp!DnsjH5 zjr!TB_@}TNDsHllrgV~_c(`3U_1w@fv1|H(5r@7tCamn9^_Okb8 z*53!F^mDFgv9Lx2hJksymAFA0e*i zFkLTV*Y0V>a4~laGwK8|wU4kHJGPn9Fkcog4FlLM&)RH^`NSxUksn%xZRABhsEIO* z)+sq|F&d?}wDYyMb4R%==E*DPsi{V{hri}@L}I*dE4VCn;Ns655*^zk&bpYx+UlbmYDd*dTf0^l9QM^Pc;UkX)HpR+U4?ko*t3~t;E7KdVrmQTRokeJN=B@1KfA}A&>i5mWHHy zIle3o$>Sb3^=S+%o3t>+53BbMYc36Ioe!h9N6?xh7^e}v_z{E0BSyU=CQBm^1^BPV zBTCqKTHAOnHG8EPhj$U3iq(Hr%Yl6(=y zJpk%s|JvnBJFa#(HdNVWzGHM2Fm}tNd-iO6g9|tA`O%zes&NA@r3Gm^K!15{5Dr&EPpBH_f4-7*J?1U?$=&D9C*v zBKCxz`qZ z3q+1hXP>TCne5w?*%!RJnGZJ1Ol*5JiTn42U{Nhed0{DwaGqhPmu>Ild>b=$rrGsh zZRgLsQ_fuPPn>48Z_FkK%zl)dHRf@+jqbSq_B~6vg666MYFOurHL3EUUSD1+1l}^0~u7vaL zQ%$+2oH%{6faOJSf_csC{G>)lRkC>p>qHODLg}0N{Jx&#cyw9qT)D}d&$Pw>v*z&c zg@3*%=eM$uW-Ty3ao_h^<->Huu@8w3^na`A zpqx+OUw6AEP@{c_d%`@7hKp%liy1g2t>NPNJdE0}i-7muJ1yPcR&AH~8Lc35} zyiiuZ@IGT1dbF@D{fR&e=;vUJ4;Os=P~Y7Yx6E~Ih4Uz<415j@y55326FxKLIX#^D z9Q0NW*wq_!cKfBE9~1hOJ&`A#CF^_h*F=Z`h(AYnA^SQNaI0E47Ou^FD94Tat4mq3 za;oU^^y}PmpUynjm}h*Sozz%S@3Nt>!@=2d_Rr;?LF1LPh6Ojis5V>~U@eCBZlPZiH*qa^bw|=cSL+M@;_h0J^jb9c7megCqjv})YYWj_ z3rVPgbb8r+FT(0#L=muo7y$jIyJU#P$)^HthK*9 z;3(Hg0wE@08|h{100oR|5G9Ef(YKyOCps4``_}%OQ97SJsDCHY@lpzjo4Z>wxGKGX zrG1~)KV(Fwv(NJ#{?M_g4Cq~V{7Vb0)wrJisM&a%^7OP0gs5StTybj9t_;?yKNZ|y z1~^k2$((&pOYD9z1M4CPSY_4WTov{Es$;L(op-MPyb_82`4)iC4A(Xh6 z9mvO+u!IPCeC%F$A}#QTMf*>icR*JM)2#=JISheZUr)kmPZ-TlKIxsLg%~`&KokVB zOh%u|fc`QI{9V$6FN`teKR|qjG1cr{p39;`hDE-^Vy6EDL$%9}qJ^=~Z>=7OxW$}P zbRu53e(b%8=nr{=!3iSPO(Yz~qf8BBAcUCU3rby+Z^AQ9;UhQemfnZI+6(WKics{4 zP<hr|?j3Xx#huxW7aON4US?AWz?UmGv&#-nHo1x^8LJ&P9pfs~E!npXlxGbL2ZjJB+ z7KL2dk$BYN^+q|3{d&oj-OYR_AHJ$a6Z20ZwDlZ(%HUs$TzxC~U82XN=Pil? zrO4DxG(%I*M3_B4Y*3)@o~88+68RMPyB@ScEkUO<3&YFxbfgNm7zjPU$Qz2}AEr|) z!l}QBhzRpNB!1Ql?sIArxgfCBq})dc|Bc3-C0`2GvK+xa*_yhS>8x)g z2PM^1ILoH;HK9>u=5$7~9Qw4~6m?jL>|mLAZ7&mE^AC&hl>Y1U+_#P1_3dRv;h*l9 z6S+q%UaRjd)x0MLC;Wb8ku?Mifc^m@;Nfe};2iuU5E^y>`h4#nN(Ag@ zlL@L18bf@=Q$i*@_`_Z%eE&jtb!2o&=7X&)MSg^qITx(t<}VY)K8ul}y0X~p?}1{; zHA##q-)Y4F~hT$?18`wzYvTwJ9$_DuMDXhYDX?=5Acw z${tM72=3mjTwJ8s=h`CW-`^Oci+;UKN|HnhfbOQJZ5JgG68WyBdk8XYcu2hkHhminG(vPxItx9_ofvp z1bATKI#JE{|J_>s=7ugQgRqx@vztgtq>zCr;cImt*+Y7dU-b>}Ab(`@8Qg6e+&EvD zrfDe|y|UPSXjW|D2ALO}sMq}3C^{4Q4Xs%air$-_1b48_q(C->wK8);Mdowqht{~B zoQxq5*(Eeqmow2=UFI=&D2Nl1`jT4EgaprqD6Mb>H)+qL>mvR!LXv!`%WWN05zsu7 z)U)9)wB7PrM9rso96%obtK5Mpn3Z+#tNn&*h#fhdo4Ow}B9z7d3(s;6Vq%V^qM*kT zH6j715}b#cJPFvVmeW!QjDmY1AS-ej|9!$;+aWv^M<^K~wogVK&yQd4_smIzRM?u@ zzdE69$xORU!npn#0GRNsTw#)u@CcD*3v6W1Z4hhPgadO=F#^8xM44SPh)`VmG zsE!}=A?N~|TYZ==^OS7t$~1zo>9RMKy<|updVm*((U2?h5PU535D3Jlgi)h^zVm6?hWW*Y_HxJk6giN`z>7kFjVm>I^;#Q~;V`b95P z)trnwdn_sqD!UO3`>k?`PT^;uHumqo`rvAcpNW?Pf_c;LN zP(rE0W%~Fxi35oMu^N=2^W$mlRKvhbCTKRMP~RINg)_xqRITbylHJD(Dq| z^9R)U3Yqrmn>+^0W+);*dF1+`mo{vXUeRPmHVs!uH#yO z-xp=e-RO@!U!WneG~vnr<``)6CTit zKO(9ZmTuka&el0UdNnodu9qgxgY)D3n95k#{it3K-anUn2Ns^0qUkBfzA&M$d|?25 zVgf`$Fo2)Jbhg`&Cv~H4pzOl~LbX&Li`5eqkB380_c>PjO!5l@y@Oz_?0)N+Yo}wO|G~nu25~-@u+v*Fw=e6q+wVXOx_g@Szv+~8bn>dZ>Pv|V}X{> z2EcMXg0P2Qf#DamP}|Usd`l=HS5OhDLGwqmxNKQCL_%(~TwrXm6hZ-ZfNMUnbK-R2a9=Mf@8PiWa($?65? zMRzR!YJ7cp2X~i(zX7tc*IwRYL{f+?{e5lT@ZaD02d&2)5$j5K>`mP0nep?q7{d{tszQ)@_nZ+`9P0UxV5n#HZWozI;Xk?=>`dDJ7pw;b zqP9-@i3fw|hbX&v{#h{an3f+9+d>1}K(=6|>wnum1N=g7qIb7Uyfh~WZvg{60JTE6 z{l{;)Tmw~VJh$eW+{kazk^Q?-Df9H~@k`taWyYUHt?gkgkXdrW3R9&x31ZTP{GAJw zfz?C%bll``KI&u?1KB1Kg-|J*w=`i0XhA3#4N!o5JBV9p@GVLYznnmEQkX$iLlcXM zc|T{Hc0n2GFhZ*e1av&=2S|u3aC~2(763;BX3B99*NJf8*O`LEHXaV(d2om%xmXDa z8o+O%E*jK(eOe<~`9rs%S$y^xch;A(FxoBnv_*nn}lc9QiL0mO^MLN5>FuYda zQQ&q#Tm)o>26&>422~|rPXdIRgpn1h0FXk3zk@>H1rWgGFQhXRNGII(OQsYRAX4CwY=m#S#tiyXB+r+zQaebK5nxll6yvV(%06z9Q%lq}KU zA0PeO%7;pExZSI_L@j~9^M#ifkyL(uBHagNeEweig=#dx1gB+%N(rO@*vyEx?g(9g z`1`|ktcB4aSu`kiRDlB6rvX%Mja@j<;wh_=gy8sFmV`gAhb#hH=(7ggMlci1FFmc~ zJp@VKJL!M2uPK`t_|s<42@VtH%cQ}0nO7amg(|G>E&K-twzu2HTM3BdJ5dOrMgSgf zfN_hgCLnMr96RY;ugZD8jn`Im09$~0EKHXK7LkRBSXSGjh5aHYtQCz@)+F7~;-x~> zE(g~)7Y!IQi2w(PF*LbPLww|QN9RsuQ9-9<04nH}p|gP@iWVq$Gv*fWoiH|jv_$PF zk9MjNF$AMuc~-4ZJp)ikFLxxW_c?W#Xb$Z#&b^}b>mt0u$_OA6DNiuZg~td@6d*h8 zrjyFhp;t>e9Y7OIbf0h`Yf%45Ua~g!O$uZPf3EPOkZRkAIG)werKnfIGL(n_6tMC? zI5Eh;cU%5i{?sPuTHVbZQ?lZ)r@3hgegbyh{mtZNlCNZCxI~3T&BKhFzd|C&=ey?iOGyvsbH(|0zJh&XU-vcBgno9 zc3W2Hd&^bHEct-<^`s`M#VHZ5X(TRcS~O)^EO%P`*|bFawB+ct)ZDc6`n1f^^i}AL zEbEM%$c((wjDqgW1u!y6G@y(lL6E)_i1qXv|(&0-k=06)G5JXb|=Gz5Q=77sor8=snsEI*Qc4kmKED2#pRI*F{ z4A=6axbRvbrmqv9|9~L7AlR+s8z-HF`8N@mpf++CoRdV%L${=b+EeKQAh7IRcqZ zHE)-E%bZXK6aokrz#z>fDCN5G@_LXYLK? zNR*RS&{F%gh3Ur*HSG=n3V($kuC42`?&ac?>H2fs`M>qKH_ooEO7M$O7a;Zvb)IX* ze|d2Mc+)PB3kMt*OAMb+R`gAla|C0}=0)s?&%@m~^1jL?ImhA&5%Z9T#ULY8>ZR6) z!gb3AX_M%2)^3oOC1O2~iq{BTo>yV3gf1HnGnkWsjcT5U`a35G zM+)X2<%79ZWx!o4(cNimRe%>R(cv!j!Cgk#>jv+tywkN2?Wa~r1r<}BW=R73wk%aaV%7#wPpj4>&;ZSx9&eFFZ6B zObmtT!0^1Gup(t#iuq((VT0j>BWA!7aNrMB*We3NiYGNeHA1{nz-O8im6OH$<6 zY-kEh3f&=`__ZtRQ9^dA8+;#*`i*)2?B3pbu-rnq>~ry+7e3jsT|eR9u(Crm2m!N3XLnjh{7|3v75Hs@VaCP6}c zuND2<#qG1%Bdfr~Dln7-EF+_iTewEN5&A=I9CQ#KH>94(@RT z6X(ORKf_gGey?w^sn5XbgWZWMm$Up4Nxt9WxDFvIP-0o~FBpE{NR6Waq$Rd`fopil zV0TFHjbzK;yRi~k;oTCs4~;{BpPTvvA@W{ksg`!!a({v?eOqqeqT;fTYTtEGJ#W1o z`pMS7l~OO&b2il%ioa2|Mlc{|{SH?R`9+Myvhcy(uXcNgl2l{DpeqDzIAxPrl#S>o zu8%)aqpl`Ckq?i;?0n?ypC3!?<08HIUIBoMUt^y1j=#ga_WtrZ{To4>rSlH$JXB+~D73P7e&P=)04t609}Rp-~2jTLI^{MRoAvg1Xs${^dy~ zY!S*rf{2-r=hu$hgN`K3TGT?1CjP}e;qymk$0-g()mOI0V~O$e$#Iu;v5C}X-qWH) zXwmN9GN0osq0y}avrjs|2OOOmPYOc2LaP2mr$4_%>^gn+{4{R+b{8K>RP5|YNKA$8 zt+$gtE4F07xgK~f+k-WNd>RfRf`k~3}pdW0ITuqS?F zh`aoKT`JQ;*%tJ=Kn|+V1nFoW0}5=D-Lkd$W?JHR$`1@Dz9FP!oML~nep!kL3FZZN z4BY@-p@hZB`XL=xKOo-{s!~JogvhewEf^dK3_f2Ss-y!0U@A^bl`INK0r<6&D}hhd zYE#1Cve{uieMnK;AnD^+KH9}ZeUPL_wT>al3xT^1NguL&U*(BoWOa~WUUA!w`07cd zG@u>_E_jZ`8RD&r4#MhcnjBO)zKdORn2SgqDWj%j(=3qPFe&upDycvC$^nEtjOFQj z6tQW?dkO}!KN>vIy~`@ITZy`Eu7;ox3|Tpz=jo30 zFsgt9wKfed?0HcWg+GVe6e&W@fsc`mH@{{%PD(%X6=v^#(^{@KP5m zeLg0z!1k3tuv7*R;faWcfr_9eSKNi+nlY!z{*tBPJ z!k~9>phUG&LL!0TrM^SBg64Fo!h`|)^HQ$VJI~PC(KTjI?@IvUK-uw??~$wGJyNZ2 z)z75bri?VC+vgmL9{EXEnzKIp=#U!}xSXyL9Gj!6BlF^WO^-~^&lhJhy}w>@6%|+E z{$=a2E}`{yO{@tTSIOW0`wfzoMGYsbfFyfmhv_cGCL@eGjv@O0+0Xs#st-SG9O3yR zk0tPAXv)77DTh=a_ooKF846kvMjdcy4X_mowOc?dzw`2Cf^5sqPZK*S&(moEgT z^&czAW=IRK>@#%@iMud{>uL&d@`#R|-jAG2vADI@ zj*xtjj`q*y3EGMtoXph|bWd*HF?4c&;2S$gjh>GG$jrxmo5R4)ygDoIc7?FFJtylb zvFw8q$)oYpwb_(Ane{Nul|bCK{&jjXkUyQ{U|{`YfatHEZ;=Kv;vb|+N0d~)d+0z~ z`=P9&s!~Iwth@^exB%$vEwgjcpg;Uml(#Yqe$q9>B31F`#((k88d&P5Kh@eds+M?? zhF}Od1coxVX}N!|neS(8=x-k-poT9!-~n%q{YD=m|7dhPy-O=qw51pSsQSf~t3Nf%3^ zFg3gL89CWOZ66eHBYSCG`A;|Vo!v+k{t;}U9&JJ9OAgww55GT~J;Js8UK71+rl$ML zKSJj0iM&*C{j-~2Ow+sM1*&rmiq1-k{JDp}&@g=CpJy*S4`H^MN&*#C!Wqmk6hCAM z5X}k@ohpICT3&qGf zZ--=u{|XGm+nP?>jv8g+F^K>;Mc6^`?mv+rx|r`KA)Ek?0#3vv3cynA+@K6sw5f*X z)<~M_uc~ZFHTHerLNe#9BU>)o1`oDB49o4;dV*WM9Y}AKH?3y!%wcq*gZ-aF-B|xd z%k3*;7lE5f58gH?cU|l>SOS7f56s9{OlHZHBo)E?zKZn%{~-+1I79Hc1`rN@Mi>Gu zu#-2@^8j}*b^b}YB85-TAZylM!k@)in#>7+mmXjm$!pKeRB|1*4k*Mp3G$T2jzU9! zaot>70i!5t4G2W~rMORVC5=}<_Pl)5*}JHGah3UL@dp|Cv&H^A1!PF#Lcs5(MZHaB zhM$UUt{bNIylgZdVvbpD@WKe!li^A82|)rEz{60=*6l8TX#% z^_2sAp%ANcLfX6Y1iSBx^V^;M8wCtMrzp>wqeBUV1hwl&1VLSURPz}+b(Q^(Hh*d+lN5KRSMW`zS2NPy(JQ**;fmWEzfdA8$6~jPXF3Mtp zN)N?H=#N(zVC8LBW*7nol_5#2Y~_!fc?&@^1<$Tr?c**EdRRL6QO58cyG0=m0di(v zepC`BATenFBe%TxXC|9`0YDs=5F73Wk>$xcp-N;9ZZcc%FtCG1V^I@Sc#sK(NfAVy zi9$fop)W_^+;}krcnw5mokc?~oxC7`pIT6W^IPZ*i^oCkqKQwKHdb^D2B|P)w#mUe z<+>s+f@=cq6Vl%#mW$E2E7)ls+IjqdXoo|e~`xN$}VUvI_g=E{_Iw~N}wMYbR}aLMIi zA)zVTUTc0>y|y8=j>zH(w^SW{suM(}Izb^~$vqsxXbIu>9Q2wvBW7hLVO^UFT^C_J z?+U$OVg2X|{X}7d)Cz<9!iISjh9$yAl@&$}69Ol8j3GaAI<`_&#n!xR9J6$ zjT|WD^&fo8J27Ei|AN;1%~Xw5*qRm$1pJwJu>1V;34GV2}oz#LitJAxq@< zMX}R9LuZ17MsNh#Dk3Iw-8R+BdrO!e0XPjkvyd2J!FoZ>bYfIR$g0m=!ZCclsNNG{ zGwNrZhhC1K)>_Y>#q1E+3^LrAMBHss+>9Xhg(40}B-Vn`!{)-PeG<=KmL$tfgf%6h z*U;B`34Fd_geM-e1OjoRtqYL;HOPQnVfPjasWluic!T(*Jc-7HAS*?boTrE}LH6!@ zdD>7inxU}&Dq0}V>})c^!bc*b$HQN}jzVv^xu*qO*4R8neJYKmVhI=)l!h1vCX4p& zLOBhIAj+QKav0^|(4qH5i6JQ5IVt2k$JkktFf2M!PUG<(HWT!aOrAtu&mqxJh(gsM zj)ttwzDC4&qM*Gfwq9*(VK7J-9esHDkWAw_B-n;b_#~Qm;CzQ|D=Jd^Hq#|=nJm>s z&X7o!?E(UipR4-sw8w(G8l*i zqhtVWcBiy7V%4QmmYt*nBVV%3;s?#>tL`9uybG$+B}NEH-%N>-Or!6~Hd`r1kc^Ja zyJLh5@5@ia%ZVkkjjTIKjO3?&FUYG_ofTE$NQ$r-FCJUJ3q}=5h(!nbk?xD7Gi}`g z;|qiRqndnf_lpADesStP<>}&&j4+Sc!~snSr+2<(ue_{HeiW7bD95FW#vBe_%0JY_ zAVMr?xh-wBWa5`2f^4rhpKxs>_)<~p~H(1QbQfowsiVGqROcq!J98NEV<5d`6v3{2{^(q425{Rjne3w|; zX0hFxT07`4&V$PgXi0z8VOqt>;YZ&@q2@c}JMBg93kG~a-28)4bpbv70ljP}`d;nP z7wAk=?Xlp%@oABs7m~dakjP_@R5B2KxIF;dxyuG{7t|qXHwW3I3LT(>>9y$0+U_T{ zFZ$~yBu08aZ1)}T3`^8v;6t1hLxMYK4+%_*4Y}+-&i{RhR2Udg^2H+$K^klLw-P(E z=_1o50WS_}2f%e?Sp5_jHH8d};*e~ykgn#ejyR}$50(b-Qg6n#hb&OTr(S%q()zvi z)0}?u|90lTNknr{fXpt)EC$J(TZ6oZAjV6xN*)qaAgLd@yP3MXm8C5fD&sB>=9VJz zU5>T$u6S8{;(12~qnaAFB``=9A|_UQ1Polsd~VHu>9b90Jsb?U@3k$F%*l`3L+?#G zjJ|Lf74;-wG{0AU(AiIyxH5}e_8!{h46$axSAp?RgT@nY;4f3--*AlC23lie=xdbk z@B99z4UNB#8=_3E0+_}hFKN6$)awdfG2b?HFvG znZy=P(WU?q+4rtRkvPk+94$;VwjMi+%7&PP1y#Sp7 zgbsmX$2D88p;dYTp{gXlE!_M) zPn3o-_-Ti%xI$>uggl_xdNn5e=|NMba%iVfa)@9vlkteMBu3>DC54g`vT982@P=EF zy<9Hz)r?2fez*7>v{?IU!yf;V!c$6-hd6tXmHn-ag2>C3lO_%qC>fC~_jr?&d{6}w zE4oEQ!@&xn;|dWYU(~}fH`}bO+Axr3&`j-KmvOB>t+Ee($V-k~O6a314#l#=u8PX* zMl-L2iQ-yJT@{pVb)miDOj`srY4{9G=EBR$+d}P)N9@lU{(6JlE&M^Yz!y2R ziivo%=aA#L5{LpNP%&h8-2PNOGNuc8We;t*tppoCa`8yBra*Cb;U%`THP``X_6u1o z1xlh06q8B7N-9VPDEm03_}pwUt0D3SHViS5-STmVHa$n~u4(R)5GRHv%y|^nL!TXS z?C~X1YO~GChe%~hzUh-{z1ZaHqa4N2f#z4Pe5VY|Dg&s_NJo8#h>>7pj07giH@_o{ z^2qvQsOxHnVOq4UV+y-3euo#$b~l>47bS2qC}l=2a_PkM#>Bsm$?PXAYz%R&0q&_p zoah@O-z1sFw~gJCz_){Rv82QW5OEZ-;vT=kziqQ@4N4tqbCZV>!GMMx{(xFXCDXe< z*f)B1nDdapHbUH#7)jDsb?-mHU2X5}ujJby?iyjFGN0-8fEAVq5^EQzAmk8D*)Y$D zwp8FY%%dwcqRTQ(`5~8DmgL_QpA%eaOlZJWKhh5xLlREw2!J!zNi5^ait9FPjE#6DH&>d zr7_-SIw|ftVk8kp@(_&`YTZG+QgWnz^Va(DAm^5tQk^zqkE(JnfIu~iwu!~srZh44 zG~e`X!71s-qf=~9>{7C7nRO|_BKlha(cI{iXdP}AFf=)?E#Lyx%y;&p^LBI{2-=J1 z#MYqSpbaU4#kQ*CxR+&dR(Kjuf+|Kd3VXXDq^DNpV1V+RY@9q8a0a#&2a7_w&)OWvd(t$QZO)3o(aM=zR-_Fofev{Zp?El%xJnH0S)2|6st>0HR2dp;i zk3-pi`cFCz>6?zc^V-{gIzB2= zG)fi?@|j)ZGiL|NV^!yF8~USMzk+a%y)+9y+!s9-AZND zTs$3c!k3zFI>ju9oTBof45<()SkOsRt!)!vqa}s?x{~kyL(z9D+&b7}{DFXep5~)) zuh;oEYpBvgs@xCPMWRZG6V@#ug;T#Z~6pWhPU!@mzIoU4n{1(2G z$!!H9GsrXDxtaYpStk<=h0?6R?C})mz0gA#q^myl!S-K0TX82gauZ zz67SsFaug3tW^Wq%DowXYt8BRxTX0Gob{ZwebC&Tt=#QFNif7MlUrJAN=G%YKi0SA z@*2%3Q?j+K>VXx#8vG5rFVJRkUf?A;%SuSe;OB(L!r>ly;OGx-7gn?CMj%9v0}-Y( zOU`QIGL(s6ICxq>tvQ9qw@VF$wm7|ryC5(|oyUsJ-y#3ZA&#M-CRTc$5*)Y>X#)4{ zzTFXTnAg`X0P$aHkNDXEZ+aMzC&P;#Pf3#fpi0%Qp3;_6&6~)t9qmNXkCi$7{$E7{Bl(E9M4OIvRwyvt-5q9x0qzmo)$yb@ACYP zoGb>Npl9to4@SOqe!cIw+l~94sFbUOc-2TO&zxN44@=kFqEiQTahU-Q_it#wXb==K zExMwpV0xW7n)6*6wc)xzIhVrH`yvM1pDFUB*A#!%Lh%c^*!JKLz4f_2I9p}rWw`fR ztgn-f(<~Up4jwfI5TwOj{eQ9#B294Y$39&_eIzT7so~sIHEUw~W%MsVT%U6)= zk78VS-0y5DH-1T&@yOHqhEFN@QD=<%@A!*Pp%3Q-1s+a~)+9xAlPQ5;bDLt{(p{5I zvO#NGb^NB5W>A*cT!8zDYT|rKK4P8{F4M#tu$9E-J|%oII7rh?&i0sh1DQ}g<&p;j zCzpWXG_!pK+X%Ly4VRg5ldNskfF0wpdYE*`|A3^c_>J*l!Bc?tDOhHLsLG*p?*&$f zg-IAJ&UR${6|rb-${+R@nQEJEt{K`FRjEmpwN%@J}>f zM$4S2D~?^G-%2ld8z@58hH|`ssMS953#4O-C2;QN8Z^Gy!6Bl)>v2$=|!dnLS^mEU)`ewAxg?v>}3 z)d-|=X(QIeOD6l#Tj6hA$<-raYRr$Mo@^*JKe`dr@B=^UxvDIhXA*ip`|-NsrrOja z)2N2*;-8V58eef&ZpOXKE;(x3y!PwS`vCMz!Rg`Vbr7dn^npSlSZPa}v2fCb$*P<# zYD-7JNF`M-=Lu{3mhNpu^Si-0PkD}fy%kT*AKuTY;G*+0G%vKsg&kH%MtwJS`}8hv zET>YbU0liMmSyp7&U4*2em4o67gpsqJI{5LewaTzefk8Mi>tm7CE=HMYE^BTTa$gq z-@3VQuG+=A*7@j%S@)@R^ZoWpH<4}oDF=(z%G~;(zAcB(oVMLamWGJ-ZRg+OK;Ldu zW9-qkE8{EML2zDE%G+A(nZMnr%yBX4hLnc@*Fw0uO=DL3j#smxJqVlES`4l9zQ*M+ z#mU(AROzSRc7lz=Y(ri|#8`q+BpG`-5d;NXi+m4@iKPYyu{|q6#zVZc@-!+>1 zCiGsB(>fUFejOzfT6E_0eOdX%OuI~A?QQ3uCCWXEM-4tbXU_i*rcm08n<}~lXXp3* jjM}^XmCN=22-!#NdkMdaT>qom%^&#hs8NgJ@){z0T{rKG*lYf4Tnz^E#f#@pwLuI+^=^yv9cwu1LGky z45D%92J>FLdN=m;W%Pmg>$irp1c$S8k34_*c6?%Le=O%}->nmsbrX|sZw}tMHFS4( z)Pa$^kNR%jPE5%P-MahEy(i1uRvDRE28Hf8$W7|$z2UiLgRYVJp8bakkCxrKJ?gP) z-FiQE)An;~}FJ5B0J!grtBg^Gre8NFaVrki_v1gP1 z?9eM$uV>^4^9zqv)|_!$xz=;F@3rfLJ0tcjv_oSL@n66DG&1`5Qb&)W38UnAMS6Dr z(c>rQ>Kf}CTReU7n(6Fry~we%r{CLm(~+X%`Qel2&tAMKEr?UB`Gy) z^ud#s3zEVT(ZKLMEggMJ8~c#0J6C%7#KiGduk+isYtJEG^3ceA3oF}(vu$k`J8$24 zker%*_x@ONxLHi%&gb0_uph@xo}?$my?hh&rhj6 zbN1NrQx_#YXIm~-RMo$F^TBF?gVXYrn}fn_9hfHOHXT>`a`TIX1xJsGDkoo0)AUT{ z&9_O*5{gb#8PBuYzB}3hby>F|z}a=B=j!#X?Hx^u)^v;}RpCm8hV{0Gy$vU>=Fptd zwcQ%^osCJWi-ojmeIR(D)8iLPf%q%JOD0&lw#S%$Z;si~rF~o&=q=B@PVJVf{iG^MZ{y^`N zjvoy|Nf?!aT9bgA?HkarC$ehnYh*v0t+yqsjouskmkYFXOU@+9bK5#B=9w9kW7d4{ zc-bZ!Jab1opVPLNzlTCqtdER-^{QX9^m1W9*rBhNH9JlC;m?2N;KTzstc>wEZZ{G_ zBdRfNP=Tz1*;t3Fft)j*s5CveoJq$Is5%{M>2SfTR#^(TcrB84IzgvpfQ;$Z2$n^v zXl}Z=7+p7x+K$FvjLcDLKdK@UB+(SC@MVdr6plWszev2Ai<~EWKhJfeoPD0Ch8@#E zTuD!RSoCb)r>NQiW}=Lo_q0xisRh0=18dUDK7#DHSAot7Z7D+;eHus>BBzAvESy$i zDq^$fdfUTmuAM5ucI1+0%Tx`yYs{zEPon!4lFC!{i;V}4&Qll-iX*x`eMR(Co?&pj zB9V&L(31BPn)Cv0tb5f7OBQ8{Urq^mU2#l~hQ%%rv-$Y;4ljfn@sph_kG&$1$gUiq z5)`m*JY>HxbGi(jQ(8;aQ}F1-&XT3J?P$7%U38{tpwDEd(NBfM4qe>6h-4w@vr?ao zOq{M4jns=sR9qq&1kDd)Wi1d6mL?{W=DLb{JLQ*ZM>ap$_oE(tXF2Y!FW2zeqCJtq z?(Ug$n?7*y4~xV-mk`$#_2)*hXv4Kx87oe=R=#`i9^GKZOVe7KX-U1TLCW}WU3&%F z8nMYNuAz!5(y6G%v>+MZnJ%5 z)DFJah`iD!j4%2|aB!*dUxNig3$woiL;mx?BWzRCB2BTE0W;tt& zgxH;mNHWKB)q`!jv>r#$+_Za%Hn{@%n>AVSDkSyB;nd%BeF4&P0`+a7+I$>HakdFE ze0IQ@V_;9^A3AXup}N&NHtyc1b+%X^gSstrk4V&=>Xsgb!}vjGJw$+au_IG)<9tp0Q+%3ZcRoH%G`scH4L)}d z?ZmfEg@uDuHbq#tT{TQM>zW5*YfZoE!7+^37BjQLF?o>I_Wb000@e-LF-A*iaC$;P;ymCFvns;LL!F_9J@^Nh2AIa&L&7;dJJ&c)OHEY+e8N(bJ zM0OjC?0Be14*LqLrC~+b;U2P-ktsBvxT9r@Hk`sVgGNsorDRLJP4S=O~s& z@#Cg?rtKf94gJI3AxUQ|Wjs;A3}1y++P3&Yx;J9HfWC8`=}MWX+eeev(H-Zw$`x)K z5S@&w*o5b5^KVIQD`IH=;#_W z5q9nhR&-ip<0N7m!BwR3aHKKLN-RZywVgqDm?$bqGfIRd$c>Y>QhVphv3u0vmGN%t zoqmpy3>PyM?Wlaz_qE?BHl^)Mmbudu6*1{%5;xL%X)Z`wgu8@bra{0`DO{?VNZE|r zNfVU|9)0<8zGLN1_9NNN--hm9xvz9@ zU;TXB#7^!fhlfvf_R}8zVR3-)>TdPwmG~7xqxu8vL~{vUO~-ZzllAk_v`QKw|TT2`yff^c(|yKvQ6tlhVjwG;ejlZukg3B z+Mha?t#ihBORy#povO4K=UX~Q8nI@`^=BrF+;LuPjEsc#VmwXm=KhnBQAK;t zc#F^Fvwuyxu4)@9xcT{%!>?CfIc>w0o`2MA{59o!tL@JDn}3`>C=6a~!HGK4oQbUZ zT1r~tlC&z$Q(-Q0#UWrp3a9;faOc-+8!s6gzTE!8E$`cngTM8T&9qN0Q2stx60du5 z>BXrzdEZAaETPwPF1{fv|G0PS(wAnA|goe<+;R#j0*Maac?d8HI0hsNJPI%h^cfts6L=J0 z6fhJh6To!CreJ_kDSCQxR{H{UuHVRBzG5}NDS#@FDS)H>5@%pX08L;};8CDb07{_7 ze|S_%s6eFvmw=nVqrjkmq=2VDrT@UF6i)#T0X=~=fj)spfjfag0ZDuNIRk*Dz?wji zz@b2p|1c=<>EBpd1ZW3X3F!H69+hG!P$`fofT3=XN;3~i+kf@HXk(5CJM*jmt|F7sNRJ5Kgyty=4UAHj( zKj8Cux0#_(r`m_}uAjE@5E>E`K|wArzC1cn^(XzwMU4-9vxi3_T_xCGESW8c1*PmeO2e+C&PVIwmn>`Are)9g9bM}dowZKNik)Px0#fu=jJWimx7>~OscnULemI}`^ z)j4iKi2uHOTUgjclT(F$M~ZR_!ufVD3PYRil!^mtT0;wW-T6j6x>?u8sA%7pYC!?M zyZU7*_UqP3CT6ji3G~9?6EVGZFU#^3RJj;jL^ghR*7 zjt|@+ha+S;cE`Es(2ZdPQw@ZLqr(uuk2RX^D#2)b@f!`}P^P#>`TOaT2Sa{>`X9w< zMg?z)X44YF?79ib*E=<5IyYDyWpuB1H+xf|x>=L@-;!3qBc4dR@IK3!46>D~RVeGU z*j4KOq;?Oy9*7O}4UP}Y9LUUS;bPDOC_!q%KnT)0|KEiz%yF{jfb9P*bf-#D z8wB;G4yJ=k1YttI0mX%c?~pn`(A~d9C$)T_IH||`x77a9*>HwbXPNi1rA7}#_HTtr zP2Z}$>p*JSdQ^igMO#5}#nZ)7?ZVFosVvV>b*f2JlIgs`@J8#|5T2>sM&ra-K}{Fd z*T8h1z4#TgTDjg{RaUw7Zc*5R;u|D&`aRz6gj45QnqT{;%x;-_^uT)llbraO9#^^c z#(FS^E3`bXw=_JvD$rX|T4%`!>?>4!e0Zx}Q|HZ6JO1gfMrU6YWv!^azAdV0`ADT^ zW9Uw5^H{&*v)JKZw{_o*W^r&ru~1+5#KoQSm_U1)s<%&Hl4e{^dYZm4cd|Uq$7aLd%n8M?P_|T2@Jj&>oT!&5vv9E%CACPU5KavYixGyxzIOO)gaq0 z^wmihj4Ibj(IuMEm1`xc3UM-Eh`BQJsTf3vjoVte4D(Zh%4$f&C}mA^vZPq{7>CUx zvoyw7_&otJFHb18jv|OE-js?-G*#sjiG$=X}xxJCVi6 zAR_DFFXHCAvXcg707(=L53W(~RiJ>iyBD%-t3^z7evbnq&TV`Al^U+^;!6>?qOJfDoe zfcXiU0g*^$2y+VxU0TD^s!PqxgMJV50md&(S`Z!#QkaO+Fb9PEkJ5y*+^jiL*~5ee zk-|v+XC6x@G0f9{)CwaN#xTrW=~RY%M>lwrh3C_Pe3}_po9BE!7l{SPmAZ_7XcMZS) zp9(g$u>LRk{$JD^Oa$eYovaZqU1lwOtg=-oTw&vBU|e_d45p!^{xn8U&PGFtuO%m= zpsGfii*)z&_9dHT*H+YHOq6A*IE#509BKACO&wV*e(dS<7x-jFMU`RX0!Bk7fj<8U zmNpBkE>!by*K)PR1oAS83lE-ZzovBc0$Km@jV5(;S*E68Q;f$sCC=YimWD(l1&A7w zvfRsK)@=Hl_n+a_;C0|nfG2~Og~x}tfc_2T1FQycwsl7ov~Z{(C<=f!c(n&lo^R4Y5^@7KNpbH@7*m2#zk}mko0b^ivKn@A4H-~Nr zGXlCRAfbk~u5fpNnlL4R&VjBAPXcfUPNhX1X7S z^Now}6B3h>Q&Q8?GcvQX5ln7gUQQ;qps?_8$v3$Kx+cO|azY)=xi=aYpckBr5iRn}|kLUt%VrNw`aVf9Wo%@nLhX zU=vLPv_tq#BxIh}5*vetit^ZOpB)jjaK7tq!(biOt4ZfHRjO+=%CI_e{Ww2-p*wXP zNtTn>r*X-jE4@~El=Q^iH>nxU^S0Y?QOol6se1o!G4=R`b?pr~?F8&!+`y4~fjTI< z!v9fp@B={+fgOPNa9Fwwes?ekkcvW#+JEcz;P8F02H+PSkG}vf0ObjF03`;`25$xr z4}C?NA;Yf^B?a>wl2GV9P3PO8Gj;defWY){VQDfaEe9S1o)qRSU@N>fa4l3E)EX2v zMBvaMp}3$aLd`<~L(77Sl|C~JZKx@Tg@J=%wnKO;jap&6H#N5bH$z{7Xcnpl*aHd; zYDJn#(+$l)K2YG6Hk`i-8&o81zo0RQl7UfxLO^MtB@i2wGzbrRGE_B43v>l`2b2cV z0u?|dOB=P+%7D`Tsbr{msm%b@NqZ}Fa!?(pM(QR&e(OOz04|W%Lm5Ng1SLo-8I%J7 zHb@i7SZX0a1CaGg^Jr-2P|YAGDCqxd8*Lg_bifE7FH`0?@i4mX`CkQP+zbs%pT9Hb zEET7Co5F_Yy+Y%)3+3!q8*uY9H}xHj$un4Xn6Y5!;k7*{Zy=PzHX5;AL7o^#p{e;- zl`4q!XsV3jJ=G%>D`zVgwoMxk)w08gBuf?sgH`iE47RJkP3Lcv2||@ZXv(Tf+K1|t z_ig2JFl6_Nuc!p;CE=4da{JfO@az&4!Kq8{9kXMy_@4M+Rj+kTp^B_w%Nj_zjT-@n{>|8pM zs;yLYzGZ(xmdx*>ESeH8wM&VWQDq@WN#p3u5h%{TRyigT#$CSf^EJB@r$`Qu@a4=9 zd<6;?W*vB@-7vcweMHVrjaN-y#KkBdUDk<939K5&5w;*avQ4jyL=iiR1a47l4ll!) zVIt_uH42-bZnJ3qIxAE6##ezdYR1Jem0q}xXIp-s6i}^D7yS$uoo~Vw%UoV@Hu=~x zw@w^h8(Op${hQQ7q~<#saln}VtILB0mugO0nxHulA2eQ280ZXCC|v-7)Ie}h$55*v zM^GDR1K0r60s@6H2DQL2fO41GW{$LQK|NA=O7#oH4XOlffsjFPpghno)G=raTq_6# zT0aODN*^=}dXOp_-1%R{{r7GNiW}qzIswT_MGe9LU4!2LkF@_*_88~sOHj#QJ^OFh z3XK310D}E%2y6<5CNA~Cpm$IL2oqEcS%Xwepa-dGIqp>Ewbw z@Q>bMO8m8rIetpo87@kU|JvPvz@Y^|?~p1{DqiUz{AY&*igCsW8PtWs8(Es1g2H4> z$!s?0c6Q&m@g`i!_iTyw0k`Fu-j+nKYa7cNUWI=lE6OS*fn_4Oa` z!CW609J-C%9KJhx@BE$nj~+h}Jsf-XymwaW%Z!aFPbc2JpLjd{>GR!>e|-IxW0&?S z`FHNSSF;NeFT0Of9ioiLe4ZFM@kcrZ?fZOe=#vQf+k5ZMX?DsX`4#)_jy8txJhrm`&dB}d2%VJ|vsNq`e%N+k{-YcH>xUj+;?Djh z&+*V09P3P#kq(Lf%8L#n9T?lcOBSdEiWTtWRP|{nP^eBA7EpiE_z3zYP2UuX5?&Ij z0!kC=4ayffKQv8fxX?ghh(J+6DMJxTBO@u9LT3Xj$$_^5E(IchK>|YsiW;6+%DkWq z5CODgC|PMOLfL_6pgQ4^rH%HVttM0pR4NR702vSjlq?Jvs3I5*(ohJBTbdW8|Gl<^ z-V9P1=RAKUoe2M!Qt0H;v;<>WeuVPIVPv&fKEUj4QDxR{~w+fzzgIF;)j_jRS$?p>S;j`{}CBUK?vvvCI#@8 zbWaKT0}X*tq@zn39|4eoC_(jLIanZR7|&Am!5R|)ONz+c#58_VM)|4QydxzSFJGxU zb580`po2gkft~~n1+)x87LF@E78>woYhFo|v-lso&WdY7`K5I4G$9%}kFcyaVQN?y z5vlw4hSNY{w7+2Y4Hh{qcfe&_^TFWeq0afyLTQ!*a9jkr$%G z{Yguf#g2=)^1G|31bM6-kGrohabO&soqd6-t7y~Vq(&jd?r7}){^fMz_0CsjxUUKo zOd770K@^gDF)L(b#L*<|97K{xU1t_z-h4kwmWz<;a-C&3%C@=#9pw2B8Hi%og?jYO zp$>|^Tv@Hf1wMtActztqeW3k=h4Y?^h^=h>* z>LsnO_851}Zv5QWzwZWRZ;&gJH0E#; z*}ST*w4bq&GqdUKEu~qTkV|hd$hqN=PuKNFEEPpPlsHFGi4s+ASaKOj9FQ z%(B&Gu5-Ak>i0<%nafG)Rc9CjQ{@s@8Sf>=t znZul^5+@G+La`f_5o7x;1fDZ{?MiPFg;PKv+AF0Sc?2?9CnyBha=KMTnS7*egQ=C9 zqrECgQ7z8}sau_>Z$n2;Rk76DsL8lo8q*>oEzyhW6FOXio{lhBHa0(%$UA|$w+I+_ zrjs3i2I`NHx)Zb+Jp6_+%_7xaj_;t-A(l<=Ttc}k!f4Etdrl*Mjlw>PQ&#lq4Pp&U z^R1k@c-6peDhY$2s4_y3NKn5br$9<#VV&#*YEec)@buLl#a(C(jmSgCgB8Ao7=BW( z-LB(Yf+Md~A7-Q_Pv#X|(m!EHAbSL3ks>nr1>?}CKHrIlMXI0jx-)lU}RFLes zLxdBdxUahSM_!^RERU;&A4*!t2%!w+yT-3EPS{)%O*2>PT}4p#PDxTl4vV^JM?`ZB zw@9KGR9Dp&B$reC`{oIxaEe*iw|GzvOVRP|^&||f-5a#G3NhZs8t@w~P;fqFbM6%@ z!k((F{Rh^uM1L0g1lk0ID-As1VLP@R1_s180aS!+fhQb#rTv+*BgaB-Hz z_^&u---y80?5V6rm6Lodje5J>=iH^pUE9|8QyuUU@_qqEos^eKwb2zShhr2M^AIi; z!BfO|#bNJC*MWwQq;YwoTe>DKuJJ@RWO;(T!JFcEDz;~j)s96CRg&U|B4U3!f+foJSJ;H+Sw z(-0S^8eyA=oox{*3MohQ$2dF{T>eLWW`l)Zv67E1`b#-dWa+F#h- zidnhq^rzAvKlK;Sv<{>^R@&N?3L8%QWtqQqPr`;%HZT?u!G=@TdCKQj+wF$af1Fl4 z_BufE!p#ngFO4Nf--NEZ5HfK3OY_|1x4UwFY#y`tv+ZuuyM4DD{HIU<8F=YT())PD z_6^AVubnAL)5)tAucw~*+Os+7Lw3&3wY2%)`sO8lJaQ{;HRH^;n>d62vB~5k^D&nH zGE)Gjz$x1^`W8!`$oZ~(|a(2%=8A^~wNELwm$f%}AIyEQh!?ic7B z@EYtDU^kF3fHmxO0EYbnLjDSYYsCPqkarvqKsXmtslb%FfO$|zW1Y;!No&zUP2u9AaIL#OI+Q6dYY?`Rvai|Y1uPEz2tAs$)& zvzV*&d+R_aYD{7$qkiEuGz#zLmEmNbKgQ$sZ@R;zW|e*H<)k9|kzI2`*fc6-kq4uT zvh_hB&MIQDZx?wl=&|ndUQmxBmE*Qgb^M$L)+{1?h$r8lJS?R-u zTq0MIP$(i`3a2p$hFU>&AvqP&xR_zTjQZwKLjghvYL?WsNDQO<3<+~2eDrDF3PCGD zB9)_vg5qV_gWFMgpUp1Jh%J4g0?OHip;qKr%qU}PwJ5AJM!fF0<;hVr~RHLxbv z#a&d~SY(%?tWBSi+F3>qE_4aKQ=w&8%*A3i9sSTF<7h>2qLCt&Gc%scNX)S9YXtf* z^H4H={YEb(tp8QNECK2m_!Y8TmBLBnWFda zi(4ON1hPKK`d^m(iK8w>Vp=4)8WEpjR&j9j_TzL!!o3-X(lFX^_@d0jYI)IiQE>_s z8Wv;2q|sef5wxL==<|YyqbCxR#{{ZoW3+S*RWcWkB=8^diBIl5Df%wMC8Sd6{qs^w zW~ib%GuKtLV}-mw#CMTtx)-w2e+>OCv#8bbIR#5iB0Ur(JCMeF*M2Thdw;HNj+H(q z%v3LC?9b-;%TSVBRUoTW33 z^B<#IIQP=t*|t zNFj4)`v%c$eUI7Lm8U(JlSsgF4$NY*8%_rAYNT!I<$bJDcUOrHq*PCLYgY+ov~*M@ zihc~9?DJRd?;M-5kx^E=EA2E-%tVaBCB))N>SFC6xaPwtgwv@>*%@W8V#A${Oc@~- z&K1fhClQaS)fBEbP1#m5`}BU^KHUn@wQ&jV=>VUi!Cz;2tQxb8!dY81boSUb<0Ksv zO>&!-M{>- z=QN|oNUBdUmaeLvkrafKZy0A2fx%@DBqRw~2r)4M@g2Q;SwUZ%V7^1^Nh`Hixw+!~ z=j~y6pRhEuF^oE=5XspU>$L&P#;b~)$Q4{!Ui6oyvWda%%z1vid_m=q-b|3ML}Z z0<2bHa|@^d>p57G!hnRi2y+iIC>V_}r6B==5eriqrlWK{0T~U9JD7FCw+9%1U04AZ zKr#j+JSVpRqA&moU=u(A00JqS!14?tV89cY^gsrH8^AA+n*p-`o4{O#kq_7c00N;9 zkPDy+3}9duzzskWh*5!D0Cs?D{y_>r1c=0*I=^@g;~Yo<_yV{Ecmco$&;>XLVl7zT zLH-75F8~ifgp^re{|huBWgCDFz#HLMjFCBTi4=2S%mbjn@jn0tAPX=CfD%9gjB5y> z06c&eg!ZwsiPBA+a9ymC4kSpx8SLP#Fv@-X1K0R$37;)=9IR^icvpY&!F83sL zC0xr@xSFS!bT&Culr&O3ka91hd8l!?XzcQX?B}P_pC;bzdwDbQQOe_j7YUzhUm??H z(s!mUe3$fnjTh3T5kC1YaLd;cbU*aD|TyTLwZ80={Z$z z>h0{ckIbK)U9i2pCf~aaCp(Zizp=QDl}8a2IC}1$S>8}z?IZ9#qxfO!zu82XSUrnV zXubXM_130dMC6q6#iQ-)E3fjk#{+J(?L9GEzNx?Tt=5`#rUquhw@-Sl$HM4A}~zeJgf#c3nO3W^U?=CWt(*3jv*JX5tW zBrht8HKfwYk`HZZNlkkz2zOn&C>L8yqT#)Ggv-^&ee24(d$014HCyyhQIdouLvr?d zmZRFx{h&YOmzu9{xV8ot2RZ*OS)7`Fid53E>ok@2rm0oU6C3Y*)Bw zNAf^w{>0(kHBoLmy_RiRG0(xqco8G=bhPk!e%kHy{1=DUC-}qdQ_$hCqo0oXX9Q+H z$gw~dqMMgH_&6PCJ*cf~;JSU4N5mS@H_?3OMbVA>y$<*|`Z-%Iw=erqX69&P@6Gh# zZ%iFZGq$zVHJ`URmlG0u@eni6b*aD0Aqi(~{094VEF&8Rx@oz!tHYYu^{e)+6O88; zye>4cx8nBj_czD-rEO*fx#<`g?`=AeF`9J<4veqx6Z(>KpXND*xNph|TE5LQzKfT9 zE7c`@WodaOm^yHGnK_4{e?miAv1;AugE44>&@*6dx)l5g?2f_qfjfh)1kDt>By?M7 zm(XFM%YpfTuIk8I9vS_Y(}Io(y;8bYf?fo>AS(=n*Q)by^30>gUb_Er%w@8Mcnx-^ zHU4&k`uzp6n>vqPTWu&buhv{1{j4H?Rf+pwpYDv*`ZjHQ)TdT;<20RoQnmk&?W>zK z2KggZ`^=p(c0DspnpZ%3)TZ(Nf7y?Osg=Sv1xB2q=F@In+2)02Zy&Un-@19@!v4-H z^LRgWen&3)@T^xjZ}ZLe)=w`74!fMRJ5)VAIoh;+?yiUD-wK*8@1D6Ee`xW@#}~J2 zH{ZH+@yDOjPkN58x_s%^kFTFzKgrq1otc^WV8q^osN0V5uBnk|d^v?mHdo$d^hpA? zU4NODqM3-xQPx(YqHA5f&leyiRRM72ZGY) z#gCpWre(RUCVC2VhlJfl1}Z+ZIIZ-6`+un~(a zxA`DO4Qx70NS1Yx5>2BBGSb**)j!bo_R>5rguoUdGMEE$9~-9{;j47MeN;@n z{2RNNN>W1tyKppdETe;>5*^Ly#2tpn8kf6xPy44k4%9CBRdrp60h_TLYeTXjHe3GI z{yea3wm+uDc|g>|@(p&dL_AOQQ*X@>cT7t>a5LiQ4$6iH;$}p&SWtu@<~DQVn;3ne4$h# zG6&c=s__G4Bj->1SF3Nuj;i$5RN<*{73To_OB*6F*g%R z2`Yt5WXG9iVDSFfU(=5MBKY+)rm-?jhZv%GQ7Bc{s55u7vxr4eTtC(K!>fGk_Ai-=2GpNdPD2`BFL04)O z%&TD2RJ>FuECy9$QW06g?O+D56U?~IWE?dC^+(DI;2;|bDco#I_9vhEEocg z9fpUl$&*c+U}8~Qq>8!nmMV#ANM5l)3%_iqYo~gf9@T%UF=E6Ur?@Z1oo%?2b{UT{ zFycO+OKXaWWhc$$t!Az#WTKe;`mXrTt~Yp9dkWMvdbLlr2;$W%O0kg>PS>y94DcB~ zCig+#nB3UYdCv0K>o;4gHa`?c9O9ag^f4Z`sWL-i#MU2?)g*VxyGVG} zax@w2)~U546+S$4U17Jr>uh7u3Kf(ais3rlj-?>S7G|CycTCx=Z~O?l>uUVYo!PLU*XP3bb$mfSjY*o#@`$zV)O{yc zxB}~>7Ug$y#&aEQ-Jv(W{jokbg6^D04$M2TWP>1ES0OTgrPU^>osK4%Az83ja_Yk%ujn zycJQdn~r%|k*e)SC0_nR9rV^?TkN3 z^~zazD6M?7kAssr!Yxz!HMug_E;~q_q^6D%C>4v49zO2`#w#op{oYlt=2|QNaoZIu zF2(69>TxRKl{!ZgDb^uX%9_7%p09;u#Yb1DS-s+o(S{LH6sz}55KlzoVl_MRls@k8 zo9l3o+;A3UINoE+hK#;g^0^XYE>Q8(LJmwv)$!n?7Jl@>bFto^QAt+l9DNbiVXPB( zDWWP^vtL2BmnSzM;=5ucPmozHz3c%VLooK#28Udj`};jtF^;ZaD4)jUcSa%)KS2Oc=44~#mf@s9UWH)i@F{b@JaaV{%hIYU;D3m?kTw|w^EafsHrP| zE}P|u3q8KSx9D_q(i_KDMytN{ZM?Lv==`r2b~2Ki2Q37Z%Man!<}?fXH+IWTiz6<3 zG8G4C2@6Kq4`d?Sha=}5IC81QP5*!T#vLU0)j) z=}eutx@ls5PSoL&CGUrB?2=Wc@=*1Mx%fyPNqvAvvGK(9@BWS2if^~<(ndzZmdsFY z^zyBb@}Yq6SNzL@ z_=!aBWM#Z;2Ubyls7Q!-IuR#Yv?CuI7J=B%RECxxx^tEKVG-w#l(>8XGS~M|mNox# z7-u04A&lX4_D~UHE`FlT>$G4i6oTe_uddU<+ZX=3lzb2$AeZFTPwa#c{ob}CUK9JE; zn91&2WBeT<1xG!S?=j$xIAbYAR`{ii1W<&P$WcEi}rRkRJPX}`3SLeJ* z&H0&1{a%>;OG7~Tkb|cQh-3sGBfu63DED&Y?g_qr6;SPRl!uGjX( za3I5gBcP0&{I!QR0HF`xeF$p~@I2rbV&fCGo!A9t23!y%89siS!MZ?J0-?pKHNHzW zE@QG?;h1P=RpdW*2=*We{mJG_7r@p4pnhXITinzF)D8&;IG+P;2Z81{1zLuI#eiT0 zT#cmr8tgm(Y)sfCS+ofWtgup5wbu=BQni4bB4rf}q?#ZkzzgIlrEzizzB zQKaZZicM8Q&9VAgaYJL%*>iv2cwK0}c(L*l+<0|g>ACvXjo0-X1rnqrW$5OO;R|O* z?mu|=@NVLhM_0z5PP}+Ing87G^{ckG?=sy!eEy^R_4Jq0Pifz>ekLPRvt7k({kYq5 zogXX3WnC$`BD#(9e1&p@0La&j1yXKK0D_3|fVkYa7noLSj4|^Gd-u563&uvYj*!EvY z73*C}r)J;+`x*4^^c4HwuiY4y{mBfOC2`djjyJMUYvs2lQL6sAM!7_B>|R|-*_zEk zD(CZZ?zfS~)b%x*J7q3B!zh;C`~#i0Ay;L6_TH}+k3uQSM9c7w_dbV?%n3DG_${W) z2-#)bHpcxzpMGjymU88x;H6t-R<7Z0oizuSeO7s76#dKVXYddCj{)YP_daf3fEkJ& zvlg4#rY4m4F3gN9K&w)dgsxSBBn{=4<0-UcV_jqZxdlQ|jw!*_u=@Fo@B(u-C)wmh zVaSoKFN(tbG$qA58jDhqh#t+b;^@Ai7sqz@nS>pSD~}2*iJ2mY9Z%$ctSm_-*@u;7 z1`HWuxP~=VNS2Sg8)T_s37ndEu@D|*+p8)8K0<=f*zgrAv4vVwTG7)-BI7_>6{$K_ zCMO%e#JXbC^hMnIR;@-(?U`O>WeG_a5Ex^!7^$g9H{AZVSQBM*;Bn4l_Z#l${s_lt z%SCk59!!4y`UD27uFRxG&FMPj#0ZIu><-vf=yW?wwl@+*T*||8HlJ{N%HBkRX-a!t z{QG0ybX5w=qh7m8Wvzc?x90XZ1y6~q!g9yppTs>pqtXw+|EFWR{2Fp#jy#sp;*`IVr2{9a`a&RdJ|6T*q zMu-Bz3&WZbLPj|2f-n#=zZh?oRRLkji zGob;2*M~lZ1}q2RFAH4(ULQmZ?q8adf@yU~3jdasJ)=FX+t|A?;**b4!d@Xw_}RsR6X=AA zo-9i_M*8c6tX<(xP3E4`&`r}XoqTF+65pbmp?fL(nUN*Gmz-trcv8>MZl7x^g7@wW z&RS~d<~Ae1P<0a&lHh|zz2y|q^TWA})>Hz{D@Okadm-d{s$aQ?;@r`J5CuJTJCcGK zU*vi?@J^8{B2Sw}F{VG+C`X8>!tKy53ZIF`k^CgO(f3~&(=qudGi6T1v=LoK)zlTc zY2nc1i5wzVg4M~6cttBx@2oCZ%%^NaaFQ{)Y$YYnlwKSA{bX%6ak>+)bJ}Yja$aG` zsWLOJZ+juegT^FKYz8_{<~5NqhxX0wVXu%Zae(U7K0ctZYp>NT}FP4j$*wfnS zWof*uZMagu?`UN9>?UKYq<^c6g0vzt7(1c+VVV)7>9E#@F$Cg)vuGGB5S+t$9Kv`= zwLw>KR}8toF!!*&Dd-R`4j@qn9YK~3IX|qyL2j`9hV?s$5#$D&dC-^e$zip>1PbF6 zMiN{NK%Ng15jNtGKfy8`GJjZ>!wLYF?@}Rxwm^j-!H}YG7{#DMNEShYkkdhu2C_>V zPG{$az$ACuxyqa4w{(+>U+QMS0g$7i&HRO)OFSainmSlRu%=^d44L8%tCJDVTUKlp z?F4nE45WdmEm#X7KZHn6szr$2piw|)fEEGU0a!K&b9Jq72^-UdUo_`(jt3wa(lIIW zJ=fv`xAzw>CAMGgJW1L93J!GnU4lKaQ+o_jc2^|vwP8eaM|InfjO%bo9%gss704%O7)9H!phY2DlPZe{zc-FJ^B-m7uDTpOk2SdWw<)w zHSmRKmt1D*%g4M^DDAlM=hiQf9fhNOsyeA$#KCFyvJ)@_zm&0*d!*Z<*jd_)Ug{i@ z6%(HzmIUe&`Nnz+_3p3lKoaCc2{hWY5s5NiSNU0{bI=;ZWC50jY0c(;6(`UL-3(V* zrjAueuJ4-0PGh$(>~fln2aQD7NZ~sjPWCUFD9*0n>Tf4&qt3)H@?I!e%Xo}0!{Jv5 zBr;lP1ge`F4)T0s4>3auE}nu zyc(~nQ*NxHQ4XxBIh1DW#U*KEikWqc)Ay&&_#e4X!pgf+J8@YWlsAnf*V{^WU3Ynq z)^zQg>DzNhyfz*?H~LYX1Y@h|bWt#lLpm(C$-ZH7u*BoUzUUficao}thFm7Ciy%W% zI)EUi>}(I6Af@t^^VI0;5>?b~M7%O*A`hqE?c2dxmeJrka&}Jp^joG3g;>hq?e9Y6 z8Hkg?Xrg$6r>G?7Jf^~1b^|+CLnEAxe>@8(qbhhaL@Vn*GS`rXI`D4YJI9gn(J&X| z$n7#~&KSyGuzgWVS*@>L#l=R9*SQtPu_Efxvy2BJ6#*JCES&7(0ncz`ylYQ;S1zS) zajyAQXNO0(Dq0zdsWR$kOJzj%-&Z`lqPb5w5_%tviIPItENrp!7_TAb>QDkz;SSqP z)yH@wiN2+ZzE*pmvk!_iVN1WtaH@FT-!DW#p8#Tp0Smkf0tZlr5BT8V2;youzk$z^ z0Ha}U!yXV|`fbAwSQOr`2!(attJB+?(tP2N9vTyjeqN}{nPea6B+v~;Piz4yhvlSn zhX^}KkZgX`%Gg5*AJ6Una(*{N;Ey(`EKtj(*y9H)wD0FUVMS^C7SYFA#hr3|i;r zmG%(9L$8FzChQskHGuQsQfRO=*wDZbz8M76hnW6E{94x~R^VrRT^B)bgWg$t`YiO} z(iksTJOXb(Lw!~Q|2gCc^gOtjT4XuT+QQV(#F9qWgN-QXebY`@umBCgsumhsY@jok z6EGpSj|ao)`fKryO9KC0)lpzDKAhbZ?(GN;0t^g%=$*aGUAnh{MJjYn4Q)DXG+?I! zlrvr(4r@~Q;sjdv`=(v6hjm==*B1h?P=h?^X7|HI~n`3XzK^$9Fwqu`=l~vK1j$;cIB9xGny-GS}ipmV7j53Ofl2l&# zdVjwE!1>`^F3-#TalhZLx7&^6do*N@OaMo7=4gRB(xHzuq$EEx4ZOjT>EK8}N+Vj? zVl|IYtIjOXU?;<5g867E;pky@wEG>2IY)rl(Oz{V3>~djN2<_~5_F^xeY_V=3O;ot zY#+%$lB!Ba3K5|&=XYkxviB7dpiNKio@0wAPl;ci_Wc!yYc^R6JO`J%l! zD)3}umf(Z&F<+Ef;qYBF$v6$mSEeQrV{up_`~iqr1*dD~dH6~HS=&6{`%CX+z~1hU zD%)A{U*cd<5YgQ~`gy!Mm}i`G`sj_2_}WQ=Z#!mCd6aY4Ld+CDLBXm|OZ17l3pV!w zK>Yp@L(kquph3m@m$C%pgC&`g1@ie2>EK%uIK_Mnl`Ud>Ly9LKf^%A;u(8umo%Gcr zK=nBa6YJecX)sv_6c}9%ozUpxR4eW`&j#ZF5F58D)SQj#be^j0hCHPA9q}*$WDYNY zz=Bt@##w@*4c!rqPvExock6iRLk%@%P2)|y;776mrxO+qSTh4Mu>_|WFrYae1MhrK zReFHENmW$5YpFF3fkrsxld&^?H@=B> zSLONR77*anNl3{drtwWA$HzT0Yc&glTrQ3p5 zg@O%2q_68{^{+%LK4U&`o>6}2g*tyAy!j&I&(dhsDB89vj4p zpN0@9fF^K+Y&B#SkB_B<#-02fD%ZVR`7KWUQQ3O1mD!t9 zW9Ko3MeL5UkNDqP$9HBeuUqIDn%^B`G~e^#QrfGXT^&s*RVw;=I2R{uWFc`JDbFw~ zs)Qy0OW`n4JOb9w(T2^!<;^5Roip$&18*_8 zBmv;DSZ!Wvni25|=QD3Vb0SNZL_<}b1z!R9S$fviQK%dkg(6&W6^Fm(C}2+*QT`f} zA8RsE4910mHZcqec`15{j?_G}XE%k{1eSmJX+P3GwC475zHxt{`h{iks0UoDP~}4z zcfi?)PA$BQ2U$dHknF>$5=?q+{PYHu_{huaQ+iJ@$H}FbOtr0L9tRQh@*an5c0F8U3i6hN} z?{e4@MW?AL%MhB&&ry5>=8j{hklh-BkK=9qg{Mk%962Acs64sboefd#_b9DIhom=0 z^z_j|Pb~cOjslqk6sZGO>=X~Ky_w#{9_IuqKW{l(PAt5`Bvz&fahWq~b1vJp-q2cB zG%fW+trR%dEBg|Ci*2U;B5y-rXYsRvSwV*f+}tmjPt7=&rEKcVz#1?Xd@X619*+ha zq5C8Nb(9KIvfJ&UB7A7})$+^66!2LyHcJc$=i$~oM`{PNiK7`NddE>AmB2AOG)Q?) z?eXThMr^VncoCdbgR1KX4YG1U(**R2OydPpoBR*5N!^#@RO78~YY#AZnx|Ag!0+Fa z-HI}MwD9wRl3|T?VfS98kj$NQtA%bHkK)z(BKc#sRufZ~_XCqJo(t1VYSp!lyaq47 z@1gZUSWy=1@>B-elApeHRa}(7p#}^<^eTg{@%(<~)N6ylvuJEx?a$P5Tds8$PB+Sv zysgPOiMQ5iyF&61Ca)!R)wSSYULyUnH8Hzj!|bc4gmt9_n>dzoqB3|Q`I_DB*p{(JxEb)I+E@mZ*l^65WH&;EzUk@Z6yV2E{Kfv537MgRCao%VwkSMK zazqGB&#axiMqbszbX7A%BxLeB z3qrYn+@E?oTUcDd57i()vGy6a^}jHRpq{7LmAi%nig$_K+^Y#QRFkh{9rq)o@&A|Q z-qC**ySJ+7ab?qcIlL45`aUT+ty;mXmFbQbh5N-|BWM)Pudw z=hD%tY?y8l=xDp6=zjdYKSaQ{oVrZVa2~v8-P@LGfijtbn~|Cv~VZKG1$X5#L@-|Cu^THf=I)@`S~Cj zR`F)xB$5TLPZ36kzxd}JP{T=3p*)~ zikQ-grfJy(p&*zoQK z2uz(Ee1_~;%KR~(OfW7}g@_v6hFG*Jt?2;$1PSgztlA2ejgkQ^&f3v5<)&vnJ_9i#=yEJ) zK>3*uiJ1U7lZ}#H=aDgYKEtOdM zews0&)Ta?t%0_x9F>z=(XJ{=89FQ|tbn5kw?CRutF{Z#~lv<_A&9nRu13*c2zWrxr^FGGT$BTRo(ary`w)Ca6++j zHRn^LW4Gmr+zMCRJPLtB%oVr-2?evxQw+3X^UQk*2b`Tqh~^wk&rG^BieYg@ULOT3 zL1E_ec}faVzw@`|(n-X`5GS&AcOg6=53GJF(=}iES(F>I&UGC6Vq zgHUNgC6zc-CSRkjT?c?-Hc%<~_qB<(;v(zoqIb#Wo<(nxwQee)wmv$1OF{u|s2VmP z*4l1^-}Az=Yf)@vo}Y3dRh;+k9`n1Kb=Mlzd7;Rv@Wvyd8)x-T=dD?Dn+NdNfq?veG z#0jYu1LJohB@VgyrMVc$+%%ObeCSb`?3Ty&=FH=D<)cq>p$WA)?;iZ?>JOm`j)|(D z)+&_Ma@6xPAJ~AfkehV~;Fp5uEV1a6vrCy=xeIV6?$nt*l91azo9jDISHaKDTc6y~ ziWRS|E8LL47Y~%!_K}9pwG{(>b~bxSs7mhnErZXuvWG4#D0nO?lurqrP#cFL!=U!t z{@^NtG&%}i<1+>WHtzUswbQfYfSl{7-4Or2<26BEHQ=gRhyGelO2E5QC%hP-25(Df$ei`Q8h^?Em}D(nAsqLu4Fug_^)0YtL21>Xh>UkQ@!YffBl77}UEYPRJAwMa>5rczoYAGPR8SU3i>oCmck8@Aq} zXprg-g93G>g49Fx6{G^S_5#zso0-`L>M>g3?Pi=q1`R)3^=(@nyj$%JgJgmXP2RTZ zUTeEu6v7Abs%ZDLz0r2^Lts-#`vZc*n~H^I zqlK-|@nA*9=~(ZMs7+G=9nK#s7R+rUvQ{?oWpO2a#9fsANnn4ds?^&z7?tWtj~?fo;bv z*PcTq8?=Bo$+lZ#vlq$9%8z9s7g%7WC)}ca+*yIVK79fyeS&3u!aaSW3w`1TeQ42s zNuz#gpMKetetFIZ;9D$C%Grsk)0@lv+N3^KOG1nKn9;pa-fuf#^!UJ=ZN4_!b}dmJ z^Rj+P9+B45BAo#|kM{a&l$0JyoK#*oEu((Yz9;;YU8k-$$~_)XP~h>*?$I}T;$k;A zBr7gs?T$1ck=zY=eGV;#Pn_sGZacEpVX_G3Ip z%N~WL0=Jc@R+z~^&|Vp4VBzHpZ~fnP2}nxn+GNz+2_Pd~^_Nu&z`DFGsRjv9xsiX# z$PmRL|EkUG734eyMtdck`U+L2yzuLVG0NxJxQ3?MyUzED#I zt2&hHSn=uHNa>or(Jl3&b+JdTac1fxC$GVPrU^uAbTshk8#-0v6x(S!lqVgOuNN|) zO>~*b)4Uv%G4Rq>*yDvB`*NDE9<{+W9cW^llfR%h=LrGLWE6|Le$mVRF++4=6l&^R z9PQCQ&`;0eR3(imHrjIH6x1@~q3b6$g1z2S$x)!cs5CHD5A@u}^)^+fu$hSb)lOc zY7Wb~wqjwqzFeoTZv;5_JaA~4cL47=fF(){?&+K_5f6@9Qx+#Jr{7tdjlEH5zk2oX z{Pk+wIx|C9qp28@UwnIKV~uM{RI@nk0@#YX2Q|}ftJ-y`e37eN|FpwmvG1ygy0c7z zvqHNwrm*Tu$(@mFV#^9ul5fh{1+~w9U7`7zv^Wese80(liK^h)0seeRHWD0D;|eFYRNe_DwK zqCw;(*W1k%i>V*qWKRX%__o&@nErLDPx&j5`&kr+d`f0RlD!|wj139;}_3J0Q#sy?yiT zVeU>*e85}nx@V7{JU{(C?0OwnQysIu&SOd6D+V~0k66?YPV*Xb$$ql`uhSsM_Tb;g zNUpK?f-a`&Hh*8xcI={J?1OVV4~qVvR@gs#IX*VldMV7)Xx$MUC9yYSlfD)HDV(%- z_J%=11<$|mkZ8~^QcMME--hFSF=V({jojX zNdbP+NuC?*5vbVTQW67ZSAKKyoGo-ed)2a9BZGVGiUERJ}VN*rAjiUk0Crbf05kD1f!5GW6k zCt~+>Y_$c6D<5c*zco&z7No>@ir^yo94G;vLWM+<8`>@h{|@xmHL_cJXzw81$8BDt}07`XP)s%5UMWnINVag zviF17B)Q2PtOmPMo~vu31u`@T;YV%~d)k#E}1 z4OrrqpK~aQFaq^hpe)b{FI2z01oI7>ryGh|6$55*3Ws5C@({$d@3U$86|eN^|N8pg z{OOOqRAG)7EdASpubjTJ7R*JnwPD(W%h z%{{g%yV7xlFy!JK2bdQdWM{!^4`ngo7s&)JcAaTkD{-l~*sc}5t*?)^9j3XAfArf; zV341Afb2cA4bx_%K=cYuHq0mnv$sG}`i{?Tq4T_yiH2x7;Se%yPUeTlPVH*R*D#6H zs_J~Sq|gS03>QkdxWbGCQgMJe%ByYS2nZNCJ?*8(s^+#MPO}d`%r9~lc4FdTk`ArY zwIBg=BBd(y{?FGoYTD0khir5~I9?n4rzPPB@~Gsb<6$h)@u50D;Hz8bY#QH?UQmwiT31lsF&6q(C}V{}VG52wstQuU!Nn@lM z5k^&V(XqM2kLBi;BkQCo(OhE5NfT`Xqy~-}eqe_ZmT0a$T_@K{B{G%m&We6jwWx?d(p;~~o)g%{^ z0o}`Jv0)3WvjLQ>T*?v_-gY`qo4V!raDy)oOBNxWCsHobnJCGdU&v=%RyZ|@1$r72 z44!Ap+^0VbFj=e&uymz0c>QtTOaLbj2nVrWu`+m%0xmR63WLUnrJs-IUMst8t>eKP za)1K<0Lx3m8+?|-AxEJqQryk^!)=epuQt*{lsRA-@Fox{zmnx77(*5$P#`j75MbLx zf+6e7*oau9fu-nB&B=wm#e;H#)~;!W*v0isc8K5bTC< zmF^XD@vp$nRARGVvLNRO0Vk3wuLgKw#sb9)^S?n@Mw=I2rF<M+2t5 z1?I5Sqe|LRov(gRzupU#wYZ;Qf9^GJ*?XT$Bx&!CxgOQ>*Vd zdGq>8#%=6>b#@{8?k(458WPQWpVc?6 zk0!6RU;47?Z!YrqxnD;#iDEGV=am8=ZF}+m|1!#*R?TR+Hl!SP)o}Kmut0OBTSV|l zk;Ua(jJubtv21T7AsZKF<6G~avv?Wd3lMeH-@&kPAHwyTZ_e}`W5m#98cJ1~o|EsF z#V`zqp;qB@11I6J%u_}yZ+pmGvVx1B@I8U^yGwv~GDuLIMFI)T&JF7h$L9Kv(BXr% z1i{y_`8RC9;&uSh%tnU0XM@C%H9itG%GxN{S498t-?+H;&njiItAN5!m zg=$=%9}BZQUpmths?$0DBARi&Y}F{tV0Qjx((sS#5W)>$YhD_Rzg`J^DKzo#(y96J ztTNVTV^XVM~W!INzm!;SYOiDsk*;U?FHamdX-1A7M3x1?G;b_ zk&negki%*z%K8vr1)U+_I28$8z1@#v7#xa#7J2k0S2Md#hOC-;9SyohfJs#&J_xVt zWf|Qj(ur$|JbfJ%3b@RoMhY+J=wlH~Wirc*Bsk8Fm~-+0g|n+`oUzCofiI&9s~298 zPA(=>G(CB1v8NQ@n224FVN*%Vcamn>BtDeEPrL}8dOLF+B3Db0HN!zPF@D9vj6)UMRCoR{7Mhmk>n zKhD}(LtvcoD?A(ozaK$M2kt+2N!JZ=tXI@CP+{j@Aa1who`zc6)$O86J#FH8i|&6n zFF7AxLZtrpGuNtn0<`q|#a|;;ol=K{n|$TK5>i48%u4V5DlKoV080IOOh|_Z?NZkJ z>V^l*nmg}YwlofSG#vi3=v+>LR@IZs1uh>TgnzB06$b$M)$;n({*u-EL(<_dw)-f0 z5g*#>;Ry%|u$+T|@Zh~qAgC)A9*@n|y8|H6u1alYbr2^AnS=zS26W;Bj9g3FeRnkd z=k+;^0I*%LpAfsf;hpI@Eu;?%&JRdVWJT`?*ee*Aj$Q}IRFi#^-FQ3uvhXamTCmQsC@ zG)_}ZF|bh&KEB_2tMwiQS2C)#Y>qV?G&dg9x)v)`Ou8cU*x=M-9I_=tw49CHKcO}F zN%KC4Tt7nhY9&i0*JvoSIaLA`tcH_V`Qw1$G{xJZ$%JpPU25>(TmC2_kg!2@^JZA4SeOnB zKJ6lz%(e`g3=En@G&SHLLO;xE_wuME%_sKeMEc zoqD(TgTnn%yU1!Ns)>43c@i39{J`dgF$a0Z=kD;hmc=ISu&A`!cl`0@+rbg+i}@^$ zzM#=+O zFWN=Mj8a~yZ)idu4c+lEgdZhsNAm62;Xa!+F7J+m-#%DVX6v{&3_fRz&F0wnuEd&D z>Mbx3gaPlr-;ZPmwt3aQ*Msau?oS%r-|m4Jgv~gSj?bKynQ_*haXB^P>NevRGUI;q988<>xH{u`XU402#(T)k zdd3y^n~~H7m7Al=c|@|?rGWpKTX7?@*Xz2^w?j=`NhY4g4b9<4*v1{MA%Kj)8eFj6s- zz(~3%3wGxe(kCAxp_k^f-8y*nRbn#K{u134izKCB$>Ut_T(HQo8E2&#x-pWf#&Y+b zgWJt9e6ZdA7>L{k)V?llU@Gld8tu?xBYnF84y}W87QK?+U>KvoqVkL<_;)jI?#e{J z*IeFGU*Hp5zJUO6frSWUy|~0e-2akh1u)P^YE<28Am8WtRo@t6<2UWT3#X8<5ekVg zM?*Q0f7mZRzpwr4@w)|M?{F@%mtI;FvNux8@1vWa=_X8iJk6nt?pNo&;pY1(WRb~y z|2p;ET=}~K zHV_M#P+10IeCOI1z@a@5hxdV`ZB4es_a$zD>{0fX5Z_H1Um*YJM?CN)C$zBlla-gYHh>K;2Tg}SZ2QU*B)Q7cZ{PlyW z_^PwXs;ealnU_Ni+DP*XHS&2K;-?w_+jtk(@y5I3W8h6s1DVhOOQgeIu#-Rtu)mfh z5aynkeh4J5dN{11JVJ~3s4*;B;1Vs`4k5_E_*9l>@wYf+ZSQ=!3DHKf36xr-gE>lWMVwdXcs#IvvadE{HJ zGqD?v+^bjIKNt7~O{>#v&~*7FIvNk9W8nH2IKT>`vq0|K1W_#W!N1Q<;+qA8G#kAL zdL0b9lvY5FXcE{g3Dz>&r!q0Ll6P=vCR2?W3a}_@1YPe9`X#323M?`)3k=Oikm#t$ z{+shJE^ks)2d93}+f*`q$h1W+^7EXe3Sf`)4WyF?-D_H?f7Au}VoV8@m zxo`I64xhabOU9=KynQ?RGE&hb&Fn2DaeS-qYis|5t@X7?y582H-`4Qut&yA0Cid9$ zk?zAvZSJVEtGUdz*O7ykNIlFE7G|mc4L-1Gi5v=bDYJJ0|8kpWtK^n$9Grmn4AImd-%2NQrH5BI#aQQVcbokmeC% zhpBc6Oor+sDQGNt_5O~C6;sp-De^RS{NGbpQmkEmI)Di~bR)+zk%!*sSO6KjX?*^< z<$3YEVWpat4*T;H#^=#$182`6y$U2(X6URRgR_9+vd$8^ z(pmvN(LQMJ$p}b)#Ph^#M8vDz#?eHJ#+`7-w37Dok;5dqmE1#MpFv1QNZ_M%&U6Lo zF+5ma3dca_E9O)4nCBb6wg31Dj6;)=sCjr?I~MHVBk+k_Zhditx6YgbfoR|)aa1d<&0D~V40o%xHJ5Pd#zvo$I2*T+!e zq|UGliWIW*Uh{jRyN}$iKl;q+U!%^5Sig$jWCT#~D(R|e&o$BofOtU%0eE+=>_s7} zW&c>^aroyU35ZJxd5evvdpS7jIVRJ>V=E*V?4C~xAEL!O3PT5S?3QN%}g9dgEMn@Og3q`F6 zxh90&Mk0*7phh?V>i!1FCW+z?sybIX&izNEr{?8R4<~=oKQ6RBUu+#cI?}#6F!^yX z`z>WKk2w^ba-*?*BoAr(O|!yk&Hj2S7(qTa7k$)%d&Tw7u;b<7GYN}_!DEf*R@PHU zFKU05Ko8XXk^vT^u_E=`uOo>c*%G!jc;?@&+{3n6!5|b^8en>Cs;+_oG|&%pdBHFv zudLOThn<@>h;~R`3Y6sEC$?5yn zhmO0*TsWOAb{>BI>0@B<{i-Iji6l%7N0vVnH6U2*tN7Ti~y1h~2$Ly6;_EOYPPY zTvs?<$rm>tq?oe9iv8^sOTrGzMo)tR(IdHmwaj#?vhERBy1Rb;; zmyNo=5%|WFqiQ!x)PY4I4U!S5f-6ioi~{6nF)+^7a#bHCn34`|SKReR}|1Xs}He5I(IIIFR z?x=Si88B?%de?2tHY*iZE$bzIlsut)aqZ4o5LQ9v>i!jm7YU$0n3Dvuo~wt1T$d<< za6`any^4dbU67^L7$dNy7QGkhBF@!6uff@9dr&l z13s6fJTpJxdr4j#K=Y7fj5081!1m>?D7z7+41R{w!3>BM%=ryKMj=lVKvpU0 z!yNFE=Dxcred;3;Sw8Q5u{@oX-%Y0NLkFFJ{ zoIZ!K*2F21RIN$G=zRUeUH5zP^q-f{^9UV@5=_CGe{+vwVI$ggY^f|et&2!c{%6l zai6&jH}3qpX+YZU`<3%|sN;NH_m1*ZuI^6zjfktscI!8Lwr9K#_kLt#{`ypP&qYk` zQ-#uDYI244EA-b-R>yh=?p;6pJ-PVE(dcmIQQrISwzs}HT#oqiXz%Y&usrs5+Oe<& z!^%CKwchy*HKXmfi+{%Dp8OvAX4PUyXd4UbgIeB88UOJfE<@5YK1ge#EPZ&lTdm7F z-jYv*Srj37>ae^H@^npCaqhqCJ*%Hkfy;%Jpny5tzP{rnyG!Du+3WiM+?>)-L4;%8 z@Kb=@@hL3tWUj^ZqUa~$b2F2PE5ISNTJY6APO2sSqC%UrjEuE4`pslv@4+gv z^Vc0yjmfOYwh!`-b@z4RPG310FC{HBKNOhgSUhPLD%?uC(98aKJD_^%PQuqP8$v;A z*^Ml5Y0YB0pq2@ea5Y*}_tO|g7Nzo*|D>>S-B{{yQ|Z%%RjpWk3%9ix`kIlv8DDs- zpEEM=X{(I+am9%Y=V`NF{Ke+FMW+$&ZMVh$+eq6FYsz7`=JUW5Y+ULmueP+^QB75_ z3sRgq3cITz={#0&IA1?i{=Kc%X zV(-t^w%2BC1)|FsqVw)<9fPr@%>e<%^@pQ@6Io}`Xz1VZiNmky6eTDdm`dUy??>VZP_F+HDpPjDHBXWZ++O3{TVl&(t-F6e8ou>2xE4#6 zUD{4V#b+|Vy!GScCOf>>u57%zy4CMx_}V)PFLI1XfkB%=PVo;~iie8*Q}0K!tINvYw$>JIco*QHtjQ z4tNYjAT#BowA$}nvCCnI?yV4vNH7rS0XYI7y=fRSIC##2caV_zlK30#z-Vz>;0)9M zApj)wp1=7^)JFL{2C#7&J{x8<%3c3z$iPIi=1O;brDifV#E z#My91n!$qt)u=qaHJIG^20yFP*#rcnnPd+_?M!T;x9n~Sh!U8|Ut0O4F}y-{EcBzV zKO1HA-CxRFntuUj0o9m-Ls(HCS_?~Yam7MeyB8GuxZ66o`p-q*W@)X|$o2e9r}EbI z2Ru!!slOoPMVh*(I)GjM)b23#07PTz$C&*WWP+Jev->fEjseCHXxWL114gHzP#8_bn3%UR5FK zceK9^t;)mpyn6xd_T?xpIF>36K|h>;k$2e*PpyNC&A`^D!Q8|@izLO@oqB1Xh8ty5 zR{q?K?&ApG8(Aw@2}9^DaCs$4l)k)rUhdM6zRvOgW8#oM+uiim z=TB{g$J@-p@36$hg9eZ(+(#B##?&E`0tNbM>MYP8AP|FPW07(DOR5A4DtAFUq14So zLLgj%bV8Ld1!4(plXVDvstcg5@-%+uDjfeZkI5V`c5}RaS!8%w)GR>f8Cj4#pdq@V zkuALECd{lVox59#_w~9RQd;t*SYk#{no-PjyCqrgAJ952FXi!7vgXUKWh&cUtJ`2Lco%EUae#)8|)GV&~+`y|S$(O-y*rNjK;B z$^)NSTu;N`4y!mV-{cJZbmerew*AQhMfP!!`yesoXH049QfZr)_R!R7eP4b&uNxx& zh^z;gB>Pc==KTY#Xj0`%bXUtb6Q-+S@w>zs*H=y9TyWBSIaxD4l-`;cijAB z+(YlU+sK^oF^3%$Q$VS#6aXYj;_}oO@wDLr5m~GSEQq-}RJ}?cx$}&le2mQHn`_~x zgFkaQ#3L@-H)?gLh$>}a2A>1@N%!0v+;@Uarsqn_M9G*ieP z3=$6wv>EYR8zbhfB|y#Kbz@!~tKNaxXLUv*!ja*ABbqUk{;^P>Yot}`;2J)7Ei`eh zZ%LLmT|>~x79KMfIOr2$k`X@XQa;!qvyoWY^*9|lpcujdP}Jys^5X;X$FZV5PvaHk z&buR{YwXT`UZX8wVRf?J?AhK7*?}@SoAKJTrrOb^u&7&iE*c;O$m{(ZVX>Ln2p<~F z1FX4^jTfdkAK8l~N=zOB06$^7MG9M7jz^t;;Pw8*u zb8`m^&F)_Pg9GhT5h?xba}-<*DE+-mCA(skaCiYXC?k|2)>BIhR!sL&0E`r~NS62t zc7-dlcdzIu0vN>t6DGs#ZaNq!%^eH}V=KACt7O-zU*B!8{8V@CbHZGBnQBD+^L4Tg zQ;M@sg|lC-8fdgI7lu-)HZ@#5ARwksPMLy>KiuqOC^c3>4Ym{jC{>LdhThtIbWy1* zQ;A-uaDvdMpG}RjF^4Sx04dvC%0mw2iq)#aDM*{Afw7`<*sy;%;oS}Vmi$vQrXG`Z zlF-N7K)%YZ+$X%1{)WX8Xt?Ev5I}GB%C5nf=JZTf$s4jvU7tuWHWv(_sy82YDAA1~ z2OT1Zc*!rnZ^<7O+}A5TdZ;vR)-dSYfEx@$qX!Tc_>tVmXI>-)(31SrMLD3dVHB=B zTC>$ByVbALfD=47qowO^X^8ra)HW% zy=FCCUlBxk=Sw4ZCg0k;oQ+y?<=_i)vHs~1_4f)?NY zMQ#66wn=881sid7IFP)ujgi_m`!`xOjy;=>+*p(3?88?BFTudR#t842c{#5g8mRlj zX#DYc?a%9Iy3rOD4OV1EXYsO(%A)@$M$>h^{hItnNhA z{XHx72a4Nxt(fnU+xupCCg}3Xp$c^cLnc}c-y*zusZ_nFAWo5F8v}CcWAFJ!Q;w4|jgxNGXz5*-7J~dy{1s7ZA{Ow$v-%&KXcn;=f7Q{88d8QD(%u>} zn`;I}B1T1hAm$ zVn$5!potE%2%n?KmRLiPK{F8xb5lHQsacA@_2fW{h8pq&{|38-IRg#Rkp52k8fTd| zXelyi^JJ6fwuLc-ELH>ox@KKxPQ!TevEvu8HRx3k1-hTjZs!8J6o3IL;W)^%bY7Hx53KQyr7arVm`tc(~bL6}xKINL3GytN{ zb>NovROR+A{m}t{P8w4;=1gew4l_J=tGER zQ3rgyPR)n53no9c88Pa@p<_VG`%!0S_j4S7lSJmaxIEf%gP`PpeR>{^IF?yx|F(QG zM4*VuL=u&&suU4KfsPWyeSB6R5@_7l5Krbx8F2FP0zUlaXD zon-pwDg0rfd3TYi&egE)tGXA-SsgfZKRSjYyiXPv)ieFIpSSrNU;XDg`bGWlMfm8hIYvcZeaZD{ZJ9gTph#!HW$7%sJ3f_EAAm@-9N zS?o;K17Qm-e(X?d9DDp-v2B}<=u4ee_{V2tdkz1Z1U>3Fe= zuydyLoiLy;Dh(JKRebH~C)M@%1CQTcdiLQ{@2HZE#lhg2l-k>a@~Af4dJ1}hWG0nD zJyxteXlpcNMH~;)qmB2x5b1d-cOWd4GH{sU|KZPLjRCY)3j17}E1x#dlrkYgpNuvJ zjQ$f6iSK!JDZav}?TM?_t{UfnqN6?-jObm7wnz7X6p2a8o6{m%W?FBFt^0~J6bEC;-XYb|{ldY${Tdz#M%=Ug+H2J#zZ^sV# z+Nvy6hMrpAvV7(=5NSsE^KZuy|2<1pQR`53(`5IA9bgw45(>&t28G-*d-Cfa>+DNR zS#!`Mi*32>Z9dc3KmUH`(PLEcf6Va;MP^d`Ag9czaLdE3pxVSZIb$sglFtpA+8_uU z+yn&x$}uR9tSb|PC8trQEnLr^BlI&)B9*7>u8w6IX56cfGRo@%eQSEB8g$H`hF%D04J_d1mSMY;)LbFRA=e(znIF^x02Bz{4}_ zkhEunm-Sff4;oAHsucKY*oPTBtvtXObl zlSPiMWwU)LdlWz@voylW^XiVX1&OL6!Tk(fU}>dL1~YY--TKNSki8KL?q=!SV?2uC zzqr+Z+Nzk;G>3YMHGyD9#6Xp=Ob&L<>pG=%GY1&Xz`hihwX;w2(1}G2-luoDTR!Wv ztE8Btcjh9eUg$1oyS&t2?-`}x4vro&U_~IX-Vr4%$yESWKyy?70@eg6`??kx0-+Q{KnN8ZtV1+Jf;?D%L@Q~**%2v>y+a?YxGJ`I)5X{oK&+H0}RR=b8Q;Seu1 zxbR^R7z=ueuto^_;}%pJ$)EuC09fIrjRMJlON1JMv7vG%-T#dsdHpTuIf4Iusi7hY zKxh~{YW#P9xdI}|6($E=WwIk1FSZc?TkYcSE`@eYcind1Rj4`fybcN1b^UXQ$oO3K3xkjxTFFOA0~#p zZiHNaCn$D!Su&g^JIq!7@tG5PrE+x6yx>#gJ#XLr_u-E}y8u%73NYNmo5ePpZgBb}C0dWXoi443!4VJLMq{y=$2uhHG z%_$oIiohWNpyXZvP}@Qzu>$t^0T%MHk&GsP=AfdV4)N?K%V^Ym`6SCk&ggq#KXv!h2Wqf1%si28~^r~fg!}rjKR5vABIqYDIy|& zI2U*Yu?P|ga^1!a)5(Gxs4zFA1%Q$(uq3gBmoa3a!j#By;T;Kbjtj8h6GJd!W;WBR zj{#s54=cbpei%dzIHZ>k1111A;f4yVKm=pqr7wXQ2S-9ul2r6SBUn%XEPX@`6cSDf zxDv}**0NN}WTrC%!Hhu^Fa@{kNFuj?(nopDlb-eLS?xsP8}aDVp4n1mKLHw0fetiI z6bp|*33{!6CX}HKb?8HP62gP-5~6cjXhkuaQH^etqaF3=M?o4=k&cw4B{k_uQJPYf zu9T%MttiF#=~9`_l%_SUCrt5aQ=RUVr#-zVOnn;vRG|))sBOY&QIVQdr7o3!Cr4%K zQ=uBws5(`uRki9>bxKvNZk4ND9jR8m8dkB6m7!oI>sis7);yY3t!;JdTYtt@xXzWX zb$ydu?V4A;?iDFO|rs3P{b~lv4SORV<8*av_4j{m9^|vDSKJX zZg#1e1a)Vn_AV5Q~<4Yt!q~sTiK@cwY8n?ZE*|I+P*foz4dKH zcMIF!4wtwA4Q^|Tn_T7g@wft5?sK90zUD@ky44lhbgi3R?OqGJ+x6~u-_%|3j+eaL z5pQ|Xo8FfB=M#1eep{W`%dPUzwg~|e*ui%{|1;tz~3Ekfe~!o z11Ffl&s}hXAxzu{N0`DDw(x~9oM8=bn8O|R@P|PhViAv+#3eTIiBX(l6|b1ZEq3vX KVcfHT0028RwfY7C diff --git a/docs/generate_demo.py b/docs/generate_demo.py index 9347b69..9cd9bf1 100644 --- a/docs/generate_demo.py +++ b/docs/generate_demo.py @@ -61,12 +61,12 @@ def main(): run("git add calc.py") # Run the real commands and capture their real outputs. - suggest = run("ai-commit-message commit") + suggest = run("ai-commit-message commit --message-only") if suggest.returncode != 0: sys.exit(f"demo generation failed: {suggest.stderr.strip()}") message = suggest.stdout.strip() - apply_out = run("ai-commit-message commit --apply", input_="y\n") + apply_out = run("ai-commit-message commit", input_="y\n") if apply_out.returncode != 0: sys.exit(f"demo apply failed: {apply_out.stderr.strip()}") @@ -78,7 +78,7 @@ def main(): emit("", 0.9) # the model is thinking emit(message + "\r\n\r\n", 0.6) - type_command("ai-commit-message commit --apply") + type_command("ai-commit-message commit") emit("", 0.9) emit(message + "\r\n", 0.4) emit("Commit with this message? (\x1b[1mY\x1b[0m/n) ", 0.5) From fb35998ff3646388d15465474764f0a0c4d18027 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 08:37:16 +0100 Subject: [PATCH 25/31] [#maintenance] [Docs] Show message-only flag on first command in demo gif --- docs/demo.cast | 58 ++++++++++++++++++++++-------------------- docs/demo.gif | Bin 61179 -> 65301 bytes docs/generate_demo.py | 2 +- 3 files changed, 32 insertions(+), 28 deletions(-) diff --git a/docs/demo.cast b/docs/demo.cast index ad4baf0..89ffe40 100644 --- a/docs/demo.cast +++ b/docs/demo.cast @@ -1,4 +1,4 @@ -{"version": 3, "term": {"cols": 84, "rows": 13}, "timestamp": 1790492059, "command": "ai-commit-message"} +{"version": 3, "term": {"cols": 84, "rows": 13}, "timestamp": 1790494557, "command": "ai-commit-message"} [0.8, "o", ""] [0.84, "o", "\u001b[2m# ai-commit-message: AI commit messages from a local LLM\u001b[0m\r\n\r\n"] [0.89, "o", "\u001b[1;32m$\u001b[0m "] @@ -7,29 +7,33 @@ [1.04, "o", "t-me"] [1.09, "o", "ssag"] [1.14, "o", "e co"] -[1.26, "o", "mmit"] -[2.16, "o", "\r\n"] -[2.76, "o", ""] -[2.8, "o", "docs: add docstring and type check for add function\r\n\r\n"] -[2.85, "o", "\u001b[1;32m$\u001b[0m "] -[2.9, "o", "ai-c"] -[2.95, "o", "ommi"] -[3.0, "o", "t-me"] -[3.05, "o", "ssag"] -[3.1, "o", "e co"] -[3.22, "o", "mmit"] -[4.12, "o", "\r\n"] -[4.52, "o", ""] -[5.02, "o", "docs: add docstring and type check for add function\r\n"] -[5.42, "o", "Commit with this message? (\u001b[1mY\u001b[0m/n) "] -[6.02, "o", "y\r\n"] -[6.06, "o", "\u001b[32m36f6d52 docs: add type check and docstring to add function\u001b[0m\r\n\r\n"] -[6.11, "o", "\u001b[1;32m$\u001b[0m "] -[6.16, "o", "git "] -[6.21, "o", "log "] -[6.26, "o", "--on"] -[6.31, "o", "elin"] -[6.43, "o", "e -2"] -[6.83, "o", "\r\n"] -[7.33, "o", ""] -[7.33, "o", "\u001b[33m36f6d52 docs: add type check and docstring to add function\r\ne36ef4c chore: initial setup\u001b[0m\r\n\r\n"] +[1.19, "o", "mmit"] +[1.24, "o", " --m"] +[1.29, "o", "essa"] +[1.34, "o", "ge-o"] +[1.46, "o", "nly"] +[2.36, "o", "\r\n"] +[2.96, "o", ""] +[3.0, "o", "docs: add type check and docstring to add function\r\n\r\n"] +[3.05, "o", "\u001b[1;32m$\u001b[0m "] +[3.1, "o", "ai-c"] +[3.15, "o", "ommi"] +[3.2, "o", "t-me"] +[3.25, "o", "ssag"] +[3.3, "o", "e co"] +[3.42, "o", "mmit"] +[4.32, "o", "\r\n"] +[4.72, "o", ""] +[5.22, "o", "docs: add type check and docstring to add function\r\n"] +[5.62, "o", "Commit with this message? (\u001b[1mY\u001b[0m/n) "] +[6.22, "o", "y\r\n"] +[6.26, "o", "\u001b[32m3f7159a docs: add docstring and type check for add function\u001b[0m\r\n\r\n"] +[6.31, "o", "\u001b[1;32m$\u001b[0m "] +[6.36, "o", "git "] +[6.41, "o", "log "] +[6.46, "o", "--on"] +[6.51, "o", "elin"] +[6.63, "o", "e -2"] +[7.03, "o", "\r\n"] +[7.53, "o", ""] +[7.53, "o", "\u001b[33m3f7159a docs: add docstring and type check for add function\r\nb445970 chore: initial setup\u001b[0m\r\n\r\n"] diff --git a/docs/demo.gif b/docs/demo.gif index 86174600d807da3397739ea772e086d885b3874a..07e2f0d122f84b682097cfb89d9b9aedbb5d8279 100644 GIT binary patch delta 39732 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 W&2gS{o$s9IJ@@&~fgbaK0027{gA%3y delta 36155 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 diff --git a/docs/generate_demo.py b/docs/generate_demo.py index 9cd9bf1..b9d0cb5 100644 --- a/docs/generate_demo.py +++ b/docs/generate_demo.py @@ -74,7 +74,7 @@ def main(): EVENTS.append([0.0, "o", ""]) emit("\x1b[2m# ai-commit-message: AI commit messages from a local LLM\x1b[0m\r\n\r\n", 0.8) - type_command("ai-commit-message commit") + type_command("ai-commit-message commit --message-only") emit("", 0.9) # the model is thinking emit(message + "\r\n\r\n", 0.6) From 6eb77d8540bf010af7b09e91b37e72b67ef9c13a Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 10:28:32 +0100 Subject: [PATCH 26/31] [#maintenance] [Tests] Close mock server before joining thread to avoid deadlock --- test/test_helper.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index 9802218..5c995e2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -21,11 +21,12 @@ def with_mock_server(response_body, status: '200 OK') ) client.close end - yield server.addr[1] - ensure - thread&.join - server.close - end + yield server.addr[1] + ensure + # Close the server first so a thread still blocked in accept can exit. + server&.close + thread&.join(1) + end end def openai_chat_response(content) From 76b5ac707a40c5e244bbe1d0a86434cdb4b7ba7f Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 10:29:07 +0100 Subject: [PATCH 27/31] [#maintenance] [Suggester] Enforce TLS with certificate verification for https endpoints --- lib/ai-commit-message/suggester.rb | 18 ++++++++++++------ test/suggester_test.rb | 11 +++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index 3a381a7..0aaa492 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -1,6 +1,7 @@ require 'net/http' require 'uri' require 'json' +require 'openssl' module AiCommitMessage class Suggester @@ -17,9 +18,7 @@ class ApiError < Error; end def self.list_models(url) uri = URI("#{normalized_base(url)}/v1/models") - http = Net::HTTP.new(uri.host, uri.port) - http.open_timeout = OPEN_TIMEOUT - http.read_timeout = READ_TIMEOUT + http = build_http(uri) begin response = http.request(Net::HTTP::Get.new(uri)) @@ -41,6 +40,15 @@ def self.parse_response(response) raise ApiError, 'API response was not valid JSON' end + def self.build_http(uri) + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = uri.scheme == 'https' + http.verify_mode = OpenSSL::SSL::VERIFY_PEER + http.open_timeout = OPEN_TIMEOUT + http.read_timeout = READ_TIMEOUT + http + end + def self.normalized_base(url) url.chomp('/').sub(%r{/v1$}, '') end @@ -116,9 +124,7 @@ def chat_completions_uri(url) end def post_json(uri, body) - http = Net::HTTP.new(uri.host, uri.port) - http.open_timeout = OPEN_TIMEOUT - http.read_timeout = READ_TIMEOUT + http = self.class.build_http(uri) request = Net::HTTP::Post.new(uri) request['Content-Type'] = 'application/json' request.body = body.to_json diff --git a/test/suggester_test.rb b/test/suggester_test.rb index 15ba8ec..c06bd4d 100644 --- a/test/suggester_test.rb +++ b/test/suggester_test.rb @@ -38,6 +38,17 @@ def test_clean_commit_message_truncates_to_length assert_equal '', @suggester.send(:clean_commit_message, nil, 72) end + def test_build_http_enables_ssl_verification_for_https + http = AiCommitMessage::Suggester.build_http(URI('https://api.example.com/v1/chat/completions')) + assert http.use_ssl? + assert_equal OpenSSL::SSL::VERIFY_PEER, http.verify_mode + end + + def test_build_http_keeps_plain_http_local + http = AiCommitMessage::Suggester.build_http(URI('http://localhost:11434/v1/chat/completions')) + refute http.use_ssl? + end + def test_clean_commit_message_strips_inline_think_blocks raw = "Let me decide on wording.\nfix: handle nil diff" assert_equal 'fix: handle nil diff', @suggester.send(:clean_commit_message, raw, 72) From f80d4812d32ff9b3767ad310c6d66886e0570135 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 10:29:42 +0100 Subject: [PATCH 28/31] [#maintenance] [Suggester] Strip ANSI escape sequences from model output --- lib/ai-commit-message/suggester.rb | 6 +++++- test/suggester_test.rb | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/ai-commit-message/suggester.rb b/lib/ai-commit-message/suggester.rb index 0aaa492..b7a9b11 100644 --- a/lib/ai-commit-message/suggester.rb +++ b/lib/ai-commit-message/suggester.rb @@ -107,10 +107,14 @@ def branch_line end # Models tend to wrap answers in code fences or quotes, inline their # reasoning in blocks, or offer alternatives; reduce everything to - # a single clean subject line. + # a single clean subject line. Control characters are stripped so that a + # prompt-injected model cannot smuggle terminal escapes into git history. def clean_commit_message(raw, length) line = raw.to_s .gsub(%r{.*?}m, '') + .gsub(/\e\][^\x07\e]*(?:\x07|\e\\)/, '') + .gsub(/\e\[[0-9;:]*[A-Za-z]/, '') + .gsub(/[\e\a\b\v\f\r]/, '') .gsub('`', '') .each_line.map(&:strip).reject(&:empty?).first.to_s line = line.sub(/\A["'](.*)["']\z/, '\1') diff --git a/test/suggester_test.rb b/test/suggester_test.rb index c06bd4d..679d5b0 100644 --- a/test/suggester_test.rb +++ b/test/suggester_test.rb @@ -38,6 +38,11 @@ def test_clean_commit_message_truncates_to_length assert_equal '', @suggester.send(:clean_commit_message, nil, 72) end + def test_clean_commit_message_strips_ansi_escape_sequences + raw = "\e[31mfix:\e[0m handle \e[2Knil \e]0;title\a crash" + assert_equal 'fix: handle nil crash', @suggester.send(:clean_commit_message, raw, 72) + end + def test_build_http_enables_ssl_verification_for_https http = AiCommitMessage::Suggester.build_http(URI('https://api.example.com/v1/chat/completions')) assert http.use_ssl? From 5419dc7c6abcaf21462948a58cd78e5a33fe3dd5 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 10:29:42 +0100 Subject: [PATCH 29/31] [#maintenance] [ConfigManager] Write config file with owner-only permissions --- lib/ai-commit-message/config_manager.rb | 5 ++++- test/config_manager_test.rb | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/ai-commit-message/config_manager.rb b/lib/ai-commit-message/config_manager.rb index f80d11c..bcb38f3 100644 --- a/lib/ai-commit-message/config_manager.rb +++ b/lib/ai-commit-message/config_manager.rb @@ -34,5 +34,8 @@ def self.config @config end - def self.save_config = File.write(CONFIG_FILE, config.map { |key, value| "#{key}=#{value}" }.join("\n")) + def self.save_config + File.write(CONFIG_FILE, config.map { |key, value| "#{key}=#{value}" }.join("\n")) + FileUtils.chmod(0600, CONFIG_FILE) + end end \ No newline at end of file diff --git a/test/config_manager_test.rb b/test/config_manager_test.rb index 86e4c24..a71c338 100644 --- a/test/config_manager_test.rb +++ b/test/config_manager_test.rb @@ -41,6 +41,11 @@ def test_loads_existing_config_file assert_equal 'gemma3:4b', ConfigManager.get_model end + def test_config_file_is_owner_only + ConfigManager.set_url('http://localhost:1234') + assert_equal 0600, File.stat(@config_file.path).mode & 0777 + end + private def stub_constant From 5c0e1357736da45ac5c8006bf1e043bb560f96a8 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 10:30:10 +0100 Subject: [PATCH 30/31] [#maintenance] [CI] Add bundler-audit dependency scan --- .github/workflows/tests.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d524025..3459e52 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -20,3 +20,7 @@ jobs: bundler-cache: true - name: Run tests run: bundle exec rake test + - name: Scan dependencies for vulnerabilities + run: | + gem install bundler-audit --no-document + bundler-audit check From 7a8d865f0efe82c6587224ad6aa481b46b8bbeb0 Mon Sep 17 00:00:00 2001 From: Afonso Neto Date: Sun, 27 Sep 2026 10:39:35 +0100 Subject: [PATCH 31/31] [#maintenance] [Tests] Read full HTTP request in mock server before parsing --- test/suggester_test.rb | 19 +++---------------- test/test_helper.rb | 30 ++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/test/suggester_test.rb b/test/suggester_test.rb index 679d5b0..854b495 100644 --- a/test/suggester_test.rb +++ b/test/suggester_test.rb @@ -75,25 +75,12 @@ def test_generate_commit_message_returns_cleaned_content end def test_generate_commit_message_uses_chat_completions_and_chat_payload - request = nil - server = TCPServer.new('127.0.0.1', 0) - body = openai_chat_response('ok') - thread = Thread.new do - client = server.accept - request = +'' - request << client.readpartial(4096) until request.include?("\r\n\r\n") - client.write("HTTP/1.1 200 OK\r\nContent-Length: #{body.bytesize}\r\nConnection: close\r\n\r\n#{body}") - client.close - end - begin - @suggester.generate_commit_message(url: "http://127.0.0.1:#{server.addr[1]}/v1", model: 'm', conventional: true) - ensure - thread.join - server.close + request = with_mock_server(openai_chat_response('ok')) do |port| + @suggester.generate_commit_message(url: "http://127.0.0.1:#{port}/v1", model: 'm', conventional: true) end assert_includes request, "POST /v1/chat/completions" - json_body = JSON.parse(request.split("\r\n\r\n").last) + json_body = JSON.parse(request.split("\r\n\r\n", 2).last) assert_equal 'm', json_body['model'] assert_equal 'system', json_body['messages'][0]['role'] assert_includes json_body['messages'][0]['content'], 'Conventional Commits' diff --git a/test/test_helper.rb b/test/test_helper.rb index 5c995e2..a8d9eda 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -4,15 +4,28 @@ require_relative '../lib/ai-commit-message/config_manager' module TestHelper + # Reads a full HTTP request from the socket: headers plus Content-Length + # bytes of body. Segments can arrive split across multiple reads. + def read_http_request(client) + request = +'' + request << client.readpartial(4096) until request.include?("\r\n\r\n") + headers, body = request.split("\r\n\r\n", 2) + body = +(body || '') + content_length = headers[/^Content-Length: (\d+)$/i, 1].to_i + body << client.readpartial(4096) while body.bytesize < content_length + "#{headers}\r\n\r\n#{body}" + end + # Minimal dependency-free HTTP server returning a canned JSON response. + # Yields the bound port and returns the full received HTTP request. def with_mock_server(response_body, status: '200 OK') server = TCPServer.new('127.0.0.1', 0) thread = nil + received = nil begin thread = Thread.new do client = server.accept - request = +'' - request << client.readpartial(4096) until request.include?("\r\n\r\n") + received = read_http_request(client) client.write( "HTTP/1.1 #{status}\r\n" \ "Content-Type: application/json\r\n" \ @@ -21,12 +34,13 @@ def with_mock_server(response_body, status: '200 OK') ) client.close end - yield server.addr[1] - ensure - # Close the server first so a thread still blocked in accept can exit. - server&.close - thread&.join(1) - end + yield server.addr[1] + ensure + # Close the server first so a thread still blocked in accept can exit. + server&.close + thread&.join(1) + end + received end def openai_chat_response(content)