From d7e08f8850b4cd20386e2b89d13d9c4c6158681e Mon Sep 17 00:00:00 2001 From: OrekiWoof Date: Sun, 22 Mar 2026 04:23:33 +0100 Subject: [PATCH] scaffold --- .editorconfig | 265 +++++++ .gitignore | 675 ++++++++++++++++++ .vscode/launch.json | 11 + .vscode/tasks.json | 39 + BaseMods/petai.dll | Bin 0 -> 57344 bytes BaseMods/wolftaming.dll | Bin 0 -> 13312 bytes LICENSE | 21 + WolfTamingExtras.slnx | 9 + .../Properties/launchSettings.json | 10 + .../Systems/WolfTamingExtrasModSystem.cs | 7 + WolfTamingExtras/WolfTamingExtras.csproj | 90 +++ .../assets/wolftamingextras/lang/en.json | 2 + WolfTamingExtras/modinfo.json | 17 + ZZCakeBuild/CakeBuild.csproj | 34 + ZZCakeBuild/Program.cs | 122 ++++ build.ps1 | 2 + build.sh | 1 + readme.md | 9 + 18 files changed, 1314 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 BaseMods/petai.dll create mode 100644 BaseMods/wolftaming.dll create mode 100644 LICENSE create mode 100644 WolfTamingExtras.slnx create mode 100644 WolfTamingExtras/Properties/launchSettings.json create mode 100644 WolfTamingExtras/Systems/WolfTamingExtrasModSystem.cs create mode 100644 WolfTamingExtras/WolfTamingExtras.csproj create mode 100644 WolfTamingExtras/assets/wolftamingextras/lang/en.json create mode 100644 WolfTamingExtras/modinfo.json create mode 100644 ZZCakeBuild/CakeBuild.csproj create mode 100644 ZZCakeBuild/Program.cs create mode 100644 build.ps1 create mode 100644 build.sh create mode 100644 readme.md diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..87029d7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,265 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 4 +indent_style = space +tab_width = 4 + +# New line preferences +end_of_line = crlf +insert_final_newline = false + +#### .NET Code Actions #### + +# Type members +dotnet_hide_advanced_members = false +dotnet_member_insertion_location = with_other_members_of_the_same_kind +dotnet_property_generation_behavior = prefer_throwing_properties + +# Symbol search +dotnet_search_reference_assemblies = true + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +file_header_template = unset + +# this. and Me. preferences +dotnet_style_qualification_for_event = false +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false +dotnet_style_qualification_for_property = false + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members + +# Expression-level preferences +dotnet_prefer_system_hash_code = true +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true +dotnet_style_explicit_tuple_names = true +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = false +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_collection_expression = when_types_loosely_match +dotnet_style_prefer_compound_assignment = true +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = false:suggestion +dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_prefer_simplified_interpolation = true + +# Field preferences +dotnet_style_readonly_field = true + +# Parameter preferences +dotnet_code_quality_unused_parameters = all + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +# New line preferences +dotnet_style_allow_multiple_blank_lines_experimental = true +dotnet_style_allow_statement_immediately_after_block_experimental = true + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = false +csharp_style_var_for_built_in_types = true +csharp_style_var_when_type_is_apparent = true + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true +csharp_style_expression_bodied_constructors = false +csharp_style_expression_bodied_indexers = true +csharp_style_expression_bodied_lambdas = true:suggestion +csharp_style_expression_bodied_local_functions = true:suggestion +csharp_style_expression_bodied_methods = false +csharp_style_expression_bodied_operators = false +csharp_style_expression_bodied_properties = true + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_extended_property_pattern = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_pattern_matching = true:suggestion +csharp_style_prefer_switch_expression = true + +# Null-checking preferences +csharp_style_conditional_delegate_call = true + +# Modifier preferences +csharp_prefer_static_anonymous_function = true +csharp_prefer_static_local_function = true +csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async +csharp_style_prefer_readonly_struct = true +csharp_style_prefer_readonly_struct_member = true + +# Code-block preferences +csharp_prefer_braces = false:warning +csharp_prefer_simple_using_statement = true +csharp_prefer_system_threading_lock = true +csharp_style_namespace_declarations = file_scoped:warning +csharp_style_prefer_method_group_conversion = true +csharp_style_prefer_primary_constructors = true +csharp_style_prefer_simple_property_accessors = true +csharp_style_prefer_top_level_statements = true + +# Expression-level preferences +csharp_prefer_simple_default_expression = true +csharp_style_deconstructed_variable_declaration = true +csharp_style_implicit_object_creation_when_type_is_apparent = true +csharp_style_inlined_variable_declaration = true +csharp_style_prefer_implicitly_typed_lambda_expression = true +csharp_style_prefer_index_operator = true +csharp_style_prefer_local_over_anonymous_function = true +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_range_operator = true +csharp_style_prefer_tuple_swap = true +csharp_style_prefer_unbound_generic_type_in_nameof = true +csharp_style_prefer_utf8_string_literals = true +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable +csharp_style_unused_value_expression_statement_preference = discard_variable + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:suggestion + +# New line preferences +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true +csharp_style_allow_embedded_statements_on_same_line_experimental = true + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.private_consts_should_be_lowercase.severity = suggestion +dotnet_naming_rule.private_consts_should_be_lowercase.symbols = private_consts +dotnet_naming_rule.private_consts_should_be_lowercase.style = underscore_lower + +dotnet_naming_rule.public_consts_should_be_uppercase.severity = suggestion +dotnet_naming_rule.public_consts_should_be_uppercase.symbols = public_consts +dotnet_naming_rule.public_consts_should_be_uppercase.style = underscore_upper + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.private_consts.applicable_kinds = field +dotnet_naming_symbols.private_consts.applicable_accessibilities = private, protected_internal, private_protected +dotnet_naming_symbols.private_consts.required_modifiers = const, static + +dotnet_naming_symbols.public_consts.applicable_kinds = field +dotnet_naming_symbols.public_consts.applicable_accessibilities = public, internal, protected +dotnet_naming_symbols.public_consts.required_modifiers = const, static + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +dotnet_naming_style.underscore_lower.required_prefix = +dotnet_naming_style.underscore_lower.required_suffix = +dotnet_naming_style.underscore_lower.word_separator = _ +dotnet_naming_style.underscore_lower.capitalization = all_lower + +dotnet_naming_style.underscore_upper.required_prefix = +dotnet_naming_style.underscore_upper.required_suffix = +dotnet_naming_style.underscore_upper.word_separator = _ +dotnet_naming_style.underscore_upper.capitalization = all_upper diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e39752c --- /dev/null +++ b/.gitignore @@ -0,0 +1,675 @@ +# Created by https://www.toptal.com/developers/gitignore/api/csharp,visualstudio,visualstudiocode,rider +# Edit at https://www.toptal.com/developers/gitignore?templates=csharp,visualstudio,visualstudiocode,rider + +### Csharp ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +### Rider ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### VisualStudioCode ### +!.vscode/*.code-snippets + +# Local History for Visual Studio Code + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### VisualStudio ### + +# User-specific files + +# User-specific files (MonoDevelop/Xamarin Studio) + +# Mono auto generated files + +# Build results + +# Visual Studio 2015/2017 cache/options directory +# Uncomment if you have tasks that create the project's static files in wwwroot + +# Visual Studio 2017 auto generated files + +# MSTest test Results + +# NUnit + +# Build Results of an ATL Project + +# Benchmark Results + +# .NET Core + +# ASP.NET Scaffolding + +# StyleCop + +# Files built by Visual Studio + +# Chutzpah Test files + +# Visual C++ cache files + +# Visual Studio profiler + +# Visual Studio Trace Files + +# TFS 2012 Local Workspace + +# Guidance Automation Toolkit + +# ReSharper is a .NET coding add-in + +# TeamCity is a build add-in + +# DotCover is a Code Coverage Tool + +# AxoCover is a Code Coverage Tool + +# Coverlet is a free, cross platform Code Coverage Tool + +# Visual Studio code coverage results + +# NCrunch + +# MightyMoose + +# Web workbench (sass) + +# Installshield output folder + +# DocProject is a documentation generator add-in + +# Click-Once directory + +# Publish Web Output +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted + +# NuGet Packages +# NuGet Symbol Packages +# The packages folder can be ignored because of Package Restore +# except build/, which is used as an MSBuild target. +# Uncomment if necessary however generally it will be regenerated when needed +# NuGet v3's project.json files produces more ignorable files + +# Microsoft Azure Build Output + +# Microsoft Azure Emulator + +# Windows Store app package directories and files + +# Visual Studio cache files +# files ending in .cache can be ignored +# but keep track of directories ending in .cache + +# Others + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) + +# RIA/Silverlight projects + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) + +# SQL Server files + +# Business Intelligence projects + +# Microsoft Fakes + +# GhostDoc plugin setting file + +# Node.js Tools for Visual Studio + +# Visual Studio 6 build log + +# Visual Studio 6 workspace options file + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) + +# Visual Studio 6 technical files + +# Visual Studio LightSwitch build output + +# Paket dependency manager + +# FAKE - F# Make + +# CodeRush personal settings + +# Python Tools for Visual Studio (PTVS) + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio + +# Telerik's JustMock configuration file + +# BizTalk build output + +# OpenCover UI analysis results + +# Azure Stream Analytics local run output + +# MSBuild Binary and Structured Log + +# NVidia Nsight GPU debugger configuration file + +# MFractors (Xamarin productivity tool) working folder + +# Local History for Visual Studio + +# Visual Studio History (VSHistory) files + +# BeatPulse healthcheck temp database + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 + +# Ionide (cross platform F# VS Code tools) working folder + +# Fody - auto-generated XML schema + +# VS Code files for those working on multiple tools + +# Local History for Visual Studio Code + +# Windows Installer files from build outputs + +# JetBrains Rider + +### VisualStudio Patch ### +# Additional files built by Visual Studio + +# End of https://www.toptal.com/developers/gitignore/api/csharp,visualstudio,visualstudiocode,rider diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..bedd5be --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Vintage Story Client", + "type": "dotnet", + "request": "launch", + "projectPath": "${workspaceFolder}/WolfTamingExtras/WolfTamingExtras.csproj" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..8c8fad0 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,39 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "check env", + "type": "shell", + "command": "[ -n \"$VINTAGE_STORY\" ] || { echo 'ERROR: VINTAGE_STORY is not set'; exit 1; }; [ -n \"$VINTAGE_STORY_DATA\" ] || { echo 'ERROR: VINTAGE_STORY_DATA is not set'; exit 1; }", + "windows": { + "command": "if (-not $env:VINTAGE_STORY) { Write-Host 'ERROR: VINTAGE_STORY is not set'; exit 1 }; if (-not $env:VINTAGE_STORY_DATA) { Write-Host 'ERROR: VINTAGE_STORY_DATA is not set'; exit 1 }" + }, + "problemMatcher": [] + }, + { + "label": "build mod", + "command": "dotnet", + "type": "process", + "dependsOn": ["check env"], + "dependsOrder": "sequence", + "args": [ + "build", + "${workspaceFolder}/WolfTamingExtras/WolfTamingExtras.csproj", + "-c", + "${input:buildConfig}", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary;ForceNoAlign" + ], + "problemMatcher": "$msCompile" + } + ], + "inputs": [ + { + "id": "buildConfig", + "type": "pickString", + "description": "Build configuration", + "options": ["Debug", "Release", "Version22"], + "default": "Debug" + } + ] +} diff --git a/BaseMods/petai.dll b/BaseMods/petai.dll new file mode 100644 index 0000000000000000000000000000000000000000..47891f752e9ab93c7690098dd1c0fa44ae0c9e27 GIT binary patch literal 57344 zcmb@v3t&{m^#?rnv3EDSNk~Y@lRyYbSavtOf(l51kno5G2qYk&2urerg(NrbCLqRO zDC%EZv{hRlZMBMhS#1^T->OyXyTwo=$fHXU?2CGjn%Yw*ITa5JH&veEO*nci~BY3m6_B3?n;t{5`qij;yC9+@-ZVHKBcL zG+x;kv%6y9p307JZ?D~7xj9l98|bZ!_Et8nXshh8J0nwaa=g`wb?YJ_S~No}`S!e9 zoYr0uRh2$%nh?JO#gf#bkMXRev_>G0)4G(K2qZuMEkHi#^k;}o7f@09KlxNBk?{A> zM?$RNlqQyvA~OFfHIWV4yB`YCo|$(%yiy2HO1=m9(iD73f8^|b;A4LafIRN2k{cNR zRSL0bN-Q4h048Na->9Q6a&`hNz;I28MY?SiBv}PyW*xkoD8h*aLM%+D2=OucPk$tv zE?go6p&l4kTBeNu@^6MdI7$ew4V8NXXQm*!AKJC-e4>MA!8B9Yins0`4eDS4Kn#-i z*@Z|=bQ-qD081_6`s^ZEBNvGmfmNU^mV;~vQ7}yxWQS-oUpM^4$TS8Zpystgqb<7x zc(IMlpl+8@#qXg|ITHHdSU@gWQ>WJk(n?lP$^E*2+~+DdPWO+e3M|V6$O03{FG35I zpvJ(f&j!_NR{@L`e&hygtpI94?t~sMQ>xNqlTcv@`Z0CGbopyg#*8&Mx(Jo)DHxZv zYf(g2&<9c3yL%lf51t9IafonTAM_{4>nU$D!1^H~>VuO3YX+f7RWGFg5uI`VgCn0l zh}mq`)S0z~!F>N2um_oT*+CQ^3IWI>b@^zx4yX;I2@X*$eUP$4ljPH$N=TVP;3~Xz zISQFhh+Y&>3@~4U_Niz}A0);2XHdmfS$41!aQh@C&Pu@bNAy6E z?5kVsb^6Nc3{5{qL$kT|oCI8dqFeW$3^bq@4b5fp7Z_5frEK#Umx|}cYmT_*gBD*v z8AmLPvrHG+3z4iPn=-}OkOw-1eZwFcsiYZO=~zTfU3Tqgabyh4s@w{Ws(cG2{Y}JY z5daz7Vmya1n@m)T9;@2*nDHZ2^P*ayV45K=P3Xh}QpVU434=|KV;Y8=$_y?c>Dej< zmm+C5157@)f6gVgzL zYg6ekCdfg(lez2c7ErdW9rA%B?Z6VH8W7Suw>h$Pk+rSco?0T)-Uv@GK^B;5v4pSN z9$$us*BV@oN4GV&f*$@>!0o=&!Wek3+rJ7hJB3_h6Ws$Xo%67eYwdQx zl%gp~u2l8=Q3n@nP^GB*sz73VrWd7ZJ>-E0T@9Abd@;l@w2yh2AAbR(;0nxX^C`^e{CY|9fYg$+Hg7Ep>5o9(u67oF|!T4`P8Z>$d5Gxp-DygoP>H0@(6SJ<3>ysJNoC6Y)SwBD`rgv|q`QO%2>OhHQmlg6p3nw&sLEq+ zMj1D0+LGRLl-ovw7A!@~KM_@>IMANKvF+s{loz%Rs2 zQlCOgl^DfS9Dz#eXX<`v-B})}S<9F*CY=bcZyEJo=&ab^36=qUFoH)KDZ#qT$|))^ zM;qMXeDjEgOS}uafp;ZeQ-M!^>+gn+cX+=ZoP1biJUd( zo6v@pU6eCg=TXeUAnI}u>o#+wX@=J8{-O-KDKPbXGnFm8P`)YorWGc8DsbufuFS$N zSy-A^T4pv>Pd4Wi$m~I=1Oc%KQ9{bB9VOnGy!w>^Ru*qwFS9A(u5{_c?T~W}ih_R2TZP zL>#7#kO1=pc4k)QO&V!!m`+k>PLd(2pby5t?$X(NA!7U$jGz~BDS2uc(!`On`vHz3 z4uE(%JnjPx>$_7kPo)|=049Rtg8KSr=dV|(hv%v09CeSkV=Z&4ig^-Z8apu|P)Hq8<`xJf_)o=+MMKy< zLem_yOAVs8XqF78>MIX@^o8B z>kzCF-@)AgXdk=3^C(rN7jvsTkALgP1EZZdcL-XB+2bT&;ZTK>Y#16x$=EZn@1aUc zI+G#A=6RENU&;)aI9JX9;%LTx@8oc~1ja4Na@3p|`yj1c0;6&bvK+~hvK`IXoRW-k zb4r3@K_p)l#`yRWYn0k8*d}aQ1yp{_2I!os_&cB?81}jFV&;)CaB=1Oxp0|@ba^6; zxyq&d!&Ie07L!PxelC?`WX@gzYhqiM%@qyqK?Rxi#(Wwi{vrro-Kz7A)?}ORpwE(L z8mR3ZB4LioMqJisb2iC$R5r|4Ws@i)?Q6Ne?2?;OXO!&J`Dk~$>XS-ympE--fLwi$ z?Sf(2UiRzgF#RbTPf^l2sY>ceQBr7=nghwkyHgrRI?;GHpT_W63MLMT0P7G7PRC4` z?92qD{Z3lV3ha;JRuVB%LdF#7%2K7vNs%tO#>w^Oa|o$+`zacNl*0>7pNZoJnw0j1 z05m8hROU>j8Op+1feU%E{ST=-#p(;CjZdHsVOn2=Ysi^(HLqA;65Pw z;3a^Ztj|JBMpX*YXL|DD%L&ZURQ?kce|jePGve?kWJLayLHy~-{5iosU?t?wW*@*J z(F}~$I8(1iPDWp>0hB`fQe>+6>5HvPkVb2MM7qI{&kA|m7ON>x2p0qXhFFGY4y`ZP zeql$=oDBP9DAE2ZC>HZE>^UINBrn32Pq)b(bGA}cLMqF?3|Z6#|K*fe%vNv(lDg@K z8mzz?Q2bvbf?>m!y?!jC7LF)8ATGr>)uaMEYv{Q~_g~3%hX_T`!?~>Y1&|xE$T-dz zKo@kfc0;ennk8{8?bHv8d!u%8x}SPtaet0zSX^evLiSZ?hvmMS6161dHI$+?nA*a= zBVUGyI4qrRafm2;pR)6Hr9_K4)b(65*X92P_~g2Z+5<1T>~A7{+-ljfn*UqWxF2pj z7!c(+w?P<1$NKrk;C09eMUBC4<2iQ9Cf&Xs3Ht^BZ*ZPv??=Mtwr|9vZmMZ6hp7(F zciX2?p|t?=*m;mls1PW!h2Rxx-TF0_{T-@y&&%i|l=NL7FTqeWG^~pXaY`43B0|vc zeh+!lhAgp}i1A5MQH@mX$Y9$Zz4zp` z_9kg3-y}OB0d67z%3}8szC$n42Vq_&8@GQAiiX^h0!yc8nKCh!h9H^q@xN?_S2Uha zh4v4@(5n~A2_kvu7OLY=KYi*M_RX^M#BVA1A@oxGWWWVATXlK~CUmmmuOO#v!{^3c z2zm^L^7RsTio|HGh`e8VrBRr4Fg`WuxMfTa%o^z_II&!h-vW__2yvz!Z09zVQ4>w7 zA~C;;gC1vdH5=wFtl8HR9C<3HAGg!AlOCYQunz#SZwCl%$~BAYPgfd0hsZwxD5+nn z56*xp>n39dz@tHV1C7uQqAel}6d@hI46P4Q!5|I<=xJXLib~#rVtgiTh<`&&%r*Eb zEntS`Wpt}B=;8yj5SAn2Ep6xw>KTb`a{pNP+5Zbh(ia!k?}7t88HM~U0FL+85IZT6 zVGCY9-?vc5TS|>VLiWR$eiua^@ml9y@R|1>@0VJ)YzDUxr;xvN2H?!9oJkCLuBZ86l4>PWueidG-p^q~#d)osc9{m8zGG;O6B16uC!SMeyTv zo@t3r#aES|N|kZ*kx;5*@aw@tx?*V)q2fzI7|)ub_+6+{6YGGeLw9rXGD_Y<$&#U; z;juqZ#AVr+AV?Bp$aei*;266WW#uA_3GSl_&NKSylx&*Ju!Li*pbvwAeJ@%GoTBQy zlVBORE`?+qwfH8hLMEE`@Im~i56*&Ns-DZ`CuNa>lcel`E@{{Y;h++ch*TOoZJA}? zkE|got7=diZD>LEAFW|?y2t=Q#|H~DUj_%OczFr1Q$QoErhlMMOtybcT^*U~^p*-6 z_5&!WL}FV^=`G0twj;}dIVt5hQOcp($}&j z<%;cxiLKKuA{q80$L!WOl%!ukxs zB~UH>9o66$Ay^$QD%o!)MvEO32ZxzCHdP4Ro=G-FF3htdZACr{!WP-TASPHBXOlJ4 zg3k%8i@!w1&>XT`6_P?`zKhp{fD_L*WB&sNyvRB3A#**%3G6KFCxj;pOX3wyX}JIv zm^HC$9a8LOO4Xvp0#{9pOxFpqhUd#A(TdSfF}0Y_;InVYV{JS2J~QfzW*#p7{omVNm_#4vrokz6 z(+WT7RO&aMZ#NxX!xFr)pF>2sKA(`@!X|LmWr*lh*o+E((!ZV*0x`$4V8M3e7H8^0 zAiPDKPS#)O{|#!)ewGGNdMY;DpMY4r09y)&is&8-57n@Li)6N^Zk8%fIW~e zRLOmzf#sU}?cbqTz+=CF2ToDgF>>`6K}f}a4?If|>XGKtPsX)XIT zh8&>fTO6gzRm$EnI(nvE&YmC`Xle10~qYTXqh+1DNMnSxOP;y&0GP zO_cM$MU6{lMH$Qpmn(q%HcAEIQAx+%IHr%~b6b4mGK9HosvJpxfu?$`l-Ha7g4!{} zlYRC(NV$tIX-l282yznVuVW2X?Ozk*X}waNSN znmVJlD4?ugzL5fdh&NI~$vb{oS3>(eR4!g;{~sRq`vCF30nlyY-|-AMOi5csDRV02 zjRDDrXOo%_hhXHTB%{0*=|~PC4R$inSlEk#^nw&9)(e_ z!#g>o9ci7*X|(?V)aQOe9#Id2s_Yg1O_aeF;xKo*pc~qW0+um!HXbrM!PU^a$m4fP zY#6=Qr(<4GzUhx6gYJl2;#Tk}2cL=5Ss`XENNF{xM%^DljdlKifsI!#+m1;EK?=1i zYe*S#RDd9J0oT*5kz{`Q_M=QAiW2KGOk*9J#>gW|m+36KM`$|UO(h**qS8Iv&@OIs z4&d%S0KUnxkvL+(4_fhmL)4mK%Ar?3gHRAAsTKbZ$n?%%e%OxO z(aLRXjeE!h-~E9U#&h6Q)VgOEpk*2qI&yKLAokd^e~oN8CYY@o) zqrt~B8%);pBjOD1hSj912R`14ySeL>L+`+nPT}!Vb=sd^>8+$rDM#uQ(OD{EtO$-y zDJQ8@M*-F#jWiwA`m@kJrUd)&hw!W*|2XI+sp{Od^5m7@62S53Vs-A6qV#OpM@$bh zG&e09?#CM{l-Z{v8zCsWzPd5SAkI~A;xs{K!g-mYF?=y3))<9D)HWW7_tXsLz!@(o zOm_RTk;iUj=2*AePGD|32O0c2o1Kdk&+#lVA8vdc`h#uIC{R=EXU-&KshN5X8d7fr z&&~rGM=j`%B^}VmM?0V#Whc%uod{V`+3`8VQ{A3p!xbFNN7n8g=xEB6`U{QHXk^q3 zQ;uDL0gpXa#+#s1?-m#iFYLX6lP2$OKmOm=+QSk#khu`7^N zf$@~O*ygk<82Mvv0fNEU57P=`0v@w4w-S3XrF_ieLG~Zh3_>4g&ed z6DY>W@IsOzYOQh(CCCfSR|sv~d`4^*SUS5IX?*+Op)>@&(*7jI99bY}j^>piXkJy4 zpG6$Qeir6oCY=N3Jlv2KuOy)mp9E)r4HZ<|BY33{UMFJLSVg*($ug4HIgrPC6fCkQ zCUdKiqyQ{fYvUfxYu9FE9dTnmc;kKmdUqpe(VjLDw=iM{kcqeBWqb0J?1%-!RT23n zm~)XGM4=&CYUx~JK0WDNf)gMta0r|Lp}`?=0)&MQffKkTy%IJZ@Z#o<-p4ozqd0+V zaD3rV6H4Odbum2*e+cdB=1?Or!-lEi1bGUe*FP0-tUV3T=bsL^dj^1A50LFCv1j6m z6WtT=h^@uwy6qE@^c1W0wvgWuneWH@mfqO8$WNLKw)$V9zN07J!oouTEUIVE2K3JX zzy%xCxh1WRe=cZ>HH|NIpDP*F+_2Ky(k#IYCBbN8Geuk3Kqo4~>u04m~N z1OhIJ7UPkrY1xNO|G)JCF5|!J!`IOCG5e5V7E;*nqzMbXT}o{(N$3sZl%}`gHI8nS z&6X7Um!fp+=}bmnNoSNf0LNlvH-lTTeF`A2V}<}Dfe0cW?@E(p;#DDfxajaJ&n0&= zxbRhP`B7~I%nEONR07#Rk8(J;XODMfYrW+|u8-0CnIU2NA0LYDeD^iw?00`f0 zT7`6NF}$%%1^#ZxL(`DK8}0EkrdJt7<7e1yD3_;Yx(Gx00%M3IVxLapaDrrkx2N}6 z=u1n?pFDQVam%hD?91@olA&gL&^rTr9KZ*&k>$LNmd*$*Wjxd0JAZva4btM)=c&?)4kGwe)j4{rD%0a z8GhC3;1IHE>WXSD2=JjJKuz`#(LMI*B+VHBzF9P-;~$|!PL?%v9&)pAgueky!;9q#tGpGh(p0(< z!HQVRCJX^Kg3Fu;t}9;7rFV!b;br8@B`D3k#!5y{%mw+b$vtBK85&O1Xl{7K%_gPT zE_qu2zq7k*s6Pu*Viak2(%=&DZ~D+FlS)|9$ZKP)9|}$C4p#XMM|YVv*{sxdEd9l< z&t&z@bXE^+cC7j{Sv{G_>RTDCVxOB8PsHQvXr06C7&`hSQ<`hjrNQ`0WhGRTNMzVp zY)*EDy01%TmC#XwLn4vMioMElJ675C86Df2Db2UjrAc&bc)Q|sOliKA$?E!aR*8;% zHml!evbrIIl{5IC%_=V^L*4t+Syi5^`t{kYn$lQ}G}m6~`wVptr?J3XyD?pwgu3(M zpQY}*GFg2momE2JpUEm^E#Wp;n~iS{%wp1})0+?xHP`!N((Nz2>EVP&O0$m^#-1cNdCgF6V~*Q_vOFpsm72 z2zX+HT-IZr+?2D7j7UIMMbL=5%G5pnCU|(f!y_ZAV?ou~f zeFr3~bt1Dwh?Yp4q8G(xLO%K092OZ1@5&U#<{nLI$|M!@H^9>>7V~!lQb;lu!?s^c zqFAh?h!0FgVd>!mla!Javn9(Ff6j6xpR-))G0UBzm&RH%yH*`mx=RhhKBZ&b5l$t=U^J70l$Dce4>o3Xhe%?&7j`Ct8|~SW4hq zmAHU+ryZmP!Pi`XGc@6zjq^SszjIl#00*epNmWv-2+QQ}2gEK%`|_Q+chUKyT9PFT zQAfSmcyx*DoF2%pqlPA{?#g{p^3Jh%Z2^KT(;tECe3q7Dm^5j;M)I9oZZ6A)61;X7 zfvo_=sz4NJmE4A8KlU=3z=aN}^JES8K>)sZ=fBj=qnq8gdM? zuRwN6%d%1b^I)%TgiXFQwtLZ5t<06Tz{ltzYyJOIFZp0CX?%VgEeCGTxLbGxBXi8x z^RWBsqe=zSvIK%xdfzwSoc(k3)bt-fr=6bw$VLom1?797Y1gT&6?1kj>YDsI3)jHc zTPC1}8#R6cF7dO_2E4Z)-*xepEO?dJ^Uc6)4340ARvZi_=2_|$ua`GyX)V&_3StJ; z9KU8NnHBOIrqU$_a;=hf(@vaT`eJX8fyU83h6YEJJfDk#9+t28h!$EZM~u%p=f>Vc z>3Ba%t1+F48Y+20GI=7Bg~f31Vj%$DS{gtNye@MyIa<7j?iIc80ho!n+jg>Uu&-U(1(d02pa%VVES#9aU?iDj3hS-Nnv zYqVKdXk)YI&1Z)=K0nnV=CdDD&XMm9Z{=LIag66#e_3=UG?y!l?)ve!QW zc?G^Cj(!CTva>?f`MywPes*YVewMuqOz;hJl`5(Ce>dq!5|Ej(qxQVqX~0tC#D%FWl`)&INC* zdKBiuBrr3eiUkXf$nUP=T!#Nj(qHeLgTlx1A2r459pD{_Le7i7j%T45!6mRQ6QQHm zLVfUj>S;cDid#C%Dm-EYwW3_t#t?p{0(S0=C0CB@6bgE5*%zSd;DrSK2cUTE27aF< zrIdXyIJoVLkSmt~nP!(QU(czKYXL2~bP&a^@W;9zKFc~(;S6Ey4s>pOiT`5oiGK+I zr}p-j@vNm6kEv{N>><+VKF|VZ9zqzZu|dRMqKegA5o1EahT*{ z;V}JSFibeSOTaRerCwbL(R<%TtN1IPSE6eO4*j@HwhoQ^e4bWt(Om8kzBQ41YW zS=KK=R*HkvJrT)@zz5&y#$ltyXMptM2o~;+>`Pfp^(7nnN|CygO%wG#R4Y7$uvSi& zSZ!XWT9aC(vL$I+-J1~gM5?DmJyCDIdJS7TH*y)pP5rI*Fj zSYimF7x^8QDG9wG7~zcsUgakZ$+*t$0!x0;%TSji_#LRD?@9PItyHOh!BWFteGU~- z*;J`_92%35`b<_)(Iwv}%2&xOtMo$qGDm;h-d=_?S2 z3Nnb_q>}I#X(hizJaPT0h+pH@e@H|h;dRSuLLo64+{DxV(fUwLqDAroLs64^?YHn{05wY=6?MdRfL@di7 zegi}sUV`RWiD7?(B)f}f=&{!tUWaiBmMQu_9eVsZXrJ?5o>H4cRI%>SsQxWfe>vaa zJL4EPf_Nmz-&3OvnHbg@AJ!`1?C?s@u(s(H4aybbJs8AwsEI3BoQLCPGlqQs0TkqZLqsH2U{t5KU#D4ZL}Xk-IOA2 zRAdS`@_Twdb8r<1coo-;)%d!#vS?ae;rCAX$@kjE;96pq=rHW8T4u+Lg5(i~Wj_N= zsrMS_oI;i{2B{Z(_Mjr{Gj;aQ@gJhh5cvw-e>0K^2je)JU+eMTK)xZY8g%Ur>FKe7 zAD3)`-PIJu=0kw}^fN_Z!XBJ-xsCdUKOLPMogash+9p4Cq(|ONe-+~U>e}sN?`$v@gF#$yT-uSIZ z`P}~7@Q5D($kshY_U%YuhXH8C&H@*=eFxI^{{p;R=m{b0{x0gigviG&Q*^y0H1ZdS z6eetx-yhX6q9;XVn&g89#Y`IGI{NMrGcL661kdVo{Pm3=qp zH87uh@XUU>Fs1FpcUV0ECBsBfwaAg7Sj<`>)6T#;&r{^V2 z=+D%Uo!U^$pwlNSwhNtBZ}Q%Yvb>!O6d8yy164+G{64Bb&KQx5uSB1WfuN#J!^`!- zooL0-`8`g53@s$`cIf<8oWZ9RHFY_)4t_tiar|6|zdTFBJmNotr7yC74hDVVt#m2y~i>JLS&Q2cbZ7@LT|$FTQ9}T2S^sN!i07 zC%Qfk@4!GjvfG7ir{HA{1QhtgS}u0XoHA`n{j~b&vx(vo-GJ{;!M(+9A(yre4tYL9zWe*iaGdTf#)(FJbn0}Px$LB zqk8DGcx`lWq9wWt2)aj~Uo}dciip7yO{32qV~OPjXNq71|Gr}KL6!@tlBHivA#dnD{i%ZU+ERK6Da-1lJA3$QT}{cuJ|xSCD-|h ze#@kPPs|lB^C8vGd_>{=`J0w@oJcRoMiK$L;|AtqBBM#u8-} z(v~>U_yfM7eF3;xV#a7{jtE%=Edc|RA%o3NCEkLacDi@$fkFfqXjHC4G8tT`!an#nQ;D%9#%wF-l zQI1|bGKR+J1~*Z5)zFBd=&Nc5sdF>u_vGS+=>>T6}?#V&|-Bt zr2R`3jql}df=fmbe2vF_FOU1$N}^m-L+}$n!Bqi*hw}*jt%#tROTB32y4P~8o>H>a z)6uS1yk0}OmvbMl1I!i6Et2iwJd*7ntdl#~{-1>95qlVw5czbe(bwUDr3D`1VSwe%m znO4|gtpw)dk~dd&SgYYXCAQhuVTJKKe7T(W)shZt7d&kNW6y;;tUdVdUlC(ZfoB-s zqAzD`OOUWqyfH(qKZbgji3vFCC2W(o!}>bjYnsN`C%^_!ZVt<`Fpp%Z74sRpu9UDK zVW{^Sc;0|o5?kZxupR~0#Cesu9oAEbgO@ONIkzw!zokn3dy%=!#5b;q%M&@&`YeV0 zxQtq#FNQcT$K7FNX^rAS#y%}3Y^nGv^q41xD>|%FZ5e)_j<{?a-(l4N`#xi{MoH|4 z604Hft&H7QL@g{62N;{Ausa!RQ`pZK`-Z|EU~E8Pk22O_by&@4?{UU-^kG1>ieEEU z$ymF1ma%s*nge2;c#g3-b%bpazhP`X_ja53tuVAafdg1Xp4-F=!kCaJUce?~Kx`Mk z=e!B%^ML3PFQ=636|ba}w8ft|4|^t*+$r8+tdV){5`SgvZq7SLyw8~AIVk?l7{YDT z+bupy;W;e+fp2Jj$vxFvGhFX}!?$L5HbbxVhEEfnqkd{=;!in$@tGpK?ma-6{%1LU zMn#xo33gUZ!;oK_^CR?k$oqHHGR7q--z}l^*dl_dxjEjCQSyqMsir1mnZK40hXK!R zfTh8IAvaz}a6m$)Uy(z(=lclC@+2XC<$&dUx9mR9uNr@!m>^xhQ)xIsLChFS9*VHm?Ezv3zS1yIf+^>s~F{%Fnrim zj9k649Ppy7H++_;4U9*6XZFS5P#+|j-5%mLn&BCcO%vBK{2+^R@64jyM$V06L^QFV z`}K*3G;>oq!R)#R0e4Jz51Q%ZGP2|YRrKYDn}X8;@3&3_eBKIpEb+3-(T^ooRF)U(Oz;Fe_)#X&Co?$M-A7ua3I8j{XTAE!XP7=$&Ei3Rb^fo!@cN2XT=oQ*& zfR`E_fVE~1;4bqVK+{E(W*1R*hzn5n?CQUu?r(fwLAuWSHNfu4lzuV~qm0}vz>D>3 z08QV1z*CLyWm79RgTqzgw(QnQOdat?*17Qgn%KbDg`Tf7cDBOaokV#bF!n~)?7V%z zK4I)JaZ2H0U?G}v;xW-*9>M-@jlzC|kub!0j9plAY87D@NzC(w!n?B#@xN(#4ux)R!KimdLAT}= z=Tb0?==r2E_hV zt=Edn6}C9EMynOyP*_7LVf!VG8F)p68c&?_^IE-&NQq&ij$X!1I0NJ)-LUy!s#6(?#BiB=uvW zI{VxD3{k-tY3XrbwJPtF!uR!hF->7#nRG-yL7c0w*DLajIpPk5k!15k(@Cre=CVMv zGWM9DdJW=!g^|>Y#iJ=D7mKG;@|K9-$UM(n?>@vZA27DZv)r2p>=TvuGV+#+8MCOp zJ)XZIZ>eZu>_X4&rJrOsi|bY1W2IV7vv@@1eXq)$bBcIU<=tB~8rW}S9!q_yc$YEq z8t>~ZVju6GWgnJ{KH97zB6`+4E~icG#32P~kb1OQ3^TSzMEtcmtHtkB9%*TfSUQ*M zdHz}&%2_XB3Ny>51N)xBDm?pewsg0`CVTRLy{52F#|O+a#L_QFF1@vDv@^u_6?Rc= z7qCML`=)P=wm~$`lO=ERbphM1u-80?@T=9k74}chNA5Gl_ZZvbnP2gm*eIS-SWCr8 zIUB`C3VV0dYlxc0&L^IGJX+pKIh#ZiV;6d|Csk*K#Z?Ncp0ohiBdX-v<=@sfiI&3B6P8YDJ4>m&CTaf`ypmb%0{jWUlk-z`35 zY>$}b@6x)(rp1)EM|{6*VNQ=Qmq_gN+Ea6E@d_P2poK{lYjR>DuUY1OD|bUqT&z{t zP_RoI5QV46k~DrhM0JbA$jZ+VA1Z8CaXEfAWWjQo_szhToFQ@U3dwV2aZk=}aZ0Pi zvaqh7C;Az?(DMsOeV#a1VTVTL0lPq9mzM7n!{QQ!T~m%&TU@EI{TTN>;yQ)hig8CT z6*j+Omi9$)tHN3;rn|lRKv zFF7PG65cg3?{%zj7l{Ie4eEKoS`~J``H}l#u})#b#z*ciiOmWtF%O9^i){+q&RC2w zDa)6|0Au8PF3tI}_?pDThsBn-RFs@1TfeQ~njBzjCH6?*{p_!b+tx|!7s$I@Y&}zA zx0clAd`;}xD6y(hAGyCSex$H<7>6sxoeDb*J-Sl-Tw!PEhk*TBVPS)?*A;e{v41M8 z1%0?u_%_KFzRg&r!d_==sloy-D%q#7vl+WuVc%rz0fixYMagFsmdCQZ!5Hb~HP4me zea0RW1C!tPTqS0O1^x(Il69T&6h>Sg z6(1>#xI8BEaL7)*{ZHT>V4aLfE(b-o$|EiZ#nlQUE{}_w6-Hd15C;|ZpTI}Je$ANV z@}zi)vB$*T$&1C4;-5X#-eba*ZMmNkGkYcWk?&>i(_){(n)5C3D{(zzdvMVD@0?$W zkWD2K{9=z+-F63ALYsRo)h(H*vV;FV;XjL8umV8829X=+~>qs&mx{z zihHxi<^Dz##*!^OFUF=})r{>G_iB@KpBE=Fc3H{Fs;RlZ6OAb)e)6C}Fm&7Xy+iR}M{eyT*VY#k_xi5?N6xQZy&i$kKhr))%y4+WU9#3lGRosdY zwpUz&zP~EQrR4od)T+F%>YH-^B$^cVq`4{g&th{*$=5`;%KMde(0olinv(arcuM67 zy*B4{@dt(71ndp**OZcPijP#@9q@H;ikyCuOls*(QOcOKkT=By#`cQqv151>r8MzY zabBJ#Hcg;(J@y5k?D^yy}EMb+z9IGIETo~GsK12pSKLv(!_rX zMlS!yVxr4-kCyXTbjd9hQe92F;3EmMkv7D)JVf~=Qx3DVPv%i>=P06&Eg>jt(Y{a@ zbFl-|M1XbGJ()OMJQf!_;zy|KQrzmiRB|gy8aP*=+@o8OJde*umPwUAHT~a8WpW?o zSW{ZVo_=IGQ(O7`>7(WGRD8Cs zvW5H`XA2t6NQm1sz;wFQyyR2J)mA^r!bX1&IGe*3i|I=NDe_iQ7a6Bl#E~&*UNzb5B6-sa123ODAf3#K5=~@v8nz*(&k29Isng3OB4d>njcpX~#@t7Zoo5WQ($GnM8oF5dAx_=_F zjPr2He3@tq-35Af-F@Ogc+&@QzkKb4M*)q(Lx5u{2sY*(0{>9x1*Ffc`6FKTJk$Le zU=PFd8Lq2%3w-FbI^S4V@qb7U=iCPP-N`s}<@4(YMQ7#5$UPT2xk=DTQWiA!Z=~sr zX@W6+qNY8lWUlsCYK2JG0REvM2zozG-VcjO-g@nz{_Cn)pwPL|LA~BPSDS8Z3sh<^ zpnNmncK2<#bGQg_w()_{s^uHE1=eT{M%=d^@Shc%K)EZ>1rBu5bwDhhyi;4Ltt}bS z4rI=u!>g$a1;2Le6u^4c=@oMgC_=XS388%##PS8pJ zr|5^-W}*hs-`1ZgZbjWk^#b^Ga zvem#o*XMi8J>vKNJo7>0(~=_d8EtRPi^f6iKyI~pP)wN+Fb^69q!S)tR+gZe#rVZay0Z8P6C?w``t_D9z4TgaZS$8k^5HYag6)VM;|l~ z=raqRHcQPPLWWZF8#tLcpilSz-n>|RQ1Yrd!MvjMO>?sO+@$wR&DdCc5O8tvw{^`Z zFU)ai##T@|(Qb{_$+PT$n9j5Hwu(~MN^M%8+BMsFAkeBE(4U0$9@I}RneIBMKRJFn z=wB*t#o3jdzbnd4bMvg=%5Q)!}qORNb#?h0#PtUlywFdxO~Ub8tq z@RI90T;>+8J6R)ZoUUERcKEcR{l4U{`R>2)*f?O_7AKl#oS5v zBmE@Ky`JOpmzjk{&sZz9?RDfoe=`0xE1zboyHua(&2b;pPw*7DuQ5LvQ|g|e|G+;U zu(zz#eUs@M<45{m`0mRD{WoJ~p!~bVv)y-_->I1IK4_j`H3Lo?x7Pij`Ce_eJ6~T^ zIRH4L@?7^b=EZ?8qE>d+MJO{ExEyd+;6}hjfxF$WnjaRtVZ6k?=rxw`p!tWQ-y-+T zqIcYHBljcs-%PeW^Odpx0{=hMo(tHJpX({r&Y4v1d5QhiOQ>6;xT4@IErZjY&vhtZ7flb%4DJWQ$Hkb^h@+I!7&mKK8do37JY(%nLvbV%g8 z$jAOoZ}t~t9n>EwE6>t&;rX_HP^&5=SYBP7br6;i$XcmwDVd#Bs@V4T63qV zfzOhxX7-}lC{v?lYqZMjF<&gloB|~eW4CBhEbFjXR6{YwD$jV#zF9Rlfy1*!Yp_b5 zH1^i4>8>lrJ(;ymuPuF4%ywms`aRMWrLSc*8@t9^Vx4|T^*dRG8ue~0_iilrOVi&% zym453cVeEmS-ZhsI(C zaQ;Rwe4X#0K_$0&ALQG+%XB(z+2yLOJ>R>_8PNTW@^2qk&J>ac|HvTQLTsMqAgj_nenPBc^uhNtE znm5F`lg%5(f9Rdb>C1Fl7tVri^TcJW;XUZr6yMw8_Pm+CEc3ikb9{F*{Ti3;YVbXX z^b+4;v9fw4()b5L@Rr(|;5y#{eRK7hzEW*nbsv{M+xHBYB(Jy|<(E{S@5|TLPu%CD z*?O6e#`p}U?q#yX2%>$DU_&oTD`a{0ah(iw{osC;v58eQI(Wi?=;x)hx zfFAKJ&b^*~$PfQ@1;;HgY+18mf{i+!W^=pEp^z#zDZ z;jm1bMCmZ&;>l5aIK7wCH*nf;QSL;BjSM>&?qzr*!-pCEnW15Ed4`P)!we_5iN1j0 zCWfyv)I3C=z_5YgD_KMlUM`Prm#Bi8l1OCnU(b_`oEbR{McUrDq zrk}3I^c(d%^mp{b`gEhi=rRV48;zeE|1_G-PtDP;6J7IM3tfhlXRWv5*8A2NPqnAn z^A*oCopYZe zRQ?EXUoCO_k&oafp4$OiEA9kzrY8B_omg08TOg|2YYfL*1A-DD}! zGx+_rdO%&w#2vqe_i`(co`aiu9W!nMU^C{ThJUwgBGRWq&zfif)bWnjB&3%E>S6`< zsG4X6)bXZS5b1S*^s8BQNS_X<<6mr?3b+9+Yq+DFj`T*%Y)xze)I}IAYhp8?j_+8U zgmfpME+W|RYGMnZj(=Cez990dO0?9k(4&$2)Be$lVR764>0v+}G4dj$ zzX+&{z5K@9`G7j^c$)#giargAGVN0BO6<4(p@sAzeYFuYt~A}Q7S~y>A=f_F*Il=| z9(4WP^@(eqwZz(G-C;d$J?#FKdzI&O&-XkJd$whLob_qeFTC$~b)Pv*rvs^fPvG1E zM<&Yzj4qoBOq}`5l!A#m@oQ!1h8%@TKz8IJ-&foPxNi!XS_=WF}IIYO6 zTRo0we$<={OA6o<#E0yq4xcIbOvPs!X4rIm$X@C(wo9<5-yojA=Q(_Si2Y}izC_%r zpR5IqmD&@??=hC(Ez}KSoVh{##(Y6LY_8OTuEW}P*MGDNT`v7+t_|Y1t{nY6SH8a8 zRWGJkCu=sMz;R|HXe+g^TN}jJtu{^{bl<2SHgD8l@N5u|WgXU^!RNPGQ;o~LQ;nzV7g@#_n)DK7HCoqR!?5 zNTFh^f6>{Ij)8us8mPzPs;Zwbofxg?UDVqj?cdcD3HNWMW+j>VQ+}`AAKkKRc_bX$ zysI_RA7{x}f(*G%s2_FBp(RFko`t@c27XNt(Ps7!Njv>&~Xp2NMUpUvFR z%bA>766tU5?T^I59sNO$-f&O4VkPSg@tL?K66uucXx`Fl z$K%n>-7F2nJ4$HKwua-&qaBgsTHj5I-~ zi{%5|-C?L_({$0mW725%#s_*7sd-WFKo3Ss7HEw{I-?!o{$yd)S{~`&X~(v=MPfT5 zv1O5XJlqvo8t(1vj>M9=jor~mZ~sxb4trP?%C&Q+0c=ZfC$ zT}@F|Q8=~>c@6#H-p`P$K20uQN-m_1DHrmNH{LVTSOQZlkvb+zT2VL|gN+)|N%0 zwV|!8dCelxuw==qMKamCYDN2^#&)K5cD8K|cSbtpatyb__555fc7(eJA{#eChXXxQuMM$CSTyuTd$2Owy~`r~ z;ihnZSSh(F67LJ|>}5(AWhh%L4aa)y-d!!x&9I;jN4Q42yF0=TAUApTH|`Xz(cWI5@koc=+ZkUSM|yD--fhK} zEszQr$=Mu7=XYRqfv@PrxA{7@OIwrKJpF_XqjMZ*@j&}1+G zZaaIizN$$Tg*ZH^7VcV&G&zMHh`Bu66PdSt!M!J!Sm45_k|E|6fsBsEB zj^fa1_k^RpN7FlOOlSemk7OG-H}ycIL|m%Vi0=5XD8AdH%5CE znG|GiM&uHqLL_$*Vrfjeun2V%(XOhvZXc4u7DiAh_uGs14Ap|6kA9IZ(&n#85^ zWLySRE#cm-MjKVp*`?w5R!$Q?%H9!4IHvf*U6f8_x7%Il;Hi;aQ2FL)FFP;JTx$0- z6)gKPGvq*XPPD5R?mLA*{d3}N=sO}h2=owG7Qy1x9*aHSENQG%4C5k?oiuT@juk z%k7;>0*zuCp+C|c>9b?~>~&UU-RaQ^2h(qEhy1>sq^(0PeAI@~h(}!?>7bBF}OZ>^eIMEc|)s7x6juCYW zLn_o6jVHVa<#UCjh$^a4S`zRZm=Z0~-iX+W9Yr@Kh#4u2d#ucqan;*Io}6!t%2+G0 z+e#E^Xl_KP(?1a70dZVvYq-B-YoZLzF-DfifuaGEs$(jN(@)|^M@*)tJTE7~YioNf zjQtTpMy6oI7IjB@;3pP!Mmaobhox{jI|%O2x@wWIs}=&6u9C=w=+La07@)V;s4G zLuWFpnfzN4g+^Ay5Pqdo+je33$e@u9)2cQ_HV<@l(PT`rYlz1qJ)65>MzHWCdBx_q z-Hos-Ns)7$Esb{6$qa|XV#vP+sz(%ibY^q!7CRYDQF#sBSkd_)1rK?Eq_%3z1R`{7Z$pI2vz<V`|NVIX38$6D7%+!P*ejSf(I;?NbR=#H4`j$ zDghHzDGa8Q8rU4?A3b5UFSOxtqUSJ2>E{#%$0s|;!_+X)Z_@~MF2g=U(HBFNhz$gJ zzBU}ZB6(D_F=9}~9(&|rgupbQvV>fSVN}wGw%gJHuIOEElcOGq&61eCb0Ic>J&^{S zdi2X8%haY$Vyk=mXvN@ewMHogU)Z*jQ=~7IO89+6Slm4j-zt_sxMgTt)~19bOFq+bv;$b^qBBm0CMU5>Qeo-qQx<~^t*Lw}x-5LQ!mv+Jsja-A za1hegZTBy;2haopg>aOXMLI0UtZcQT_?fmSR_`eG_W;BVqwhEiO48P(4IwC>4iKS> z^Rb25yiM5nP@T5kNO(Kk0UeY?VvXvkK&@% zNC{d$YalX!k&pJaZ-v!&l0rnYevI*DI3SGef=i2pdlFWJoe);6C`P9T4vj2{c92dI3S&}~ z=s>Ux$N-k>@1V2q9yURhq{9olhgzg)A2u-1BU*R#t>_i0fv|Ee(FkU|4EkC*2*b2c zd-7xnCoEJYq-@8`R>xBdWA^q)FGZ3o5MGOA(O#ApqQM$jUX^U_uzN*#GfCYmmeYNh z8dc~JW7mTF23jfDTob!;>2Z=MslJQO^<-HnuTw=+bpDV?%e|oB^B!kQN4$9=B|L># zh1~_Br3frONt7Nji95T9$QI>b1aJSH!$|HeZn=1w6F4wQq)FCg(N1jCK;o_)WsBqn zAeM88tWX+CbuhXLVLA$636R?{9%eYoctqjIA;l`p?p+*>VY#C-RTfOfWQtjeyXR9^ z(J4<~xukOz$3vDt+Rhq)7sjrD&v@ExwK1V+SM>1F5htCqazrL^9Mi;>;tH#GG0tzG zSxl~YyKSqT1iIK~leM%C&{d=jnQ#r+=?qd^f25C$Kb3}oqnk=1JH;Flu5x?&*kX8@ z#~EiN)?(Y+2dFezNjGh{ul3)7NfHY9m`6POHN77j$aDNij4;ofkUDoHlHOySK5gLWuvsmsEB4&K~?<0n;9 zC9x1pN*y(E5Q%JOy&zS$W5uKEM;fw}1^K8fIW<#^ z4WR;6p^@m|({{E1x~q|$q^;n>U6P1%W)y9=SK}B!R*^>|Y?0Vcv%nc7#1e^Ygk{Oi zw>T}l3sFfgOxxLy3uz~(VF?8@_B2=|C@sZSh_sBw2*&N5%fb|jNZX_6oVJ$jSl2*v z)N}O4L9WS|H|Qlc9b2#~RjO4v?RE<;2Vw~kVOA}4fhL;ekqx(}l3TEJsH9r#9ZW9r z3d2had|jZrqL4mGOF74Kh6aZp@kAQ)Hjz#rK`gZ0HuMvV0XFj-Xz1v`nLeSiHyK1J zRR)oDov290kWNXt=O!mY?v)l0Y6R9y2PQbPS!Ls310=r52Bdc_1OiaH_2RU%xU5Fd z)V(Z@_)}h9IJojJ@GCe5rjR8rnsH_y?TGgCMM|9Ye$>T=oF|#r9b9%%ceoGNM9UCr zMAfyCv%PEU?_5Ynrg5>kOC>t_r5A;$U7*5F3wLjCw|9nPDDNz1^5_uTP&!qJVEx0j z08}sJ84AsQ98<@IbUAS~@Xk1{f|KWC7ByP9U^v=P!5WL(6drOaKm!AVrQ<$Ar70*g z%Ot0i>r3Wg2q0MMncxV`HsN*=J4l>$U{qzRa8U9XDvn7(E;M=i6c_MOP9_CX3wQOS zR=X{qWV=j&1Ct5Na@spD?hfN;Ip@xsxp8AZPEXmAc$c7B?Cz#eJ43uh2y|dQc&|dN zX-h#CVU;Bs{0Y_zzS`wbm9}zNI*~=X!{XW>BSdK~iLyPz)$!FNIg!LLJ9Cpsysd77 zN%pVkqj*HJrMr?&L@3+_MPc2Gc2UG4T^J?gOq3}KZ`55WrKBh-E3wCO)}=U|C_4_6 z)^MDj!J?!)io?exW|wTe9dodIDXx4dPwvxrCi5FxXbZO~n6MIa3LH&w`b@rG-OQy| zkwTB0$L%Qv(_yxNwRCKk5qsMJn>#BiZKnZi<=qX><&kq}0Ab0=VhJSk)iALHzu}6& z1>=LDtDkh-*|-&9g__eC80e-qokZ*xosA__Dl$!mHaNC{_|dW{I#oqP8|NEg+{0lD z)K6WMoAkDDKW&E)o8wF%0*HvN2aksM;%*yHL~={81K~90h)k^Lbpkc=@EkT{Ft8bi zCl#k4pjAmZhS)jCoX&o7&&s-Bb-kUf*i3^0UG>|W2e#DV){3<+!)keRF4&@}CLaf` zz(!|F7)L51Oh+tY<3@7gNHoyp4i%#ZM5PCZ!5G}gns6)%WkcLfe&@`=r6n|A%h8YB zo5a*HdjHY$RXVegmS&YhhbTCt?CPZxd+tf2e5)dz7l)si-cBKY`9o}>&|W4Hzd8Yk zXbeYV_F|Nl{4jtR6}hIx8z}z3-DL!)e?;%XSkqApCt4y~a3k8=Ni!%xTovuwnof;6 z+0kAuMR=TeWJd1TQVVRE?Vas738C9Sfo*dNhBKu^P77SLvmMTOqff=oblXTrw8{<9 zd60w1VLIItYHNWBv6+c8rVWpb|3PPhp_91!0v;g+Yh>V$d){$ z?eF(L_s*B3RJ2c9cBDD?eE!e>`+VGU?;ruys7q8g*lKxWIPk$6aq$?+64{-TL#L85 zcgz<+`25P8hUV-C?RvK$fXh(|&v|e0OJ<<6B>^RHO9&+tWdC7EH zy;0Q+f%}0w6+-&8A{@kuT}h-p)g);W?_bR+FI|=K7CT)E@zKQ+M_;B`H{Jx3gi$nQ z4ktv3m#aIIqF%Vy!ii8+IJ#21Q(UWmrik@=lr;C#qD0+bQ>XP&p;;(^PFg~gC*o}= zr!?diUcCJrxzDIlv;doaX)VgQ7Dr05_lFyPGuVfLe>CKeEG!`wpZ_qavEuS|>`l*| zoyUDzXyWp96ZE2Z`=pbcX;QCdW;d6X|oeo@`tnxCCU`7G*{@zk1nb{>$= zG(arksRV3v;`adNkdJj0pkix;IUNhgc@wb}Ma*&fL~w@NBCLHY$SI=56rNciE>SCB zXfR=4thuSV?DzDD}bqum0bwXFgNVx{)YMlBm_s)N%~ zwL8)bf?D!~(j%mEND=cJN`0e< z7~9;awrQjXuc&FFXd!w7emGF5wDKh|t)8;XiSwT@VApR)@%!6{MPZG=Y54i%x2;!JO-t#?;P@DvG{o8 z>N|KOXB}5x;F_|S{2JsVFt&Lh=&K2YWJHXTFA6e;G;7eU9YrmYWJ(w}Er_8p8kVu= zUg^0@YTiUWANaFuMcfB5t*3~Pj3Xi~blkpBUN3s`p<7u{FdD@zxI(g;&c@I(iXP~4 zFjPEK6A%?(6}5>yjI{;teaX(Dg>kbmvQ7%!z^GI8uN5&Vp;AybMfACbN2hB&Zs$H` zP?Pvu&wqVALL{&02(1Q})U2Qe&M~2wI9M=Qx+^o#P)4L&HQ+T1y61s++_vUwte5NY zYOc4l>lznX)Erc!X*9#x>TnuqY_3lVX!!8}|Mk$DYvZB9gRcNW5$=GtaT+>hEaHVo zKh-zJQND^t5~)#i3mn4F;>tF3ynxZ52{jDsThPpDe{8)IMUC}whe|BXiY7DF0r|!4 z<&n1 zcT9)eCb7NEgIyzE%wdzsj&;NGtr1` zx!c^rq)m(4%EB8Kw@ReB&34l$_GqS2mPd==fXHc-OdcD&Pb}wVsK!PbJ=IQiN#|;l zSKFyBv4E%C)}ESiFjHktudKpuII+{je|u}(+8cErxa~?(QZZrzp7idSV;fTrcbXi%acGH#%8PgiKnk2qE z+0l>1OCB3sJY;g}z&sFD- zq?xuuOlS>|^+8gJ^CqCm*oL8m{)fvU;y^miBP1s3+4_;7kwYqP+Hz(`o*U`M*2lN; z5)w7F1g$ezm_-zR6fw$;=RB&Dvvg`9_Q`~I;_vgLfIv+(SbeKbd%&;5acQH@z6MH& zg`rtB!8n5w+^_`wlxIwX;fh&Ub>oE#)LJYCUmO#z__FMaS03>ifEdz0&4?VhaOJ|S z4ESc_pj)XGO2x-ZB*@#XP{^SvV8VXQ>cCgOkM>;t8tdRX#dx!L-9p$i$TPAhF2-w_ z`dEMm?+}EU3bIqP+=&t6B8uyD<}RR=j*GSG8PK?=#KqeG6{$n2(U6-L17yG=zAG~E znTAWD0L@Ma)~ko(HTmhPD`gGi!l>9XkhM>NZDz<&DWiM}zwE%zN9{8o-1(E4kw3e; z`CR#(0)AM?w=Ac{S5^WM&tuYUP3mx=)mOTZ^etV`1;)o(lKKiN=_@WOWwS}Y1!1-| zW$6*N)x!zY3jZjHAJ#db>_pnq;Y}$RlyDU7hf&+hImu2PuG_AgimvFT!|G7L!gX?% zZM!-ATwEG8+t7!e)K~Nsbm_Ww(zcTsVt0oal>l)a-%0$A4t|sbE%XFn*o>URYg5nz z>%N6NVw(ZB=qZC7W^W{X+uHwh&QIF9kjd!a4*tFHom9%|^yV!mAtCy89OB;rPVwC; z$ut|605dK0zMD+7=!Hy%?8sy?=oa0elrg07>oW*5WGe$ZlK{VhzhKi~Q^F?#<}jcJ zkHL`OD@$ME^;2Bi!5AfZ=pIz{5QM!qCAfJ*dP0|or8ndaB~2vdx7d0;V|S*ajC5Q< zuM4vZM1PZ<@3-{2>$f1kkd2bbluelE1(Xocze*(YUhtNn_?{z}An8&_`2z;C0}7&+ zI#yN}(f~LJe(La{0QgbPZ_TrdOeX3hjXr`6VwDv#vP9?+6)o6s9bcHAbtx}=z(^;N zvR!Wg(sChBbTyC?2$BV*NI{IQ4nGtnThCBqf_L>~&I|54C_*9!&MUo6P3<#T51>#; zl{`N|{R%d9!3*AFlMbRAe4vAeI(Vdm51E(5o3KGGH9Ghpo3g=%zejWv|E)#jP^86ri{1Z<*qIY^(aC+;{qV6Gqhb>;taC{U^}j}C*`0! zFDKo*nKa%n1pRZ-79IbRXuuj=A^BI5XOV}acG3|I$JMztsZz;pc8P)e12O z_jK?;2cNaU`T!6Akf>yl7#)6*Bv$$TOaz}v)|V1~mGN6`9e#yeU9jOGDlnL|Z>LQR zCa82JkpeJu@_<0YxA5Nva9*ViLZ)RvYmon;pj{!MmTMY%EU0w4=^o35bIR**Oh~&I z8M`f-Xak1pzy=(sA{5zyokPZs=;jlLEh>4`vC<-vzt)!^+H4!O@o%9tPk?LirL8Z4 z>JB(Tq&`JwlGy?OBt1TEHB<7&xuUxnQK4bO1bc7XyVQqWd2TiE1+>nfCf*@WuwDSZUO6Jq=1S^KsU|=uCDK(>SHhf?lhD6X3Et)x(^lz$M%R= z6);{p`kW4rX?B7Ey9HpW<*$)P5!>yfVfsjj>ucKI$Pbd1vkpTT}dK}z?% z%3lhOmHTFZqLubWPJ0*y}@v1zmZl zD<4$<;VseGL$C74&D4>NAxFW4$@%pxW(EdO9%#YHK!|A8+Z=76)AtkbSD1VP_bvu| z8608o9D}FL#L|pOZ>NkWrw+n=?ojDI0$cB8p_52UlB$W+h^f=bIzL67yQWU3BoC-K z`(7HlSJIQ-fbQcwXi`rQ@5y#>h7!M`L$TPfB#gNab_mim-;X&C>B=XF$_ za8;O+V!eR&lY9Jxjpa(!hb0wq!@&d;F)TQkc;#TR!|e*#gc!;({Y{`o4kHGq#vki- zn`!;J=>f`hw;H==Fua$7>j*Z04+a^yr49HyVZkM+lZ84q=KIu4%wjGvsWE3^@(ChH zBcDSFvJ*0ZGNbhfmXj?`5fS^f-%0QQ5{f zn?NGiKrHQ8%Diy#0Dld7!hY&o%f%&}5gWNZRgzKb82R=*i-E3EuJi$xOQr=f8biFXQo&@G0<1+JJCOVd>VT! zmO6d*X31YI`$a!G|K#Hw&D30%zgE8KPZbya#qup5XM=omIH%#nmkKIE|Lb!&UAkJv zlf~VQ$H}|=`eTt@eoXf9?mi;j<)6W+9-I{`ES7HKneZE3{y5$+F+YVPTN8X_t8l#k z)V2QJ>48(z$4h1@wv2il~5AglHFYx_Ytp?lRr+pM( zRr!6CeZQ`ZwdB>Aj6|Q;E}p&k^gk~B{CNA@=YI5q)3?7HEOima$mz>C<9{8;Gp9Mfo1$@{S9J%oNB!Ormmh+IE%e}_Qnl9aH$qnrtqY3NuCTe zZT{;ppfr=(2<~^O|A!plZ>=l5XH^A_#LzA>N1Z4RsN3 z*?mKe;MCehyzlk`wy&?^dLH|h7o^^Yt^fX?<{h)_fgf{y(Igb-4|QNA_pH=<13QY# zfMfPkN3l!Et#W>zlUCgP=T`rU>^;Wkrlf*;zx5n|TEK}n+sp>-R!B#rP7mlde|^~U z1rP9cS`2Z~IXK=5Tf_!)^;Q7N%?>AbdKKPk%(^k`v)CEMfqdzcw|JtnflY0CFnrY7 zyn!~ny-};%i`yJM)i3)LmP z7C*Ux*D3&#f(yWFX$AI$D4(2S?U){>xMN&TbFB}%p6v`G)2qV*K_ZJPE8$KwhVi-;X*xkJcmG^F`zjfM-Q~PoQiX vZxzO1htGiUeHgsv*8Kw7m|F)s<3Tz6mVbV&unLCFpZqPS<9F!)uQ>4EX9OOU literal 0 HcmV?d00001 diff --git a/BaseMods/wolftaming.dll b/BaseMods/wolftaming.dll new file mode 100644 index 0000000000000000000000000000000000000000..20455bf5c71e014e120f4053f941a62ca3b515f0 GIT binary patch literal 13312 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 HzX<#n8XDip literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..3b05fe5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 OrekiWoof + +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/WolfTamingExtras.slnx b/WolfTamingExtras.slnx new file mode 100644 index 0000000..e7d5b18 --- /dev/null +++ b/WolfTamingExtras.slnx @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/WolfTamingExtras/Properties/launchSettings.json b/WolfTamingExtras/Properties/launchSettings.json new file mode 100644 index 0000000..bb5efd9 --- /dev/null +++ b/WolfTamingExtras/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Client": { + "commandName": "Executable", + "executablePath": "dotnet", + "commandLineArgs": "\"$(VINTAGE_STORY)/Vintagestory.dll\" --tracelog --addModPath \"$(ProjectDir)/bin/$(Configuration)/Mods\" --addOrigin \"$(ProjectDir)/assets\"$(VintageStoryDataPathArgs)", + "workingDirectory": "$(VINTAGE_STORY)" + } + } +} diff --git a/WolfTamingExtras/Systems/WolfTamingExtrasModSystem.cs b/WolfTamingExtras/Systems/WolfTamingExtrasModSystem.cs new file mode 100644 index 0000000..27ac322 --- /dev/null +++ b/WolfTamingExtras/Systems/WolfTamingExtrasModSystem.cs @@ -0,0 +1,7 @@ +using Vintagestory.API.Common; + +namespace WolfTamingExtras.Systems; + +public class WolfTamingExtrasModSystem : ModSystem +{ +} diff --git a/WolfTamingExtras/WolfTamingExtras.csproj b/WolfTamingExtras/WolfTamingExtras.csproj new file mode 100644 index 0000000..92c3459 --- /dev/null +++ b/WolfTamingExtras/WolfTamingExtras.csproj @@ -0,0 +1,90 @@ + + + + net8.0 + false + bin\$(Configuration)\Mods\mod + enable + Debug;Release;Version22 + $([System.Environment]::GetEnvironmentVariable('VS_CONFIGLIB')) + true + $(DefineConstants);CONFIGLIB + + + + net10.0 + $(VINTAGE_STORY_22) + $(VINTAGE_STORY_DATA_22) + + + + --dataPath "$(VINTAGE_STORY_DATA)" + + + + + $(VINTAGE_STORY)/VintagestoryAPI.dll + false + + + $(VINTAGE_STORY)/Mods/VSSurvivalMod.dll + False + + + $(VINTAGE_STORY)/Mods/VSEssentials.dll + False + + + $(VINTAGE_STORY)/Mods/VSCreativeMod.dll + False + + + $(VINTAGE_STORY)/Lib/Newtonsoft.Json.dll + False + + + $(VINTAGE_STORY)/Lib/0Harmony.dll + False + + + $(VINTAGE_STORY)/VintagestoryLib.dll + false + + + $(VINTAGE_STORY)/Lib/protobuf-net.dll + False + + + $(VINTAGE_STORY)/Lib/cairo-sharp.dll + False + + + $(VINTAGE_STORY)/Lib/Microsoft.Data.Sqlite.dll + False + + + + + + $(VS_CONFIGLIB) + False + + + + + + + + + + PreserveNewest + + + + + + PreserveNewest + + + + diff --git a/WolfTamingExtras/assets/wolftamingextras/lang/en.json b/WolfTamingExtras/assets/wolftamingextras/lang/en.json new file mode 100644 index 0000000..2c63c08 --- /dev/null +++ b/WolfTamingExtras/assets/wolftamingextras/lang/en.json @@ -0,0 +1,2 @@ +{ +} diff --git a/WolfTamingExtras/modinfo.json b/WolfTamingExtras/modinfo.json new file mode 100644 index 0000000..d1df58c --- /dev/null +++ b/WolfTamingExtras/modinfo.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://moddbcdn.vintagestory.at/schema/modinfo.latest.json", + "type": "Code", + "modid": "wolftamingextras", + "name": "Wolf Taming Extras", + "authors": [ + "OrekiWoof" + ], + "description": "Wolf taming extras mod.", + "version": "0.0.1", + "dependencies": { + "game": "1.21.0", + "petai": "4.0.3", + "wolftaming": "4.1.4" + }, + "side": "Client" +} diff --git a/ZZCakeBuild/CakeBuild.csproj b/ZZCakeBuild/CakeBuild.csproj new file mode 100644 index 0000000..208214e --- /dev/null +++ b/ZZCakeBuild/CakeBuild.csproj @@ -0,0 +1,34 @@ + + + Exe + net8.0 + $(MSBuildProjectDirectory) + Debug;Release;Version22 + $([System.Environment]::GetEnvironmentVariable('VS_CONFIGLIB')) + true + $(DefineConstants);CONFIGLIB + + + + + + + + + + + $(VINTAGE_STORY)/VintagestoryAPI.dll + + + + + + $(VS_CONFIGLIB) + False + + + + + + + diff --git a/ZZCakeBuild/Program.cs b/ZZCakeBuild/Program.cs new file mode 100644 index 0000000..21323af --- /dev/null +++ b/ZZCakeBuild/Program.cs @@ -0,0 +1,122 @@ +using Cake.Common; +using Cake.Common.IO; +using Cake.Common.Tools.DotNet; +using Cake.Common.Tools.DotNet.Clean; +using Cake.Common.Tools.DotNet.Publish; +using Cake.Core; +using Cake.Frosting; +using Cake.Json; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.IO; +using System.Linq; +using Vintagestory.API.Common; + +namespace CakeBuild; + +public static class Program +{ + public static int Main(string[] args) + { + return new CakeHost() + .UseContext() + .Run(args); + } +} + +public class BuildContext : FrostingContext +{ + public const string PROJECT_NAME = "WolfTamingExtras"; + public string BuildConfiguration { get; } + public string Version { get; } + public string Name { get; } + public bool SkipJsonValidation { get; } + public string GameVersion { get; } + + public BuildContext(ICakeContext context) + : base(context) + { + BuildConfiguration = context.Argument("configuration", "Release"); + SkipJsonValidation = context.Argument("skipJsonValidation", false); + var modInfo = context.DeserializeJsonFromFile($"../{PROJECT_NAME}/modinfo.json"); + Version = modInfo.Version; + Name = modInfo.ModID; + GameVersion = modInfo.Dependencies.First(x => x.ModID == "game").Version; + } +} + +[TaskName("ValidateJson")] +public sealed class ValidateJsonTask : FrostingTask +{ + public override void Run(BuildContext context) + { + if (context.SkipJsonValidation) + { + return; + } + var jsonFiles = context.GetFiles($"../{BuildContext.PROJECT_NAME}/assets/**/*.json"); + foreach (var file in jsonFiles) + { + try + { + var json = File.ReadAllText(file.FullPath); + JToken.Parse(json); + } + catch (JsonException ex) + { + throw new Exception($"Validation failed for JSON file: {file.FullPath}{Environment.NewLine}{ex.Message}", ex); + } + } + } +} + +[TaskName("Build")] +[IsDependentOn(typeof(ValidateJsonTask))] +public sealed class BuildTask : FrostingTask +{ + public override void Run(BuildContext context) + { + context.DotNetClean($"../{BuildContext.PROJECT_NAME}/{BuildContext.PROJECT_NAME}.csproj", + new DotNetCleanSettings + { + Configuration = context.BuildConfiguration + }); + + + context.DotNetPublish($"../{BuildContext.PROJECT_NAME}/{BuildContext.PROJECT_NAME}.csproj", + new DotNetPublishSettings + { + Configuration = context.BuildConfiguration + }); + } +} + +[TaskName("Package")] +[IsDependentOn(typeof(BuildTask))] +public sealed class PackageTask : FrostingTask +{ + public override void Run(BuildContext context) + { + context.EnsureDirectoryExists("../Releases"); + context.CleanDirectory("../Releases"); + context.EnsureDirectoryExists($"../Releases/{context.Name}"); + context.CopyFiles($"../{BuildContext.PROJECT_NAME}/bin/{context.BuildConfiguration}/Mods/mod/publish/*", $"../Releases/{context.Name}"); + if (context.DirectoryExists($"../{BuildContext.PROJECT_NAME}/assets")) + { + context.CopyDirectory($"../{BuildContext.PROJECT_NAME}/assets", $"../Releases/{context.Name}/assets"); + } + context.CopyFile($"../{BuildContext.PROJECT_NAME}/modinfo.json", $"../Releases/{context.Name}/modinfo.json"); + if (context.FileExists($"../{BuildContext.PROJECT_NAME}/modicon.png")) + { + context.CopyFile($"../{BuildContext.PROJECT_NAME}/modicon.png", $"../Releases/{context.Name}/modicon.png"); + } + context.Zip($"../Releases/{context.Name}", $"../Releases/{context.Name}_v{context.Version}-v{context.GameVersion}.zip"); + } +} + +[TaskName("Default")] +[IsDependentOn(typeof(PackageTask))] +public class DefaultTask : FrostingTask +{ +} diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..2a3616b --- /dev/null +++ b/build.ps1 @@ -0,0 +1,2 @@ +dotnet run --project ZZCakeBuild/CakeBuild.csproj -- $args +exit $LASTEXITCODE; diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..1a40ae7 --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +dotnet run --project ./ZZCakeBuild/CakeBuild.csproj -- "$@" diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..300e6b0 --- /dev/null +++ b/readme.md @@ -0,0 +1,9 @@ +# WolfTamingExtras + +## Required env vars + +- `VINTAGE_STORY` +- `VINTAGE_STORY_DATA` +- `VINTAGE_STORY_22` (for `Version22`) +- `VINTAGE_STORY_DATA_22` (for `Version22`) +- `VS_CONFIGLIB`