diff --git a/.editorconfig b/.editorconfig
index cc2facfda..353ee1ffd 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,3657 +1,3657 @@
-[*]
-charset = utf-8
-end_of_line = lf
-insert_final_newline = true
-trim_trailing_whitespace = true
-# Standard properties
-csharp_indent_labels = one_less_than_current
-# Microsoft .NET properties
-csharp_indent_braces=false
-csharp_indent_switch_labels=true
-csharp_new_line_before_catch=true
-csharp_new_line_before_else=true
-csharp_new_line_before_finally=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
-csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion
-csharp_preserve_single_line_blocks=true
-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_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
-csharp_style_namespace_declarations= file_scoped:suggestion
-csharp_style_var_elsewhere= true:suggestion
-csharp_style_var_for_built_in_types= true:suggestion
-csharp_style_var_when_type_is_apparent= true:suggestion
-csharp_using_directive_placement= outside_namespace:silent
-dotnet_diagnostic.bc40000.severity=warning
-dotnet_diagnostic.bc400005.severity=warning
-dotnet_diagnostic.bc40008.severity=warning
-dotnet_diagnostic.bc40056.severity=warning
-dotnet_diagnostic.bc42016.severity=warning
-dotnet_diagnostic.bc42024.severity=warning
-dotnet_diagnostic.bc42025.severity=warning
-dotnet_diagnostic.bc42104.severity=warning
-dotnet_diagnostic.bc42105.severity=warning
-dotnet_diagnostic.bc42106.severity=warning
-dotnet_diagnostic.bc42107.severity=warning
-dotnet_diagnostic.bc42304.severity=warning
-dotnet_diagnostic.bc42309.severity=warning
-dotnet_diagnostic.bc42322.severity=warning
-dotnet_diagnostic.bc42349.severity=warning
-dotnet_diagnostic.bc42353.severity=warning
-dotnet_diagnostic.bc42354.severity=warning
-dotnet_diagnostic.bc42355.severity=warning
-dotnet_diagnostic.bc42356.severity=warning
-dotnet_diagnostic.bc42358.severity=warning
-dotnet_diagnostic.bc42504.severity=warning
-dotnet_diagnostic.bc42505.severity=warning
-dotnet_diagnostic.cs0067.severity=warning
-dotnet_diagnostic.cs0078.severity=warning
-dotnet_diagnostic.cs0108.severity=warning
-dotnet_diagnostic.cs0109.severity=warning
-dotnet_diagnostic.cs0114.severity=warning
-dotnet_diagnostic.cs0162.severity=warning
-dotnet_diagnostic.cs0164.severity=warning
-dotnet_diagnostic.cs0168.severity=warning
-dotnet_diagnostic.cs0169.severity=warning
-dotnet_diagnostic.cs0183.severity=warning
-dotnet_diagnostic.cs0184.severity=warning
-dotnet_diagnostic.cs0197.severity=warning
-dotnet_diagnostic.cs0219.severity=warning
-dotnet_diagnostic.cs0252.severity=warning
-dotnet_diagnostic.cs0253.severity=warning
-dotnet_diagnostic.cs0414.severity=warning
-dotnet_diagnostic.cs0420.severity=warning
-dotnet_diagnostic.cs0465.severity=warning
-dotnet_diagnostic.cs0469.severity=warning
-dotnet_diagnostic.cs0612.severity=warning
-dotnet_diagnostic.cs0618.severity=warning
-dotnet_diagnostic.cs0628.severity=warning
-dotnet_diagnostic.cs0642.severity=warning
-dotnet_diagnostic.cs0649.severity=warning
-dotnet_diagnostic.cs0652.severity=warning
-dotnet_diagnostic.cs0657.severity=warning
-dotnet_diagnostic.cs0658.severity=warning
-dotnet_diagnostic.cs0659.severity=warning
-dotnet_diagnostic.cs0660.severity=warning
-dotnet_diagnostic.cs0661.severity=warning
-dotnet_diagnostic.cs0665.severity=warning
-dotnet_diagnostic.cs0672.severity=warning
-dotnet_diagnostic.cs0675.severity=warning
-dotnet_diagnostic.cs0693.severity=warning
-dotnet_diagnostic.cs1030.severity=warning
-dotnet_diagnostic.cs1058.severity=warning
-dotnet_diagnostic.cs1066.severity=warning
-dotnet_diagnostic.cs1522.severity=warning
-dotnet_diagnostic.cs1570.severity=warning
-dotnet_diagnostic.cs1571.severity=warning
-dotnet_diagnostic.cs1572.severity=warning
-dotnet_diagnostic.cs1573.severity=warning
-dotnet_diagnostic.cs1574.severity=warning
-dotnet_diagnostic.cs1580.severity=warning
-dotnet_diagnostic.cs1581.severity=warning
-dotnet_diagnostic.cs1584.severity=warning
-dotnet_diagnostic.cs1587.severity=warning
-dotnet_diagnostic.cs1589.severity=warning
-dotnet_diagnostic.cs1590.severity=warning
-dotnet_diagnostic.cs1591.severity=warning
-dotnet_diagnostic.cs1592.severity=warning
-dotnet_diagnostic.cs1710.severity=warning
-dotnet_diagnostic.cs1711.severity=warning
-dotnet_diagnostic.cs1712.severity=warning
-dotnet_diagnostic.cs1717.severity=warning
-dotnet_diagnostic.cs1723.severity=warning
-dotnet_diagnostic.cs1911.severity=warning
-dotnet_diagnostic.cs1957.severity=warning
-dotnet_diagnostic.cs1981.severity=warning
-dotnet_diagnostic.cs1998.severity=warning
-dotnet_diagnostic.cs4014.severity=warning
-dotnet_diagnostic.cs7022.severity=warning
-dotnet_diagnostic.cs7023.severity=warning
-dotnet_diagnostic.cs7095.severity=warning
-dotnet_diagnostic.cs8094.severity=warning
-dotnet_diagnostic.cs8123.severity=warning
-dotnet_diagnostic.cs8321.severity=warning
-dotnet_diagnostic.cs8383.severity=warning
-dotnet_diagnostic.cs8416.severity=warning
-dotnet_diagnostic.cs8417.severity=warning
-dotnet_diagnostic.cs8424.severity=warning
-dotnet_diagnostic.cs8425.severity=warning
-dotnet_diagnostic.cs8509.severity=warning
-dotnet_diagnostic.cs8524.severity=warning
-dotnet_diagnostic.cs8597.severity=warning
-dotnet_diagnostic.cs8600.severity=warning
-dotnet_diagnostic.cs8601.severity=warning
-dotnet_diagnostic.cs8602.severity=warning
-dotnet_diagnostic.cs8603.severity=warning
-dotnet_diagnostic.cs8604.severity=warning
-dotnet_diagnostic.cs8605.severity=warning
-dotnet_diagnostic.cs8607.severity=warning
-dotnet_diagnostic.cs8608.severity=warning
-dotnet_diagnostic.cs8609.severity=warning
-dotnet_diagnostic.cs8610.severity=warning
-dotnet_diagnostic.cs8611.severity=warning
-dotnet_diagnostic.cs8612.severity=warning
-dotnet_diagnostic.cs8613.severity=warning
-dotnet_diagnostic.cs8614.severity=warning
-dotnet_diagnostic.cs8615.severity=warning
-dotnet_diagnostic.cs8616.severity=warning
-dotnet_diagnostic.cs8617.severity=warning
-dotnet_diagnostic.cs8618.severity=warning
-dotnet_diagnostic.cs8619.severity=warning
-dotnet_diagnostic.cs8620.severity=warning
-dotnet_diagnostic.cs8621.severity=warning
-dotnet_diagnostic.cs8622.severity=warning
-dotnet_diagnostic.cs8624.severity=warning
-dotnet_diagnostic.cs8625.severity=warning
-dotnet_diagnostic.cs8629.severity=warning
-dotnet_diagnostic.cs8631.severity=warning
-dotnet_diagnostic.cs8632.severity=none
-dotnet_diagnostic.cs8633.severity=warning
-dotnet_diagnostic.cs8634.severity=warning
-dotnet_diagnostic.cs8643.severity=warning
-dotnet_diagnostic.cs8644.severity=warning
-dotnet_diagnostic.cs8645.severity=warning
-dotnet_diagnostic.cs8655.severity=warning
-dotnet_diagnostic.cs8656.severity=warning
-dotnet_diagnostic.cs8667.severity=warning
-dotnet_diagnostic.cs8669.severity=none
-dotnet_diagnostic.cs8670.severity=warning
-dotnet_diagnostic.cs8714.severity=warning
-dotnet_diagnostic.cs8762.severity=warning
-dotnet_diagnostic.cs8763.severity=warning
-dotnet_diagnostic.cs8764.severity=warning
-dotnet_diagnostic.cs8765.severity=warning
-dotnet_diagnostic.cs8766.severity=warning
-dotnet_diagnostic.cs8767.severity=warning
-dotnet_diagnostic.cs8768.severity=warning
-dotnet_diagnostic.cs8769.severity=warning
-dotnet_diagnostic.cs8770.severity=warning
-dotnet_diagnostic.cs8774.severity=warning
-dotnet_diagnostic.cs8775.severity=warning
-dotnet_diagnostic.cs8776.severity=warning
-dotnet_diagnostic.cs8777.severity=warning
-dotnet_diagnostic.cs8794.severity=warning
-dotnet_diagnostic.cs8819.severity=warning
-dotnet_diagnostic.cs8824.severity=warning
-dotnet_diagnostic.cs8825.severity=warning
-dotnet_diagnostic.cs8846.severity=warning
-dotnet_diagnostic.cs8847.severity=warning
-dotnet_diagnostic.cs8851.severity=warning
-dotnet_diagnostic.cs8860.severity=warning
-dotnet_diagnostic.cs8892.severity=warning
-dotnet_diagnostic.cs8907.severity=warning
-dotnet_diagnostic.cs8947.severity=warning
-dotnet_diagnostic.cs8960.severity=warning
-dotnet_diagnostic.cs8961.severity=warning
-dotnet_diagnostic.cs8962.severity=warning
-dotnet_diagnostic.cs8963.severity=warning
-dotnet_diagnostic.cs8965.severity=warning
-dotnet_diagnostic.cs8966.severity=warning
-dotnet_diagnostic.cs8971.severity=warning
-dotnet_diagnostic.wme006.severity=warning
-dotnet_naming_rule.constants_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.constants_rule.severity = warning
-dotnet_naming_rule.constants_rule.style = upper_camel_case_style
-dotnet_naming_rule.constants_rule.symbols=constants_symbols
-dotnet_naming_rule.event_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.event_rule.severity = warning
-dotnet_naming_rule.event_rule.style = upper_camel_case_style
-dotnet_naming_rule.event_rule.symbols=event_symbols
-dotnet_naming_rule.interfaces_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.interfaces_rule.severity = warning
-dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style
-dotnet_naming_rule.interfaces_rule.symbols=interfaces_symbols
-dotnet_naming_rule.locals_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.locals_rule.severity = warning
-dotnet_naming_rule.locals_rule.style = lower_camel_case_style_1
-dotnet_naming_rule.locals_rule.symbols=locals_symbols
-dotnet_naming_rule.local_constants_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.local_constants_rule.severity = warning
-dotnet_naming_rule.local_constants_rule.style = lower_camel_case_style_1
-dotnet_naming_rule.local_constants_rule.symbols=local_constants_symbols
-dotnet_naming_rule.local_functions_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.local_functions_rule.severity = warning
-dotnet_naming_rule.local_functions_rule.style = upper_camel_case_style
-dotnet_naming_rule.local_functions_rule.symbols=local_functions_symbols
-dotnet_naming_rule.method_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.method_rule.severity = warning
-dotnet_naming_rule.method_rule.style = upper_camel_case_style
-dotnet_naming_rule.method_rule.symbols=method_symbols
-dotnet_naming_rule.parameters_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.parameters_rule.severity = warning
-dotnet_naming_rule.parameters_rule.style = lower_camel_case_style_1
-dotnet_naming_rule.parameters_rule.symbols=parameters_symbols
-dotnet_naming_rule.private_constants_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.private_constants_rule.severity = warning
-dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style
-dotnet_naming_rule.private_constants_rule.symbols=private_constants_symbols
-dotnet_naming_rule.private_instance_fields_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.private_instance_fields_rule.severity = warning
-dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style
-dotnet_naming_rule.private_instance_fields_rule.symbols=private_instance_fields_symbols
-dotnet_naming_rule.private_static_fields_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.private_static_fields_rule.severity = warning
-dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style
-dotnet_naming_rule.private_static_fields_rule.symbols=private_static_fields_symbols
-dotnet_naming_rule.private_static_readonly_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.private_static_readonly_rule.severity = warning
-dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style
-dotnet_naming_rule.private_static_readonly_rule.symbols=private_static_readonly_symbols
-dotnet_naming_rule.property_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.property_rule.severity = warning
-dotnet_naming_rule.property_rule.style = upper_camel_case_style
-dotnet_naming_rule.property_rule.symbols=property_symbols
-dotnet_naming_rule.public_fields_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.public_fields_rule.severity = warning
-dotnet_naming_rule.public_fields_rule.style = upper_camel_case_style
-dotnet_naming_rule.public_fields_rule.symbols=public_fields_symbols
-dotnet_naming_rule.static_readonly_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.static_readonly_rule.severity = warning
-dotnet_naming_rule.static_readonly_rule.style = upper_camel_case_style
-dotnet_naming_rule.static_readonly_rule.symbols=static_readonly_symbols
-dotnet_naming_rule.types_and_namespaces_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.types_and_namespaces_rule.severity = warning
-dotnet_naming_rule.types_and_namespaces_rule.style = upper_camel_case_style
-dotnet_naming_rule.types_and_namespaces_rule.symbols=types_and_namespaces_symbols
-dotnet_naming_rule.type_parameters_rule.import_to_resharper=as_predefined
-dotnet_naming_rule.type_parameters_rule.severity = warning
-dotnet_naming_rule.type_parameters_rule.style = t_upper_camel_case_style
-dotnet_naming_rule.type_parameters_rule.symbols=type_parameters_symbols
-dotnet_naming_style.i_upper_camel_case_style.capitalization=pascal_case
-dotnet_naming_style.i_upper_camel_case_style.required_prefix=I
-dotnet_naming_style.lower_camel_case_style.capitalization=camel_case
-dotnet_naming_style.lower_camel_case_style.required_prefix=_
-dotnet_naming_style.lower_camel_case_style_1.capitalization=camel_case
-dotnet_naming_style.t_upper_camel_case_style.capitalization=pascal_case
-dotnet_naming_style.t_upper_camel_case_style.required_prefix=T
-dotnet_naming_style.upper_camel_case_style.capitalization=pascal_case
-dotnet_naming_symbols.constants_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected
-dotnet_naming_symbols.constants_symbols.applicable_kinds=field
-dotnet_naming_symbols.constants_symbols.required_modifiers=const
-dotnet_naming_symbols.event_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.event_symbols.applicable_kinds=event
-dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.interfaces_symbols.applicable_kinds=interface
-dotnet_naming_symbols.locals_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.locals_symbols.applicable_kinds=local
-dotnet_naming_symbols.local_constants_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.local_constants_symbols.applicable_kinds=local
-dotnet_naming_symbols.local_constants_symbols.required_modifiers=const
-dotnet_naming_symbols.local_functions_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.local_functions_symbols.applicable_kinds=local_function
-dotnet_naming_symbols.method_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.method_symbols.applicable_kinds=method
-dotnet_naming_symbols.parameters_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.parameters_symbols.applicable_kinds=parameter
-dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities=private
-dotnet_naming_symbols.private_constants_symbols.applicable_kinds=field
-dotnet_naming_symbols.private_constants_symbols.required_modifiers=const
-dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities=private
-dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds=field
-dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities=private
-dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds=field
-dotnet_naming_symbols.private_static_fields_symbols.required_modifiers=static
-dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities=private
-dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds=field
-dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers=static,readonly
-dotnet_naming_symbols.property_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.property_symbols.applicable_kinds=property
-dotnet_naming_symbols.public_fields_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected
-dotnet_naming_symbols.public_fields_symbols.applicable_kinds=field
-dotnet_naming_symbols.static_readonly_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected
-dotnet_naming_symbols.static_readonly_symbols.applicable_kinds=field
-dotnet_naming_symbols.static_readonly_symbols.required_modifiers=static,readonly
-dotnet_naming_symbols.types_and_namespaces_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.types_and_namespaces_symbols.applicable_kinds=namespace,class,struct,enum,delegate
-dotnet_naming_symbols.type_parameters_symbols.applicable_accessibilities=*
-dotnet_naming_symbols.type_parameters_symbols.applicable_kinds=type_parameter
-dotnet_separate_import_directive_groups=false
-dotnet_sort_system_directives_first=true
-dotnet_style_parentheses_in_arithmetic_binary_operators= never_if_unnecessary:suggestion
-dotnet_style_parentheses_in_other_binary_operators= never_if_unnecessary:suggestion
-dotnet_style_parentheses_in_relational_binary_operators= never_if_unnecessary:suggestion
-dotnet_style_predefined_type_for_locals_parameters_members= true:suggestion
-dotnet_style_predefined_type_for_member_access= true:suggestion
-dotnet_style_qualification_for_event= false:suggestion
-dotnet_style_qualification_for_field= false:suggestion
-dotnet_style_qualification_for_method= false:suggestion
-dotnet_style_qualification_for_property= false:suggestion
-dotnet_style_require_accessibility_modifiers= always:suggestion
-file_header_template=
-
-# ReSharper properties
-resharper_accessor_owner_body=expression_body
-resharper_alignment_tab_fill_style=use_spaces
-resharper_align_first_arg_by_paren=false
-resharper_align_linq_query=false
-resharper_align_multiline_argument=true
-resharper_align_multiline_array_and_object_initializer=false
-resharper_align_multiline_array_initializer=true
-resharper_align_multiline_binary_expressions_chain=false
-resharper_align_multiline_binary_patterns=false
-resharper_align_multiline_ctor_init=true
-resharper_align_multiline_expression_braces=false
-resharper_align_multiline_implements_list=true
-resharper_align_multiline_property_pattern=false
-resharper_align_multiline_statement_conditions=true
-resharper_align_multiline_switch_expression=false
-resharper_align_multiline_type_argument=true
-resharper_align_multiline_type_parameter=true
-resharper_align_multline_type_parameter_constrains=true
-resharper_align_multline_type_parameter_list=false
-resharper_align_tuple_components=false
-resharper_align_union_type_usage=true
-resharper_allow_alias=true
-resharper_allow_comment_after_lbrace=false
-resharper_allow_far_alignment=false
-resharper_always_use_end_of_line_brace_style=false
-resharper_apply_auto_detected_rules=false
-resharper_apply_on_completion=false
-resharper_arguments_anonymous_function=positional
-resharper_arguments_literal=positional
-resharper_arguments_named=positional
-resharper_arguments_other=positional
-resharper_arguments_skip_single=false
-resharper_arguments_string_literal=positional
-resharper_attribute_style=do_not_touch
-resharper_autodetect_indent_settings=false
-resharper_blank_lines_after_block_statements=1
-resharper_blank_lines_after_case=0
-resharper_blank_lines_after_control_transfer_statements=1
-resharper_blank_lines_after_file_scoped_namespace_directive=1
-resharper_blank_lines_after_imports=1
-resharper_blank_lines_after_multiline_statements=0
-resharper_blank_lines_after_options=1
-resharper_blank_lines_after_start_comment=1
-resharper_blank_lines_after_using_list=1
-resharper_blank_lines_around_accessor=0
-resharper_blank_lines_around_auto_property=1
-resharper_blank_lines_around_block_case_section=0
-resharper_blank_lines_around_class_definition=1
-resharper_blank_lines_around_field=1
-resharper_blank_lines_around_function_declaration=0
-resharper_blank_lines_around_function_definition=1
-resharper_blank_lines_around_global_attribute=0
-resharper_blank_lines_around_invocable=1
-resharper_blank_lines_around_local_method=1
-resharper_blank_lines_around_multiline_case_section=0
-resharper_blank_lines_around_namespace=1
-resharper_blank_lines_around_other_declaration=0
-resharper_blank_lines_around_property=1
-resharper_blank_lines_around_razor_functions=1
-resharper_blank_lines_around_razor_helpers=1
-resharper_blank_lines_around_razor_sections=1
-resharper_blank_lines_around_region=1
-resharper_blank_lines_around_single_line_accessor=0
-resharper_blank_lines_around_single_line_auto_property=0
-resharper_blank_lines_around_single_line_field=0
-resharper_blank_lines_around_single_line_function_definition=0
-resharper_blank_lines_around_single_line_invocable=0
-resharper_blank_lines_around_single_line_local_method=0
-resharper_blank_lines_around_single_line_property=0
-resharper_blank_lines_around_single_line_type=0
-resharper_blank_lines_around_type=1
-resharper_blank_lines_before_block_statements=0
-resharper_blank_lines_before_case=0
-resharper_blank_lines_before_control_transfer_statements=0
-resharper_blank_lines_before_multiline_statements=0
-resharper_blank_lines_before_single_line_comment=0
-resharper_blank_lines_inside_namespace=0
-resharper_blank_lines_inside_region=1
-resharper_blank_lines_inside_type=0
-resharper_blank_line_after_pi=true
-resharper_braces_for_dowhile=required
-resharper_braces_for_fixed=required
-resharper_braces_for_for=required_for_multiline
-resharper_braces_for_foreach=required_for_multiline
-resharper_braces_for_ifelse=not_required_for_both
-resharper_braces_for_lock=required
-resharper_braces_for_using=required
-resharper_braces_for_while=required_for_multiline
-resharper_braces_redundant=true
-resharper_break_template_declaration=line_break
-resharper_can_use_global_alias=true
-resharper_configure_await_analysis_mode=disabled
-resharper_constructor_or_destructor_body=expression_body
-resharper_continuous_indent_multiplier=1
-resharper_continuous_line_indent=single
-resharper_cpp_align_multiline_argument=true
-resharper_cpp_align_multiline_calls_chain=true
-resharper_cpp_align_multiline_extends_list=true
-resharper_cpp_align_multiline_for_stmt=true
-resharper_cpp_align_multiline_parameter=true
-resharper_cpp_align_multiple_declaration=true
-resharper_cpp_align_ternary=align_not_nested
-resharper_cpp_anonymous_method_declaration_braces=next_line
-resharper_cpp_case_block_braces=next_line_shifted_2
-resharper_cpp_empty_block_style=multiline
-resharper_cpp_indent_switch_labels=false
-resharper_cpp_insert_final_newline=false
-resharper_cpp_int_align_comments=false
-resharper_cpp_invocable_declaration_braces=next_line
-resharper_cpp_max_line_length=120
-resharper_cpp_new_line_before_catch=true
-resharper_cpp_new_line_before_else=true
-resharper_cpp_new_line_before_while=true
-resharper_cpp_other_braces=next_line
-resharper_cpp_space_around_binary_operator=true
-resharper_cpp_type_declaration_braces=next_line
-resharper_cpp_wrap_arguments_style=wrap_if_long
-resharper_cpp_wrap_lines=true
-resharper_cpp_wrap_parameters_style=wrap_if_long
-resharper_csharp_align_multiline_argument=false
-resharper_csharp_align_multiline_calls_chain=false
-resharper_csharp_align_multiline_expression=false
-resharper_csharp_align_multiline_extends_list=false
-resharper_csharp_align_multiline_for_stmt=false
-resharper_csharp_align_multiline_parameter=false
-resharper_csharp_align_multiple_declaration=true
-resharper_csharp_empty_block_style=together
-resharper_csharp_insert_final_newline=true
-resharper_csharp_int_align_comments=true
-resharper_csharp_max_line_length=144
-resharper_csharp_naming_rule.enum_member=AaBb
-resharper_csharp_naming_rule.method_property_event=AaBb
-resharper_csharp_naming_rule.other=AaBb
-resharper_csharp_new_line_before_while=false
-resharper_csharp_prefer_qualified_reference=false
-resharper_csharp_space_after_unary_operator=false
-resharper_csharp_wrap_arguments_style=wrap_if_long
-resharper_csharp_wrap_before_binary_opsign=true
-resharper_csharp_wrap_for_stmt_header_style=wrap_if_long
-resharper_csharp_wrap_lines=true
-resharper_csharp_wrap_parameters_style=wrap_if_long
-resharper_css_brace_style=end_of_line
-resharper_css_insert_final_newline=false
-resharper_css_keep_blank_lines_between_declarations=1
-resharper_css_max_line_length=120
-resharper_css_wrap_lines=true
-resharper_cxxcli_property_declaration_braces=next_line
-resharper_declarations_style=separate_lines
-resharper_default_exception_variable_name=e
-resharper_default_value_when_type_evident=default_literal
-resharper_default_value_when_type_not_evident=default_literal
-resharper_delete_quotes_from_solid_values=false
-resharper_disable_blank_line_changes=false
-resharper_disable_formatter=false
-resharper_disable_indenter=false
-resharper_disable_int_align=false
-resharper_disable_line_break_changes=false
-resharper_disable_line_break_removal=false
-resharper_disable_space_changes=false
-resharper_disable_space_changes_before_trailing_comment=false
-resharper_dont_remove_extra_blank_lines=false
-resharper_enable_wrapping=false
-resharper_enforce_line_ending_style=false
-resharper_event_handler_pattern_long=$object$On$event$
-resharper_event_handler_pattern_short=On$event$
-resharper_expression_braces=inside
-resharper_expression_pars=inside
-resharper_extra_spaces=remove_all
-resharper_force_attribute_style=separate
-resharper_force_chop_compound_do_expression=false
-resharper_force_chop_compound_if_expression=false
-resharper_force_chop_compound_while_expression=false
-resharper_force_control_statements_braces=do_not_change
-resharper_force_linebreaks_inside_complex_literals=true
-resharper_force_variable_declarations_on_new_line=false
-resharper_format_leading_spaces_decl=false
-resharper_free_block_braces=next_line
-resharper_function_declaration_return_type_style=do_not_change
-resharper_function_definition_return_type_style=do_not_change
-resharper_generator_mode=false
-resharper_html_attribute_indent=align_by_first_attribute
-resharper_html_insert_final_newline=false
-resharper_html_linebreak_before_elements=body,div,p,form,h1,h2,h3
-resharper_html_max_blank_lines_between_tags=2
-resharper_html_max_line_length=120
-resharper_html_pi_attribute_style=on_single_line
-resharper_html_space_before_self_closing=false
-resharper_html_wrap_lines=true
-resharper_ignore_space_preservation=false
-resharper_include_prefix_comment_in_indent=false
-resharper_indent_access_specifiers_from_class=false
-resharper_indent_aligned_ternary=true
-resharper_indent_anonymous_method_block=false
-resharper_indent_braces_inside_statement_conditions=true
-resharper_indent_case_from_select=true
-resharper_indent_child_elements=OneIndent
-resharper_indent_class_members_from_access_specifiers=false
-resharper_indent_comment=true
-resharper_indent_inside_namespace=true
-resharper_indent_invocation_pars=inside
-resharper_indent_left_par_inside_expression=false
-resharper_indent_method_decl_pars=inside
-resharper_indent_nested_fixed_stmt=false
-resharper_indent_nested_foreach_stmt=true
-resharper_indent_nested_for_stmt=true
-resharper_indent_nested_lock_stmt=false
-resharper_indent_nested_usings_stmt=false
-resharper_indent_nested_while_stmt=true
-resharper_indent_pars=inside
-resharper_indent_preprocessor_directives=none
-resharper_indent_preprocessor_if=no_indent
-resharper_indent_preprocessor_other=no_indent
-resharper_indent_preprocessor_region=usual_indent
-resharper_indent_statement_pars=inside
-resharper_indent_text=OneIndent
-resharper_indent_typearg_angles=inside
-resharper_indent_typeparam_angles=inside
-resharper_indent_type_constraints=true
-resharper_indent_wrapped_function_names=false
-resharper_instance_members_qualify_declared_in=this_class, base_class
-resharper_int_align=true
-resharper_int_align_assignments=true
-resharper_int_align_binary_expressions=false
-resharper_int_align_declaration_names=false
-resharper_int_align_eq=false
-resharper_int_align_fields=true
-resharper_int_align_fix_in_adjacent=true
-resharper_int_align_invocations=true
-resharper_int_align_methods=true
-resharper_int_align_nested_ternary=true
-resharper_int_align_parameters=false
-resharper_int_align_properties=true
-resharper_int_align_property_patterns=true
-resharper_int_align_switch_expressions=true
-resharper_int_align_switch_sections=true
-resharper_int_align_variables=true
-resharper_js_align_multiline_parameter=false
-resharper_js_align_multiple_declaration=false
-resharper_js_align_ternary=none
-resharper_js_brace_style=end_of_line
-resharper_js_empty_block_style=multiline
-resharper_js_indent_switch_labels=false
-resharper_js_insert_final_newline=false
-resharper_js_keep_blank_lines_between_declarations=2
-resharper_js_max_line_length=120
-resharper_js_new_line_before_catch=false
-resharper_js_new_line_before_else=false
-resharper_js_new_line_before_finally=false
-resharper_js_new_line_before_while=false
-resharper_js_space_around_binary_operator=true
-resharper_js_wrap_arguments_style=chop_if_long
-resharper_js_wrap_before_binary_opsign=false
-resharper_js_wrap_for_stmt_header_style=chop_if_long
-resharper_js_wrap_lines=true
-resharper_js_wrap_parameters_style=chop_if_long
-resharper_keep_blank_lines_in_code=2
-resharper_keep_blank_lines_in_declarations=2
-resharper_keep_existing_attribute_arrangement=false
-resharper_keep_existing_declaration_block_arrangement=false
-resharper_keep_existing_declaration_parens_arrangement=true
-resharper_keep_existing_embedded_arrangement=false
-resharper_keep_existing_embedded_block_arrangement=false
-resharper_keep_existing_enum_arrangement=false
-resharper_keep_existing_expr_member_arrangement=false
-resharper_keep_existing_initializer_arrangement=false
-resharper_keep_existing_invocation_parens_arrangement=true
-resharper_keep_existing_property_patterns_arrangement=true
-resharper_keep_existing_switch_expression_arrangement=false
-resharper_keep_nontrivial_alias=true
-resharper_keep_user_linebreaks=true
-resharper_keep_user_wrapping=true
-resharper_linebreaks_around_razor_statements=true
-resharper_linebreaks_inside_tags_for_elements_longer_than=2147483647
-resharper_linebreaks_inside_tags_for_elements_with_child_elements=true
-resharper_linebreaks_inside_tags_for_multiline_elements=true
-resharper_linebreak_before_all_elements=false
-resharper_linebreak_before_multiline_elements=true
-resharper_linebreak_before_singleline_elements=false
-resharper_line_break_after_colon_in_member_initializer_lists=do_not_change
-resharper_line_break_after_comma_in_member_initializer_lists=false
-resharper_line_break_before_comma_in_member_initializer_lists=false
-resharper_line_break_before_requires_clause=do_not_change
-resharper_linkage_specification_braces=end_of_line
-resharper_linkage_specification_indentation=none
-resharper_local_function_body=expression_body
-resharper_macro_block_begin=
-resharper_macro_block_end=
-resharper_max_array_initializer_elements_on_line=10000
-resharper_max_attribute_length_for_same_line=38
-resharper_max_enum_members_on_line=1
-resharper_max_formal_parameters_on_line=10000
-resharper_max_initializer_elements_on_line=1
-resharper_max_invocation_arguments_on_line=10000
-resharper_media_query_style=same_line
-resharper_member_initializer_list_style=do_not_change
-resharper_method_or_operator_body=expression_body
-resharper_min_blank_lines_after_imports=0
-resharper_min_blank_lines_around_fields=0
-resharper_min_blank_lines_around_functions=1
-resharper_min_blank_lines_around_types=1
-resharper_min_blank_lines_between_declarations=1
-resharper_namespace_declaration_braces=next_line
-resharper_namespace_indentation=all
-resharper_nested_ternary_style=autodetect
-resharper_new_line_before_enumerators=true
-resharper_normalize_tag_names=false
-resharper_no_indent_inside_elements=html,body,thead,tbody,tfoot
-resharper_no_indent_inside_if_element_longer_than=200
-resharper_object_creation_when_type_evident=target_typed
-resharper_object_creation_when_type_not_evident=explicitly_typed
-resharper_old_engine=false
-resharper_options_braces_pointy=false
-resharper_outdent_binary_ops=true
-resharper_outdent_binary_pattern_ops=false
-resharper_outdent_commas=false
-resharper_outdent_dots=false
-resharper_outdent_namespace_member=false
-resharper_outdent_statement_labels=false
-resharper_outdent_ternary_ops=false
-resharper_parentheses_non_obvious_operations=none, bitwise, bitwise_inclusive_or, bitwise_exclusive_or, shift, bitwise_and
-resharper_parentheses_redundancy_style=remove_if_not_clarifies_precedence
-resharper_parentheses_same_type_operations=false
-resharper_pi_attributes_indent=align_by_first_attribute
-resharper_place_attribute_on_same_line=false
-resharper_place_class_decorator_on_the_same_line=false
-resharper_place_comments_at_first_column=false
-resharper_place_constructor_initializer_on_same_line=false
-resharper_place_each_decorator_on_new_line=false
-resharper_place_event_attribute_on_same_line=false
-resharper_place_expr_accessor_on_single_line=true
-resharper_place_expr_method_on_single_line=false
-resharper_place_expr_property_on_single_line=false
-resharper_place_field_decorator_on_the_same_line=false
-resharper_place_linq_into_on_new_line=true
-resharper_place_method_decorator_on_the_same_line=false
-resharper_place_namespace_definitions_on_same_line=false
-resharper_place_property_attribute_on_same_line=false
-resharper_place_property_decorator_on_the_same_line=false
-resharper_place_simple_case_statement_on_same_line=if_owner_is_single_line
-resharper_place_simple_embedded_statement_on_same_line=false
-resharper_place_simple_enum_on_single_line=true
-resharper_place_simple_initializer_on_single_line=true
-resharper_place_simple_property_pattern_on_single_line=true
-resharper_place_simple_switch_expression_on_single_line=true
-resharper_place_template_args_on_new_line=false
-resharper_place_type_constraints_on_same_line=true
-resharper_prefer_explicit_discard_declaration=false
-resharper_prefer_separate_deconstructed_variables_declaration=false
-resharper_preserve_spaces_inside_tags=pre,textarea
-resharper_properties_style=separate_lines_for_nonsingle
-resharper_protobuf_brace_style=end_of_line
-resharper_protobuf_empty_block_style=together_same_line
-resharper_protobuf_insert_final_newline=false
-resharper_protobuf_max_line_length=120
-resharper_protobuf_wrap_lines=true
-resharper_qualified_using_at_nested_scope=false
-resharper_quote_style=doublequoted
-resharper_razor_prefer_qualified_reference=true
-resharper_remove_blank_lines_near_braces=false
-resharper_remove_blank_lines_near_braces_in_code=true
-resharper_remove_blank_lines_near_braces_in_declarations=true
-resharper_remove_this_qualifier=true
-resharper_requires_expression_braces=next_line
-resharper_resx_attribute_indent=single_indent
-resharper_resx_insert_final_newline=false
-resharper_resx_linebreak_before_elements=
-resharper_resx_max_blank_lines_between_tags=0
-resharper_resx_max_line_length=2147483647
-resharper_resx_pi_attribute_style=do_not_touch
-resharper_resx_space_before_self_closing=false
-resharper_resx_wrap_lines=false
-resharper_resx_wrap_tags_and_pi=false
-resharper_resx_wrap_text=false
-resharper_selector_style=same_line
-resharper_show_autodetect_configure_formatting_tip=true
-resharper_simple_blocks=do_not_change
-resharper_simple_block_style=do_not_change
-resharper_simple_case_statement_style=do_not_change
-resharper_simple_embedded_statement_style=do_not_change
-resharper_single_statement_function_style=do_not_change
-resharper_sort_attributes=false
-resharper_sort_class_selectors=false
-resharper_sort_usings=true
-resharper_sort_usings_lowercase_first=false
-resharper_spaces_around_eq_in_attribute=false
-resharper_spaces_around_eq_in_pi_attribute=false
-resharper_spaces_inside_tags=false
-resharper_space_after_arrow=true
-resharper_space_after_attributes=true
-resharper_space_after_attribute_target_colon=true
-resharper_space_after_cast=false
-resharper_space_after_colon=true
-resharper_space_after_colon_in_case=true
-resharper_space_after_colon_in_inheritance_clause=true
-resharper_space_after_colon_in_type_annotation=true
-resharper_space_after_comma=true
-resharper_space_after_for_colon=true
-resharper_space_after_function_comma=true
-resharper_space_after_keywords_in_control_flow_statements=true
-resharper_space_after_last_attribute=false
-resharper_space_after_last_pi_attribute=false
-resharper_space_after_media_colon=true
-resharper_space_after_media_comma=true
-resharper_space_after_operator_keyword=true
-resharper_space_after_property_colon=true
-resharper_space_after_property_semicolon=true
-resharper_space_after_ptr_in_data_member=true
-resharper_space_after_ptr_in_data_members=false
-resharper_space_after_ptr_in_method=true
-resharper_space_after_ref_in_data_member=true
-resharper_space_after_ref_in_data_members=false
-resharper_space_after_ref_in_method=true
-resharper_space_after_selector_comma=true
-resharper_space_after_semicolon_in_for_statement=true
-resharper_space_after_separator=false
-resharper_space_after_ternary_colon=true
-resharper_space_after_ternary_quest=true
-resharper_space_after_triple_slash=true
-resharper_space_after_type_parameter_constraint_colon=true
-resharper_space_around_additive_op=true
-resharper_space_around_alias_eq=true
-resharper_space_around_assignment_op=true
-resharper_space_around_assignment_operator=true
-resharper_space_around_attribute_match_operator=false
-resharper_space_around_deref_in_trailing_return_type=true
-resharper_space_around_lambda_arrow=true
-resharper_space_around_member_access_operator=false
-resharper_space_around_operator=true
-resharper_space_around_pipe_or_amper_in_type_usage=true
-resharper_space_around_relational_op=true
-resharper_space_around_selector_operator=true
-resharper_space_around_shift_op=true
-resharper_space_around_stmt_colon=true
-resharper_space_around_ternary_operator=true
-resharper_space_before_array_rank_parentheses=false
-resharper_space_before_arrow=true
-resharper_space_before_attribute_target_colon=false
-resharper_space_before_checked_parentheses=false
-resharper_space_before_colon=false
-resharper_space_before_colon_in_case=false
-resharper_space_before_colon_in_inheritance_clause=true
-resharper_space_before_colon_in_type_annotation=false
-resharper_space_before_comma=false
-resharper_space_before_default_parentheses=false
-resharper_space_before_empty_invocation_parentheses=false
-resharper_space_before_empty_method_parentheses=false
-resharper_space_before_for_colon=true
-resharper_space_before_function_comma=false
-resharper_space_before_initializer_braces=false
-resharper_space_before_invocation_parentheses=false
-resharper_space_before_label_colon=false
-resharper_space_before_lambda_parentheses=false
-resharper_space_before_media_colon=false
-resharper_space_before_media_comma=false
-resharper_space_before_method_parentheses=false
-resharper_space_before_nameof_parentheses=false
-resharper_space_before_new_parentheses=false
-resharper_space_before_nullable_mark=false
-resharper_space_before_open_square_brackets=false
-resharper_space_before_pointer_asterik_declaration=false
-resharper_space_before_property_colon=false
-resharper_space_before_property_semicolon=false
-resharper_space_before_ptr_in_abstract_decl=false
-resharper_space_before_ptr_in_data_member=false
-resharper_space_before_ptr_in_data_members=true
-resharper_space_before_ptr_in_method=false
-resharper_space_before_ref_in_abstract_decl=false
-resharper_space_before_ref_in_data_member=false
-resharper_space_before_ref_in_data_members=true
-resharper_space_before_ref_in_method=false
-resharper_space_before_selector_comma=false
-resharper_space_before_semicolon=false
-resharper_space_before_semicolon_in_for_statement=false
-resharper_space_before_separator=false
-resharper_space_before_singleline_accessorholder=true
-resharper_space_before_sizeof_parentheses=false
-resharper_space_before_template_args=false
-resharper_space_before_template_params=true
-resharper_space_before_ternary_colon=true
-resharper_space_before_ternary_quest=true
-resharper_space_before_trailing_comment=true
-resharper_space_before_typeof_parentheses=false
-resharper_space_before_type_argument_angle=false
-resharper_space_before_type_parameters_brackets=false
-resharper_space_before_type_parameter_angle=false
-resharper_space_before_type_parameter_constraint_colon=true
-resharper_space_before_type_parameter_parentheses=true
-resharper_space_between_accessors_in_singleline_property=true
-resharper_space_between_attribute_sections=true
-resharper_space_between_closing_angle_brackets_in_template_args=false
-resharper_space_between_empty_square_brackets=false
-resharper_space_between_keyword_and_expression=true
-resharper_space_between_keyword_and_type=true
-resharper_space_between_method_call_empty_parameter_list_parentheses=false
-resharper_space_between_method_call_name_and_opening_parenthesis=false
-resharper_space_between_method_call_parameter_list_parentheses=false
-resharper_space_between_method_declaration_empty_parameter_list_parentheses=false
-resharper_space_between_method_declaration_name_and_open_parenthesis=false
-resharper_space_between_method_declaration_parameter_list_parentheses=false
-resharper_space_between_parentheses_of_control_flow_statements=false
-resharper_space_between_square_brackets=false
-resharper_space_between_typecast_parentheses=false
-resharper_space_colon_after=true
-resharper_space_colon_before=false
-resharper_space_comma=true
-resharper_space_equals=true
-resharper_space_inside_braces=true
-resharper_space_in_singleline_accessorholder=true
-resharper_space_in_singleline_anonymous_method=true
-resharper_space_in_singleline_method=true
-resharper_space_near_postfix_and_prefix_op=false
-resharper_space_within_array_initialization_braces=false
-resharper_space_within_array_rank_empty_parentheses=false
-resharper_space_within_array_rank_parentheses=false
-resharper_space_within_attribute_angles=false
-resharper_space_within_attribute_match_brackets=false
-resharper_space_within_checked_parentheses=false
-resharper_space_within_default_parentheses=false
-resharper_space_within_empty_braces=true
-resharper_space_within_empty_initializer_braces=false
-resharper_space_within_empty_invocation_parentheses=false
-resharper_space_within_empty_method_parentheses=false
-resharper_space_within_empty_object_literal_braces=false
-resharper_space_within_empty_template_params=false
-resharper_space_within_expression_parentheses=false
-resharper_space_within_function_parentheses=false
-resharper_space_within_import_braces=true
-resharper_space_within_initializer_braces=false
-resharper_space_within_invocation_parentheses=false
-resharper_space_within_media_block=true
-resharper_space_within_media_parentheses=false
-resharper_space_within_method_parentheses=false
-resharper_space_within_nameof_parentheses=false
-resharper_space_within_new_parentheses=false
-resharper_space_within_object_literal_braces=true
-resharper_space_within_parentheses=false
-resharper_space_within_property_block=true
-resharper_space_within_single_line_array_initializer_braces=true
-resharper_space_within_sizeof_parentheses=false
-resharper_space_within_template_args=false
-resharper_space_within_template_argument=false
-resharper_space_within_template_params=false
-resharper_space_within_tuple_parentheses=false
-resharper_space_within_typeof_parentheses=false
-resharper_space_within_type_argument_angles=false
-resharper_space_within_type_parameters_brackets=false
-resharper_space_within_type_parameter_angles=false
-resharper_space_within_type_parameter_parentheses=false
-resharper_special_else_if_treatment=true
-resharper_static_members_qualify_members=none
-resharper_static_members_qualify_with=declared_type
-resharper_stick_comment=true
-resharper_support_vs_event_naming_pattern=true
-resharper_termination_style=ensure_semicolon
-resharper_toplevel_function_declaration_return_type_style=do_not_change
-resharper_toplevel_function_definition_return_type_style=do_not_change
-resharper_trailing_comma_in_multiline_lists=true
-resharper_trailing_comma_in_singleline_lists=false
-resharper_types_braces=end_of_line
-resharper_use_continuous_indent_inside_initializer_braces=true
-resharper_use_continuous_indent_inside_parens=true
-resharper_use_continuous_line_indent_in_expression_braces=false
-resharper_use_continuous_line_indent_in_method_pars=false
-resharper_use_heuristics_for_body_style=true
-resharper_use_indents_from_main_language_in_file=true
-resharper_use_indent_from_previous_element=true
-resharper_use_indent_from_vs=false
-resharper_use_roslyn_logic_for_evident_types=false
-resharper_vb_align_multiline_argument=true
-resharper_vb_align_multiline_expression=true
-resharper_vb_align_multiline_parameter=true
-resharper_vb_align_multiple_declaration=true
-resharper_vb_insert_final_newline=false
-resharper_vb_max_line_length=120
-resharper_vb_place_field_attribute_on_same_line=true
-resharper_vb_place_method_attribute_on_same_line=false
-resharper_vb_place_type_attribute_on_same_line=false
-resharper_vb_prefer_qualified_reference=false
-resharper_vb_space_after_unary_operator=true
-resharper_vb_space_around_multiplicative_op=false
-resharper_vb_wrap_arguments_style=wrap_if_long
-resharper_vb_wrap_before_binary_opsign=false
-resharper_vb_wrap_lines=true
-resharper_vb_wrap_parameters_style=wrap_if_long
-resharper_wrap_after_binary_opsign=true
-resharper_wrap_after_declaration_lpar=false
-resharper_wrap_after_dot=false
-resharper_wrap_after_dot_in_method_calls=false
-resharper_wrap_after_expression_lbrace=true
-resharper_wrap_after_invocation_lpar=false
-resharper_wrap_around_elements=true
-resharper_wrap_array_initializer_style=chop_always
-resharper_wrap_array_literals=chop_if_long
-resharper_wrap_base_clause_style=wrap_if_long
-resharper_wrap_before_arrow_with_expressions=true
-resharper_wrap_before_binary_pattern_op=true
-resharper_wrap_before_colon=false
-resharper_wrap_before_comma=false
-resharper_wrap_before_comma_in_base_clause=false
-resharper_wrap_before_declaration_lpar=false
-resharper_wrap_before_declaration_rpar=false
-resharper_wrap_before_dot=true
-resharper_wrap_before_eq=false
-resharper_wrap_before_expression_rbrace=true
-resharper_wrap_before_extends_colon=false
-resharper_wrap_before_first_type_parameter_constraint=false
-resharper_wrap_before_invocation_lpar=false
-resharper_wrap_before_invocation_rpar=false
-resharper_wrap_before_linq_expression=false
-resharper_wrap_before_ternary_opsigns=true
-resharper_wrap_before_type_parameter_langle=false
-resharper_wrap_braced_init_list_style=wrap_if_long
-resharper_wrap_chained_binary_expressions=chop_if_long
-resharper_wrap_chained_binary_patterns=wrap_if_long
-resharper_wrap_chained_method_calls=wrap_if_long
-resharper_wrap_ctor_initializer_style=wrap_if_long
-resharper_wrap_enumeration_style=chop_if_long
-resharper_wrap_enum_declaration=chop_always
-resharper_wrap_enum_style=do_not_change
-resharper_wrap_extends_list_style=wrap_if_long
-resharper_wrap_imports=chop_if_long
-resharper_wrap_multiple_declaration_style=chop_if_long
-resharper_wrap_multiple_type_parameter_constraints_style=chop_if_long
-resharper_wrap_object_literals=chop_if_long
-resharper_wrap_property_pattern=chop_if_long
-resharper_wrap_switch_expression=chop_always
-resharper_wrap_ternary_expr_style=chop_if_long
-resharper_wrap_union_type_usage=chop_if_long
-resharper_wrap_verbatim_interpolated_strings=no_wrap
-resharper_xmldoc_attribute_indent=single_indent
-resharper_xmldoc_insert_final_newline=false
-resharper_xmldoc_linebreak_before_elements=summary,remarks,example,returns,param,typeparam,value,para
-resharper_xmldoc_max_blank_lines_between_tags=0
-resharper_xmldoc_max_line_length=120
-resharper_xmldoc_pi_attribute_style=do_not_touch
-resharper_xmldoc_space_before_self_closing=true
-resharper_xmldoc_wrap_lines=true
-resharper_xmldoc_wrap_tags_and_pi=true
-resharper_xmldoc_wrap_text=true
-resharper_xml_attribute_indent=align_by_first_attribute
-resharper_xml_insert_final_newline=false
-resharper_xml_linebreak_before_elements=
-resharper_xml_max_blank_lines_between_tags=2
-resharper_xml_max_line_length=120
-resharper_xml_pi_attribute_style=do_not_touch
-resharper_xml_space_before_self_closing=true
-resharper_xml_wrap_lines=true
-resharper_xml_wrap_tags_and_pi=true
-resharper_xml_wrap_text=false
-
-# ReSharper inspection severities
-resharper_abstract_class_constructor_can_be_made_protected_highlighting=hint
-resharper_access_rights_in_text_highlighting=warning
-resharper_access_to_disposed_closure_highlighting=warning
-resharper_access_to_for_each_variable_in_closure_highlighting=warning
-resharper_access_to_modified_closure_highlighting=warning
-resharper_access_to_static_member_via_derived_type_highlighting=warning
-resharper_address_of_marshal_by_ref_object_highlighting=warning
-resharper_amd_dependency_path_problem_highlighting=none
-resharper_amd_external_module_highlighting=suggestion
-resharper_angular_html_banana_highlighting=warning
-resharper_annotate_can_be_null_parameter_highlighting=none
-resharper_annotate_can_be_null_type_member_highlighting=none
-resharper_annotate_not_null_parameter_highlighting=none
-resharper_annotate_not_null_type_member_highlighting=none
-resharper_annotation_conflict_in_hierarchy_highlighting=warning
-resharper_annotation_redundancy_at_value_type_highlighting=warning
-resharper_annotation_redundancy_in_hierarchy_highlighting=warning
-resharper_arguments_style_anonymous_function_highlighting=hint
-resharper_arguments_style_literal_highlighting=hint
-resharper_arguments_style_named_expression_highlighting=hint
-resharper_arguments_style_other_highlighting=hint
-resharper_arguments_style_string_literal_highlighting=hint
-resharper_arrange_accessor_owner_body_highlighting=suggestion
-resharper_arrange_attributes_highlighting=none
-resharper_arrange_constructor_or_destructor_body_highlighting=hint
-resharper_arrange_default_value_when_type_evident_highlighting=suggestion
-resharper_arrange_default_value_when_type_not_evident_highlighting=hint
-resharper_arrange_local_function_body_highlighting=hint
-resharper_arrange_method_or_operator_body_highlighting=hint
-resharper_arrange_missing_parentheses_highlighting=hint
-resharper_arrange_namespace_body_highlighting=hint
-resharper_arrange_object_creation_when_type_evident_highlighting=suggestion
-resharper_arrange_object_creation_when_type_not_evident_highlighting=hint
-resharper_arrange_redundant_parentheses_highlighting=hint
-resharper_arrange_static_member_qualifier_highlighting=hint
-resharper_arrange_this_qualifier_highlighting=hint
-resharper_arrange_trailing_comma_in_multiline_lists_highlighting=hint
-resharper_arrange_trailing_comma_in_singleline_lists_highlighting=hint
-resharper_arrange_type_member_modifiers_highlighting=hint
-resharper_arrange_type_modifiers_highlighting=hint
-resharper_arrange_var_keywords_in_deconstructing_declaration_highlighting=suggestion
-resharper_asp_content_placeholder_not_resolved_highlighting=error
-resharper_asp_custom_page_parser_filter_type_highlighting=warning
-resharper_asp_dead_code_highlighting=warning
-resharper_asp_entity_highlighting=warning
-resharper_asp_image_highlighting=warning
-resharper_asp_invalid_control_type_highlighting=error
-resharper_asp_not_resolved_highlighting=error
-resharper_asp_ods_method_reference_resolve_error_highlighting=error
-resharper_asp_resolve_warning_highlighting=warning
-resharper_asp_skin_not_resolved_highlighting=error
-resharper_asp_tag_attribute_with_optional_value_highlighting=warning
-resharper_asp_theme_not_resolved_highlighting=error
-resharper_asp_unused_register_directive_highlighting_highlighting=warning
-resharper_asp_warning_highlighting=warning
-resharper_assigned_value_is_never_used_highlighting=warning
-resharper_assigned_value_wont_be_assigned_to_corresponding_field_highlighting=warning
-resharper_assignment_in_conditional_expression_highlighting=warning
-resharper_assignment_in_condition_expression_highlighting=warning
-resharper_assignment_is_fully_discarded_highlighting=warning
-resharper_assign_null_to_not_null_attribute_highlighting=warning
-resharper_assign_to_constant_highlighting=error
-resharper_assign_to_implicit_global_in_function_scope_highlighting=warning
-resharper_asxx_path_error_highlighting=warning
-resharper_async_iterator_invocation_without_await_foreach_highlighting=warning
-resharper_async_void_lambda_highlighting=warning
-resharper_async_void_method_highlighting=none
-resharper_auto_property_can_be_made_get_only_global_highlighting=suggestion
-resharper_auto_property_can_be_made_get_only_local_highlighting=suggestion
-resharper_bad_attribute_brackets_spaces_highlighting=none
-resharper_bad_braces_spaces_highlighting=none
-resharper_bad_child_statement_indent_highlighting=warning
-resharper_bad_colon_spaces_highlighting=none
-resharper_bad_comma_spaces_highlighting=none
-resharper_bad_control_braces_indent_highlighting=suggestion
-resharper_bad_control_braces_line_breaks_highlighting=none
-resharper_bad_declaration_braces_indent_highlighting=none
-resharper_bad_declaration_braces_line_breaks_highlighting=none
-resharper_bad_empty_braces_line_breaks_highlighting=none
-resharper_bad_expression_braces_indent_highlighting=none
-resharper_bad_expression_braces_line_breaks_highlighting=none
-resharper_bad_generic_brackets_spaces_highlighting=none
-resharper_bad_indent_highlighting=none
-resharper_bad_linq_line_breaks_highlighting=none
-resharper_bad_list_line_breaks_highlighting=none
-resharper_bad_member_access_spaces_highlighting=none
-resharper_bad_namespace_braces_indent_highlighting=none
-resharper_bad_parens_line_breaks_highlighting=none
-resharper_bad_parens_spaces_highlighting=none
-resharper_bad_preprocessor_indent_highlighting=none
-resharper_bad_semicolon_spaces_highlighting=none
-resharper_bad_spaces_after_keyword_highlighting=none
-resharper_bad_square_brackets_spaces_highlighting=none
-resharper_bad_switch_braces_indent_highlighting=none
-resharper_bad_symbol_spaces_highlighting=none
-resharper_base_member_has_params_highlighting=warning
-resharper_base_method_call_with_default_parameter_highlighting=warning
-resharper_base_object_equals_is_object_equals_highlighting=warning
-resharper_base_object_get_hash_code_call_in_get_hash_code_highlighting=warning
-resharper_bitwise_operator_on_enum_without_flags_highlighting=warning
-resharper_block_scope_redeclaration_highlighting=error
-resharper_built_in_type_reference_style_for_member_access_highlighting=hint
-resharper_built_in_type_reference_style_highlighting=hint
-resharper_by_ref_argument_is_volatile_field_highlighting=warning
-resharper_caller_callee_using_error_highlighting=error
-resharper_caller_callee_using_highlighting=warning
-resharper_cannot_apply_equality_operator_to_type_highlighting=warning
-resharper_center_tag_is_obsolete_highlighting=warning
-resharper_check_for_reference_equality_instead_1_highlighting=suggestion
-resharper_check_for_reference_equality_instead_2_highlighting=suggestion
-resharper_check_for_reference_equality_instead_3_highlighting=suggestion
-resharper_check_for_reference_equality_instead_4_highlighting=suggestion
-resharper_check_namespace_highlighting=warning
-resharper_class_cannot_be_instantiated_highlighting=warning
-resharper_class_can_be_sealed_global_highlighting=none
-resharper_class_can_be_sealed_local_highlighting=none
-resharper_class_highlighting=suggestion
-resharper_class_never_instantiated_global_highlighting=suggestion
-resharper_class_never_instantiated_local_highlighting=suggestion
-resharper_class_with_virtual_members_never_inherited_global_highlighting=suggestion
-resharper_class_with_virtual_members_never_inherited_local_highlighting=suggestion
-resharper_clear_attribute_is_obsolete_all_highlighting=warning
-resharper_clear_attribute_is_obsolete_highlighting=warning
-resharper_closure_on_modified_variable_highlighting=warning
-resharper_coerced_equals_using_highlighting=warning
-resharper_coerced_equals_using_with_null_undefined_highlighting=none
-resharper_collection_never_queried_global_highlighting=warning
-resharper_collection_never_queried_local_highlighting=warning
-resharper_collection_never_updated_global_highlighting=warning
-resharper_collection_never_updated_local_highlighting=warning
-resharper_comma_not_valid_here_highlighting=error
-resharper_comment_typo_highlighting=suggestion
-resharper_common_js_external_module_highlighting=suggestion
-resharper_compare_non_constrained_generic_with_null_highlighting=none
-resharper_compare_of_floats_by_equality_operator_highlighting=none
-resharper_conditional_ternary_equal_branch_highlighting=warning
-resharper_condition_is_always_const_highlighting=warning
-resharper_condition_is_always_true_or_false_highlighting=warning
-resharper_confusing_char_as_integer_in_constructor_highlighting=warning
-resharper_constant_conditional_access_qualifier_highlighting=warning
-resharper_constant_null_coalescing_condition_highlighting=warning
-resharper_constructor_call_not_used_highlighting=warning
-resharper_constructor_initializer_loop_highlighting=warning
-resharper_container_annotation_redundancy_highlighting=warning
-resharper_context_value_is_provided_highlighting=none
-resharper_contract_annotation_not_parsed_highlighting=warning
-resharper_convert_closure_to_method_group_highlighting=suggestion
-resharper_convert_conditional_ternary_expression_to_switch_expression_highlighting=hint
-resharper_convert_if_do_to_while_highlighting=suggestion
-resharper_convert_if_statement_to_conditional_ternary_expression_highlighting=suggestion
-resharper_convert_if_statement_to_null_coalescing_assignment_highlighting=suggestion
-resharper_convert_if_statement_to_null_coalescing_expression_highlighting=suggestion
-resharper_convert_if_statement_to_return_statement_highlighting=hint
-resharper_convert_if_statement_to_switch_expression_highlighting=hint
-resharper_convert_if_statement_to_switch_statement_highlighting=hint
-resharper_convert_if_to_or_expression_highlighting=suggestion
-resharper_convert_nullable_to_short_form_highlighting=suggestion
-resharper_convert_switch_statement_to_switch_expression_highlighting=hint
-resharper_convert_to_auto_property_highlighting=suggestion
-resharper_convert_to_auto_property_when_possible_highlighting=hint
-resharper_convert_to_auto_property_with_private_setter_highlighting=hint
-resharper_convert_to_compound_assignment_highlighting=hint
-resharper_convert_to_constant_global_highlighting=hint
-resharper_convert_to_constant_local_highlighting=hint
-resharper_convert_to_lambda_expression_highlighting=suggestion
-resharper_convert_to_lambda_expression_when_possible_highlighting=none
-resharper_convert_to_local_function_highlighting=suggestion
-resharper_convert_to_null_coalescing_compound_assignment_highlighting=suggestion
-resharper_convert_to_primary_constructor_highlighting=suggestion
-resharper_convert_to_static_class_highlighting=suggestion
-resharper_convert_to_using_declaration_highlighting=suggestion
-resharper_convert_to_vb_auto_property_highlighting=suggestion
-resharper_convert_to_vb_auto_property_when_possible_highlighting=hint
-resharper_convert_to_vb_auto_property_with_private_setter_highlighting=hint
-resharper_convert_type_check_pattern_to_null_check_highlighting=warning
-resharper_convert_type_check_to_null_check_highlighting=warning
-resharper_co_variant_array_conversion_highlighting=warning
-resharper_cpp_abstract_class_without_specifier_highlighting=warning
-resharper_cpp_abstract_final_class_highlighting=warning
-resharper_cpp_abstract_virtual_function_call_in_ctor_highlighting=error
-resharper_cpp_access_specifier_with_no_declarations_highlighting=suggestion
-resharper_cpp_assigned_value_is_never_used_highlighting=warning
-resharper_cpp_awaiter_type_is_not_class_highlighting=warning
-resharper_cpp_bad_angle_brackets_spaces_highlighting=none
-resharper_cpp_bad_braces_spaces_highlighting=none
-resharper_cpp_bad_child_statement_indent_highlighting=none
-resharper_cpp_bad_colon_spaces_highlighting=none
-resharper_cpp_bad_comma_spaces_highlighting=none
-resharper_cpp_bad_control_braces_indent_highlighting=none
-resharper_cpp_bad_control_braces_line_breaks_highlighting=none
-resharper_cpp_bad_declaration_braces_indent_highlighting=none
-resharper_cpp_bad_declaration_braces_line_breaks_highlighting=none
-resharper_cpp_bad_empty_braces_line_breaks_highlighting=none
-resharper_cpp_bad_expression_braces_indent_highlighting=none
-resharper_cpp_bad_expression_braces_line_breaks_highlighting=none
-resharper_cpp_bad_indent_highlighting=none
-resharper_cpp_bad_list_line_breaks_highlighting=none
-resharper_cpp_bad_member_access_spaces_highlighting=none
-resharper_cpp_bad_namespace_braces_indent_highlighting=none
-resharper_cpp_bad_parens_line_breaks_highlighting=none
-resharper_cpp_bad_parens_spaces_highlighting=none
-resharper_cpp_bad_semicolon_spaces_highlighting=none
-resharper_cpp_bad_spaces_after_keyword_highlighting=none
-resharper_cpp_bad_square_brackets_spaces_highlighting=none
-resharper_cpp_bad_switch_braces_indent_highlighting=none
-resharper_cpp_bad_symbol_spaces_highlighting=none
-resharper_cpp_boolean_increment_expression_highlighting=warning
-resharper_cpp_boost_format_bad_code_highlighting=warning
-resharper_cpp_boost_format_legacy_code_highlighting=suggestion
-resharper_cpp_boost_format_mixed_args_highlighting=error
-resharper_cpp_boost_format_too_few_args_highlighting=error
-resharper_cpp_boost_format_too_many_args_highlighting=warning
-resharper_cpp_clang_tidy_abseil_duration_addition_highlighting=none
-resharper_cpp_clang_tidy_abseil_duration_comparison_highlighting=none
-resharper_cpp_clang_tidy_abseil_duration_conversion_cast_highlighting=none
-resharper_cpp_clang_tidy_abseil_duration_division_highlighting=none
-resharper_cpp_clang_tidy_abseil_duration_factory_float_highlighting=none
-resharper_cpp_clang_tidy_abseil_duration_factory_scale_highlighting=none
-resharper_cpp_clang_tidy_abseil_duration_subtraction_highlighting=none
-resharper_cpp_clang_tidy_abseil_duration_unnecessary_conversion_highlighting=none
-resharper_cpp_clang_tidy_abseil_faster_strsplit_delimiter_highlighting=none
-resharper_cpp_clang_tidy_abseil_no_internal_dependencies_highlighting=none
-resharper_cpp_clang_tidy_abseil_no_namespace_highlighting=none
-resharper_cpp_clang_tidy_abseil_redundant_strcat_calls_highlighting=none
-resharper_cpp_clang_tidy_abseil_string_find_startswith_highlighting=none
-resharper_cpp_clang_tidy_abseil_string_find_str_contains_highlighting=none
-resharper_cpp_clang_tidy_abseil_str_cat_append_highlighting=none
-resharper_cpp_clang_tidy_abseil_time_comparison_highlighting=none
-resharper_cpp_clang_tidy_abseil_time_subtraction_highlighting=none
-resharper_cpp_clang_tidy_abseil_upgrade_duration_conversions_highlighting=none
-resharper_cpp_clang_tidy_altera_id_dependent_backward_branch_highlighting=none
-resharper_cpp_clang_tidy_altera_kernel_name_restriction_highlighting=none
-resharper_cpp_clang_tidy_altera_single_work_item_barrier_highlighting=none
-resharper_cpp_clang_tidy_altera_struct_pack_align_highlighting=none
-resharper_cpp_clang_tidy_altera_unroll_loops_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_accept4_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_accept_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_creat_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_dup_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_epoll_create1_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_epoll_create_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_fopen_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_inotify_init1_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_inotify_init_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_memfd_create_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_open_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_pipe2_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_pipe_highlighting=none
-resharper_cpp_clang_tidy_android_cloexec_socket_highlighting=none
-resharper_cpp_clang_tidy_android_comparison_in_temp_failure_retry_highlighting=none
-resharper_cpp_clang_tidy_boost_use_to_string_highlighting=suggestion
-resharper_cpp_clang_tidy_bugprone_argument_comment_highlighting=suggestion
-resharper_cpp_clang_tidy_bugprone_assert_side_effect_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_bad_signal_to_kill_thread_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_bool_pointer_implicit_conversion_highlighting=none
-resharper_cpp_clang_tidy_bugprone_branch_clone_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_copy_constructor_init_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_dangling_handle_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_dynamic_static_initializers_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_easily_swappable_parameters_highlighting=none
-resharper_cpp_clang_tidy_bugprone_exception_escape_highlighting=none
-resharper_cpp_clang_tidy_bugprone_fold_init_type_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_forwarding_reference_overload_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_forward_declaration_namespace_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_implicit_widening_of_multiplication_result_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_inaccurate_erase_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_incorrect_roundings_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_infinite_loop_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_integer_division_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_lambda_function_name_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_macro_parentheses_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_macro_repeated_side_effects_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_misplaced_operator_in_strlen_in_alloc_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_misplaced_pointer_arithmetic_in_alloc_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_misplaced_widening_cast_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_move_forwarding_reference_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_multiple_statement_macro_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_narrowing_conversions_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_not_null_terminated_result_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_no_escape_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_parent_virtual_call_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_posix_return_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_redundant_branch_condition_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_reserved_identifier_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_signal_handler_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_signed_char_misuse_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_sizeof_container_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_sizeof_expression_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_spuriously_wake_up_functions_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_string_constructor_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_string_integer_assignment_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_string_literal_with_embedded_nul_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_suspicious_enum_usage_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_suspicious_include_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_suspicious_memset_usage_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_suspicious_missing_comma_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_suspicious_semicolon_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_suspicious_string_compare_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_swapped_arguments_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_terminating_continue_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_throw_keyword_missing_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_too_small_loop_variable_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_undefined_memory_manipulation_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_undelegated_constructor_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_unhandled_exception_at_new_highlighting=none
-resharper_cpp_clang_tidy_bugprone_unhandled_self_assignment_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_unused_raii_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_unused_return_value_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_use_after_move_highlighting=warning
-resharper_cpp_clang_tidy_bugprone_virtual_near_miss_highlighting=suggestion
-resharper_cpp_clang_tidy_cert_con36_c_highlighting=none
-resharper_cpp_clang_tidy_cert_con54_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_dcl03_c_highlighting=none
-resharper_cpp_clang_tidy_cert_dcl16_c_highlighting=none
-resharper_cpp_clang_tidy_cert_dcl21_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_dcl37_c_highlighting=none
-resharper_cpp_clang_tidy_cert_dcl50_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_dcl51_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_dcl54_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_dcl58_cpp_highlighting=warning
-resharper_cpp_clang_tidy_cert_dcl59_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_env33_c_highlighting=none
-resharper_cpp_clang_tidy_cert_err09_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_err34_c_highlighting=suggestion
-resharper_cpp_clang_tidy_cert_err52_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_err58_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_err60_cpp_highlighting=warning
-resharper_cpp_clang_tidy_cert_err61_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_fio38_c_highlighting=none
-resharper_cpp_clang_tidy_cert_flp30_c_highlighting=warning
-resharper_cpp_clang_tidy_cert_mem57_cpp_highlighting=warning
-resharper_cpp_clang_tidy_cert_msc30_c_highlighting=none
-resharper_cpp_clang_tidy_cert_msc32_c_highlighting=none
-resharper_cpp_clang_tidy_cert_msc50_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_msc51_cpp_highlighting=warning
-resharper_cpp_clang_tidy_cert_oop11_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_oop54_cpp_highlighting=none
-resharper_cpp_clang_tidy_cert_oop57_cpp_highlighting=warning
-resharper_cpp_clang_tidy_cert_oop58_cpp_highlighting=warning
-resharper_cpp_clang_tidy_cert_pos44_c_highlighting=none
-resharper_cpp_clang_tidy_cert_pos47_c_highlighting=none
-resharper_cpp_clang_tidy_cert_sig30_c_highlighting=none
-resharper_cpp_clang_tidy_cert_str34_c_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_api_modeling_google_g_test_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_cast_value_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_return_value_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_api_modeling_std_c_library_functions_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_api_modeling_trust_nonnull_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_builtin_builtin_functions_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_builtin_no_return_functions_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_modeling_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_divide_zero_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_dynamic_type_propagation_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_nonnil_string_constants_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_non_null_param_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_null_dereference_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_stack_address_escape_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_stack_addr_escape_base_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_undefined_binary_operator_result_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_array_subscript_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_assign_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_branch_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_captured_block_variable_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_undef_return_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_core_vla_size_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_inner_pointer_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_move_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_leaks_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_placement_new_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_pure_virtual_call_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_self_assignment_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_smart_ptr_modeling_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_cplusplus_virtual_call_modeling_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_deadcode_dead_stores_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_fuchsia_handle_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_nullability_nullability_base_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_dereferenced_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_passed_to_nonnull_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_returned_from_nonnull_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_nullability_null_passed_to_nonnull_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_nullability_null_returned_from_nonnull_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_uninitialized_object_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_virtual_call_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_mpi_mpi_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_empty_localization_context_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_non_localized_string_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_osx_os_object_c_style_cast_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_performance_gcd_antipattern_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_performance_padding_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_optin_portability_unix_api_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_api_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_at_sync_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_autorelease_write_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_class_release_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_dealloc_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_incompatible_method_types_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_loops_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_missing_super_call_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_nil_arg_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_non_nil_return_value_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_autorelease_pool_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_error_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_obj_c_generics_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_base_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_run_loop_autorelease_leak_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_self_init_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_super_dealloc_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_unused_ivars_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_variadic_method_types_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_error_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_number_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_retain_release_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_out_of_bounds_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_pointer_sized_values_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_mig_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_ns_or_cf_error_deref_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_number_object_conversion_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_obj_c_property_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_os_object_retain_count_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_osx_sec_keychain_api_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_float_loop_counter_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcmp_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcopy_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bzero_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_decode_value_of_obj_c_type_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_deprecated_or_unsafe_buffer_handling_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_getpw_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_gets_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mkstemp_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mktemp_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_rand_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_security_syntax_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_strcpy_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_unchecked_return_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_vfork_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_api_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_bad_size_arg_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_c_string_modeling_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_null_arg_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_dynamic_memory_modeling_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_sizeof_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_mismatched_deallocator_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_unix_vfork_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_valist_copy_to_self_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_valist_uninitialized_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_valist_unterminated_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_valist_valist_base_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_webkit_no_uncounted_member_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_webkit_ref_cntbl_base_virtual_dtor_highlighting=none
-resharper_cpp_clang_tidy_clang_analyzer_webkit_uncounted_lambda_captures_checker_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_absolute_value_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_abstract_final_class_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_abstract_vbase_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_address_of_packed_member_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_address_of_temporary_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_aix_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_align_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_alloca_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_alloca_with_align_alignof_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_delete_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_ellipsis_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_macro_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_member_template_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_reversed_operator_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_analyzer_incompatible_plugin_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_anonymous_pack_parens_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_anon_enum_enum_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_arc_bridge_casts_disallowed_in_nonarc_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_arc_maybe_repeated_use_of_weak_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_arc_non_pod_memaccess_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_arc_perform_selector_leaks_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_arc_repeated_use_of_weak_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_arc_retain_cycles_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_arc_unsafe_retained_assign_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_argument_outside_range_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_pointer_arithmetic_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_asm_operand_widths_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_assign_enum_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_assume_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_atimport_in_framework_header_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_atomic_alignment_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_atomic_implicit_seq_cst_highlighting=suggestion
-resharper_cpp_clang_tidy_clang_diagnostic_atomic_memory_ordering_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_atomic_property_with_user_defined_accessor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_attribute_packed_for_bitfield_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_at_protocol_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_auto_disable_vptr_sanitizer_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_auto_import_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_auto_storage_class_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_auto_var_id_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_availability_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_avr_rtlib_linking_quirks_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_backslash_newline_escape_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bad_function_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_binding_in_condition_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bind_to_temporary_copy_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bitfield_constant_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bitfield_enum_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bitfield_width_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bitwise_conditional_parentheses_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bitwise_op_parentheses_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_block_capture_autoreleasing_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bool_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bool_operation_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_braced_scalar_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_bridge_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_builtin_assume_aligned_alignment_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_builtin_macro_redefined_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_builtin_memcpy_chk_size_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_builtin_requires_header_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_c11_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_c2x_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_c99_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_c99_designator_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_c99_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_called_once_parameter_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_call_to_pure_virtual_from_ctor_dtor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cast_align_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cast_calling_convention_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cast_function_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cast_of_sel_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_unrelated_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cf_string_literal_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_char_subscripts_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_clang_cl_pch_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_class_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_class_varargs_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cmse_union_leak_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_comma_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_comment_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_compare_distinct_pointer_types_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_completion_handler_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_complex_component_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_macro_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_space_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_concepts_ts_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_conditional_type_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_conditional_uninitialized_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_config_macros_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_constant_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_constant_evaluated_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_constant_logical_operand_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_constexpr_not_const_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_consumed_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_coroutine_missing_unhandled_exception_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_covered_switch_default_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_deprecated_writable_strings_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_reserved_user_defined_literal_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extra_semi_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_inline_namespace_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_long_long_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp11_narrowing_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp14_binary_literal_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp14_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_mangling_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp17_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp20_designator_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp20_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp2b_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_bind_to_temporary_copy_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_extra_semi_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_local_type_template_args_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_unnamed_type_template_args_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_binary_literal_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cpp_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cstring_format_directive_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ctad_maybe_unsupported_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_ctu_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_cuda_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_custom_atomic_properties_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_cxx_attribute_extension_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dangling_else_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dangling_field_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dangling_gsl_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dangling_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dangling_initializer_list_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_darwin_sdk_settings_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_date_time_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dealloc_in_category_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_debug_compression_unavailable_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_declaration_after_statement_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_defaulted_function_deleted_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_delegating_ctor_cycles_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_delete_abstract_non_virtual_dtor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_delete_incomplete_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_delete_non_abstract_non_virtual_dtor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_delete_non_virtual_dtor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_altivec_src_compat_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_anon_enum_enum_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_array_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_attributes_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_comma_subscript_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_dtor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_copy_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_dtor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_declarations_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_dynamic_exception_spec_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_conditional_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_enum_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_float_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_implementations_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_increment_bool_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_isa_usage_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_perform_selector_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_register_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_this_capture_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_deprecated_volatile_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_direct_ivar_access_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_disabled_macro_expansion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_distributed_object_modifiers_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_division_by_zero_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dllexport_explicit_instantiation_decl_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dllimport_static_field_def_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dll_attribute_on_redeclaration_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_documentation_deprecated_sync_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_documentation_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_documentation_html_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_documentation_pedantic_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_documentation_unknown_command_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_dollar_in_identifier_extension_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_double_promotion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dtor_name_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dtor_typedef_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_duplicate_decl_specifier_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_duplicate_enum_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_arg_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_match_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_duplicate_protocol_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dynamic_class_memaccess_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_dynamic_exception_spec_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_embedded_directive_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_empty_body_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_empty_decomposition_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_empty_init_stmt_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_empty_translation_unit_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_encode_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_conditional_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_switch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_enum_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_enum_enum_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_enum_float_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_enum_too_large_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_error_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_exceptions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_excess_initializers_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_exit_time_destructors_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_expansion_to_defined_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_explicit_initialize_call_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_explicit_ownership_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_export_unnamed_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_export_using_directive_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_extern_c_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_extern_initializer_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_extra_qualification_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_stmt_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_extra_tokens_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_final_dtor_non_final_class_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_fixed_enum_extension_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_fixed_point_overflow_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_flag_enum_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_flexible_array_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_float_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_float_equal_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_float_overflow_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_float_zero_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_extra_args_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_insufficient_args_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_invalid_specifier_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_nonliteral_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_non_iso_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_pedantic_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_security_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_type_confusion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_format_zero_length_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_fortify_source_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_for_loop_analysis_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_four_char_constants_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_framework_include_private_from_public_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_frame_address_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_frame_larger_than_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_free_nonheap_object_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_function_def_in_objc_container_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_function_multiversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gcc_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_global_constructors_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_global_isel_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_alignof_expression_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_anonymous_struct_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_array_member_paren_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_auto_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_binary_literal_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_case_range_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_complex_integer_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_compound_literal_initializer_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_conditional_omitted_operand_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_designator_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_initializer_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_struct_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_initializer_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_union_member_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_folding_constant_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_imaginary_constant_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_include_next_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_inline_cpp_without_extern_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_label_as_value_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_redeclared_enum_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_statement_expression_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_static_float_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_string_literal_operator_template_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_union_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_variable_sized_type_not_at_end_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_gnu_zero_variadic_macro_arguments_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_header_guard_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_header_hygiene_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_hip_only_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_idiomatic_parentheses_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ignored_attributes_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_ignored_availability_without_sdk_settings_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_ignored_optimization_argument_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragmas_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_intrinsic_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_optimize_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_ignored_qualifiers_highlighting=suggestion
-resharper_cpp_clang_tidy_clang_diagnostic_implicitly_unsigned_literal_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_atomic_properties_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_const_int_float_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_conversion_floating_point_to_bool_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_exception_spec_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_per_function_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_fixed_point_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_float_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_function_declaration_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_float_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_implicit_retain_self_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_import_preprocessor_directive_pedantic_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_inaccessible_base_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_include_next_absolute_path_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_include_next_outside_header_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incompatible_exception_spec_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incompatible_function_pointer_types_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incompatible_library_redeclaration_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incompatible_ms_struct_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_discards_qualifiers_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incompatible_property_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incompatible_sysroot_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incomplete_framework_module_declaration_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incomplete_implementation_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incomplete_module_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incomplete_setjmp_declaration_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_incomplete_umbrella_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_dllimport_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_destructor_override_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_override_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_increment_bool_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_independent_class_attribute_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_infinite_recursion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_initializer_overrides_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_injected_class_name_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_inline_asm_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_inline_namespace_reopened_noninline_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_inline_new_delete_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_instantiation_after_specialization_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_integer_overflow_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_interrupt_service_routine_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_int_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_int_in_bool_context_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_int_to_pointer_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_int_to_void_pointer_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_constexpr_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_iboutlet_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_initializer_from_system_header_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_ios_deployment_target_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_noreturn_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_no_builtin_names_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_offsetof_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_or_nonexistent_directory_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_partial_specialization_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_pp_token_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_source_encoding_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_invalid_token_paste_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_jump_seh_finally_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_keyword_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_keyword_macro_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_knr_promoted_parameter_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_language_extension_token_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_large_by_value_copy_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_literal_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_literal_range_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_local_type_template_args_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_logical_not_parentheses_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_logical_op_parentheses_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_long_long_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_macro_redefined_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_main_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_main_return_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_malformed_warning_check_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_many_braces_around_scalar_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_max_tokens_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_max_unsigned_zero_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_memset_transposed_args_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_memsize_comparison_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_method_signatures_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_abstract_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_anon_tag_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_charize_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_comment_paste_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_const_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cpp_macro_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_default_arg_redefinition_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_drectve_section_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_end_of_file_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_forward_reference_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_value_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exception_spec_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exists_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_explicit_constructor_call_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_extra_qualification_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_fixed_enum_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_flexible_array_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_goto_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_inaccessible_base_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_include_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_mutable_reference_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_pure_definition_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_redeclare_static_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_sealed_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_static_assert_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_shadow_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_union_member_reference_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_unqualified_friend_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_using_decl_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_microsoft_void_pseudo_dtor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_misleading_indentation_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_mismatched_new_delete_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_mismatched_parameter_types_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_mismatched_return_types_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_mismatched_tags_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_braces_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_constinit_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_declarations_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_exception_spec_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_field_initializers_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_method_return_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_noescape_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_noreturn_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_prototypes_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_missing_prototype_for_cc_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_selector_name_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_sysroot_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_missing_variable_declarations_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_misspelled_assumption_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_modules_ambiguous_internal_linkage_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_modules_import_nested_redundant_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_module_conflict_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_module_file_config_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_module_file_extension_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_module_import_in_extern_c_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_msvc_not_found_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_multichar_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_multiple_move_vbase_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nested_anon_types_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_newline_eof_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_new_returns_null_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_noderef_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nonnull_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nonportable_include_path_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nonportable_system_include_path_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nonportable_vector_initialization_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nontrivial_memaccess_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_non_c_typedef_for_linkage_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_non_literal_null_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_framework_module_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_module_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_non_pod_varargs_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_non_power_of_two_alignment_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_non_virtual_dtor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nsconsumed_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nsreturns_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ns_object_attribute_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_on_arrays_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nullability_declspec_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nullability_extension_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nullability_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nullability_inferred_on_nested_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_nullable_to_nonnull_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_null_arithmetic_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_null_character_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_null_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_null_dereference_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_arithmetic_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_subtraction_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_odr_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_old_style_cast_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_opencl_unsupported_rgba_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_openmp51_extensions_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_openmp_clauses_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_openmp_loop_form_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_openmp_mapping_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_openmp_target_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_option_ignored_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_ordered_compare_function_pointers_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_out_of_line_declaration_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_out_of_scope_function_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_overlength_strings_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_overloaded_shift_op_parentheses_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_overloaded_virtual_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_override_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_override_module_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_overriding_method_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_overriding_t_option_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_over_aligned_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_packed_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_padded_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_parentheses_equality_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_parentheses_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pass_failed_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pch_date_time_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pedantic_core_features_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pedantic_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pessimizing_move_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pointer_arith_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pointer_bool_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pointer_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pointer_integer_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pointer_sign_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_enum_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_int_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pointer_type_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_poison_system_directories_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_potentially_evaluated_expression_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pragmas_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pragma_clang_attribute_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pragma_messages_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pragma_once_outside_header_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_suspicious_include_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pragma_system_header_outside_header_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_predefined_identifier_outside_function_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2b_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2b_compat_pedantic_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_pre_openmp51_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_private_extern_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_private_header_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_private_module_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_missing_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_out_of_date_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_unprofiled_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_property_access_dot_syntax_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_property_attribute_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_protocol_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_protocol_property_synthesis_ambiguity_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_psabi_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_qualified_void_return_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_quoted_include_in_framework_header_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_range_loop_analysis_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_range_loop_bind_reference_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_range_loop_construct_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_readonly_iboutlet_property_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_receiver_expr_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_receiver_forward_class_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_redeclared_class_member_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_redundant_move_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_redundant_parens_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_register_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_reinterpret_base_class_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_reorder_ctor_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_reorder_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_reorder_init_list_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_requires_expression_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_requires_super_attribute_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_reserved_identifier_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_reserved_id_macro_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_reserved_macro_identifier_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_reserved_user_defined_literal_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_retained_language_linkage_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_return_stack_address_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_return_std_move_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_return_type_c_linkage_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_return_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_rewrite_not_bool_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_section_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_selector_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_selector_type_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_self_assign_field_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_self_assign_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_self_assign_overloaded_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_self_move_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_semicolon_before_method_body_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_sentinel_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_serialized_diagnostics_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_modified_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_shadow_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shadow_ivar_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shadow_uncaptured_local_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_shift_count_negative_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shift_count_overflow_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shift_negative_value_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shift_op_parentheses_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shift_overflow_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shift_sign_overflow_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_shorten64_to32_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_signed_enum_bitfield_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_signed_unsigned_wchar_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_sign_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_sign_conversion_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_argument_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_decay_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_div_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_div_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_memaccess_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_slash_u_filename_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_slh_asm_goto_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_sometimes_uninitialized_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_source_uses_openmp_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_spir_compat_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_static_float_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_static_inline_explicit_instantiation_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_static_in_inline_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_static_local_in_inline_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_static_self_init_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_stdlibcxx_not_found_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_strict_prototypes_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_strict_selector_match_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_string_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_string_concatenation_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_string_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_string_plus_char_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_string_plus_int_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_strlcpy_strlcat_size_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_strncat_size_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_suggest_destructor_override_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_suggest_override_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_super_class_method_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_suspicious_bzero_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_switch_bool_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_switch_enum_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_switch_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_sync_fetch_and_nand_semantics_changed_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_bitwise_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_in_range_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_out_of_range_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_objc_bool_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_overlap_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_pointer_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_type_limit_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_undefined_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_char_zero_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_enum_zero_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_zero_compare_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_tautological_value_range_compare_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_tentative_definition_incomplete_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_analysis_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_attributes_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_beta_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_negative_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_precise_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_reference_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_verbose_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_trigraphs_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_typedef_redefinition_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_typename_missing_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_type_safety_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unable_to_open_stats_file_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unavailable_declarations_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undeclared_selector_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undefined_bool_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undefined_func_template_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undefined_inline_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_type_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undefined_reinterpret_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undefined_var_template_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undef_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_undef_prefix_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_underaligned_exception_object_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unevaluated_expression_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_new_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unicode_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unicode_homoglyph_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unicode_whitespace_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unicode_zero_width_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_const_reference_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unknown_argument_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unknown_attributes_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unknown_cuda_version_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unknown_escape_sequence_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unknown_pragmas_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unknown_sanitizers_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unknown_warning_option_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unnamed_type_template_args_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unneeded_internal_declaration_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unneeded_member_function_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_break_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_loop_increment_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_return_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsequenced_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_abs_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_availability_guard_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_cb_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_dll_base_class_template_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_friend_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_gpopt_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_nan_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_target_opt_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unsupported_visibility_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unusable_partial_specialization_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_parameter_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_variable_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unused_comparison_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_const_variable_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_exception_parameter_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_function_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_getter_return_value_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_label_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_lambda_capture_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unused_local_typedef_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_macros_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_member_function_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_parameter_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unused_private_field_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_property_ivar_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_result_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_template_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_value_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_unused_variable_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_unused_volatile_lvalue_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_used_but_marked_unused_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_user_defined_literals_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_user_defined_warnings_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_varargs_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_variadic_macros_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_vector_conversion_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_vec_elem_size_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_vexing_parse_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_visibility_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_vla_extension_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_vla_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_enum_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_int_cast_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_void_ptr_dereference_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_warnings_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_wasm_exception_spec_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_weak_template_vtables_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_weak_vtables_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_writable_strings_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_xor_used_as_pow_highlighting=warning
-resharper_cpp_clang_tidy_clang_diagnostic_zero_as_null_pointer_constant_highlighting=none
-resharper_cpp_clang_tidy_clang_diagnostic_zero_length_array_highlighting=warning
-resharper_cpp_clang_tidy_concurrency_mt_unsafe_highlighting=warning
-resharper_cpp_clang_tidy_concurrency_thread_canceltype_asynchronous_highlighting=warning
-resharper_cpp_clang_tidy_cppcoreguidelines_avoid_c_arrays_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_avoid_goto_highlighting=warning
-resharper_cpp_clang_tidy_cppcoreguidelines_avoid_magic_numbers_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_avoid_non_const_global_variables_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_c_copy_assignment_signature_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_explicit_virtual_functions_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_init_variables_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_interfaces_global_init_highlighting=warning
-resharper_cpp_clang_tidy_cppcoreguidelines_macro_usage_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_narrowing_conversions_highlighting=warning
-resharper_cpp_clang_tidy_cppcoreguidelines_non_private_member_variables_in_classes_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_no_malloc_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_owning_memory_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_prefer_member_initializer_highlighting=suggestion
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_array_to_pointer_decay_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_constant_array_index_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_pointer_arithmetic_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_const_cast_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_cstyle_cast_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_member_init_highlighting=warning
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_reinterpret_cast_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_static_cast_downcast_highlighting=suggestion
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_union_access_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_vararg_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_slicing_highlighting=none
-resharper_cpp_clang_tidy_cppcoreguidelines_special_member_functions_highlighting=suggestion
-resharper_cpp_clang_tidy_darwin_avoid_spinlock_highlighting=none
-resharper_cpp_clang_tidy_darwin_dispatch_once_nonstatic_highlighting=none
-resharper_cpp_clang_tidy_fuchsia_default_arguments_calls_highlighting=none
-resharper_cpp_clang_tidy_fuchsia_default_arguments_declarations_highlighting=none
-resharper_cpp_clang_tidy_fuchsia_header_anon_namespaces_highlighting=none
-resharper_cpp_clang_tidy_fuchsia_multiple_inheritance_highlighting=none
-resharper_cpp_clang_tidy_fuchsia_overloaded_operator_highlighting=none
-resharper_cpp_clang_tidy_fuchsia_statically_constructed_objects_highlighting=none
-resharper_cpp_clang_tidy_fuchsia_trailing_return_highlighting=none
-resharper_cpp_clang_tidy_fuchsia_virtual_inheritance_highlighting=none
-resharper_cpp_clang_tidy_google_build_explicit_make_pair_highlighting=none
-resharper_cpp_clang_tidy_google_build_namespaces_highlighting=none
-resharper_cpp_clang_tidy_google_build_using_namespace_highlighting=none
-resharper_cpp_clang_tidy_google_default_arguments_highlighting=none
-resharper_cpp_clang_tidy_google_explicit_constructor_highlighting=none
-resharper_cpp_clang_tidy_google_global_names_in_headers_highlighting=none
-resharper_cpp_clang_tidy_google_objc_avoid_nsobject_new_highlighting=none
-resharper_cpp_clang_tidy_google_objc_avoid_throwing_exception_highlighting=none
-resharper_cpp_clang_tidy_google_objc_function_naming_highlighting=none
-resharper_cpp_clang_tidy_google_objc_global_variable_declaration_highlighting=none
-resharper_cpp_clang_tidy_google_readability_avoid_underscore_in_googletest_name_highlighting=none
-resharper_cpp_clang_tidy_google_readability_braces_around_statements_highlighting=none
-resharper_cpp_clang_tidy_google_readability_casting_highlighting=none
-resharper_cpp_clang_tidy_google_readability_function_size_highlighting=none
-resharper_cpp_clang_tidy_google_readability_namespace_comments_highlighting=none
-resharper_cpp_clang_tidy_google_readability_todo_highlighting=none
-resharper_cpp_clang_tidy_google_runtime_int_highlighting=none
-resharper_cpp_clang_tidy_google_runtime_operator_highlighting=warning
-resharper_cpp_clang_tidy_google_upgrade_googletest_case_highlighting=suggestion
-resharper_cpp_clang_tidy_hicpp_avoid_c_arrays_highlighting=none
-resharper_cpp_clang_tidy_hicpp_avoid_goto_highlighting=warning
-resharper_cpp_clang_tidy_hicpp_braces_around_statements_highlighting=none
-resharper_cpp_clang_tidy_hicpp_deprecated_headers_highlighting=none
-resharper_cpp_clang_tidy_hicpp_exception_baseclass_highlighting=suggestion
-resharper_cpp_clang_tidy_hicpp_explicit_conversions_highlighting=none
-resharper_cpp_clang_tidy_hicpp_function_size_highlighting=none
-resharper_cpp_clang_tidy_hicpp_invalid_access_moved_highlighting=none
-resharper_cpp_clang_tidy_hicpp_member_init_highlighting=none
-resharper_cpp_clang_tidy_hicpp_move_const_arg_highlighting=none
-resharper_cpp_clang_tidy_hicpp_multiway_paths_covered_highlighting=warning
-resharper_cpp_clang_tidy_hicpp_named_parameter_highlighting=none
-resharper_cpp_clang_tidy_hicpp_new_delete_operators_highlighting=none
-resharper_cpp_clang_tidy_hicpp_noexcept_move_highlighting=none
-resharper_cpp_clang_tidy_hicpp_no_array_decay_highlighting=none
-resharper_cpp_clang_tidy_hicpp_no_assembler_highlighting=none
-resharper_cpp_clang_tidy_hicpp_no_malloc_highlighting=none
-resharper_cpp_clang_tidy_hicpp_signed_bitwise_highlighting=none
-resharper_cpp_clang_tidy_hicpp_special_member_functions_highlighting=none
-resharper_cpp_clang_tidy_hicpp_static_assert_highlighting=none
-resharper_cpp_clang_tidy_hicpp_undelegated_constructor_highlighting=none
-resharper_cpp_clang_tidy_hicpp_uppercase_literal_suffix_highlighting=none
-resharper_cpp_clang_tidy_hicpp_use_auto_highlighting=none
-resharper_cpp_clang_tidy_hicpp_use_emplace_highlighting=none
-resharper_cpp_clang_tidy_hicpp_use_equals_default_highlighting=none
-resharper_cpp_clang_tidy_hicpp_use_equals_delete_highlighting=none
-resharper_cpp_clang_tidy_hicpp_use_noexcept_highlighting=none
-resharper_cpp_clang_tidy_hicpp_use_nullptr_highlighting=none
-resharper_cpp_clang_tidy_hicpp_use_override_highlighting=none
-resharper_cpp_clang_tidy_hicpp_vararg_highlighting=none
-resharper_cpp_clang_tidy_highlighting_highlighting=suggestion
-resharper_cpp_clang_tidy_linuxkernel_must_check_errs_highlighting=warning
-resharper_cpp_clang_tidy_llvmlibc_callee_namespace_highlighting=none
-resharper_cpp_clang_tidy_llvmlibc_implementation_in_namespace_highlighting=none
-resharper_cpp_clang_tidy_llvmlibc_restrict_system_libc_headers_highlighting=none
-resharper_cpp_clang_tidy_llvm_else_after_return_highlighting=none
-resharper_cpp_clang_tidy_llvm_header_guard_highlighting=none
-resharper_cpp_clang_tidy_llvm_include_order_highlighting=none
-resharper_cpp_clang_tidy_llvm_namespace_comment_highlighting=none
-resharper_cpp_clang_tidy_llvm_prefer_isa_or_dyn_cast_in_conditionals_highlighting=none
-resharper_cpp_clang_tidy_llvm_prefer_register_over_unsigned_highlighting=suggestion
-resharper_cpp_clang_tidy_llvm_qualified_auto_highlighting=none
-resharper_cpp_clang_tidy_llvm_twine_local_highlighting=none
-resharper_cpp_clang_tidy_misc_definitions_in_headers_highlighting=none
-resharper_cpp_clang_tidy_misc_misplaced_const_highlighting=warning
-resharper_cpp_clang_tidy_misc_new_delete_overloads_highlighting=warning
-resharper_cpp_clang_tidy_misc_non_copyable_objects_highlighting=warning
-resharper_cpp_clang_tidy_misc_non_private_member_variables_in_classes_highlighting=none
-resharper_cpp_clang_tidy_misc_no_recursion_highlighting=none
-resharper_cpp_clang_tidy_misc_redundant_expression_highlighting=warning
-resharper_cpp_clang_tidy_misc_static_assert_highlighting=suggestion
-resharper_cpp_clang_tidy_misc_throw_by_value_catch_by_reference_highlighting=warning
-resharper_cpp_clang_tidy_misc_unconventional_assign_operator_highlighting=warning
-resharper_cpp_clang_tidy_misc_uniqueptr_reset_release_highlighting=suggestion
-resharper_cpp_clang_tidy_misc_unused_alias_decls_highlighting=suggestion
-resharper_cpp_clang_tidy_misc_unused_parameters_highlighting=none
-resharper_cpp_clang_tidy_misc_unused_using_decls_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_avoid_bind_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_avoid_c_arrays_highlighting=none
-resharper_cpp_clang_tidy_modernize_concat_nested_namespaces_highlighting=none
-resharper_cpp_clang_tidy_modernize_deprecated_headers_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_deprecated_ios_base_aliases_highlighting=warning
-resharper_cpp_clang_tidy_modernize_loop_convert_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_make_shared_highlighting=none
-resharper_cpp_clang_tidy_modernize_make_unique_highlighting=none
-resharper_cpp_clang_tidy_modernize_pass_by_value_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_raw_string_literal_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_redundant_void_arg_highlighting=none
-resharper_cpp_clang_tidy_modernize_replace_auto_ptr_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_replace_disallow_copy_and_assign_macro_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_replace_random_shuffle_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_return_braced_init_list_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_shrink_to_fit_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_unary_static_assert_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_auto_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_bool_literals_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_default_member_init_highlighting=none
-resharper_cpp_clang_tidy_modernize_use_emplace_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_equals_default_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_equals_delete_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_nodiscard_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_noexcept_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_nullptr_highlighting=none
-resharper_cpp_clang_tidy_modernize_use_override_highlighting=none
-resharper_cpp_clang_tidy_modernize_use_trailing_return_type_highlighting=none
-resharper_cpp_clang_tidy_modernize_use_transparent_functors_highlighting=suggestion
-resharper_cpp_clang_tidy_modernize_use_uncaught_exceptions_highlighting=warning
-resharper_cpp_clang_tidy_modernize_use_using_highlighting=none
-resharper_cpp_clang_tidy_mpi_buffer_deref_highlighting=warning
-resharper_cpp_clang_tidy_mpi_type_mismatch_highlighting=warning
-resharper_cpp_clang_tidy_objc_avoid_nserror_init_highlighting=warning
-resharper_cpp_clang_tidy_objc_dealloc_in_category_highlighting=warning
-resharper_cpp_clang_tidy_objc_forbidden_subclassing_highlighting=warning
-resharper_cpp_clang_tidy_objc_missing_hash_highlighting=warning
-resharper_cpp_clang_tidy_objc_nsinvocation_argument_lifetime_highlighting=warning
-resharper_cpp_clang_tidy_objc_property_declaration_highlighting=warning
-resharper_cpp_clang_tidy_objc_super_self_highlighting=warning
-resharper_cpp_clang_tidy_openmp_exception_escape_highlighting=warning
-resharper_cpp_clang_tidy_openmp_use_default_none_highlighting=warning
-resharper_cpp_clang_tidy_performance_faster_string_find_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_for_range_copy_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_implicit_conversion_in_loop_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_inefficient_algorithm_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_inefficient_string_concatenation_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_inefficient_vector_operation_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_move_constructor_init_highlighting=warning
-resharper_cpp_clang_tidy_performance_move_const_arg_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_noexcept_move_constructor_highlighting=none
-resharper_cpp_clang_tidy_performance_no_automatic_move_highlighting=warning
-resharper_cpp_clang_tidy_performance_no_int_to_ptr_highlighting=warning
-resharper_cpp_clang_tidy_performance_trivially_destructible_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_type_promotion_in_math_fn_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_unnecessary_copy_initialization_highlighting=suggestion
-resharper_cpp_clang_tidy_performance_unnecessary_value_param_highlighting=suggestion
-resharper_cpp_clang_tidy_portability_restrict_system_includes_highlighting=none
-resharper_cpp_clang_tidy_portability_simd_intrinsics_highlighting=none
-resharper_cpp_clang_tidy_readability_avoid_const_params_in_decls_highlighting=none
-resharper_cpp_clang_tidy_readability_braces_around_statements_highlighting=none
-resharper_cpp_clang_tidy_readability_const_return_type_highlighting=none
-resharper_cpp_clang_tidy_readability_container_size_empty_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_convert_member_functions_to_static_highlighting=none
-resharper_cpp_clang_tidy_readability_delete_null_pointer_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_else_after_return_highlighting=none
-resharper_cpp_clang_tidy_readability_function_cognitive_complexity_highlighting=none
-resharper_cpp_clang_tidy_readability_function_size_highlighting=none
-resharper_cpp_clang_tidy_readability_identifier_naming_highlighting=none
-resharper_cpp_clang_tidy_readability_implicit_bool_conversion_highlighting=none
-resharper_cpp_clang_tidy_readability_inconsistent_declaration_parameter_name_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_isolate_declaration_highlighting=none
-resharper_cpp_clang_tidy_readability_magic_numbers_highlighting=none
-resharper_cpp_clang_tidy_readability_make_member_function_const_highlighting=none
-resharper_cpp_clang_tidy_readability_misleading_indentation_highlighting=none
-resharper_cpp_clang_tidy_readability_misplaced_array_index_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_named_parameter_highlighting=none
-resharper_cpp_clang_tidy_readability_non_const_parameter_highlighting=none
-resharper_cpp_clang_tidy_readability_qualified_auto_highlighting=none
-resharper_cpp_clang_tidy_readability_redundant_access_specifiers_highlighting=none
-resharper_cpp_clang_tidy_readability_redundant_control_flow_highlighting=none
-resharper_cpp_clang_tidy_readability_redundant_declaration_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_redundant_function_ptr_dereference_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_redundant_member_init_highlighting=none
-resharper_cpp_clang_tidy_readability_redundant_preprocessor_highlighting=warning
-resharper_cpp_clang_tidy_readability_redundant_smartptr_get_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_redundant_string_cstr_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_redundant_string_init_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_simplify_boolean_expr_highlighting=none
-resharper_cpp_clang_tidy_readability_simplify_subscript_expr_highlighting=warning
-resharper_cpp_clang_tidy_readability_static_accessed_through_instance_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_static_definition_in_anonymous_namespace_highlighting=none
-resharper_cpp_clang_tidy_readability_string_compare_highlighting=warning
-resharper_cpp_clang_tidy_readability_suspicious_call_argument_highlighting=warning
-resharper_cpp_clang_tidy_readability_uniqueptr_delete_release_highlighting=suggestion
-resharper_cpp_clang_tidy_readability_uppercase_literal_suffix_highlighting=none
-resharper_cpp_clang_tidy_readability_use_anyofallof_highlighting=suggestion
-resharper_cpp_clang_tidy_zircon_temporary_objects_highlighting=none
-resharper_cpp_class_can_be_final_highlighting=hint
-resharper_cpp_class_disallow_lazy_merging_highlighting=warning
-resharper_cpp_class_is_incomplete_highlighting=warning
-resharper_cpp_class_needs_constructor_because_of_uninitialized_member_highlighting=warning
-resharper_cpp_class_never_used_highlighting=warning
-resharper_cpp_compile_time_constant_can_be_replaced_with_boolean_constant_highlighting=suggestion
-resharper_cpp_const_parameter_in_declaration_highlighting=suggestion
-resharper_cpp_const_value_function_return_type_highlighting=suggestion
-resharper_cpp_coroutine_call_resolve_error_highlighting=warning
-resharper_cpp_cv_qualifier_can_not_be_applied_to_reference_highlighting=warning
-resharper_cpp_c_style_cast_highlighting=suggestion
-resharper_cpp_declaration_hides_local_highlighting=warning
-resharper_cpp_declaration_hides_uncaptured_local_highlighting=hint
-resharper_cpp_declaration_specifier_without_declarators_highlighting=warning
-resharper_cpp_declarator_disambiguated_as_function_highlighting=warning
-resharper_cpp_declarator_never_used_highlighting=warning
-resharper_cpp_declarator_used_before_initialization_highlighting=error
-resharper_cpp_defaulted_special_member_function_is_implicitly_deleted_highlighting=warning
-resharper_cpp_default_case_not_handled_in_switch_statement_highlighting=warning
-resharper_cpp_default_initialization_with_no_user_constructor_highlighting=warning
-resharper_cpp_default_is_used_as_identifier_highlighting=warning
-resharper_cpp_deleting_void_pointer_highlighting=warning
-resharper_cpp_dependent_template_without_template_keyword_highlighting=warning
-resharper_cpp_dependent_type_without_typename_keyword_highlighting=warning
-resharper_cpp_deprecated_entity_highlighting=warning
-resharper_cpp_deprecated_register_storage_class_specifier_highlighting=warning
-resharper_cpp_dereference_operator_limit_exceeded_highlighting=warning
-resharper_cpp_discarded_postfix_operator_result_highlighting=suggestion
-resharper_cpp_doxygen_syntax_error_highlighting=warning
-resharper_cpp_doxygen_undocumented_parameter_highlighting=suggestion
-resharper_cpp_doxygen_unresolved_reference_highlighting=warning
-resharper_cpp_empty_declaration_highlighting=warning
-resharper_cpp_enforce_cv_qualifiers_order_highlighting=none
-resharper_cpp_enforce_cv_qualifiers_placement_highlighting=none
-resharper_cpp_enforce_do_statement_braces_highlighting=none
-resharper_cpp_enforce_for_statement_braces_highlighting=none
-resharper_cpp_enforce_function_declaration_style_highlighting=none
-resharper_cpp_enforce_if_statement_braces_highlighting=none
-resharper_cpp_enforce_nested_namespaces_style_highlighting=hint
-resharper_cpp_enforce_overriding_destructor_style_highlighting=suggestion
-resharper_cpp_enforce_overriding_function_style_highlighting=suggestion
-resharper_cpp_enforce_type_alias_code_style_highlighting=none
-resharper_cpp_enforce_while_statement_braces_highlighting=none
-resharper_cpp_entity_assigned_but_no_read_highlighting=warning
-resharper_cpp_entity_used_only_in_unevaluated_context_highlighting=warning
-resharper_cpp_enumerator_never_used_highlighting=warning
-resharper_cpp_equal_operands_in_binary_expression_highlighting=warning
-resharper_cpp_explicit_specialization_in_non_namespace_scope_highlighting=warning
-resharper_cpp_expression_without_side_effects_highlighting=warning
-resharper_cpp_final_function_in_final_class_highlighting=suggestion
-resharper_cpp_final_non_overriding_virtual_function_highlighting=suggestion
-resharper_cpp_for_loop_can_be_replaced_with_while_highlighting=suggestion
-resharper_cpp_functional_style_cast_highlighting=suggestion
-resharper_cpp_function_doesnt_return_value_highlighting=warning
-resharper_cpp_function_is_not_implemented_highlighting=warning
-resharper_cpp_header_has_been_already_included_highlighting=hint
-resharper_cpp_hidden_function_highlighting=warning
-resharper_cpp_hiding_function_highlighting=warning
-resharper_cpp_identical_operands_in_binary_expression_highlighting=warning
-resharper_cpp_if_can_be_replaced_by_constexpr_if_highlighting=suggestion
-resharper_cpp_implicit_default_constructor_not_available_highlighting=warning
-resharper_cpp_incompatible_pointer_conversion_highlighting=warning
-resharper_cpp_incomplete_switch_statement_highlighting=warning
-resharper_cpp_inconsistent_naming_highlighting=hint
-resharper_cpp_incorrect_blank_lines_near_braces_highlighting=none
-resharper_cpp_initialized_value_is_always_rewritten_highlighting=warning
-resharper_cpp_integral_to_pointer_conversion_highlighting=warning
-resharper_cpp_invalid_line_continuation_highlighting=warning
-resharper_cpp_join_declaration_and_assignment_highlighting=suggestion
-resharper_cpp_lambda_capture_never_used_highlighting=warning
-resharper_cpp_local_variable_may_be_const_highlighting=suggestion
-resharper_cpp_local_variable_might_not_be_initialized_highlighting=warning
-resharper_cpp_local_variable_with_non_trivial_dtor_is_never_used_highlighting=none
-resharper_cpp_long_float_highlighting=warning
-resharper_cpp_member_function_may_be_const_highlighting=suggestion
-resharper_cpp_member_function_may_be_static_highlighting=suggestion
-resharper_cpp_member_initializers_order_highlighting=suggestion
-resharper_cpp_mismatched_class_tags_highlighting=warning
-resharper_cpp_missing_blank_lines_highlighting=none
-resharper_cpp_missing_include_guard_highlighting=warning
-resharper_cpp_missing_indent_highlighting=none
-resharper_cpp_missing_keyword_throw_highlighting=warning
-resharper_cpp_missing_linebreak_highlighting=none
-resharper_cpp_missing_space_highlighting=none
-resharper_cpp_ms_ext_address_of_class_r_value_highlighting=warning
-resharper_cpp_ms_ext_binding_r_value_to_lvalue_reference_highlighting=warning
-resharper_cpp_ms_ext_copy_elision_in_copy_init_declarator_highlighting=warning
-resharper_cpp_ms_ext_double_user_conversion_in_copy_init_highlighting=warning
-resharper_cpp_ms_ext_not_initialized_static_const_local_var_highlighting=warning
-resharper_cpp_ms_ext_reinterpret_cast_from_nullptr_highlighting=warning
-resharper_cpp_multiple_spaces_highlighting=none
-resharper_cpp_must_be_public_virtual_to_implement_interface_highlighting=warning
-resharper_cpp_mutable_specifier_on_reference_member_highlighting=warning
-resharper_cpp_nodiscard_function_without_return_value_highlighting=warning
-resharper_cpp_non_exception_safe_resource_acquisition_highlighting=hint
-resharper_cpp_non_explicit_conversion_operator_highlighting=hint
-resharper_cpp_non_explicit_converting_constructor_highlighting=hint
-resharper_cpp_non_inline_function_definition_in_header_file_highlighting=warning
-resharper_cpp_non_inline_variable_definition_in_header_file_highlighting=warning
-resharper_cpp_not_all_paths_return_value_highlighting=warning
-resharper_cpp_no_discard_expression_highlighting=warning
-resharper_cpp_object_member_might_not_be_initialized_highlighting=warning
-resharper_cpp_outdent_is_off_prev_level_highlighting=none
-resharper_cpp_out_parameter_must_be_written_highlighting=warning
-resharper_cpp_parameter_may_be_const_highlighting=hint
-resharper_cpp_parameter_may_be_const_ptr_or_ref_highlighting=suggestion
-resharper_cpp_parameter_names_mismatch_highlighting=hint
-resharper_cpp_parameter_never_used_highlighting=hint
-resharper_cpp_parameter_value_is_reassigned_highlighting=warning
-resharper_cpp_pointer_conversion_drops_qualifiers_highlighting=warning
-resharper_cpp_pointer_to_integral_conversion_highlighting=warning
-resharper_cpp_polymorphic_class_with_non_virtual_public_destructor_highlighting=warning
-resharper_cpp_possibly_erroneous_empty_statements_highlighting=warning
-resharper_cpp_possibly_uninitialized_member_highlighting=warning
-resharper_cpp_possibly_unintended_object_slicing_highlighting=warning
-resharper_cpp_precompiled_header_is_not_included_highlighting=error
-resharper_cpp_precompiled_header_not_found_highlighting=error
-resharper_cpp_printf_bad_format_highlighting=warning
-resharper_cpp_printf_extra_arg_highlighting=warning
-resharper_cpp_printf_missed_arg_highlighting=error
-resharper_cpp_printf_risky_format_highlighting=warning
-resharper_cpp_private_special_member_function_is_not_implemented_highlighting=warning
-resharper_cpp_range_based_for_incompatible_reference_highlighting=warning
-resharper_cpp_redefinition_of_default_argument_in_override_function_highlighting=warning
-resharper_cpp_redundant_access_specifier_highlighting=hint
-resharper_cpp_redundant_base_class_access_specifier_highlighting=hint
-resharper_cpp_redundant_blank_lines_highlighting=none
-resharper_cpp_redundant_boolean_expression_argument_highlighting=warning
-resharper_cpp_redundant_cast_expression_highlighting=hint
-resharper_cpp_redundant_const_specifier_highlighting=hint
-resharper_cpp_redundant_control_flow_jump_highlighting=hint
-resharper_cpp_redundant_elaborated_type_specifier_highlighting=hint
-resharper_cpp_redundant_else_keyword_highlighting=hint
-resharper_cpp_redundant_else_keyword_inside_compound_statement_highlighting=hint
-resharper_cpp_redundant_empty_declaration_highlighting=hint
-resharper_cpp_redundant_empty_statement_highlighting=hint
-resharper_cpp_redundant_explicit_template_arguments_highlighting=hint
-resharper_cpp_redundant_inline_specifier_highlighting=hint
-resharper_cpp_redundant_lambda_parameter_list_highlighting=hint
-resharper_cpp_redundant_linebreak_highlighting=none
-resharper_cpp_redundant_member_initializer_highlighting=suggestion
-resharper_cpp_redundant_namespace_definition_highlighting=suggestion
-resharper_cpp_redundant_parentheses_highlighting=hint
-resharper_cpp_redundant_qualifier_highlighting=hint
-resharper_cpp_redundant_space_highlighting=none
-resharper_cpp_redundant_static_specifier_on_member_allocation_function_highlighting=hint
-resharper_cpp_redundant_template_keyword_highlighting=warning
-resharper_cpp_redundant_typename_keyword_highlighting=warning
-resharper_cpp_redundant_void_argument_list_highlighting=suggestion
-resharper_cpp_reinterpret_cast_from_void_ptr_highlighting=suggestion
-resharper_cpp_remove_redundant_braces_highlighting=none
-resharper_cpp_replace_memset_with_zero_initialization_highlighting=suggestion
-resharper_cpp_replace_tie_with_structured_binding_highlighting=suggestion
-resharper_cpp_return_no_value_in_non_void_function_highlighting=warning
-resharper_cpp_smart_pointer_vs_make_function_highlighting=suggestion
-resharper_cpp_some_object_members_might_not_be_initialized_highlighting=warning
-resharper_cpp_special_function_without_noexcept_specification_highlighting=warning
-resharper_cpp_static_data_member_in_unnamed_struct_highlighting=warning
-resharper_cpp_static_specifier_on_anonymous_namespace_member_highlighting=suggestion
-resharper_cpp_string_literal_to_char_pointer_conversion_highlighting=warning
-resharper_cpp_syntax_warning_highlighting=warning
-resharper_cpp_tabs_and_spaces_mismatch_highlighting=none
-resharper_cpp_tabs_are_disallowed_highlighting=none
-resharper_cpp_tabs_outside_indent_highlighting=none
-resharper_cpp_template_parameter_shadowing_highlighting=warning
-resharper_cpp_this_arg_member_func_delegate_ctor_is_unsuported_by_dot_net_core_highlighting=none
-resharper_cpp_throw_expression_can_be_replaced_with_rethrow_highlighting=warning
-resharper_cpp_too_wide_scope_highlighting=suggestion
-resharper_cpp_too_wide_scope_init_statement_highlighting=hint
-resharper_cpp_type_alias_never_used_highlighting=warning
-resharper_cpp_ue4_blueprint_callable_function_may_be_const_highlighting=hint
-resharper_cpp_ue4_blueprint_callable_function_may_be_static_highlighting=hint
-resharper_cpp_ue4_coding_standard_naming_violation_warning_highlighting=hint
-resharper_cpp_ue4_coding_standard_u_class_naming_violation_error_highlighting=error
-resharper_cpp_ue4_probable_memory_issues_with_u_objects_in_container_highlighting=warning
-resharper_cpp_ue4_probable_memory_issues_with_u_object_highlighting=warning
-resharper_cpp_ue_blueprint_callable_function_unused_highlighting=warning
-resharper_cpp_ue_blueprint_implementable_event_not_implemented_highlighting=warning
-resharper_cpp_ue_incorrect_engine_directory_highlighting=error
-resharper_cpp_ue_non_existent_input_action_highlighting=warning
-resharper_cpp_ue_non_existent_input_axis_highlighting=warning
-resharper_cpp_ue_source_file_without_predefined_macros_highlighting=warning
-resharper_cpp_ue_source_file_without_standard_library_highlighting=error
-resharper_cpp_ue_version_file_doesnt_exist_highlighting=error
-resharper_cpp_uninitialized_dependent_base_class_highlighting=warning
-resharper_cpp_uninitialized_non_static_data_member_highlighting=warning
-resharper_cpp_union_member_of_reference_type_highlighting=warning
-resharper_cpp_unnamed_namespace_in_header_file_highlighting=warning
-resharper_cpp_unnecessary_whitespace_highlighting=none
-resharper_cpp_unreachable_code_highlighting=warning
-resharper_cpp_unsigned_zero_comparison_highlighting=warning
-resharper_cpp_unused_include_directive_highlighting=warning
-resharper_cpp_user_defined_literal_suffix_does_not_start_with_underscore_highlighting=warning
-resharper_cpp_use_algorithm_with_count_highlighting=suggestion
-resharper_cpp_use_associative_contains_highlighting=suggestion
-resharper_cpp_use_auto_for_numeric_highlighting=hint
-resharper_cpp_use_auto_highlighting=hint
-resharper_cpp_use_elements_view_highlighting=suggestion
-resharper_cpp_use_erase_algorithm_highlighting=suggestion
-resharper_cpp_use_familiar_template_syntax_for_generic_lambdas_highlighting=suggestion
-resharper_cpp_use_range_algorithm_highlighting=suggestion
-resharper_cpp_use_std_size_highlighting=suggestion
-resharper_cpp_use_structured_binding_highlighting=hint
-resharper_cpp_use_type_trait_alias_highlighting=suggestion
-resharper_cpp_using_result_of_assignment_as_condition_highlighting=warning
-resharper_cpp_u_function_macro_call_has_no_effect_highlighting=warning
-resharper_cpp_u_property_macro_call_has_no_effect_highlighting=warning
-resharper_cpp_variable_can_be_made_constexpr_highlighting=suggestion
-resharper_cpp_virtual_function_call_inside_ctor_highlighting=warning
-resharper_cpp_virtual_function_in_final_class_highlighting=warning
-resharper_cpp_volatile_parameter_in_declaration_highlighting=suggestion
-resharper_cpp_wrong_includes_order_highlighting=hint
-resharper_cpp_wrong_indent_size_highlighting=none
-resharper_cpp_wrong_slashes_in_include_directive_highlighting=hint
-resharper_cpp_zero_constant_can_be_replaced_with_nullptr_highlighting=suggestion
-resharper_cpp_zero_valued_expression_used_as_null_pointer_highlighting=warning
-resharper_create_specialized_overload_highlighting=hint
-resharper_css_browser_compatibility_highlighting=warning
-resharper_css_caniuse_feature_requires_prefix_highlighting=hint
-resharper_css_caniuse_unsupported_feature_highlighting=hint
-resharper_css_not_resolved_highlighting=error
-resharper_css_obsolete_highlighting=hint
-resharper_css_property_does_not_override_vendor_property_highlighting=warning
-resharper_cyclic_reference_comment_highlighting=none
-resharper_c_declaration_with_implicit_int_type_highlighting=warning
-resharper_c_sharp_build_cs_invalid_module_name_highlighting=warning
-resharper_c_sharp_missing_plugin_dependency_highlighting=warning
-resharper_declaration_hides_highlighting=hint
-resharper_declaration_is_empty_highlighting=warning
-resharper_declaration_visibility_error_highlighting=error
-resharper_default_value_attribute_for_optional_parameter_highlighting=warning
-resharper_deleting_non_qualified_reference_highlighting=error
-resharper_dl_tag_contains_non_dt_or_dd_elements_highlighting=hint
-resharper_double_colons_expected_highlighting=error
-resharper_double_colons_preferred_highlighting=suggestion
-resharper_double_negation_in_pattern_highlighting=suggestion
-resharper_double_negation_of_boolean_highlighting=warning
-resharper_double_negation_operator_highlighting=suggestion
-resharper_duplicate_identifier_error_highlighting=error
-resharper_duplicate_reference_comment_highlighting=warning
-resharper_duplicate_resource_highlighting=warning
-resharper_duplicating_local_declaration_highlighting=warning
-resharper_duplicating_parameter_declaration_error_highlighting=error
-resharper_duplicating_property_declaration_error_highlighting=error
-resharper_duplicating_property_declaration_highlighting=warning
-resharper_duplicating_switch_label_highlighting=warning
-resharper_dynamic_shift_right_op_is_not_int_highlighting=warning
-resharper_elided_trailing_element_highlighting=warning
-resharper_empty_constructor_highlighting=warning
-resharper_empty_destructor_highlighting=warning
-resharper_empty_embedded_statement_highlighting=warning
-resharper_empty_for_statement_highlighting=warning
-resharper_empty_general_catch_clause_highlighting=warning
-resharper_empty_namespace_highlighting=warning
-resharper_empty_object_property_declaration_highlighting=error
-resharper_empty_return_value_for_type_annotated_function_highlighting=warning
-resharper_empty_statement_highlighting=warning
-resharper_empty_title_tag_highlighting=hint
-resharper_enforce_do_while_statement_braces_highlighting=none
-resharper_enforce_fixed_statement_braces_highlighting=none
-resharper_enforce_foreach_statement_braces_highlighting=none
-resharper_enforce_for_statement_braces_highlighting=none
-resharper_enforce_if_statement_braces_highlighting=none
-resharper_enforce_lock_statement_braces_highlighting=none
-resharper_enforce_using_statement_braces_highlighting=none
-resharper_enforce_while_statement_braces_highlighting=none
-resharper_entity_name_captured_only_global_highlighting=warning
-resharper_entity_name_captured_only_local_highlighting=warning
-resharper_enumerable_sum_in_explicit_unchecked_context_highlighting=warning
-resharper_enum_underlying_type_is_int_highlighting=warning
-resharper_equal_expression_comparison_highlighting=warning
-resharper_error_in_xml_doc_reference_highlighting=error
-resharper_es6_feature_highlighting=error
-resharper_es7_feature_highlighting=error
-resharper_eval_arguments_name_error_highlighting=error
-resharper_event_never_invoked_global_highlighting=suggestion
-resharper_event_never_subscribed_to_global_highlighting=suggestion
-resharper_event_never_subscribed_to_local_highlighting=suggestion
-resharper_event_unsubscription_via_anonymous_delegate_highlighting=warning
-resharper_experimental_feature_highlighting=error
-resharper_explicit_caller_info_argument_highlighting=warning
-resharper_expression_is_always_const_highlighting=warning
-resharper_expression_is_always_null_highlighting=warning
-resharper_field_can_be_made_read_only_global_highlighting=suggestion
-resharper_field_can_be_made_read_only_local_highlighting=suggestion
-resharper_field_hides_interface_property_with_default_implementation_highlighting=warning
-resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting=hint
-resharper_foreach_can_be_partly_converted_to_query_using_another_get_enumerator_highlighting=hint
-resharper_format_string_placeholders_mismatch_highlighting=warning
-resharper_format_string_problem_highlighting=warning
-resharper_for_can_be_converted_to_foreach_highlighting=suggestion
-resharper_for_statement_condition_is_true_highlighting=warning
-resharper_functions_used_before_declared_highlighting=none
-resharper_function_complexity_overflow_highlighting=none
-resharper_function_never_returns_highlighting=warning
-resharper_function_parameter_named_arguments_highlighting=warning
-resharper_function_recursive_on_all_paths_highlighting=warning
-resharper_function_used_out_of_scope_highlighting=warning
-resharper_gc_suppress_finalize_for_type_without_destructor_highlighting=warning
-resharper_generic_enumerator_not_disposed_highlighting=warning
-resharper_heuristically_unreachable_code_highlighting=warning
-resharper_heuristic_unreachable_code_highlighting=warning
-resharper_hex_color_value_with_alpha_highlighting=error
-resharper_html_attributes_quotes_highlighting=hint
-resharper_html_attribute_not_resolved_highlighting=warning
-resharper_html_attribute_value_not_resolved_highlighting=warning
-resharper_html_dead_code_highlighting=warning
-resharper_html_event_not_resolved_highlighting=warning
-resharper_html_id_duplication_highlighting=warning
-resharper_html_id_not_resolved_highlighting=warning
-resharper_html_obsolete_highlighting=warning
-resharper_html_path_error_highlighting=warning
-resharper_html_tag_not_closed_highlighting=error
-resharper_html_tag_not_resolved_highlighting=warning
-resharper_html_tag_should_be_self_closed_highlighting=warning
-resharper_html_tag_should_not_be_self_closed_highlighting=warning
-resharper_html_warning_highlighting=warning
-resharper_identifier_typo_highlighting=suggestion
-resharper_implicit_any_error_highlighting=error
-resharper_implicit_any_type_warning_highlighting=warning
-resharper_import_keyword_not_with_invocation_highlighting=error
-resharper_inactive_preprocessor_branch_highlighting=warning
-resharper_inconsistently_synchronized_field_highlighting=warning
-resharper_inconsistent_function_returns_highlighting=warning
-resharper_inconsistent_naming_highlighting=warning
-resharper_inconsistent_order_of_locks_highlighting=warning
-resharper_incorrect_blank_lines_near_braces_highlighting=none
-resharper_incorrect_operand_in_type_of_comparison_highlighting=warning
-resharper_incorrect_triple_slash_location_highlighting=warning
-resharper_indexing_by_invalid_range_highlighting=warning
-resharper_inheritdoc_consider_usage_highlighting=none
-resharper_inheritdoc_invalid_usage_highlighting=warning
-resharper_inline_out_variable_declaration_highlighting=suggestion
-resharper_inline_temporary_variable_highlighting=hint
-resharper_internal_module_highlighting=suggestion
-resharper_internal_or_private_member_not_documented_highlighting=none
-resharper_interpolated_string_expression_is_not_i_formattable_highlighting=warning
-resharper_introduce_optional_parameters_global_highlighting=suggestion
-resharper_introduce_optional_parameters_local_highlighting=suggestion
-resharper_introduce_variable_to_apply_guard_highlighting=hint
-resharper_int_division_by_zero_highlighting=warning
-resharper_int_variable_overflow_highlighting=warning
-resharper_int_variable_overflow_in_checked_context_highlighting=warning
-resharper_int_variable_overflow_in_unchecked_context_highlighting=warning
-resharper_invalid_attribute_value_highlighting=warning
-resharper_invalid_json_syntax_highlighting=error
-resharper_invalid_task_element_highlighting=none
-resharper_invalid_value_highlighting=error
-resharper_invalid_value_type_highlighting=warning
-resharper_invalid_xml_doc_comment_highlighting=warning
-resharper_invert_condition_1_highlighting=hint
-resharper_invert_if_highlighting=hint
-resharper_invocation_is_skipped_highlighting=hint
-resharper_invocation_of_non_function_highlighting=warning
-resharper_invoked_expression_maybe_non_function_highlighting=warning
-resharper_invoke_as_extension_method_highlighting=suggestion
-resharper_is_expression_always_false_highlighting=warning
-resharper_is_expression_always_true_highlighting=warning
-resharper_iterator_method_result_is_ignored_highlighting=warning
-resharper_iterator_never_returns_highlighting=warning
-resharper_join_declaration_and_initializer_highlighting=suggestion
-resharper_join_declaration_and_initializer_js_highlighting=suggestion
-resharper_join_null_check_with_usage_highlighting=suggestion
-resharper_join_null_check_with_usage_when_possible_highlighting=none
-resharper_json_validation_failed_highlighting=error
-resharper_js_path_not_found_highlighting=error
-resharper_js_unreachable_code_highlighting=warning
-resharper_jump_must_be_in_loop_highlighting=warning
-resharper_label_or_semicolon_expected_highlighting=error
-resharper_lambda_expression_can_be_made_static_highlighting=none
-resharper_lambda_expression_must_be_static_highlighting=suggestion
-resharper_lambda_highlighting=suggestion
-resharper_lambda_should_not_capture_context_highlighting=warning
-resharper_less_specific_overload_than_main_signature_highlighting=warning
-resharper_lexical_declaration_needs_block_highlighting=error
-resharper_localizable_element_highlighting=warning
-resharper_local_function_can_be_made_static_highlighting=none
-resharper_local_function_hides_method_highlighting=warning
-resharper_local_function_redefined_later_highlighting=warning
-resharper_local_variable_hides_member_highlighting=warning
-resharper_long_literal_ending_lower_l_highlighting=warning
-resharper_loop_can_be_converted_to_query_highlighting=hint
-resharper_loop_can_be_partly_converted_to_query_highlighting=none
-resharper_loop_variable_is_never_changed_inside_loop_highlighting=warning
-resharper_l_value_is_expected_highlighting=error
-resharper_markup_attribute_typo_highlighting=suggestion
-resharper_markup_text_typo_highlighting=suggestion
-resharper_math_abs_method_is_redundant_highlighting=warning
-resharper_math_clamp_min_greater_than_max_highlighting=warning
-resharper_meaningless_default_parameter_value_highlighting=warning
-resharper_member_can_be_internal_highlighting=none
-resharper_member_can_be_made_static_global_highlighting=hint
-resharper_member_can_be_made_static_local_highlighting=hint
-resharper_member_can_be_private_global_highlighting=suggestion
-resharper_member_can_be_private_local_highlighting=suggestion
-resharper_member_can_be_protected_global_highlighting=suggestion
-resharper_member_can_be_protected_local_highlighting=suggestion
-resharper_member_hides_interface_member_with_default_implementation_highlighting=warning
-resharper_member_hides_static_from_outer_class_highlighting=warning
-resharper_member_initializer_value_ignored_highlighting=warning
-resharper_merge_and_pattern_highlighting=suggestion
-resharper_merge_cast_with_type_check_highlighting=suggestion
-resharper_merge_conditional_expression_highlighting=suggestion
-resharper_merge_conditional_expression_when_possible_highlighting=none
-resharper_merge_into_logical_pattern_highlighting=hint
-resharper_merge_into_negated_pattern_highlighting=hint
-resharper_merge_into_pattern_highlighting=suggestion
-resharper_merge_nested_property_patterns_highlighting=suggestion
-resharper_merge_sequential_checks_highlighting=hint
-resharper_merge_sequential_checks_when_possible_highlighting=none
-resharper_method_has_async_overload_highlighting=suggestion
-resharper_method_has_async_overload_with_cancellation_highlighting=suggestion
-resharper_method_overload_with_optional_parameter_highlighting=warning
-resharper_method_safe_this_highlighting=suggestion
-resharper_method_supports_cancellation_highlighting=suggestion
-resharper_missing_alt_attribute_in_img_tag_highlighting=hint
-resharper_missing_attribute_highlighting=warning
-resharper_missing_blank_lines_highlighting=none
-resharper_missing_body_tag_highlighting=warning
-resharper_missing_has_own_property_in_foreach_highlighting=warning
-resharper_missing_head_and_body_tags_highlighting=warning
-resharper_missing_head_tag_highlighting=warning
-resharper_missing_indent_highlighting=none
-resharper_missing_linebreak_highlighting=none
-resharper_missing_space_highlighting=none
-resharper_missing_title_tag_highlighting=hint
-resharper_misuse_of_owner_function_this_highlighting=warning
-resharper_more_specific_foreach_variable_type_available_highlighting=suggestion
-resharper_more_specific_signature_after_less_specific_highlighting=warning
-resharper_move_to_existing_positional_deconstruction_pattern_highlighting=hint
-resharper_multiple_declarations_in_foreach_highlighting=error
-resharper_multiple_nullable_attributes_usage_highlighting=warning
-resharper_multiple_order_by_highlighting=warning
-resharper_multiple_output_tags_highlighting=warning
-resharper_multiple_resolve_candidates_in_text_highlighting=warning
-resharper_multiple_spaces_highlighting=none
-resharper_multiple_statements_on_one_line_highlighting=none
-resharper_multiple_type_members_on_one_line_highlighting=none
-resharper_must_use_return_value_highlighting=warning
-resharper_mvc_action_not_resolved_highlighting=error
-resharper_mvc_area_not_resolved_highlighting=error
-resharper_mvc_controller_not_resolved_highlighting=error
-resharper_mvc_invalid_model_type_highlighting=error
-resharper_mvc_masterpage_not_resolved_highlighting=error
-resharper_mvc_partial_view_not_resolved_highlighting=error
-resharper_mvc_template_not_resolved_highlighting=error
-resharper_mvc_view_component_not_resolved_highlighting=error
-resharper_mvc_view_component_view_not_resolved_highlighting=error
-resharper_mvc_view_not_resolved_highlighting=error
-resharper_native_type_prototype_extending_highlighting=warning
-resharper_native_type_prototype_overwriting_highlighting=warning
-resharper_negation_of_relational_pattern_highlighting=suggestion
-resharper_negative_equality_expression_highlighting=suggestion
-resharper_negative_index_highlighting=warning
-resharper_nested_string_interpolation_highlighting=suggestion
-resharper_non_assigned_constant_highlighting=error
-resharper_non_atomic_compound_operator_highlighting=warning
-resharper_non_constant_equality_expression_has_constant_result_highlighting=warning
-resharper_non_parsable_element_highlighting=warning
-resharper_non_readonly_member_in_get_hash_code_highlighting=warning
-resharper_non_volatile_field_in_double_check_locking_highlighting=warning
-resharper_not_accessed_field_global_highlighting=suggestion
-resharper_not_accessed_field_local_highlighting=warning
-resharper_not_accessed_positional_property_global_highlighting=warning
-resharper_not_accessed_positional_property_local_highlighting=warning
-resharper_not_accessed_variable_highlighting=warning
-resharper_not_all_paths_return_value_highlighting=warning
-resharper_not_assigned_out_parameter_highlighting=warning
-resharper_not_declared_in_parent_culture_highlighting=warning
-resharper_not_null_member_is_not_initialized_highlighting=warning
-resharper_not_observable_annotation_redundancy_highlighting=warning
-resharper_not_overridden_in_specific_culture_highlighting=warning
-resharper_not_resolved_highlighting=warning
-resharper_not_resolved_in_text_highlighting=warning
-resharper_nullable_warning_suppression_is_used_highlighting=none
-resharper_n_unit_async_method_must_be_task_highlighting=warning
-resharper_n_unit_attribute_produces_too_many_tests_highlighting=none
-resharper_n_unit_auto_fixture_incorrect_argument_type_highlighting=warning
-resharper_n_unit_auto_fixture_missed_test_attribute_highlighting=warning
-resharper_n_unit_auto_fixture_missed_test_or_test_fixture_attribute_highlighting=warning
-resharper_n_unit_auto_fixture_redundant_argument_in_inline_auto_data_attribute_highlighting=warning
-resharper_n_unit_duplicate_values_highlighting=warning
-resharper_n_unit_ignored_parameter_attribute_highlighting=warning
-resharper_n_unit_implicit_unspecified_null_values_highlighting=warning
-resharper_n_unit_incorrect_argument_type_highlighting=warning
-resharper_n_unit_incorrect_expected_result_type_highlighting=warning
-resharper_n_unit_incorrect_range_bounds_highlighting=warning
-resharper_n_unit_method_with_parameters_and_test_attribute_highlighting=warning
-resharper_n_unit_missing_arguments_in_test_case_attribute_highlighting=warning
-resharper_n_unit_non_public_method_with_test_attribute_highlighting=warning
-resharper_n_unit_no_values_provided_highlighting=warning
-resharper_n_unit_parameter_type_is_not_compatible_with_attribute_highlighting=warning
-resharper_n_unit_range_attribute_bounds_are_out_of_range_highlighting=warning
-resharper_n_unit_range_step_sign_mismatch_highlighting=warning
-resharper_n_unit_range_step_value_must_not_be_zero_highlighting=warning
-resharper_n_unit_range_to_value_is_not_reachable_highlighting=warning
-resharper_n_unit_redundant_argument_instead_of_expected_result_highlighting=warning
-resharper_n_unit_redundant_argument_in_test_case_attribute_highlighting=warning
-resharper_n_unit_redundant_expected_result_in_test_case_attribute_highlighting=warning
-resharper_n_unit_test_case_attribute_requires_expected_result_highlighting=warning
-resharper_n_unit_test_case_result_property_duplicates_expected_result_highlighting=warning
-resharper_n_unit_test_case_result_property_is_obsolete_highlighting=warning
-resharper_n_unit_test_case_source_cannot_be_resolved_highlighting=warning
-resharper_n_unit_test_case_source_must_be_field_property_method_highlighting=warning
-resharper_n_unit_test_case_source_must_be_static_highlighting=warning
-resharper_n_unit_test_case_source_should_implement_i_enumerable_highlighting=warning
-resharper_object_creation_as_statement_highlighting=warning
-resharper_object_destructuring_without_parentheses_highlighting=error
-resharper_object_literals_are_not_comma_free_highlighting=error
-resharper_obsolete_element_error_highlighting=error
-resharper_obsolete_element_highlighting=warning
-resharper_octal_literals_not_allowed_error_highlighting=error
-resharper_ol_tag_contains_non_li_elements_highlighting=hint
-resharper_one_way_operation_contract_with_return_type_highlighting=warning
-resharper_operation_contract_without_service_contract_highlighting=warning
-resharper_operator_is_can_be_used_highlighting=warning
-resharper_optional_parameter_hierarchy_mismatch_highlighting=warning
-resharper_optional_parameter_ref_out_highlighting=warning
-resharper_other_tags_inside_script1_highlighting=error
-resharper_other_tags_inside_script2_highlighting=error
-resharper_other_tags_inside_unclosed_script_highlighting=error
-resharper_outdent_is_off_prev_level_highlighting=none
-resharper_output_tag_required_highlighting=warning
-resharper_out_parameter_value_is_always_discarded_global_highlighting=suggestion
-resharper_out_parameter_value_is_always_discarded_local_highlighting=warning
-resharper_overload_signature_inferring_highlighting=hint
-resharper_overridden_with_empty_value_highlighting=warning
-resharper_overridden_with_same_value_highlighting=suggestion
-resharper_parameter_doesnt_make_any_sense_highlighting=warning
-resharper_parameter_hides_member_highlighting=warning
-resharper_parameter_only_used_for_precondition_check_global_highlighting=suggestion
-resharper_parameter_only_used_for_precondition_check_local_highlighting=warning
-resharper_parameter_type_can_be_enumerable_global_highlighting=hint
-resharper_parameter_type_can_be_enumerable_local_highlighting=hint
-resharper_parameter_value_is_not_used_highlighting=warning
-resharper_partial_method_parameter_name_mismatch_highlighting=warning
-resharper_partial_method_with_single_part_highlighting=warning
-resharper_partial_type_with_single_part_highlighting=warning
-resharper_pass_string_interpolation_highlighting=hint
-resharper_path_not_resolved_highlighting=error
-resharper_pattern_always_matches_highlighting=warning
-resharper_pattern_is_always_true_or_false_highlighting=warning
-resharper_pattern_never_matches_highlighting=warning
-resharper_polymorphic_field_like_event_invocation_highlighting=warning
-resharper_possible_infinite_inheritance_highlighting=warning
-resharper_possible_intended_rethrow_highlighting=warning
-resharper_possible_interface_member_ambiguity_highlighting=warning
-resharper_possible_invalid_cast_exception_highlighting=warning
-resharper_possible_invalid_cast_exception_in_foreach_loop_highlighting=warning
-resharper_possible_invalid_operation_exception_highlighting=warning
-resharper_possible_loss_of_fraction_highlighting=warning
-resharper_possible_mistaken_argument_highlighting=warning
-resharper_possible_mistaken_call_to_get_type_1_highlighting=warning
-resharper_possible_mistaken_call_to_get_type_2_highlighting=warning
-resharper_possible_multiple_enumeration_highlighting=warning
-resharper_possible_multiple_write_access_in_double_check_locking_highlighting=warning
-resharper_possible_null_reference_exception_highlighting=warning
-resharper_possible_struct_member_modification_of_non_variable_struct_highlighting=warning
-resharper_possible_unintended_linear_search_in_set_highlighting=warning
-resharper_possible_unintended_queryable_as_enumerable_highlighting=suggestion
-resharper_possible_unintended_reference_comparison_highlighting=warning
-resharper_possible_write_to_me_highlighting=warning
-resharper_possibly_impure_method_call_on_readonly_variable_highlighting=warning
-resharper_possibly_incorrectly_broken_statement_highlighting=warning
-resharper_possibly_missing_indexer_initializer_comma_highlighting=warning
-resharper_possibly_mistaken_use_of_interpolated_string_insert_highlighting=warning
-resharper_possibly_mistaken_use_of_params_method_highlighting=warning
-resharper_possibly_unassigned_property_highlighting=hint
-resharper_private_field_can_be_converted_to_local_variable_highlighting=warning
-resharper_private_variable_can_be_made_readonly_highlighting=hint
-resharper_property_can_be_made_init_only_global_highlighting=suggestion
-resharper_property_can_be_made_init_only_local_highlighting=suggestion
-resharper_property_getter_cannot_have_parameters_highlighting=error
-resharper_property_not_resolved_highlighting=error
-resharper_property_setter_must_have_single_parameter_highlighting=error
-resharper_public_constructor_in_abstract_class_highlighting=suggestion
-resharper_pure_attribute_on_void_method_highlighting=warning
-resharper_qualified_expression_is_null_highlighting=warning
-resharper_qualified_expression_maybe_null_highlighting=warning
-resharper_razor_layout_not_resolved_highlighting=error
-resharper_razor_section_not_resolved_highlighting=error
-resharper_read_access_in_double_check_locking_highlighting=warning
-resharper_redundant_abstract_modifier_highlighting=warning
-resharper_redundant_always_match_subpattern_highlighting=suggestion
-resharper_redundant_anonymous_type_property_name_highlighting=warning
-resharper_redundant_argument_default_value_highlighting=warning
-resharper_redundant_array_creation_expression_highlighting=hint
-resharper_redundant_array_lower_bound_specification_highlighting=warning
-resharper_redundant_assignment_highlighting=warning
-resharper_redundant_attribute_parentheses_highlighting=hint
-resharper_redundant_attribute_usage_property_highlighting=suggestion
-resharper_redundant_base_constructor_call_highlighting=warning
-resharper_redundant_base_qualifier_highlighting=warning
-resharper_redundant_blank_lines_highlighting=none
-resharper_redundant_block_highlighting=warning
-resharper_redundant_bool_compare_highlighting=warning
-resharper_redundant_case_label_highlighting=warning
-resharper_redundant_cast_highlighting=warning
-resharper_redundant_catch_clause_highlighting=warning
-resharper_redundant_check_before_assignment_highlighting=warning
-resharper_redundant_collection_initializer_element_braces_highlighting=hint
-resharper_redundant_comparison_with_boolean_highlighting=warning
-resharper_redundant_configure_await_highlighting=suggestion
-resharper_redundant_css_hack_highlighting=warning
-resharper_redundant_declaration_semicolon_highlighting=hint
-resharper_redundant_default_member_initializer_highlighting=warning
-resharper_redundant_delegate_creation_highlighting=warning
-resharper_redundant_disable_warning_comment_highlighting=warning
-resharper_redundant_discard_designation_highlighting=suggestion
-resharper_redundant_else_block_highlighting=warning
-resharper_redundant_empty_case_else_highlighting=warning
-resharper_redundant_empty_constructor_highlighting=warning
-resharper_redundant_empty_finally_block_highlighting=warning
-resharper_redundant_empty_object_creation_argument_list_highlighting=hint
-resharper_redundant_empty_object_or_collection_initializer_highlighting=warning
-resharper_redundant_empty_switch_section_highlighting=warning
-resharper_redundant_enumerable_cast_call_highlighting=warning
-resharper_redundant_enum_case_label_for_default_section_highlighting=none
-resharper_redundant_explicit_array_creation_highlighting=warning
-resharper_redundant_explicit_array_size_highlighting=warning
-resharper_redundant_explicit_nullable_creation_highlighting=warning
-resharper_redundant_explicit_params_array_creation_highlighting=suggestion
-resharper_redundant_explicit_positional_property_declaration_highlighting=warning
-resharper_redundant_explicit_tuple_component_name_highlighting=warning
-resharper_redundant_extends_list_entry_highlighting=warning
-resharper_redundant_fixed_pointer_declaration_highlighting=suggestion
-resharper_redundant_highlighting=warning
-resharper_redundant_if_else_block_highlighting=hint
-resharper_redundant_if_statement_then_keyword_highlighting=none
-resharper_redundant_immediate_delegate_invocation_highlighting=suggestion
-resharper_redundant_intermediate_variable_highlighting=hint
-resharper_redundant_is_before_relational_pattern_highlighting=suggestion
-resharper_redundant_iterator_keyword_highlighting=warning
-resharper_redundant_jump_statement_highlighting=warning
-resharper_redundant_lambda_parameter_type_highlighting=warning
-resharper_redundant_lambda_signature_parentheses_highlighting=hint
-resharper_redundant_linebreak_highlighting=none
-resharper_redundant_local_class_name_highlighting=hint
-resharper_redundant_local_function_name_highlighting=hint
-resharper_redundant_logical_conditional_expression_operand_highlighting=warning
-resharper_redundant_me_qualifier_highlighting=warning
-resharper_redundant_my_base_qualifier_highlighting=warning
-resharper_redundant_my_class_qualifier_highlighting=warning
-resharper_redundant_name_qualifier_highlighting=warning
-resharper_redundant_not_null_constraint_highlighting=warning
-resharper_redundant_nullable_annotation_on_reference_type_constraint_highlighting=warning
-resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_base_type_highlighting=warning
-resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_type_kind_highlighting=warning
-resharper_redundant_nullable_flow_attribute_highlighting=warning
-resharper_redundant_nullable_type_mark_highlighting=warning
-resharper_redundant_nullness_attribute_with_nullable_reference_types_highlighting=warning
-resharper_redundant_overflow_checking_context_highlighting=warning
-resharper_redundant_overload_global_highlighting=suggestion
-resharper_redundant_overload_local_highlighting=suggestion
-resharper_redundant_overridden_member_highlighting=warning
-resharper_redundant_params_highlighting=warning
-resharper_redundant_parentheses_highlighting=none
-resharper_redundant_parent_type_declaration_highlighting=warning
-resharper_redundant_pattern_parentheses_highlighting=hint
-resharper_redundant_property_parentheses_highlighting=hint
-resharper_redundant_property_pattern_clause_highlighting=suggestion
-resharper_redundant_qualifier_highlighting=warning
-resharper_redundant_query_order_by_ascending_keyword_highlighting=hint
-resharper_redundant_range_bound_highlighting=suggestion
-resharper_redundant_readonly_modifier_highlighting=suggestion
-resharper_redundant_record_body_highlighting=warning
-resharper_redundant_record_class_keyword_highlighting=warning
-resharper_redundant_setter_value_parameter_declaration_highlighting=hint
-resharper_redundant_space_highlighting=none
-resharper_redundant_string_format_call_highlighting=warning
-resharper_redundant_string_interpolation_highlighting=suggestion
-resharper_redundant_string_to_char_array_call_highlighting=warning
-resharper_redundant_string_type_highlighting=suggestion
-resharper_redundant_suppress_nullable_warning_expression_highlighting=warning
-resharper_redundant_ternary_expression_highlighting=warning
-resharper_redundant_to_string_call_for_value_type_highlighting=hint
-resharper_redundant_to_string_call_highlighting=warning
-resharper_redundant_type_arguments_of_method_highlighting=warning
-resharper_redundant_type_cast_highlighting=warning
-resharper_redundant_type_cast_structural_highlighting=warning
-resharper_redundant_type_check_in_pattern_highlighting=warning
-resharper_redundant_units_highlighting=warning
-resharper_redundant_unsafe_context_highlighting=warning
-resharper_redundant_using_directive_global_highlighting=warning
-resharper_redundant_using_directive_highlighting=warning
-resharper_redundant_variable_type_specification_highlighting=hint
-resharper_redundant_verbatim_prefix_highlighting=suggestion
-resharper_redundant_verbatim_string_prefix_highlighting=suggestion
-resharper_redundant_with_expression_highlighting=suggestion
-resharper_reference_equals_with_value_type_highlighting=warning
-resharper_reg_exp_inspections_highlighting=warning
-resharper_remove_constructor_invocation_highlighting=none
-resharper_remove_redundant_braces_highlighting=none
-resharper_remove_redundant_or_statement_false_highlighting=suggestion
-resharper_remove_redundant_or_statement_true_highlighting=suggestion
-resharper_remove_to_list_1_highlighting=suggestion
-resharper_remove_to_list_2_highlighting=suggestion
-resharper_replace_auto_property_with_computed_property_highlighting=hint
-resharper_replace_indicing_with_array_destructuring_highlighting=hint
-resharper_replace_indicing_with_short_hand_properties_after_destructuring_highlighting=hint
-resharper_replace_object_pattern_with_var_pattern_highlighting=suggestion
-resharper_replace_slice_with_range_indexer_highlighting=hint
-resharper_replace_substring_with_range_indexer_highlighting=hint
-resharper_replace_undefined_checking_series_with_object_destructuring_highlighting=hint
-resharper_replace_with_destructuring_swap_highlighting=hint
-resharper_replace_with_first_or_default_1_highlighting=suggestion
-resharper_replace_with_first_or_default_2_highlighting=suggestion
-resharper_replace_with_first_or_default_3_highlighting=suggestion
-resharper_replace_with_first_or_default_4_highlighting=suggestion
-resharper_replace_with_last_or_default_1_highlighting=suggestion
-resharper_replace_with_last_or_default_2_highlighting=suggestion
-resharper_replace_with_last_or_default_3_highlighting=suggestion
-resharper_replace_with_last_or_default_4_highlighting=suggestion
-resharper_replace_with_of_type_1_highlighting=suggestion
-resharper_replace_with_of_type_2_highlighting=suggestion
-resharper_replace_with_of_type_3_highlighting=suggestion
-resharper_replace_with_of_type_any_1_highlighting=suggestion
-resharper_replace_with_of_type_any_2_highlighting=suggestion
-resharper_replace_with_of_type_count_1_highlighting=suggestion
-resharper_replace_with_of_type_count_2_highlighting=suggestion
-resharper_replace_with_of_type_first_1_highlighting=suggestion
-resharper_replace_with_of_type_first_2_highlighting=suggestion
-resharper_replace_with_of_type_first_or_default_1_highlighting=suggestion
-resharper_replace_with_of_type_first_or_default_2_highlighting=suggestion
-resharper_replace_with_of_type_last_1_highlighting=suggestion
-resharper_replace_with_of_type_last_2_highlighting=suggestion
-resharper_replace_with_of_type_last_or_default_1_highlighting=suggestion
-resharper_replace_with_of_type_last_or_default_2_highlighting=suggestion
-resharper_replace_with_of_type_long_count_highlighting=suggestion
-resharper_replace_with_of_type_single_1_highlighting=suggestion
-resharper_replace_with_of_type_single_2_highlighting=suggestion
-resharper_replace_with_of_type_single_or_default_1_highlighting=suggestion
-resharper_replace_with_of_type_single_or_default_2_highlighting=suggestion
-resharper_replace_with_of_type_where_highlighting=suggestion
-resharper_replace_with_simple_assignment_false_highlighting=suggestion
-resharper_replace_with_simple_assignment_true_highlighting=suggestion
-resharper_replace_with_single_assignment_false_highlighting=suggestion
-resharper_replace_with_single_assignment_true_highlighting=suggestion
-resharper_replace_with_single_call_to_any_highlighting=suggestion
-resharper_replace_with_single_call_to_count_highlighting=suggestion
-resharper_replace_with_single_call_to_first_highlighting=suggestion
-resharper_replace_with_single_call_to_first_or_default_highlighting=suggestion
-resharper_replace_with_single_call_to_last_highlighting=suggestion
-resharper_replace_with_single_call_to_last_or_default_highlighting=suggestion
-resharper_replace_with_single_call_to_single_highlighting=suggestion
-resharper_replace_with_single_call_to_single_or_default_highlighting=suggestion
-resharper_replace_with_single_or_default_1_highlighting=suggestion
-resharper_replace_with_single_or_default_2_highlighting=suggestion
-resharper_replace_with_single_or_default_3_highlighting=suggestion
-resharper_replace_with_single_or_default_4_highlighting=suggestion
-resharper_replace_with_string_is_null_or_empty_highlighting=suggestion
-resharper_required_base_types_conflict_highlighting=warning
-resharper_required_base_types_direct_conflict_highlighting=warning
-resharper_required_base_types_is_not_inherited_highlighting=warning
-resharper_requires_fallback_color_highlighting=warning
-resharper_resource_item_not_resolved_highlighting=error
-resharper_resource_not_resolved_highlighting=error
-resharper_resx_not_resolved_highlighting=warning
-resharper_return_from_global_scopet_with_value_highlighting=warning
-resharper_return_type_can_be_enumerable_global_highlighting=hint
-resharper_return_type_can_be_enumerable_local_highlighting=hint
-resharper_return_type_can_be_not_nullable_highlighting=warning
-resharper_return_value_of_pure_method_is_not_used_highlighting=warning
-resharper_route_templates_action_route_prefix_can_be_extracted_to_controller_route_highlighting=hint
-resharper_route_templates_ambiguous_matching_constraint_constructor_highlighting=warning
-resharper_route_templates_ambiguous_route_match_highlighting=warning
-resharper_route_templates_constraint_argument_cannot_be_converted_highlighting=warning
-resharper_route_templates_controller_route_parameter_is_not_passed_to_methods_highlighting=hint
-resharper_route_templates_duplicated_parameter_highlighting=warning
-resharper_route_templates_matching_constraint_constructor_not_resolved_highlighting=warning
-resharper_route_templates_method_missing_route_parameters_highlighting=hint
-resharper_route_templates_optional_parameter_can_be_preceded_only_by_single_period_highlighting=warning
-resharper_route_templates_optional_parameter_must_be_at_the_end_of_segment_highlighting=warning
-resharper_route_templates_parameter_constraint_can_be_specified_highlighting=hint
-resharper_route_templates_parameter_type_and_constraints_mismatch_highlighting=warning
-resharper_route_templates_parameter_type_can_be_made_stricter_highlighting=suggestion
-resharper_route_templates_route_parameter_constraint_not_resolved_highlighting=warning
-resharper_route_templates_route_parameter_is_not_passed_to_method_highlighting=hint
-resharper_route_templates_route_token_not_resolved_highlighting=warning
-resharper_route_templates_symbol_not_resolved_highlighting=warning
-resharper_route_templates_syntax_error_highlighting=warning
-resharper_safe_cast_is_used_as_type_check_highlighting=suggestion
-resharper_same_imports_with_different_name_highlighting=warning
-resharper_same_variable_assignment_highlighting=warning
-resharper_script_tag_has_both_src_and_content_attributes_highlighting=error
-resharper_script_tag_with_content_before_includes_highlighting=hint
-resharper_sealed_member_in_sealed_class_highlighting=warning
-resharper_separate_control_transfer_statement_highlighting=none
-resharper_service_contract_without_operations_highlighting=warning
-resharper_shift_expression_real_shift_count_is_zero_highlighting=warning
-resharper_shift_expression_result_equals_zero_highlighting=warning
-resharper_shift_expression_right_operand_not_equal_real_count_highlighting=warning
-resharper_shift_expression_zero_left_operand_highlighting=warning
-resharper_similar_anonymous_type_nearby_highlighting=hint
-resharper_similar_expressions_comparison_highlighting=warning
-resharper_simplify_conditional_operator_highlighting=suggestion
-resharper_simplify_conditional_ternary_expression_highlighting=suggestion
-resharper_simplify_i_if_highlighting=suggestion
-resharper_simplify_linq_expression_use_all_highlighting=suggestion
-resharper_simplify_linq_expression_use_any_highlighting=suggestion
-resharper_simplify_string_interpolation_highlighting=suggestion
-resharper_specify_a_culture_in_string_conversion_explicitly_highlighting=warning
-resharper_specify_string_comparison_highlighting=hint
-resharper_specify_variable_type_explicitly_highlighting=hint
-resharper_spin_lock_in_readonly_field_highlighting=warning
-resharper_stack_alloc_inside_loop_highlighting=warning
-resharper_statement_termination_highlighting=warning
-resharper_static_member_initializer_referes_to_member_below_highlighting=warning
-resharper_static_member_in_generic_type_highlighting=none
-resharper_static_problem_in_text_highlighting=warning
-resharper_string_compare_is_culture_specific_1_highlighting=warning
-resharper_string_compare_is_culture_specific_2_highlighting=warning
-resharper_string_compare_is_culture_specific_3_highlighting=warning
-resharper_string_compare_is_culture_specific_4_highlighting=warning
-resharper_string_compare_is_culture_specific_5_highlighting=warning
-resharper_string_compare_is_culture_specific_6_highlighting=warning
-resharper_string_compare_to_is_culture_specific_highlighting=warning
-resharper_string_concatenation_to_template_string_highlighting=hint
-resharper_string_ends_with_is_culture_specific_highlighting=none
-resharper_string_index_of_is_culture_specific_1_highlighting=warning
-resharper_string_index_of_is_culture_specific_2_highlighting=warning
-resharper_string_index_of_is_culture_specific_3_highlighting=warning
-resharper_string_last_index_of_is_culture_specific_1_highlighting=warning
-resharper_string_last_index_of_is_culture_specific_2_highlighting=warning
-resharper_string_last_index_of_is_culture_specific_3_highlighting=warning
-resharper_string_literal_as_interpolation_argument_highlighting=suggestion
-resharper_string_literal_typo_highlighting=suggestion
-resharper_string_literal_wrong_quotes_highlighting=hint
-resharper_string_starts_with_is_culture_specific_highlighting=none
-resharper_structured_message_template_problem_highlighting=warning
-resharper_struct_can_be_made_read_only_highlighting=suggestion
-resharper_struct_member_can_be_made_read_only_highlighting=none
-resharper_suggest_base_type_for_parameter_highlighting=hint
-resharper_suggest_base_type_for_parameter_in_constructor_highlighting=hint
-resharper_suggest_discard_declaration_var_style_highlighting=hint
-resharper_suggest_var_or_type_built_in_types_highlighting=hint
-resharper_suggest_var_or_type_deconstruction_declarations_highlighting=hint
-resharper_suggest_var_or_type_elsewhere_highlighting=hint
-resharper_suggest_var_or_type_simple_types_highlighting=hint
-resharper_super_call_highlighting=suggestion
-resharper_super_call_prohibits_this_highlighting=error
-resharper_suppress_nullable_warning_expression_as_inverted_is_expression_highlighting=warning
-resharper_suspicious_instanceof_check_highlighting=warning
-resharper_suspicious_lambda_block_highlighting=warning
-resharper_suspicious_lock_over_synchronization_primitive_highlighting=warning
-resharper_suspicious_math_sign_method_highlighting=warning
-resharper_suspicious_parameter_name_in_argument_null_exception_highlighting=warning
-resharper_suspicious_this_usage_highlighting=warning
-resharper_suspicious_typeof_check_highlighting=warning
-resharper_suspicious_type_conversion_global_highlighting=warning
-resharper_swap_via_deconstruction_highlighting=suggestion
-resharper_switch_expression_handles_some_known_enum_values_with_exception_in_default_highlighting=hint
-resharper_switch_statement_for_enum_misses_default_section_highlighting=hint
-resharper_switch_statement_handles_some_known_enum_values_with_default_highlighting=hint
-resharper_switch_statement_missing_some_enum_cases_no_default_highlighting=none
-resharper_symbol_from_not_copied_locally_reference_used_warning_highlighting=warning
-resharper_syntax_is_not_allowed_highlighting=warning
-resharper_tabs_and_spaces_mismatch_highlighting=none
-resharper_tabs_are_disallowed_highlighting=none
-resharper_tabs_outside_indent_highlighting=none
-resharper_tail_recursive_call_highlighting=hint
-resharper_tasks_not_loaded_highlighting=warning
-resharper_ternary_can_be_replaced_by_its_condition_highlighting=warning
-resharper_this_in_global_context_highlighting=warning
-resharper_thread_static_at_instance_field_highlighting=warning
-resharper_thread_static_field_has_initializer_highlighting=warning
-resharper_throw_must_be_followed_by_expression_highlighting=error
-resharper_too_wide_local_variable_scope_highlighting=suggestion
-resharper_try_cast_always_succeeds_highlighting=suggestion
-resharper_try_statements_can_be_merged_highlighting=hint
-resharper_ts_not_resolved_highlighting=error
-resharper_ts_resolved_from_inaccessible_module_highlighting=error
-resharper_type_guard_doesnt_affect_anything_highlighting=warning
-resharper_type_guard_produces_never_type_highlighting=warning
-resharper_type_parameter_can_be_variant_highlighting=suggestion
-resharper_type_parameter_hides_type_param_from_outer_scope_highlighting=warning
-resharper_ul_tag_contains_non_li_elements_highlighting=hint
-resharper_unassigned_field_global_highlighting=suggestion
-resharper_unassigned_field_local_highlighting=warning
-resharper_unassigned_get_only_auto_property_highlighting=warning
-resharper_unassigned_readonly_field_highlighting=warning
-resharper_unclosed_script_highlighting=error
-resharper_undeclared_global_variable_using_highlighting=warning
-resharper_unexpected_value_highlighting=error
-resharper_unknown_css_class_highlighting=warning
-resharper_unknown_css_variable_highlighting=warning
-resharper_unknown_css_vendor_extension_highlighting=hint
-resharper_unknown_item_group_highlighting=warning
-resharper_unknown_metadata_highlighting=warning
-resharper_unknown_output_parameter_highlighting=warning
-resharper_unknown_property_highlighting=warning
-resharper_unknown_target_highlighting=warning
-resharper_unknown_task_attribute_highlighting=warning
-resharper_unknown_task_highlighting=warning
-resharper_unnecessary_whitespace_highlighting=none
-resharper_unreachable_switch_arm_due_to_integer_analysis_highlighting=warning
-resharper_unreachable_switch_case_due_to_integer_analysis_highlighting=warning
-resharper_unreal_header_tool_error_highlighting=error
-resharper_unreal_header_tool_parser_error_highlighting=error
-resharper_unreal_header_tool_warning_highlighting=warning
-resharper_unsafe_comma_in_object_properties_list_highlighting=warning
-resharper_unsupported_required_base_type_highlighting=warning
-resharper_unused_anonymous_method_signature_highlighting=warning
-resharper_unused_auto_property_accessor_global_highlighting=warning
-resharper_unused_auto_property_accessor_local_highlighting=warning
-resharper_unused_import_clause_highlighting=warning
-resharper_unused_inherited_parameter_highlighting=hint
-resharper_unused_locals_highlighting=warning
-resharper_unused_local_function_highlighting=warning
-resharper_unused_local_function_parameter_highlighting=warning
-resharper_unused_local_function_return_value_highlighting=warning
-resharper_unused_local_import_highlighting=warning
-resharper_unused_member_global_highlighting=suggestion
-resharper_unused_member_hierarchy_global_highlighting=suggestion
-resharper_unused_member_hierarchy_local_highlighting=warning
-resharper_unused_member_in_super_global_highlighting=suggestion
-resharper_unused_member_in_super_local_highlighting=warning
-resharper_unused_member_local_highlighting=warning
-resharper_unused_method_return_value_global_highlighting=suggestion
-resharper_unused_method_return_value_local_highlighting=warning
-resharper_unused_parameter_global_highlighting=suggestion
-resharper_unused_parameter_highlighting=warning
-resharper_unused_parameter_in_partial_method_highlighting=warning
-resharper_unused_parameter_local_highlighting=warning
-resharper_unused_property_highlighting=warning
-resharper_unused_tuple_component_in_return_value_highlighting=warning
-resharper_unused_type_global_highlighting=suggestion
-resharper_unused_type_local_highlighting=warning
-resharper_unused_type_parameter_highlighting=warning
-resharper_unused_variable_highlighting=warning
-resharper_usage_of_definitely_unassigned_value_highlighting=warning
-resharper_usage_of_possibly_unassigned_value_highlighting=warning
-resharper_useless_binary_operation_highlighting=warning
-resharper_useless_comparison_to_integral_constant_highlighting=warning
-resharper_use_array_creation_expression_1_highlighting=suggestion
-resharper_use_array_creation_expression_2_highlighting=suggestion
-resharper_use_array_empty_method_highlighting=suggestion
-resharper_use_as_instead_of_type_cast_highlighting=hint
-resharper_use_await_using_highlighting=suggestion
-resharper_use_cancellation_token_for_i_async_enumerable_highlighting=suggestion
-resharper_use_collection_count_property_highlighting=suggestion
-resharper_use_configure_await_false_for_async_disposable_highlighting=none
-resharper_use_configure_await_false_highlighting=suggestion
-resharper_use_deconstruction_highlighting=hint
-resharper_use_deconstruction_on_parameter_highlighting=hint
-resharper_use_empty_types_field_highlighting=suggestion
-resharper_use_event_args_empty_field_highlighting=suggestion
-resharper_use_format_specifier_in_format_string_highlighting=suggestion
-resharper_use_implicitly_typed_variable_evident_highlighting=hint
-resharper_use_implicitly_typed_variable_highlighting=none
-resharper_use_implicit_by_val_modifier_highlighting=hint
-resharper_use_indexed_property_highlighting=suggestion
-resharper_use_index_from_end_expression_highlighting=suggestion
-resharper_use_is_operator_1_highlighting=suggestion
-resharper_use_is_operator_2_highlighting=suggestion
-resharper_use_method_any_0_highlighting=suggestion
-resharper_use_method_any_1_highlighting=suggestion
-resharper_use_method_any_2_highlighting=suggestion
-resharper_use_method_any_3_highlighting=suggestion
-resharper_use_method_any_4_highlighting=suggestion
-resharper_use_method_is_instance_of_type_highlighting=suggestion
-resharper_use_nameof_expression_for_part_of_the_string_highlighting=none
-resharper_use_nameof_expression_highlighting=suggestion
-resharper_use_name_of_instead_of_type_of_highlighting=suggestion
-resharper_use_negated_pattern_in_is_expression_highlighting=hint
-resharper_use_negated_pattern_matching_highlighting=hint
-resharper_use_nullable_annotation_instead_of_attribute_highlighting=suggestion
-resharper_use_nullable_attributes_supported_by_compiler_highlighting=suggestion
-resharper_use_nullable_reference_types_annotation_syntax_highlighting=warning
-resharper_use_null_propagation_highlighting=hint
-resharper_use_null_propagation_when_possible_highlighting=none
-resharper_use_object_or_collection_initializer_highlighting=suggestion
-resharper_use_of_implicit_global_in_function_scope_highlighting=warning
-resharper_use_of_possibly_unassigned_property_highlighting=warning
-resharper_use_pattern_matching_highlighting=suggestion
-resharper_use_positional_deconstruction_pattern_highlighting=none
-resharper_use_string_interpolation_highlighting=suggestion
-resharper_use_switch_case_pattern_variable_highlighting=suggestion
-resharper_use_throw_if_null_method_highlighting=none
-resharper_use_verbatim_string_highlighting=hint
-resharper_using_of_reserved_word_error_highlighting=error
-resharper_using_of_reserved_word_highlighting=warning
-resharper_value_parameter_not_used_highlighting=warning
-resharper_value_range_attribute_violation_highlighting=warning
-resharper_value_should_have_units_highlighting=error
-resharper_variable_can_be_made_const_highlighting=hint
-resharper_variable_can_be_made_let_highlighting=hint
-resharper_variable_can_be_moved_to_inner_block_highlighting=hint
-resharper_variable_can_be_not_nullable_highlighting=warning
-resharper_variable_hides_outer_variable_highlighting=warning
-resharper_variable_used_before_declared_highlighting=warning
-resharper_variable_used_in_inner_scope_before_declared_highlighting=warning
-resharper_variable_used_out_of_scope_highlighting=warning
-resharper_vb_check_for_reference_equality_instead_1_highlighting=suggestion
-resharper_vb_check_for_reference_equality_instead_2_highlighting=suggestion
-resharper_vb_possible_mistaken_argument_highlighting=warning
-resharper_vb_possible_mistaken_call_to_get_type_1_highlighting=warning
-resharper_vb_possible_mistaken_call_to_get_type_2_highlighting=warning
-resharper_vb_remove_to_list_1_highlighting=suggestion
-resharper_vb_remove_to_list_2_highlighting=suggestion
-resharper_vb_replace_with_first_or_default_highlighting=suggestion
-resharper_vb_replace_with_last_or_default_highlighting=suggestion
-resharper_vb_replace_with_of_type_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_any_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_any_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_count_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_count_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_first_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_first_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_first_or_default_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_first_or_default_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_last_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_last_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_last_or_default_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_last_or_default_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_single_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_single_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_single_or_default_1_highlighting=suggestion
-resharper_vb_replace_with_of_type_single_or_default_2_highlighting=suggestion
-resharper_vb_replace_with_of_type_where_highlighting=suggestion
-resharper_vb_replace_with_single_assignment_1_highlighting=suggestion
-resharper_vb_replace_with_single_assignment_2_highlighting=suggestion
-resharper_vb_replace_with_single_call_to_any_highlighting=suggestion
-resharper_vb_replace_with_single_call_to_count_highlighting=suggestion
-resharper_vb_replace_with_single_call_to_first_highlighting=suggestion
-resharper_vb_replace_with_single_call_to_first_or_default_highlighting=suggestion
-resharper_vb_replace_with_single_call_to_last_highlighting=suggestion
-resharper_vb_replace_with_single_call_to_last_or_default_highlighting=suggestion
-resharper_vb_replace_with_single_call_to_single_highlighting=suggestion
-resharper_vb_replace_with_single_call_to_single_or_default_highlighting=suggestion
-resharper_vb_replace_with_single_or_default_highlighting=suggestion
-resharper_vb_simplify_linq_expression_10_highlighting=hint
-resharper_vb_simplify_linq_expression_1_highlighting=suggestion
-resharper_vb_simplify_linq_expression_2_highlighting=suggestion
-resharper_vb_simplify_linq_expression_3_highlighting=suggestion
-resharper_vb_simplify_linq_expression_4_highlighting=suggestion
-resharper_vb_simplify_linq_expression_5_highlighting=suggestion
-resharper_vb_simplify_linq_expression_6_highlighting=suggestion
-resharper_vb_simplify_linq_expression_7_highlighting=hint
-resharper_vb_simplify_linq_expression_8_highlighting=hint
-resharper_vb_simplify_linq_expression_9_highlighting=hint
-resharper_vb_string_compare_is_culture_specific_1_highlighting=warning
-resharper_vb_string_compare_is_culture_specific_2_highlighting=warning
-resharper_vb_string_compare_is_culture_specific_3_highlighting=warning
-resharper_vb_string_compare_is_culture_specific_4_highlighting=warning
-resharper_vb_string_compare_is_culture_specific_5_highlighting=warning
-resharper_vb_string_compare_is_culture_specific_6_highlighting=warning
-resharper_vb_string_compare_to_is_culture_specific_highlighting=warning
-resharper_vb_string_ends_with_is_culture_specific_highlighting=none
-resharper_vb_string_index_of_is_culture_specific_1_highlighting=warning
-resharper_vb_string_index_of_is_culture_specific_2_highlighting=warning
-resharper_vb_string_index_of_is_culture_specific_3_highlighting=warning
-resharper_vb_string_last_index_of_is_culture_specific_1_highlighting=warning
-resharper_vb_string_last_index_of_is_culture_specific_2_highlighting=warning
-resharper_vb_string_last_index_of_is_culture_specific_3_highlighting=warning
-resharper_vb_string_starts_with_is_culture_specific_highlighting=none
-resharper_vb_unreachable_code_highlighting=warning
-resharper_vb_use_array_creation_expression_1_highlighting=suggestion
-resharper_vb_use_array_creation_expression_2_highlighting=suggestion
-resharper_vb_use_first_instead_highlighting=warning
-resharper_vb_use_method_any_1_highlighting=suggestion
-resharper_vb_use_method_any_2_highlighting=suggestion
-resharper_vb_use_method_any_3_highlighting=suggestion
-resharper_vb_use_method_any_4_highlighting=suggestion
-resharper_vb_use_method_any_5_highlighting=suggestion
-resharper_vb_use_method_is_instance_of_type_highlighting=suggestion
-resharper_vb_use_type_of_is_operator_1_highlighting=suggestion
-resharper_vb_use_type_of_is_operator_2_highlighting=suggestion
-resharper_virtual_member_call_in_constructor_highlighting=warning
-resharper_virtual_member_never_overridden_global_highlighting=suggestion
-resharper_virtual_member_never_overridden_local_highlighting=suggestion
-resharper_void_method_with_must_use_return_value_attribute_highlighting=warning
-resharper_web_config_module_not_resolved_highlighting=error
-resharper_web_config_module_qualification_resolve_highlighting=warning
-resharper_web_config_redundant_add_namespace_tag_highlighting=warning
-resharper_web_config_redundant_location_tag_highlighting=warning
-resharper_web_config_tag_prefix_redundand_highlighting=warning
-resharper_web_config_type_not_resolved_highlighting=error
-resharper_web_config_unused_add_tag_highlighting=warning
-resharper_web_config_unused_element_due_to_config_source_attribute_highlighting=warning
-resharper_web_config_unused_remove_or_clear_tag_highlighting=warning
-resharper_web_config_web_config_path_warning_highlighting=warning
-resharper_web_config_wrong_module_highlighting=error
-resharper_web_ignored_path_highlighting=none
-resharper_web_mapped_path_highlighting=hint
-resharper_with_expression_instead_of_initializer_highlighting=suggestion
-resharper_with_statement_using_error_highlighting=error
-resharper_wrong_expression_statement_highlighting=warning
-resharper_wrong_indent_size_highlighting=none
-resharper_wrong_metadata_use_highlighting=none
-resharper_wrong_public_modifier_specification_highlighting=hint
-resharper_wrong_require_relative_path_highlighting=hint
-resharper_xaml_assign_null_to_not_null_attribute_highlighting=warning
-resharper_xaml_avalonia_wrong_binding_mode_for_stream_binding_operator_highlighting=warning
-resharper_xaml_binding_without_context_not_resolved_highlighting=hint
-resharper_xaml_binding_with_context_not_resolved_highlighting=warning
-resharper_xaml_compiled_binding_missing_data_type_error_highlighting_highlighting=error
-resharper_xaml_constructor_warning_highlighting=warning
-resharper_xaml_decimal_parsing_is_culture_dependent_highlighting=warning
-resharper_xaml_dependency_property_resolve_error_highlighting=warning
-resharper_xaml_duplicate_style_setter_highlighting=warning
-resharper_xaml_dynamic_resource_error_highlighting=error
-resharper_xaml_element_name_reference_not_resolved_highlighting=error
-resharper_xaml_empty_grid_length_definition_highlighting=error
-resharper_xaml_grid_definitions_can_be_converted_to_attribute_highlighting=hint
-resharper_xaml_ignored_path_highlighting_highlighting=none
-resharper_xaml_index_out_of_grid_definition_highlighting=warning
-resharper_xaml_invalid_member_type_highlighting=error
-resharper_xaml_invalid_resource_target_type_highlighting=error
-resharper_xaml_invalid_resource_type_highlighting=error
-resharper_xaml_invalid_type_highlighting=error
-resharper_xaml_language_level_highlighting=error
-resharper_xaml_mapped_path_highlighting_highlighting=hint
-resharper_xaml_method_arguments_will_be_ignored_highlighting=warning
-resharper_xaml_missing_grid_index_highlighting=warning
-resharper_xaml_overloads_collision_highlighting=warning
-resharper_xaml_parent_is_out_of_current_component_tree_highlighting=warning
-resharper_xaml_path_error_highlighting=warning
-resharper_xaml_possible_null_reference_exception_highlighting=suggestion
-resharper_xaml_redundant_attached_property_highlighting=warning
-resharper_xaml_redundant_binding_mode_attribute_highlighting=warning
-resharper_xaml_redundant_collection_property_highlighting=warning
-resharper_xaml_redundant_freeze_attribute_highlighting=warning
-resharper_xaml_redundant_grid_definitions_highlighting=warning
-resharper_xaml_redundant_grid_span_highlighting=warning
-resharper_xaml_redundant_modifiers_attribute_highlighting=warning
-resharper_xaml_redundant_namespace_alias_highlighting=warning
-resharper_xaml_redundant_name_attribute_highlighting=warning
-resharper_xaml_redundant_property_type_qualifier_highlighting=warning
-resharper_xaml_redundant_resource_highlighting=warning
-resharper_xaml_redundant_styled_value_highlighting=warning
-resharper_xaml_redundant_update_source_trigger_attribute_highlighting=warning
-resharper_xaml_redundant_xamarin_forms_class_declaration_highlighting=warning
-resharper_xaml_resource_file_path_case_mismatch_highlighting=warning
-resharper_xaml_routed_event_resolve_error_highlighting=warning
-resharper_xaml_static_resource_not_resolved_highlighting=warning
-resharper_xaml_style_class_not_found_highlighting=warning
-resharper_xaml_style_invalid_target_type_highlighting=error
-resharper_xaml_unexpected_text_token_highlighting=error
-resharper_xaml_xaml_duplicate_device_family_type_view_highlighting_highlighting=error
-resharper_xaml_xaml_mismatched_device_family_view_clr_name_highlighting_highlighting=warning
-resharper_xaml_xaml_relative_source_default_mode_warning_highlighting_highlighting=warning
-resharper_xaml_xaml_unknown_device_family_type_highlighting_highlighting=warning
-resharper_xaml_xaml_xamarin_forms_data_type_and_binding_context_type_mismatched_highlighting_highlighting=warning
-resharper_xaml_x_key_attribute_disallowed_highlighting=error
-resharper_xml_doc_comment_syntax_problem_highlighting=warning
-resharper_xunit_xunit_test_with_console_output_highlighting=warning
-csharp_style_prefer_implicitly_typed_lambda_expression = true:suggestion
-csharp_style_expression_bodied_methods = true:silent
-csharp_style_prefer_tuple_swap = true:suggestion
-csharp_style_prefer_unbound_generic_type_in_nameof = true:suggestion
-csharp_style_prefer_utf8_string_literals = true:suggestion
-csharp_style_inlined_variable_declaration = true:suggestion
-csharp_style_expression_bodied_constructors = true:silent
-csharp_style_expression_bodied_operators = true:silent
-csharp_style_deconstructed_variable_declaration = true:suggestion
-csharp_style_unused_value_assignment_preference = discard_variable:suggestion
-csharp_style_unused_value_expression_statement_preference = discard_variable:silent
-csharp_style_expression_bodied_properties = true:silent
-csharp_prefer_simple_using_statement = true:suggestion
-csharp_prefer_braces = true:silent
-csharp_style_prefer_method_group_conversion = true:silent
-csharp_style_prefer_top_level_statements = true:silent
-csharp_style_prefer_primary_constructors = true:suggestion
-csharp_prefer_system_threading_lock = true:suggestion
-csharp_style_prefer_simple_property_accessors = true:suggestion
-csharp_style_expression_bodied_indexers = true:silent
-csharp_style_expression_bodied_accessors = true:silent
-csharp_style_expression_bodied_lambdas = true:silent
-csharp_style_expression_bodied_local_functions = false:silent
-csharp_style_throw_expression = true:suggestion
-csharp_style_prefer_null_check_over_type_check = true:suggestion
-csharp_style_prefer_local_over_anonymous_function = true:suggestion
-csharp_prefer_simple_default_expression = true:suggestion
-csharp_style_prefer_range_operator = true:suggestion
-csharp_style_prefer_index_operator = true:suggestion
-csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
-csharp_prefer_static_local_function = true:suggestion
-csharp_style_prefer_readonly_struct = true:suggestion
-csharp_prefer_static_anonymous_function = true:suggestion
-csharp_style_prefer_readonly_struct_member = true:suggestion
-csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
-csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
-csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent
-csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
-csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
-csharp_style_conditional_delegate_call = true:suggestion
-csharp_style_prefer_switch_expression = true:suggestion
-csharp_style_prefer_pattern_matching = true:silent
-csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
-csharp_style_prefer_not_pattern = true:suggestion
-csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
-csharp_style_prefer_extended_property_pattern = true:suggestion
-
-[*.{cshtml,htm,html,proto,razor}]
-indent_style=tab
-indent_size=tab
-tab_width=4
-
-[*.{asax,ascx,aspx,axaml,c,c++,cc,cginc,compute,cp,cpp,cs,css,cu,cuh,cxx,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,js,jsx,master,mpp,mq4,mq5,mqh,paml,skin,tpp,ts,tsx,usf,ush,vb,xaml,xamlx,xoml}]
-indent_style=space
-indent_size=4
-tab_width=4
-
-[ "*.proto" ]
-indent_style=tab
-indent_size=tab
-tab_width=4
-
-[*.{asax,ascx,aspx,axaml,cs,cshtml,css,htm,html,js,jsx,master,paml,razor,skin,ts,tsx,vb,xaml,xamlx,xoml}]
-indent_style=space
-indent_size=4
-tab_width=4
-
-[*.{appxmanifest,axml,build,config,csproj,dbml,discomap,dtd,json,jsproj,lsproj,njsproj,nuspec,proj,props,resjson,resw,resx,StyleCop,targets,tasks,vbproj,xml,xsd}]
-indent_style=space
-indent_size=2
-tab_width=2
-
-[*.{appxmanifest,asax,ascx,aspx,axaml,axml,build,c,c++,cc,cginc,compute,config,cp,cpp,cs,cshtml,csproj,css,cu,cuh,cxx,dbml,discomap,dtd,h,hh,hlsl,hlsli,hlslinc,hpp,htm,html,hxx,inc,inl,ino,ipp,js,json,jsproj,jsx,lsproj,master,mpp,mq4,mq5,mqh,njsproj,nuspec,paml,proj,props,proto,razor,resjson,resw,resx,skin,StyleCop,targets,tasks,tpp,ts,tsx,usf,ush,vb,vbproj,xaml,xamlx,xml,xoml,xsd}]
-indent_style=space
-indent_size= 4
-tab_width= 4
-dotnet_style_operator_placement_when_wrapping = beginning_of_line
-dotnet_style_coalesce_expression = true:suggestion
-dotnet_style_null_propagation = true:suggestion
-dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
-dotnet_style_prefer_auto_properties = true:silent
-dotnet_style_object_initializer = true:suggestion
-dotnet_style_collection_initializer = true:suggestion
-dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
-dotnet_style_prefer_conditional_expression_over_assignment = true:silent
-dotnet_style_prefer_conditional_expression_over_return = true:silent
-dotnet_style_explicit_tuple_names = true:suggestion
-dotnet_style_prefer_inferred_tuple_names = true:suggestion
-dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
-dotnet_style_prefer_compound_assignment = true:suggestion
-dotnet_style_prefer_simplified_interpolation = true:suggestion
-dotnet_style_namespace_match_folder = true:suggestion
-insert_final_newline = true
-end_of_line = lf
-dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
-dotnet_style_readonly_field = true:suggestion
-dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
-dotnet_style_allow_multiple_blank_lines_experimental = true:silent
-dotnet_code_quality_unused_parameters = all:suggestion
-dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+# Standard properties
+csharp_indent_labels = one_less_than_current
+# Microsoft .NET properties
+csharp_indent_braces=false
+csharp_indent_switch_labels=true
+csharp_new_line_before_catch=true
+csharp_new_line_before_else=true
+csharp_new_line_before_finally=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
+csharp_preferred_modifier_order=public, private, protected, internal, new, abstract, virtual, sealed, override, static, readonly, extern, unsafe, volatile, async:suggestion
+csharp_preserve_single_line_blocks=true
+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_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
+csharp_style_namespace_declarations= file_scoped:suggestion
+csharp_style_var_elsewhere= true:suggestion
+csharp_style_var_for_built_in_types= true:suggestion
+csharp_style_var_when_type_is_apparent= true:suggestion
+csharp_using_directive_placement= outside_namespace:silent
+dotnet_diagnostic.bc40000.severity=warning
+dotnet_diagnostic.bc400005.severity=warning
+dotnet_diagnostic.bc40008.severity=warning
+dotnet_diagnostic.bc40056.severity=warning
+dotnet_diagnostic.bc42016.severity=warning
+dotnet_diagnostic.bc42024.severity=warning
+dotnet_diagnostic.bc42025.severity=warning
+dotnet_diagnostic.bc42104.severity=warning
+dotnet_diagnostic.bc42105.severity=warning
+dotnet_diagnostic.bc42106.severity=warning
+dotnet_diagnostic.bc42107.severity=warning
+dotnet_diagnostic.bc42304.severity=warning
+dotnet_diagnostic.bc42309.severity=warning
+dotnet_diagnostic.bc42322.severity=warning
+dotnet_diagnostic.bc42349.severity=warning
+dotnet_diagnostic.bc42353.severity=warning
+dotnet_diagnostic.bc42354.severity=warning
+dotnet_diagnostic.bc42355.severity=warning
+dotnet_diagnostic.bc42356.severity=warning
+dotnet_diagnostic.bc42358.severity=warning
+dotnet_diagnostic.bc42504.severity=warning
+dotnet_diagnostic.bc42505.severity=warning
+dotnet_diagnostic.cs0067.severity=warning
+dotnet_diagnostic.cs0078.severity=warning
+dotnet_diagnostic.cs0108.severity=warning
+dotnet_diagnostic.cs0109.severity=warning
+dotnet_diagnostic.cs0114.severity=warning
+dotnet_diagnostic.cs0162.severity=warning
+dotnet_diagnostic.cs0164.severity=warning
+dotnet_diagnostic.cs0168.severity=warning
+dotnet_diagnostic.cs0169.severity=warning
+dotnet_diagnostic.cs0183.severity=warning
+dotnet_diagnostic.cs0184.severity=warning
+dotnet_diagnostic.cs0197.severity=warning
+dotnet_diagnostic.cs0219.severity=warning
+dotnet_diagnostic.cs0252.severity=warning
+dotnet_diagnostic.cs0253.severity=warning
+dotnet_diagnostic.cs0414.severity=warning
+dotnet_diagnostic.cs0420.severity=warning
+dotnet_diagnostic.cs0465.severity=warning
+dotnet_diagnostic.cs0469.severity=warning
+dotnet_diagnostic.cs0612.severity=warning
+dotnet_diagnostic.cs0618.severity=warning
+dotnet_diagnostic.cs0628.severity=warning
+dotnet_diagnostic.cs0642.severity=warning
+dotnet_diagnostic.cs0649.severity=warning
+dotnet_diagnostic.cs0652.severity=warning
+dotnet_diagnostic.cs0657.severity=warning
+dotnet_diagnostic.cs0658.severity=warning
+dotnet_diagnostic.cs0659.severity=warning
+dotnet_diagnostic.cs0660.severity=warning
+dotnet_diagnostic.cs0661.severity=warning
+dotnet_diagnostic.cs0665.severity=warning
+dotnet_diagnostic.cs0672.severity=warning
+dotnet_diagnostic.cs0675.severity=warning
+dotnet_diagnostic.cs0693.severity=warning
+dotnet_diagnostic.cs1030.severity=warning
+dotnet_diagnostic.cs1058.severity=warning
+dotnet_diagnostic.cs1066.severity=warning
+dotnet_diagnostic.cs1522.severity=warning
+dotnet_diagnostic.cs1570.severity=warning
+dotnet_diagnostic.cs1571.severity=warning
+dotnet_diagnostic.cs1572.severity=warning
+dotnet_diagnostic.cs1573.severity=warning
+dotnet_diagnostic.cs1574.severity=warning
+dotnet_diagnostic.cs1580.severity=warning
+dotnet_diagnostic.cs1581.severity=warning
+dotnet_diagnostic.cs1584.severity=warning
+dotnet_diagnostic.cs1587.severity=warning
+dotnet_diagnostic.cs1589.severity=warning
+dotnet_diagnostic.cs1590.severity=warning
+dotnet_diagnostic.cs1591.severity=warning
+dotnet_diagnostic.cs1592.severity=warning
+dotnet_diagnostic.cs1710.severity=warning
+dotnet_diagnostic.cs1711.severity=warning
+dotnet_diagnostic.cs1712.severity=warning
+dotnet_diagnostic.cs1717.severity=warning
+dotnet_diagnostic.cs1723.severity=warning
+dotnet_diagnostic.cs1911.severity=warning
+dotnet_diagnostic.cs1957.severity=warning
+dotnet_diagnostic.cs1981.severity=warning
+dotnet_diagnostic.cs1998.severity=warning
+dotnet_diagnostic.cs4014.severity=warning
+dotnet_diagnostic.cs7022.severity=warning
+dotnet_diagnostic.cs7023.severity=warning
+dotnet_diagnostic.cs7095.severity=warning
+dotnet_diagnostic.cs8094.severity=warning
+dotnet_diagnostic.cs8123.severity=warning
+dotnet_diagnostic.cs8321.severity=warning
+dotnet_diagnostic.cs8383.severity=warning
+dotnet_diagnostic.cs8416.severity=warning
+dotnet_diagnostic.cs8417.severity=warning
+dotnet_diagnostic.cs8424.severity=warning
+dotnet_diagnostic.cs8425.severity=warning
+dotnet_diagnostic.cs8509.severity=warning
+dotnet_diagnostic.cs8524.severity=warning
+dotnet_diagnostic.cs8597.severity=warning
+dotnet_diagnostic.cs8600.severity=warning
+dotnet_diagnostic.cs8601.severity=warning
+dotnet_diagnostic.cs8602.severity=warning
+dotnet_diagnostic.cs8603.severity=warning
+dotnet_diagnostic.cs8604.severity=warning
+dotnet_diagnostic.cs8605.severity=warning
+dotnet_diagnostic.cs8607.severity=warning
+dotnet_diagnostic.cs8608.severity=warning
+dotnet_diagnostic.cs8609.severity=warning
+dotnet_diagnostic.cs8610.severity=warning
+dotnet_diagnostic.cs8611.severity=warning
+dotnet_diagnostic.cs8612.severity=warning
+dotnet_diagnostic.cs8613.severity=warning
+dotnet_diagnostic.cs8614.severity=warning
+dotnet_diagnostic.cs8615.severity=warning
+dotnet_diagnostic.cs8616.severity=warning
+dotnet_diagnostic.cs8617.severity=warning
+dotnet_diagnostic.cs8618.severity=warning
+dotnet_diagnostic.cs8619.severity=warning
+dotnet_diagnostic.cs8620.severity=warning
+dotnet_diagnostic.cs8621.severity=warning
+dotnet_diagnostic.cs8622.severity=warning
+dotnet_diagnostic.cs8624.severity=warning
+dotnet_diagnostic.cs8625.severity=warning
+dotnet_diagnostic.cs8629.severity=warning
+dotnet_diagnostic.cs8631.severity=warning
+dotnet_diagnostic.cs8632.severity=none
+dotnet_diagnostic.cs8633.severity=warning
+dotnet_diagnostic.cs8634.severity=warning
+dotnet_diagnostic.cs8643.severity=warning
+dotnet_diagnostic.cs8644.severity=warning
+dotnet_diagnostic.cs8645.severity=warning
+dotnet_diagnostic.cs8655.severity=warning
+dotnet_diagnostic.cs8656.severity=warning
+dotnet_diagnostic.cs8667.severity=warning
+dotnet_diagnostic.cs8669.severity=none
+dotnet_diagnostic.cs8670.severity=warning
+dotnet_diagnostic.cs8714.severity=warning
+dotnet_diagnostic.cs8762.severity=warning
+dotnet_diagnostic.cs8763.severity=warning
+dotnet_diagnostic.cs8764.severity=warning
+dotnet_diagnostic.cs8765.severity=warning
+dotnet_diagnostic.cs8766.severity=warning
+dotnet_diagnostic.cs8767.severity=warning
+dotnet_diagnostic.cs8768.severity=warning
+dotnet_diagnostic.cs8769.severity=warning
+dotnet_diagnostic.cs8770.severity=warning
+dotnet_diagnostic.cs8774.severity=warning
+dotnet_diagnostic.cs8775.severity=warning
+dotnet_diagnostic.cs8776.severity=warning
+dotnet_diagnostic.cs8777.severity=warning
+dotnet_diagnostic.cs8794.severity=warning
+dotnet_diagnostic.cs8819.severity=warning
+dotnet_diagnostic.cs8824.severity=warning
+dotnet_diagnostic.cs8825.severity=warning
+dotnet_diagnostic.cs8846.severity=warning
+dotnet_diagnostic.cs8847.severity=warning
+dotnet_diagnostic.cs8851.severity=warning
+dotnet_diagnostic.cs8860.severity=warning
+dotnet_diagnostic.cs8892.severity=warning
+dotnet_diagnostic.cs8907.severity=warning
+dotnet_diagnostic.cs8947.severity=warning
+dotnet_diagnostic.cs8960.severity=warning
+dotnet_diagnostic.cs8961.severity=warning
+dotnet_diagnostic.cs8962.severity=warning
+dotnet_diagnostic.cs8963.severity=warning
+dotnet_diagnostic.cs8965.severity=warning
+dotnet_diagnostic.cs8966.severity=warning
+dotnet_diagnostic.cs8971.severity=warning
+dotnet_diagnostic.wme006.severity=warning
+dotnet_naming_rule.constants_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.constants_rule.severity = warning
+dotnet_naming_rule.constants_rule.style = upper_camel_case_style
+dotnet_naming_rule.constants_rule.symbols=constants_symbols
+dotnet_naming_rule.event_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.event_rule.severity = warning
+dotnet_naming_rule.event_rule.style = upper_camel_case_style
+dotnet_naming_rule.event_rule.symbols=event_symbols
+dotnet_naming_rule.interfaces_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.interfaces_rule.severity = warning
+dotnet_naming_rule.interfaces_rule.style = i_upper_camel_case_style
+dotnet_naming_rule.interfaces_rule.symbols=interfaces_symbols
+dotnet_naming_rule.locals_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.locals_rule.severity = warning
+dotnet_naming_rule.locals_rule.style = lower_camel_case_style_1
+dotnet_naming_rule.locals_rule.symbols=locals_symbols
+dotnet_naming_rule.local_constants_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.local_constants_rule.severity = warning
+dotnet_naming_rule.local_constants_rule.style = lower_camel_case_style_1
+dotnet_naming_rule.local_constants_rule.symbols=local_constants_symbols
+dotnet_naming_rule.local_functions_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.local_functions_rule.severity = warning
+dotnet_naming_rule.local_functions_rule.style = upper_camel_case_style
+dotnet_naming_rule.local_functions_rule.symbols=local_functions_symbols
+dotnet_naming_rule.method_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.method_rule.severity = warning
+dotnet_naming_rule.method_rule.style = upper_camel_case_style
+dotnet_naming_rule.method_rule.symbols=method_symbols
+dotnet_naming_rule.parameters_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.parameters_rule.severity = warning
+dotnet_naming_rule.parameters_rule.style = lower_camel_case_style_1
+dotnet_naming_rule.parameters_rule.symbols=parameters_symbols
+dotnet_naming_rule.private_constants_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.private_constants_rule.severity = warning
+dotnet_naming_rule.private_constants_rule.style = upper_camel_case_style
+dotnet_naming_rule.private_constants_rule.symbols=private_constants_symbols
+dotnet_naming_rule.private_instance_fields_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.private_instance_fields_rule.severity = warning
+dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style
+dotnet_naming_rule.private_instance_fields_rule.symbols=private_instance_fields_symbols
+dotnet_naming_rule.private_static_fields_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.private_static_fields_rule.severity = warning
+dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style
+dotnet_naming_rule.private_static_fields_rule.symbols=private_static_fields_symbols
+dotnet_naming_rule.private_static_readonly_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.private_static_readonly_rule.severity = warning
+dotnet_naming_rule.private_static_readonly_rule.style = upper_camel_case_style
+dotnet_naming_rule.private_static_readonly_rule.symbols=private_static_readonly_symbols
+dotnet_naming_rule.property_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.property_rule.severity = warning
+dotnet_naming_rule.property_rule.style = upper_camel_case_style
+dotnet_naming_rule.property_rule.symbols=property_symbols
+dotnet_naming_rule.public_fields_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.public_fields_rule.severity = warning
+dotnet_naming_rule.public_fields_rule.style = upper_camel_case_style
+dotnet_naming_rule.public_fields_rule.symbols=public_fields_symbols
+dotnet_naming_rule.static_readonly_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.static_readonly_rule.severity = warning
+dotnet_naming_rule.static_readonly_rule.style = upper_camel_case_style
+dotnet_naming_rule.static_readonly_rule.symbols=static_readonly_symbols
+dotnet_naming_rule.types_and_namespaces_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.types_and_namespaces_rule.severity = warning
+dotnet_naming_rule.types_and_namespaces_rule.style = upper_camel_case_style
+dotnet_naming_rule.types_and_namespaces_rule.symbols=types_and_namespaces_symbols
+dotnet_naming_rule.type_parameters_rule.import_to_resharper=as_predefined
+dotnet_naming_rule.type_parameters_rule.severity = warning
+dotnet_naming_rule.type_parameters_rule.style = t_upper_camel_case_style
+dotnet_naming_rule.type_parameters_rule.symbols=type_parameters_symbols
+dotnet_naming_style.i_upper_camel_case_style.capitalization=pascal_case
+dotnet_naming_style.i_upper_camel_case_style.required_prefix=I
+dotnet_naming_style.lower_camel_case_style.capitalization=camel_case
+dotnet_naming_style.lower_camel_case_style.required_prefix=_
+dotnet_naming_style.lower_camel_case_style_1.capitalization=camel_case
+dotnet_naming_style.t_upper_camel_case_style.capitalization=pascal_case
+dotnet_naming_style.t_upper_camel_case_style.required_prefix=T
+dotnet_naming_style.upper_camel_case_style.capitalization=pascal_case
+dotnet_naming_symbols.constants_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected
+dotnet_naming_symbols.constants_symbols.applicable_kinds=field
+dotnet_naming_symbols.constants_symbols.required_modifiers=const
+dotnet_naming_symbols.event_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.event_symbols.applicable_kinds=event
+dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.interfaces_symbols.applicable_kinds=interface
+dotnet_naming_symbols.locals_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.locals_symbols.applicable_kinds=local
+dotnet_naming_symbols.local_constants_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.local_constants_symbols.applicable_kinds=local
+dotnet_naming_symbols.local_constants_symbols.required_modifiers=const
+dotnet_naming_symbols.local_functions_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.local_functions_symbols.applicable_kinds=local_function
+dotnet_naming_symbols.method_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.method_symbols.applicable_kinds=method
+dotnet_naming_symbols.parameters_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.parameters_symbols.applicable_kinds=parameter
+dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities=private
+dotnet_naming_symbols.private_constants_symbols.applicable_kinds=field
+dotnet_naming_symbols.private_constants_symbols.required_modifiers=const
+dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities=private
+dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds=field
+dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities=private
+dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds=field
+dotnet_naming_symbols.private_static_fields_symbols.required_modifiers=static
+dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities=private
+dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds=field
+dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers=static,readonly
+dotnet_naming_symbols.property_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.property_symbols.applicable_kinds=property
+dotnet_naming_symbols.public_fields_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected
+dotnet_naming_symbols.public_fields_symbols.applicable_kinds=field
+dotnet_naming_symbols.static_readonly_symbols.applicable_accessibilities=public,internal,protected,protected_internal,private_protected
+dotnet_naming_symbols.static_readonly_symbols.applicable_kinds=field
+dotnet_naming_symbols.static_readonly_symbols.required_modifiers=static,readonly
+dotnet_naming_symbols.types_and_namespaces_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.types_and_namespaces_symbols.applicable_kinds=namespace,class,struct,enum,delegate
+dotnet_naming_symbols.type_parameters_symbols.applicable_accessibilities=*
+dotnet_naming_symbols.type_parameters_symbols.applicable_kinds=type_parameter
+dotnet_separate_import_directive_groups=false
+dotnet_sort_system_directives_first=true
+dotnet_style_parentheses_in_arithmetic_binary_operators= never_if_unnecessary:suggestion
+dotnet_style_parentheses_in_other_binary_operators= never_if_unnecessary:suggestion
+dotnet_style_parentheses_in_relational_binary_operators= never_if_unnecessary:suggestion
+dotnet_style_predefined_type_for_locals_parameters_members= true:suggestion
+dotnet_style_predefined_type_for_member_access= true:suggestion
+dotnet_style_qualification_for_event= false:suggestion
+dotnet_style_qualification_for_field= false:suggestion
+dotnet_style_qualification_for_method= false:suggestion
+dotnet_style_qualification_for_property= false:suggestion
+dotnet_style_require_accessibility_modifiers= always:suggestion
+file_header_template=
+
+# ReSharper properties
+resharper_accessor_owner_body=expression_body
+resharper_alignment_tab_fill_style=use_spaces
+resharper_align_first_arg_by_paren=false
+resharper_align_linq_query=false
+resharper_align_multiline_argument=true
+resharper_align_multiline_array_and_object_initializer=false
+resharper_align_multiline_array_initializer=true
+resharper_align_multiline_binary_expressions_chain=false
+resharper_align_multiline_binary_patterns=false
+resharper_align_multiline_ctor_init=true
+resharper_align_multiline_expression_braces=false
+resharper_align_multiline_implements_list=true
+resharper_align_multiline_property_pattern=false
+resharper_align_multiline_statement_conditions=true
+resharper_align_multiline_switch_expression=false
+resharper_align_multiline_type_argument=true
+resharper_align_multiline_type_parameter=true
+resharper_align_multline_type_parameter_constrains=true
+resharper_align_multline_type_parameter_list=false
+resharper_align_tuple_components=false
+resharper_align_union_type_usage=true
+resharper_allow_alias=true
+resharper_allow_comment_after_lbrace=false
+resharper_allow_far_alignment=false
+resharper_always_use_end_of_line_brace_style=false
+resharper_apply_auto_detected_rules=false
+resharper_apply_on_completion=false
+resharper_arguments_anonymous_function=positional
+resharper_arguments_literal=positional
+resharper_arguments_named=positional
+resharper_arguments_other=positional
+resharper_arguments_skip_single=false
+resharper_arguments_string_literal=positional
+resharper_attribute_style=do_not_touch
+resharper_autodetect_indent_settings=false
+resharper_blank_lines_after_block_statements=1
+resharper_blank_lines_after_case=0
+resharper_blank_lines_after_control_transfer_statements=1
+resharper_blank_lines_after_file_scoped_namespace_directive=1
+resharper_blank_lines_after_imports=1
+resharper_blank_lines_after_multiline_statements=0
+resharper_blank_lines_after_options=1
+resharper_blank_lines_after_start_comment=1
+resharper_blank_lines_after_using_list=1
+resharper_blank_lines_around_accessor=0
+resharper_blank_lines_around_auto_property=1
+resharper_blank_lines_around_block_case_section=0
+resharper_blank_lines_around_class_definition=1
+resharper_blank_lines_around_field=1
+resharper_blank_lines_around_function_declaration=0
+resharper_blank_lines_around_function_definition=1
+resharper_blank_lines_around_global_attribute=0
+resharper_blank_lines_around_invocable=1
+resharper_blank_lines_around_local_method=1
+resharper_blank_lines_around_multiline_case_section=0
+resharper_blank_lines_around_namespace=1
+resharper_blank_lines_around_other_declaration=0
+resharper_blank_lines_around_property=1
+resharper_blank_lines_around_razor_functions=1
+resharper_blank_lines_around_razor_helpers=1
+resharper_blank_lines_around_razor_sections=1
+resharper_blank_lines_around_region=1
+resharper_blank_lines_around_single_line_accessor=0
+resharper_blank_lines_around_single_line_auto_property=0
+resharper_blank_lines_around_single_line_field=0
+resharper_blank_lines_around_single_line_function_definition=0
+resharper_blank_lines_around_single_line_invocable=0
+resharper_blank_lines_around_single_line_local_method=0
+resharper_blank_lines_around_single_line_property=0
+resharper_blank_lines_around_single_line_type=0
+resharper_blank_lines_around_type=1
+resharper_blank_lines_before_block_statements=0
+resharper_blank_lines_before_case=0
+resharper_blank_lines_before_control_transfer_statements=0
+resharper_blank_lines_before_multiline_statements=0
+resharper_blank_lines_before_single_line_comment=0
+resharper_blank_lines_inside_namespace=0
+resharper_blank_lines_inside_region=1
+resharper_blank_lines_inside_type=0
+resharper_blank_line_after_pi=true
+resharper_braces_for_dowhile=required
+resharper_braces_for_fixed=required
+resharper_braces_for_for=required_for_multiline
+resharper_braces_for_foreach=required_for_multiline
+resharper_braces_for_ifelse=not_required_for_both
+resharper_braces_for_lock=required
+resharper_braces_for_using=required
+resharper_braces_for_while=required_for_multiline
+resharper_braces_redundant=true
+resharper_break_template_declaration=line_break
+resharper_can_use_global_alias=true
+resharper_configure_await_analysis_mode=disabled
+resharper_constructor_or_destructor_body=expression_body
+resharper_continuous_indent_multiplier=1
+resharper_continuous_line_indent=single
+resharper_cpp_align_multiline_argument=true
+resharper_cpp_align_multiline_calls_chain=true
+resharper_cpp_align_multiline_extends_list=true
+resharper_cpp_align_multiline_for_stmt=true
+resharper_cpp_align_multiline_parameter=true
+resharper_cpp_align_multiple_declaration=true
+resharper_cpp_align_ternary=align_not_nested
+resharper_cpp_anonymous_method_declaration_braces=next_line
+resharper_cpp_case_block_braces=next_line_shifted_2
+resharper_cpp_empty_block_style=multiline
+resharper_cpp_indent_switch_labels=false
+resharper_cpp_insert_final_newline=false
+resharper_cpp_int_align_comments=false
+resharper_cpp_invocable_declaration_braces=next_line
+resharper_cpp_max_line_length=120
+resharper_cpp_new_line_before_catch=true
+resharper_cpp_new_line_before_else=true
+resharper_cpp_new_line_before_while=true
+resharper_cpp_other_braces=next_line
+resharper_cpp_space_around_binary_operator=true
+resharper_cpp_type_declaration_braces=next_line
+resharper_cpp_wrap_arguments_style=wrap_if_long
+resharper_cpp_wrap_lines=true
+resharper_cpp_wrap_parameters_style=wrap_if_long
+resharper_csharp_align_multiline_argument=false
+resharper_csharp_align_multiline_calls_chain=false
+resharper_csharp_align_multiline_expression=false
+resharper_csharp_align_multiline_extends_list=false
+resharper_csharp_align_multiline_for_stmt=false
+resharper_csharp_align_multiline_parameter=false
+resharper_csharp_align_multiple_declaration=true
+resharper_csharp_empty_block_style=together
+resharper_csharp_insert_final_newline=true
+resharper_csharp_int_align_comments=true
+resharper_csharp_max_line_length=144
+resharper_csharp_naming_rule.enum_member=AaBb
+resharper_csharp_naming_rule.method_property_event=AaBb
+resharper_csharp_naming_rule.other=AaBb
+resharper_csharp_new_line_before_while=false
+resharper_csharp_prefer_qualified_reference=false
+resharper_csharp_space_after_unary_operator=false
+resharper_csharp_wrap_arguments_style=wrap_if_long
+resharper_csharp_wrap_before_binary_opsign=true
+resharper_csharp_wrap_for_stmt_header_style=wrap_if_long
+resharper_csharp_wrap_lines=true
+resharper_csharp_wrap_parameters_style=wrap_if_long
+resharper_css_brace_style=end_of_line
+resharper_css_insert_final_newline=false
+resharper_css_keep_blank_lines_between_declarations=1
+resharper_css_max_line_length=120
+resharper_css_wrap_lines=true
+resharper_cxxcli_property_declaration_braces=next_line
+resharper_declarations_style=separate_lines
+resharper_default_exception_variable_name=e
+resharper_default_value_when_type_evident=default_literal
+resharper_default_value_when_type_not_evident=default_literal
+resharper_delete_quotes_from_solid_values=false
+resharper_disable_blank_line_changes=false
+resharper_disable_formatter=false
+resharper_disable_indenter=false
+resharper_disable_int_align=false
+resharper_disable_line_break_changes=false
+resharper_disable_line_break_removal=false
+resharper_disable_space_changes=false
+resharper_disable_space_changes_before_trailing_comment=false
+resharper_dont_remove_extra_blank_lines=false
+resharper_enable_wrapping=false
+resharper_enforce_line_ending_style=false
+resharper_event_handler_pattern_long=$object$On$event$
+resharper_event_handler_pattern_short=On$event$
+resharper_expression_braces=inside
+resharper_expression_pars=inside
+resharper_extra_spaces=remove_all
+resharper_force_attribute_style=separate
+resharper_force_chop_compound_do_expression=false
+resharper_force_chop_compound_if_expression=false
+resharper_force_chop_compound_while_expression=false
+resharper_force_control_statements_braces=do_not_change
+resharper_force_linebreaks_inside_complex_literals=true
+resharper_force_variable_declarations_on_new_line=false
+resharper_format_leading_spaces_decl=false
+resharper_free_block_braces=next_line
+resharper_function_declaration_return_type_style=do_not_change
+resharper_function_definition_return_type_style=do_not_change
+resharper_generator_mode=false
+resharper_html_attribute_indent=align_by_first_attribute
+resharper_html_insert_final_newline=false
+resharper_html_linebreak_before_elements=body,div,p,form,h1,h2,h3
+resharper_html_max_blank_lines_between_tags=2
+resharper_html_max_line_length=120
+resharper_html_pi_attribute_style=on_single_line
+resharper_html_space_before_self_closing=false
+resharper_html_wrap_lines=true
+resharper_ignore_space_preservation=false
+resharper_include_prefix_comment_in_indent=false
+resharper_indent_access_specifiers_from_class=false
+resharper_indent_aligned_ternary=true
+resharper_indent_anonymous_method_block=false
+resharper_indent_braces_inside_statement_conditions=true
+resharper_indent_case_from_select=true
+resharper_indent_child_elements=OneIndent
+resharper_indent_class_members_from_access_specifiers=false
+resharper_indent_comment=true
+resharper_indent_inside_namespace=true
+resharper_indent_invocation_pars=inside
+resharper_indent_left_par_inside_expression=false
+resharper_indent_method_decl_pars=inside
+resharper_indent_nested_fixed_stmt=false
+resharper_indent_nested_foreach_stmt=true
+resharper_indent_nested_for_stmt=true
+resharper_indent_nested_lock_stmt=false
+resharper_indent_nested_usings_stmt=false
+resharper_indent_nested_while_stmt=true
+resharper_indent_pars=inside
+resharper_indent_preprocessor_directives=none
+resharper_indent_preprocessor_if=no_indent
+resharper_indent_preprocessor_other=no_indent
+resharper_indent_preprocessor_region=usual_indent
+resharper_indent_statement_pars=inside
+resharper_indent_text=OneIndent
+resharper_indent_typearg_angles=inside
+resharper_indent_typeparam_angles=inside
+resharper_indent_type_constraints=true
+resharper_indent_wrapped_function_names=false
+resharper_instance_members_qualify_declared_in=this_class, base_class
+resharper_int_align=true
+resharper_int_align_assignments=true
+resharper_int_align_binary_expressions=false
+resharper_int_align_declaration_names=false
+resharper_int_align_eq=false
+resharper_int_align_fields=true
+resharper_int_align_fix_in_adjacent=true
+resharper_int_align_invocations=true
+resharper_int_align_methods=true
+resharper_int_align_nested_ternary=true
+resharper_int_align_parameters=false
+resharper_int_align_properties=true
+resharper_int_align_property_patterns=true
+resharper_int_align_switch_expressions=true
+resharper_int_align_switch_sections=true
+resharper_int_align_variables=true
+resharper_js_align_multiline_parameter=false
+resharper_js_align_multiple_declaration=false
+resharper_js_align_ternary=none
+resharper_js_brace_style=end_of_line
+resharper_js_empty_block_style=multiline
+resharper_js_indent_switch_labels=false
+resharper_js_insert_final_newline=false
+resharper_js_keep_blank_lines_between_declarations=2
+resharper_js_max_line_length=120
+resharper_js_new_line_before_catch=false
+resharper_js_new_line_before_else=false
+resharper_js_new_line_before_finally=false
+resharper_js_new_line_before_while=false
+resharper_js_space_around_binary_operator=true
+resharper_js_wrap_arguments_style=chop_if_long
+resharper_js_wrap_before_binary_opsign=false
+resharper_js_wrap_for_stmt_header_style=chop_if_long
+resharper_js_wrap_lines=true
+resharper_js_wrap_parameters_style=chop_if_long
+resharper_keep_blank_lines_in_code=2
+resharper_keep_blank_lines_in_declarations=2
+resharper_keep_existing_attribute_arrangement=false
+resharper_keep_existing_declaration_block_arrangement=false
+resharper_keep_existing_declaration_parens_arrangement=true
+resharper_keep_existing_embedded_arrangement=false
+resharper_keep_existing_embedded_block_arrangement=false
+resharper_keep_existing_enum_arrangement=false
+resharper_keep_existing_expr_member_arrangement=false
+resharper_keep_existing_initializer_arrangement=false
+resharper_keep_existing_invocation_parens_arrangement=true
+resharper_keep_existing_property_patterns_arrangement=true
+resharper_keep_existing_switch_expression_arrangement=false
+resharper_keep_nontrivial_alias=true
+resharper_keep_user_linebreaks=true
+resharper_keep_user_wrapping=true
+resharper_linebreaks_around_razor_statements=true
+resharper_linebreaks_inside_tags_for_elements_longer_than=2147483647
+resharper_linebreaks_inside_tags_for_elements_with_child_elements=true
+resharper_linebreaks_inside_tags_for_multiline_elements=true
+resharper_linebreak_before_all_elements=false
+resharper_linebreak_before_multiline_elements=true
+resharper_linebreak_before_singleline_elements=false
+resharper_line_break_after_colon_in_member_initializer_lists=do_not_change
+resharper_line_break_after_comma_in_member_initializer_lists=false
+resharper_line_break_before_comma_in_member_initializer_lists=false
+resharper_line_break_before_requires_clause=do_not_change
+resharper_linkage_specification_braces=end_of_line
+resharper_linkage_specification_indentation=none
+resharper_local_function_body=expression_body
+resharper_macro_block_begin=
+resharper_macro_block_end=
+resharper_max_array_initializer_elements_on_line=10000
+resharper_max_attribute_length_for_same_line=38
+resharper_max_enum_members_on_line=1
+resharper_max_formal_parameters_on_line=10000
+resharper_max_initializer_elements_on_line=1
+resharper_max_invocation_arguments_on_line=10000
+resharper_media_query_style=same_line
+resharper_member_initializer_list_style=do_not_change
+resharper_method_or_operator_body=expression_body
+resharper_min_blank_lines_after_imports=0
+resharper_min_blank_lines_around_fields=0
+resharper_min_blank_lines_around_functions=1
+resharper_min_blank_lines_around_types=1
+resharper_min_blank_lines_between_declarations=1
+resharper_namespace_declaration_braces=next_line
+resharper_namespace_indentation=all
+resharper_nested_ternary_style=autodetect
+resharper_new_line_before_enumerators=true
+resharper_normalize_tag_names=false
+resharper_no_indent_inside_elements=html,body,thead,tbody,tfoot
+resharper_no_indent_inside_if_element_longer_than=200
+resharper_object_creation_when_type_evident=target_typed
+resharper_object_creation_when_type_not_evident=explicitly_typed
+resharper_old_engine=false
+resharper_options_braces_pointy=false
+resharper_outdent_binary_ops=true
+resharper_outdent_binary_pattern_ops=false
+resharper_outdent_commas=false
+resharper_outdent_dots=false
+resharper_outdent_namespace_member=false
+resharper_outdent_statement_labels=false
+resharper_outdent_ternary_ops=false
+resharper_parentheses_non_obvious_operations=none, bitwise, bitwise_inclusive_or, bitwise_exclusive_or, shift, bitwise_and
+resharper_parentheses_redundancy_style=remove_if_not_clarifies_precedence
+resharper_parentheses_same_type_operations=false
+resharper_pi_attributes_indent=align_by_first_attribute
+resharper_place_attribute_on_same_line=false
+resharper_place_class_decorator_on_the_same_line=false
+resharper_place_comments_at_first_column=false
+resharper_place_constructor_initializer_on_same_line=false
+resharper_place_each_decorator_on_new_line=false
+resharper_place_event_attribute_on_same_line=false
+resharper_place_expr_accessor_on_single_line=true
+resharper_place_expr_method_on_single_line=false
+resharper_place_expr_property_on_single_line=false
+resharper_place_field_decorator_on_the_same_line=false
+resharper_place_linq_into_on_new_line=true
+resharper_place_method_decorator_on_the_same_line=false
+resharper_place_namespace_definitions_on_same_line=false
+resharper_place_property_attribute_on_same_line=false
+resharper_place_property_decorator_on_the_same_line=false
+resharper_place_simple_case_statement_on_same_line=if_owner_is_single_line
+resharper_place_simple_embedded_statement_on_same_line=false
+resharper_place_simple_enum_on_single_line=true
+resharper_place_simple_initializer_on_single_line=true
+resharper_place_simple_property_pattern_on_single_line=true
+resharper_place_simple_switch_expression_on_single_line=true
+resharper_place_template_args_on_new_line=false
+resharper_place_type_constraints_on_same_line=true
+resharper_prefer_explicit_discard_declaration=false
+resharper_prefer_separate_deconstructed_variables_declaration=false
+resharper_preserve_spaces_inside_tags=pre,textarea
+resharper_properties_style=separate_lines_for_nonsingle
+resharper_protobuf_brace_style=end_of_line
+resharper_protobuf_empty_block_style=together_same_line
+resharper_protobuf_insert_final_newline=false
+resharper_protobuf_max_line_length=120
+resharper_protobuf_wrap_lines=true
+resharper_qualified_using_at_nested_scope=false
+resharper_quote_style=doublequoted
+resharper_razor_prefer_qualified_reference=true
+resharper_remove_blank_lines_near_braces=false
+resharper_remove_blank_lines_near_braces_in_code=true
+resharper_remove_blank_lines_near_braces_in_declarations=true
+resharper_remove_this_qualifier=true
+resharper_requires_expression_braces=next_line
+resharper_resx_attribute_indent=single_indent
+resharper_resx_insert_final_newline=false
+resharper_resx_linebreak_before_elements=
+resharper_resx_max_blank_lines_between_tags=0
+resharper_resx_max_line_length=2147483647
+resharper_resx_pi_attribute_style=do_not_touch
+resharper_resx_space_before_self_closing=false
+resharper_resx_wrap_lines=false
+resharper_resx_wrap_tags_and_pi=false
+resharper_resx_wrap_text=false
+resharper_selector_style=same_line
+resharper_show_autodetect_configure_formatting_tip=true
+resharper_simple_blocks=do_not_change
+resharper_simple_block_style=do_not_change
+resharper_simple_case_statement_style=do_not_change
+resharper_simple_embedded_statement_style=do_not_change
+resharper_single_statement_function_style=do_not_change
+resharper_sort_attributes=false
+resharper_sort_class_selectors=false
+resharper_sort_usings=true
+resharper_sort_usings_lowercase_first=false
+resharper_spaces_around_eq_in_attribute=false
+resharper_spaces_around_eq_in_pi_attribute=false
+resharper_spaces_inside_tags=false
+resharper_space_after_arrow=true
+resharper_space_after_attributes=true
+resharper_space_after_attribute_target_colon=true
+resharper_space_after_cast=false
+resharper_space_after_colon=true
+resharper_space_after_colon_in_case=true
+resharper_space_after_colon_in_inheritance_clause=true
+resharper_space_after_colon_in_type_annotation=true
+resharper_space_after_comma=true
+resharper_space_after_for_colon=true
+resharper_space_after_function_comma=true
+resharper_space_after_keywords_in_control_flow_statements=true
+resharper_space_after_last_attribute=false
+resharper_space_after_last_pi_attribute=false
+resharper_space_after_media_colon=true
+resharper_space_after_media_comma=true
+resharper_space_after_operator_keyword=true
+resharper_space_after_property_colon=true
+resharper_space_after_property_semicolon=true
+resharper_space_after_ptr_in_data_member=true
+resharper_space_after_ptr_in_data_members=false
+resharper_space_after_ptr_in_method=true
+resharper_space_after_ref_in_data_member=true
+resharper_space_after_ref_in_data_members=false
+resharper_space_after_ref_in_method=true
+resharper_space_after_selector_comma=true
+resharper_space_after_semicolon_in_for_statement=true
+resharper_space_after_separator=false
+resharper_space_after_ternary_colon=true
+resharper_space_after_ternary_quest=true
+resharper_space_after_triple_slash=true
+resharper_space_after_type_parameter_constraint_colon=true
+resharper_space_around_additive_op=true
+resharper_space_around_alias_eq=true
+resharper_space_around_assignment_op=true
+resharper_space_around_assignment_operator=true
+resharper_space_around_attribute_match_operator=false
+resharper_space_around_deref_in_trailing_return_type=true
+resharper_space_around_lambda_arrow=true
+resharper_space_around_member_access_operator=false
+resharper_space_around_operator=true
+resharper_space_around_pipe_or_amper_in_type_usage=true
+resharper_space_around_relational_op=true
+resharper_space_around_selector_operator=true
+resharper_space_around_shift_op=true
+resharper_space_around_stmt_colon=true
+resharper_space_around_ternary_operator=true
+resharper_space_before_array_rank_parentheses=false
+resharper_space_before_arrow=true
+resharper_space_before_attribute_target_colon=false
+resharper_space_before_checked_parentheses=false
+resharper_space_before_colon=false
+resharper_space_before_colon_in_case=false
+resharper_space_before_colon_in_inheritance_clause=true
+resharper_space_before_colon_in_type_annotation=false
+resharper_space_before_comma=false
+resharper_space_before_default_parentheses=false
+resharper_space_before_empty_invocation_parentheses=false
+resharper_space_before_empty_method_parentheses=false
+resharper_space_before_for_colon=true
+resharper_space_before_function_comma=false
+resharper_space_before_initializer_braces=false
+resharper_space_before_invocation_parentheses=false
+resharper_space_before_label_colon=false
+resharper_space_before_lambda_parentheses=false
+resharper_space_before_media_colon=false
+resharper_space_before_media_comma=false
+resharper_space_before_method_parentheses=false
+resharper_space_before_nameof_parentheses=false
+resharper_space_before_new_parentheses=false
+resharper_space_before_nullable_mark=false
+resharper_space_before_open_square_brackets=false
+resharper_space_before_pointer_asterik_declaration=false
+resharper_space_before_property_colon=false
+resharper_space_before_property_semicolon=false
+resharper_space_before_ptr_in_abstract_decl=false
+resharper_space_before_ptr_in_data_member=false
+resharper_space_before_ptr_in_data_members=true
+resharper_space_before_ptr_in_method=false
+resharper_space_before_ref_in_abstract_decl=false
+resharper_space_before_ref_in_data_member=false
+resharper_space_before_ref_in_data_members=true
+resharper_space_before_ref_in_method=false
+resharper_space_before_selector_comma=false
+resharper_space_before_semicolon=false
+resharper_space_before_semicolon_in_for_statement=false
+resharper_space_before_separator=false
+resharper_space_before_singleline_accessorholder=true
+resharper_space_before_sizeof_parentheses=false
+resharper_space_before_template_args=false
+resharper_space_before_template_params=true
+resharper_space_before_ternary_colon=true
+resharper_space_before_ternary_quest=true
+resharper_space_before_trailing_comment=true
+resharper_space_before_typeof_parentheses=false
+resharper_space_before_type_argument_angle=false
+resharper_space_before_type_parameters_brackets=false
+resharper_space_before_type_parameter_angle=false
+resharper_space_before_type_parameter_constraint_colon=true
+resharper_space_before_type_parameter_parentheses=true
+resharper_space_between_accessors_in_singleline_property=true
+resharper_space_between_attribute_sections=true
+resharper_space_between_closing_angle_brackets_in_template_args=false
+resharper_space_between_empty_square_brackets=false
+resharper_space_between_keyword_and_expression=true
+resharper_space_between_keyword_and_type=true
+resharper_space_between_method_call_empty_parameter_list_parentheses=false
+resharper_space_between_method_call_name_and_opening_parenthesis=false
+resharper_space_between_method_call_parameter_list_parentheses=false
+resharper_space_between_method_declaration_empty_parameter_list_parentheses=false
+resharper_space_between_method_declaration_name_and_open_parenthesis=false
+resharper_space_between_method_declaration_parameter_list_parentheses=false
+resharper_space_between_parentheses_of_control_flow_statements=false
+resharper_space_between_square_brackets=false
+resharper_space_between_typecast_parentheses=false
+resharper_space_colon_after=true
+resharper_space_colon_before=false
+resharper_space_comma=true
+resharper_space_equals=true
+resharper_space_inside_braces=true
+resharper_space_in_singleline_accessorholder=true
+resharper_space_in_singleline_anonymous_method=true
+resharper_space_in_singleline_method=true
+resharper_space_near_postfix_and_prefix_op=false
+resharper_space_within_array_initialization_braces=false
+resharper_space_within_array_rank_empty_parentheses=false
+resharper_space_within_array_rank_parentheses=false
+resharper_space_within_attribute_angles=false
+resharper_space_within_attribute_match_brackets=false
+resharper_space_within_checked_parentheses=false
+resharper_space_within_default_parentheses=false
+resharper_space_within_empty_braces=true
+resharper_space_within_empty_initializer_braces=false
+resharper_space_within_empty_invocation_parentheses=false
+resharper_space_within_empty_method_parentheses=false
+resharper_space_within_empty_object_literal_braces=false
+resharper_space_within_empty_template_params=false
+resharper_space_within_expression_parentheses=false
+resharper_space_within_function_parentheses=false
+resharper_space_within_import_braces=true
+resharper_space_within_initializer_braces=false
+resharper_space_within_invocation_parentheses=false
+resharper_space_within_media_block=true
+resharper_space_within_media_parentheses=false
+resharper_space_within_method_parentheses=false
+resharper_space_within_nameof_parentheses=false
+resharper_space_within_new_parentheses=false
+resharper_space_within_object_literal_braces=true
+resharper_space_within_parentheses=false
+resharper_space_within_property_block=true
+resharper_space_within_single_line_array_initializer_braces=true
+resharper_space_within_sizeof_parentheses=false
+resharper_space_within_template_args=false
+resharper_space_within_template_argument=false
+resharper_space_within_template_params=false
+resharper_space_within_tuple_parentheses=false
+resharper_space_within_typeof_parentheses=false
+resharper_space_within_type_argument_angles=false
+resharper_space_within_type_parameters_brackets=false
+resharper_space_within_type_parameter_angles=false
+resharper_space_within_type_parameter_parentheses=false
+resharper_special_else_if_treatment=true
+resharper_static_members_qualify_members=none
+resharper_static_members_qualify_with=declared_type
+resharper_stick_comment=true
+resharper_support_vs_event_naming_pattern=true
+resharper_termination_style=ensure_semicolon
+resharper_toplevel_function_declaration_return_type_style=do_not_change
+resharper_toplevel_function_definition_return_type_style=do_not_change
+resharper_trailing_comma_in_multiline_lists=true
+resharper_trailing_comma_in_singleline_lists=false
+resharper_types_braces=end_of_line
+resharper_use_continuous_indent_inside_initializer_braces=true
+resharper_use_continuous_indent_inside_parens=true
+resharper_use_continuous_line_indent_in_expression_braces=false
+resharper_use_continuous_line_indent_in_method_pars=false
+resharper_use_heuristics_for_body_style=true
+resharper_use_indents_from_main_language_in_file=true
+resharper_use_indent_from_previous_element=true
+resharper_use_indent_from_vs=false
+resharper_use_roslyn_logic_for_evident_types=false
+resharper_vb_align_multiline_argument=true
+resharper_vb_align_multiline_expression=true
+resharper_vb_align_multiline_parameter=true
+resharper_vb_align_multiple_declaration=true
+resharper_vb_insert_final_newline=false
+resharper_vb_max_line_length=120
+resharper_vb_place_field_attribute_on_same_line=true
+resharper_vb_place_method_attribute_on_same_line=false
+resharper_vb_place_type_attribute_on_same_line=false
+resharper_vb_prefer_qualified_reference=false
+resharper_vb_space_after_unary_operator=true
+resharper_vb_space_around_multiplicative_op=false
+resharper_vb_wrap_arguments_style=wrap_if_long
+resharper_vb_wrap_before_binary_opsign=false
+resharper_vb_wrap_lines=true
+resharper_vb_wrap_parameters_style=wrap_if_long
+resharper_wrap_after_binary_opsign=true
+resharper_wrap_after_declaration_lpar=false
+resharper_wrap_after_dot=false
+resharper_wrap_after_dot_in_method_calls=false
+resharper_wrap_after_expression_lbrace=true
+resharper_wrap_after_invocation_lpar=false
+resharper_wrap_around_elements=true
+resharper_wrap_array_initializer_style=chop_always
+resharper_wrap_array_literals=chop_if_long
+resharper_wrap_base_clause_style=wrap_if_long
+resharper_wrap_before_arrow_with_expressions=true
+resharper_wrap_before_binary_pattern_op=true
+resharper_wrap_before_colon=false
+resharper_wrap_before_comma=false
+resharper_wrap_before_comma_in_base_clause=false
+resharper_wrap_before_declaration_lpar=false
+resharper_wrap_before_declaration_rpar=false
+resharper_wrap_before_dot=true
+resharper_wrap_before_eq=false
+resharper_wrap_before_expression_rbrace=true
+resharper_wrap_before_extends_colon=false
+resharper_wrap_before_first_type_parameter_constraint=false
+resharper_wrap_before_invocation_lpar=false
+resharper_wrap_before_invocation_rpar=false
+resharper_wrap_before_linq_expression=false
+resharper_wrap_before_ternary_opsigns=true
+resharper_wrap_before_type_parameter_langle=false
+resharper_wrap_braced_init_list_style=wrap_if_long
+resharper_wrap_chained_binary_expressions=chop_if_long
+resharper_wrap_chained_binary_patterns=wrap_if_long
+resharper_wrap_chained_method_calls=wrap_if_long
+resharper_wrap_ctor_initializer_style=wrap_if_long
+resharper_wrap_enumeration_style=chop_if_long
+resharper_wrap_enum_declaration=chop_always
+resharper_wrap_enum_style=do_not_change
+resharper_wrap_extends_list_style=wrap_if_long
+resharper_wrap_imports=chop_if_long
+resharper_wrap_multiple_declaration_style=chop_if_long
+resharper_wrap_multiple_type_parameter_constraints_style=chop_if_long
+resharper_wrap_object_literals=chop_if_long
+resharper_wrap_property_pattern=chop_if_long
+resharper_wrap_switch_expression=chop_always
+resharper_wrap_ternary_expr_style=chop_if_long
+resharper_wrap_union_type_usage=chop_if_long
+resharper_wrap_verbatim_interpolated_strings=no_wrap
+resharper_xmldoc_attribute_indent=single_indent
+resharper_xmldoc_insert_final_newline=false
+resharper_xmldoc_linebreak_before_elements=summary,remarks,example,returns,param,typeparam,value,para
+resharper_xmldoc_max_blank_lines_between_tags=0
+resharper_xmldoc_max_line_length=120
+resharper_xmldoc_pi_attribute_style=do_not_touch
+resharper_xmldoc_space_before_self_closing=true
+resharper_xmldoc_wrap_lines=true
+resharper_xmldoc_wrap_tags_and_pi=true
+resharper_xmldoc_wrap_text=true
+resharper_xml_attribute_indent=align_by_first_attribute
+resharper_xml_insert_final_newline=false
+resharper_xml_linebreak_before_elements=
+resharper_xml_max_blank_lines_between_tags=2
+resharper_xml_max_line_length=120
+resharper_xml_pi_attribute_style=do_not_touch
+resharper_xml_space_before_self_closing=true
+resharper_xml_wrap_lines=true
+resharper_xml_wrap_tags_and_pi=true
+resharper_xml_wrap_text=false
+
+# ReSharper inspection severities
+resharper_abstract_class_constructor_can_be_made_protected_highlighting=hint
+resharper_access_rights_in_text_highlighting=warning
+resharper_access_to_disposed_closure_highlighting=warning
+resharper_access_to_for_each_variable_in_closure_highlighting=warning
+resharper_access_to_modified_closure_highlighting=warning
+resharper_access_to_static_member_via_derived_type_highlighting=warning
+resharper_address_of_marshal_by_ref_object_highlighting=warning
+resharper_amd_dependency_path_problem_highlighting=none
+resharper_amd_external_module_highlighting=suggestion
+resharper_angular_html_banana_highlighting=warning
+resharper_annotate_can_be_null_parameter_highlighting=none
+resharper_annotate_can_be_null_type_member_highlighting=none
+resharper_annotate_not_null_parameter_highlighting=none
+resharper_annotate_not_null_type_member_highlighting=none
+resharper_annotation_conflict_in_hierarchy_highlighting=warning
+resharper_annotation_redundancy_at_value_type_highlighting=warning
+resharper_annotation_redundancy_in_hierarchy_highlighting=warning
+resharper_arguments_style_anonymous_function_highlighting=hint
+resharper_arguments_style_literal_highlighting=hint
+resharper_arguments_style_named_expression_highlighting=hint
+resharper_arguments_style_other_highlighting=hint
+resharper_arguments_style_string_literal_highlighting=hint
+resharper_arrange_accessor_owner_body_highlighting=suggestion
+resharper_arrange_attributes_highlighting=none
+resharper_arrange_constructor_or_destructor_body_highlighting=hint
+resharper_arrange_default_value_when_type_evident_highlighting=suggestion
+resharper_arrange_default_value_when_type_not_evident_highlighting=hint
+resharper_arrange_local_function_body_highlighting=hint
+resharper_arrange_method_or_operator_body_highlighting=hint
+resharper_arrange_missing_parentheses_highlighting=hint
+resharper_arrange_namespace_body_highlighting=hint
+resharper_arrange_object_creation_when_type_evident_highlighting=suggestion
+resharper_arrange_object_creation_when_type_not_evident_highlighting=hint
+resharper_arrange_redundant_parentheses_highlighting=hint
+resharper_arrange_static_member_qualifier_highlighting=hint
+resharper_arrange_this_qualifier_highlighting=hint
+resharper_arrange_trailing_comma_in_multiline_lists_highlighting=hint
+resharper_arrange_trailing_comma_in_singleline_lists_highlighting=hint
+resharper_arrange_type_member_modifiers_highlighting=hint
+resharper_arrange_type_modifiers_highlighting=hint
+resharper_arrange_var_keywords_in_deconstructing_declaration_highlighting=suggestion
+resharper_asp_content_placeholder_not_resolved_highlighting=error
+resharper_asp_custom_page_parser_filter_type_highlighting=warning
+resharper_asp_dead_code_highlighting=warning
+resharper_asp_entity_highlighting=warning
+resharper_asp_image_highlighting=warning
+resharper_asp_invalid_control_type_highlighting=error
+resharper_asp_not_resolved_highlighting=error
+resharper_asp_ods_method_reference_resolve_error_highlighting=error
+resharper_asp_resolve_warning_highlighting=warning
+resharper_asp_skin_not_resolved_highlighting=error
+resharper_asp_tag_attribute_with_optional_value_highlighting=warning
+resharper_asp_theme_not_resolved_highlighting=error
+resharper_asp_unused_register_directive_highlighting_highlighting=warning
+resharper_asp_warning_highlighting=warning
+resharper_assigned_value_is_never_used_highlighting=warning
+resharper_assigned_value_wont_be_assigned_to_corresponding_field_highlighting=warning
+resharper_assignment_in_conditional_expression_highlighting=warning
+resharper_assignment_in_condition_expression_highlighting=warning
+resharper_assignment_is_fully_discarded_highlighting=warning
+resharper_assign_null_to_not_null_attribute_highlighting=warning
+resharper_assign_to_constant_highlighting=error
+resharper_assign_to_implicit_global_in_function_scope_highlighting=warning
+resharper_asxx_path_error_highlighting=warning
+resharper_async_iterator_invocation_without_await_foreach_highlighting=warning
+resharper_async_void_lambda_highlighting=warning
+resharper_async_void_method_highlighting=none
+resharper_auto_property_can_be_made_get_only_global_highlighting=suggestion
+resharper_auto_property_can_be_made_get_only_local_highlighting=suggestion
+resharper_bad_attribute_brackets_spaces_highlighting=none
+resharper_bad_braces_spaces_highlighting=none
+resharper_bad_child_statement_indent_highlighting=warning
+resharper_bad_colon_spaces_highlighting=none
+resharper_bad_comma_spaces_highlighting=none
+resharper_bad_control_braces_indent_highlighting=suggestion
+resharper_bad_control_braces_line_breaks_highlighting=none
+resharper_bad_declaration_braces_indent_highlighting=none
+resharper_bad_declaration_braces_line_breaks_highlighting=none
+resharper_bad_empty_braces_line_breaks_highlighting=none
+resharper_bad_expression_braces_indent_highlighting=none
+resharper_bad_expression_braces_line_breaks_highlighting=none
+resharper_bad_generic_brackets_spaces_highlighting=none
+resharper_bad_indent_highlighting=none
+resharper_bad_linq_line_breaks_highlighting=none
+resharper_bad_list_line_breaks_highlighting=none
+resharper_bad_member_access_spaces_highlighting=none
+resharper_bad_namespace_braces_indent_highlighting=none
+resharper_bad_parens_line_breaks_highlighting=none
+resharper_bad_parens_spaces_highlighting=none
+resharper_bad_preprocessor_indent_highlighting=none
+resharper_bad_semicolon_spaces_highlighting=none
+resharper_bad_spaces_after_keyword_highlighting=none
+resharper_bad_square_brackets_spaces_highlighting=none
+resharper_bad_switch_braces_indent_highlighting=none
+resharper_bad_symbol_spaces_highlighting=none
+resharper_base_member_has_params_highlighting=warning
+resharper_base_method_call_with_default_parameter_highlighting=warning
+resharper_base_object_equals_is_object_equals_highlighting=warning
+resharper_base_object_get_hash_code_call_in_get_hash_code_highlighting=warning
+resharper_bitwise_operator_on_enum_without_flags_highlighting=warning
+resharper_block_scope_redeclaration_highlighting=error
+resharper_built_in_type_reference_style_for_member_access_highlighting=hint
+resharper_built_in_type_reference_style_highlighting=hint
+resharper_by_ref_argument_is_volatile_field_highlighting=warning
+resharper_caller_callee_using_error_highlighting=error
+resharper_caller_callee_using_highlighting=warning
+resharper_cannot_apply_equality_operator_to_type_highlighting=warning
+resharper_center_tag_is_obsolete_highlighting=warning
+resharper_check_for_reference_equality_instead_1_highlighting=suggestion
+resharper_check_for_reference_equality_instead_2_highlighting=suggestion
+resharper_check_for_reference_equality_instead_3_highlighting=suggestion
+resharper_check_for_reference_equality_instead_4_highlighting=suggestion
+resharper_check_namespace_highlighting=warning
+resharper_class_cannot_be_instantiated_highlighting=warning
+resharper_class_can_be_sealed_global_highlighting=none
+resharper_class_can_be_sealed_local_highlighting=none
+resharper_class_highlighting=suggestion
+resharper_class_never_instantiated_global_highlighting=suggestion
+resharper_class_never_instantiated_local_highlighting=suggestion
+resharper_class_with_virtual_members_never_inherited_global_highlighting=suggestion
+resharper_class_with_virtual_members_never_inherited_local_highlighting=suggestion
+resharper_clear_attribute_is_obsolete_all_highlighting=warning
+resharper_clear_attribute_is_obsolete_highlighting=warning
+resharper_closure_on_modified_variable_highlighting=warning
+resharper_coerced_equals_using_highlighting=warning
+resharper_coerced_equals_using_with_null_undefined_highlighting=none
+resharper_collection_never_queried_global_highlighting=warning
+resharper_collection_never_queried_local_highlighting=warning
+resharper_collection_never_updated_global_highlighting=warning
+resharper_collection_never_updated_local_highlighting=warning
+resharper_comma_not_valid_here_highlighting=error
+resharper_comment_typo_highlighting=suggestion
+resharper_common_js_external_module_highlighting=suggestion
+resharper_compare_non_constrained_generic_with_null_highlighting=none
+resharper_compare_of_floats_by_equality_operator_highlighting=none
+resharper_conditional_ternary_equal_branch_highlighting=warning
+resharper_condition_is_always_const_highlighting=warning
+resharper_condition_is_always_true_or_false_highlighting=warning
+resharper_confusing_char_as_integer_in_constructor_highlighting=warning
+resharper_constant_conditional_access_qualifier_highlighting=warning
+resharper_constant_null_coalescing_condition_highlighting=warning
+resharper_constructor_call_not_used_highlighting=warning
+resharper_constructor_initializer_loop_highlighting=warning
+resharper_container_annotation_redundancy_highlighting=warning
+resharper_context_value_is_provided_highlighting=none
+resharper_contract_annotation_not_parsed_highlighting=warning
+resharper_convert_closure_to_method_group_highlighting=suggestion
+resharper_convert_conditional_ternary_expression_to_switch_expression_highlighting=hint
+resharper_convert_if_do_to_while_highlighting=suggestion
+resharper_convert_if_statement_to_conditional_ternary_expression_highlighting=suggestion
+resharper_convert_if_statement_to_null_coalescing_assignment_highlighting=suggestion
+resharper_convert_if_statement_to_null_coalescing_expression_highlighting=suggestion
+resharper_convert_if_statement_to_return_statement_highlighting=hint
+resharper_convert_if_statement_to_switch_expression_highlighting=hint
+resharper_convert_if_statement_to_switch_statement_highlighting=hint
+resharper_convert_if_to_or_expression_highlighting=suggestion
+resharper_convert_nullable_to_short_form_highlighting=suggestion
+resharper_convert_switch_statement_to_switch_expression_highlighting=hint
+resharper_convert_to_auto_property_highlighting=suggestion
+resharper_convert_to_auto_property_when_possible_highlighting=hint
+resharper_convert_to_auto_property_with_private_setter_highlighting=hint
+resharper_convert_to_compound_assignment_highlighting=hint
+resharper_convert_to_constant_global_highlighting=hint
+resharper_convert_to_constant_local_highlighting=hint
+resharper_convert_to_lambda_expression_highlighting=suggestion
+resharper_convert_to_lambda_expression_when_possible_highlighting=none
+resharper_convert_to_local_function_highlighting=suggestion
+resharper_convert_to_null_coalescing_compound_assignment_highlighting=suggestion
+resharper_convert_to_primary_constructor_highlighting=suggestion
+resharper_convert_to_static_class_highlighting=suggestion
+resharper_convert_to_using_declaration_highlighting=suggestion
+resharper_convert_to_vb_auto_property_highlighting=suggestion
+resharper_convert_to_vb_auto_property_when_possible_highlighting=hint
+resharper_convert_to_vb_auto_property_with_private_setter_highlighting=hint
+resharper_convert_type_check_pattern_to_null_check_highlighting=warning
+resharper_convert_type_check_to_null_check_highlighting=warning
+resharper_co_variant_array_conversion_highlighting=warning
+resharper_cpp_abstract_class_without_specifier_highlighting=warning
+resharper_cpp_abstract_final_class_highlighting=warning
+resharper_cpp_abstract_virtual_function_call_in_ctor_highlighting=error
+resharper_cpp_access_specifier_with_no_declarations_highlighting=suggestion
+resharper_cpp_assigned_value_is_never_used_highlighting=warning
+resharper_cpp_awaiter_type_is_not_class_highlighting=warning
+resharper_cpp_bad_angle_brackets_spaces_highlighting=none
+resharper_cpp_bad_braces_spaces_highlighting=none
+resharper_cpp_bad_child_statement_indent_highlighting=none
+resharper_cpp_bad_colon_spaces_highlighting=none
+resharper_cpp_bad_comma_spaces_highlighting=none
+resharper_cpp_bad_control_braces_indent_highlighting=none
+resharper_cpp_bad_control_braces_line_breaks_highlighting=none
+resharper_cpp_bad_declaration_braces_indent_highlighting=none
+resharper_cpp_bad_declaration_braces_line_breaks_highlighting=none
+resharper_cpp_bad_empty_braces_line_breaks_highlighting=none
+resharper_cpp_bad_expression_braces_indent_highlighting=none
+resharper_cpp_bad_expression_braces_line_breaks_highlighting=none
+resharper_cpp_bad_indent_highlighting=none
+resharper_cpp_bad_list_line_breaks_highlighting=none
+resharper_cpp_bad_member_access_spaces_highlighting=none
+resharper_cpp_bad_namespace_braces_indent_highlighting=none
+resharper_cpp_bad_parens_line_breaks_highlighting=none
+resharper_cpp_bad_parens_spaces_highlighting=none
+resharper_cpp_bad_semicolon_spaces_highlighting=none
+resharper_cpp_bad_spaces_after_keyword_highlighting=none
+resharper_cpp_bad_square_brackets_spaces_highlighting=none
+resharper_cpp_bad_switch_braces_indent_highlighting=none
+resharper_cpp_bad_symbol_spaces_highlighting=none
+resharper_cpp_boolean_increment_expression_highlighting=warning
+resharper_cpp_boost_format_bad_code_highlighting=warning
+resharper_cpp_boost_format_legacy_code_highlighting=suggestion
+resharper_cpp_boost_format_mixed_args_highlighting=error
+resharper_cpp_boost_format_too_few_args_highlighting=error
+resharper_cpp_boost_format_too_many_args_highlighting=warning
+resharper_cpp_clang_tidy_abseil_duration_addition_highlighting=none
+resharper_cpp_clang_tidy_abseil_duration_comparison_highlighting=none
+resharper_cpp_clang_tidy_abseil_duration_conversion_cast_highlighting=none
+resharper_cpp_clang_tidy_abseil_duration_division_highlighting=none
+resharper_cpp_clang_tidy_abseil_duration_factory_float_highlighting=none
+resharper_cpp_clang_tidy_abseil_duration_factory_scale_highlighting=none
+resharper_cpp_clang_tidy_abseil_duration_subtraction_highlighting=none
+resharper_cpp_clang_tidy_abseil_duration_unnecessary_conversion_highlighting=none
+resharper_cpp_clang_tidy_abseil_faster_strsplit_delimiter_highlighting=none
+resharper_cpp_clang_tidy_abseil_no_internal_dependencies_highlighting=none
+resharper_cpp_clang_tidy_abseil_no_namespace_highlighting=none
+resharper_cpp_clang_tidy_abseil_redundant_strcat_calls_highlighting=none
+resharper_cpp_clang_tidy_abseil_string_find_startswith_highlighting=none
+resharper_cpp_clang_tidy_abseil_string_find_str_contains_highlighting=none
+resharper_cpp_clang_tidy_abseil_str_cat_append_highlighting=none
+resharper_cpp_clang_tidy_abseil_time_comparison_highlighting=none
+resharper_cpp_clang_tidy_abseil_time_subtraction_highlighting=none
+resharper_cpp_clang_tidy_abseil_upgrade_duration_conversions_highlighting=none
+resharper_cpp_clang_tidy_altera_id_dependent_backward_branch_highlighting=none
+resharper_cpp_clang_tidy_altera_kernel_name_restriction_highlighting=none
+resharper_cpp_clang_tidy_altera_single_work_item_barrier_highlighting=none
+resharper_cpp_clang_tidy_altera_struct_pack_align_highlighting=none
+resharper_cpp_clang_tidy_altera_unroll_loops_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_accept4_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_accept_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_creat_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_dup_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_epoll_create1_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_epoll_create_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_fopen_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_inotify_init1_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_inotify_init_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_memfd_create_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_open_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_pipe2_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_pipe_highlighting=none
+resharper_cpp_clang_tidy_android_cloexec_socket_highlighting=none
+resharper_cpp_clang_tidy_android_comparison_in_temp_failure_retry_highlighting=none
+resharper_cpp_clang_tidy_boost_use_to_string_highlighting=suggestion
+resharper_cpp_clang_tidy_bugprone_argument_comment_highlighting=suggestion
+resharper_cpp_clang_tidy_bugprone_assert_side_effect_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_bad_signal_to_kill_thread_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_bool_pointer_implicit_conversion_highlighting=none
+resharper_cpp_clang_tidy_bugprone_branch_clone_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_copy_constructor_init_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_dangling_handle_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_dynamic_static_initializers_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_easily_swappable_parameters_highlighting=none
+resharper_cpp_clang_tidy_bugprone_exception_escape_highlighting=none
+resharper_cpp_clang_tidy_bugprone_fold_init_type_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_forwarding_reference_overload_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_forward_declaration_namespace_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_implicit_widening_of_multiplication_result_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_inaccurate_erase_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_incorrect_roundings_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_infinite_loop_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_integer_division_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_lambda_function_name_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_macro_parentheses_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_macro_repeated_side_effects_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_misplaced_operator_in_strlen_in_alloc_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_misplaced_pointer_arithmetic_in_alloc_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_misplaced_widening_cast_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_move_forwarding_reference_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_multiple_statement_macro_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_narrowing_conversions_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_not_null_terminated_result_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_no_escape_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_parent_virtual_call_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_posix_return_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_redundant_branch_condition_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_reserved_identifier_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_signal_handler_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_signed_char_misuse_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_sizeof_container_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_sizeof_expression_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_spuriously_wake_up_functions_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_string_constructor_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_string_integer_assignment_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_string_literal_with_embedded_nul_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_suspicious_enum_usage_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_suspicious_include_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_suspicious_memset_usage_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_suspicious_missing_comma_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_suspicious_semicolon_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_suspicious_string_compare_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_swapped_arguments_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_terminating_continue_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_throw_keyword_missing_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_too_small_loop_variable_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_undefined_memory_manipulation_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_undelegated_constructor_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_unhandled_exception_at_new_highlighting=none
+resharper_cpp_clang_tidy_bugprone_unhandled_self_assignment_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_unused_raii_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_unused_return_value_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_use_after_move_highlighting=warning
+resharper_cpp_clang_tidy_bugprone_virtual_near_miss_highlighting=suggestion
+resharper_cpp_clang_tidy_cert_con36_c_highlighting=none
+resharper_cpp_clang_tidy_cert_con54_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_dcl03_c_highlighting=none
+resharper_cpp_clang_tidy_cert_dcl16_c_highlighting=none
+resharper_cpp_clang_tidy_cert_dcl21_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_dcl37_c_highlighting=none
+resharper_cpp_clang_tidy_cert_dcl50_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_dcl51_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_dcl54_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_dcl58_cpp_highlighting=warning
+resharper_cpp_clang_tidy_cert_dcl59_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_env33_c_highlighting=none
+resharper_cpp_clang_tidy_cert_err09_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_err34_c_highlighting=suggestion
+resharper_cpp_clang_tidy_cert_err52_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_err58_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_err60_cpp_highlighting=warning
+resharper_cpp_clang_tidy_cert_err61_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_fio38_c_highlighting=none
+resharper_cpp_clang_tidy_cert_flp30_c_highlighting=warning
+resharper_cpp_clang_tidy_cert_mem57_cpp_highlighting=warning
+resharper_cpp_clang_tidy_cert_msc30_c_highlighting=none
+resharper_cpp_clang_tidy_cert_msc32_c_highlighting=none
+resharper_cpp_clang_tidy_cert_msc50_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_msc51_cpp_highlighting=warning
+resharper_cpp_clang_tidy_cert_oop11_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_oop54_cpp_highlighting=none
+resharper_cpp_clang_tidy_cert_oop57_cpp_highlighting=warning
+resharper_cpp_clang_tidy_cert_oop58_cpp_highlighting=warning
+resharper_cpp_clang_tidy_cert_pos44_c_highlighting=none
+resharper_cpp_clang_tidy_cert_pos47_c_highlighting=none
+resharper_cpp_clang_tidy_cert_sig30_c_highlighting=none
+resharper_cpp_clang_tidy_cert_str34_c_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_api_modeling_google_g_test_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_cast_value_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_api_modeling_llvm_return_value_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_api_modeling_std_c_library_functions_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_api_modeling_trust_nonnull_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_builtin_builtin_functions_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_builtin_no_return_functions_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_call_and_message_modeling_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_divide_zero_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_dynamic_type_propagation_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_nonnil_string_constants_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_non_null_param_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_null_dereference_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_stack_address_escape_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_stack_addr_escape_base_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_undefined_binary_operator_result_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_array_subscript_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_assign_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_branch_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_captured_block_variable_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_uninitialized_undef_return_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_core_vla_size_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_inner_pointer_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_move_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_new_delete_leaks_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_placement_new_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_pure_virtual_call_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_self_assignment_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_smart_ptr_modeling_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_cplusplus_virtual_call_modeling_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_deadcode_dead_stores_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_fuchsia_handle_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_nullability_nullability_base_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_dereferenced_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_passed_to_nonnull_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_nullability_nullable_returned_from_nonnull_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_nullability_null_passed_to_nonnull_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_nullability_null_returned_from_nonnull_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_uninitialized_object_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_cplusplus_virtual_call_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_mpi_mpi_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_empty_localization_context_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_osx_cocoa_localizability_non_localized_string_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_osx_os_object_c_style_cast_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_performance_gcd_antipattern_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_performance_padding_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_optin_portability_unix_api_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_api_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_at_sync_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_autorelease_write_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_class_release_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_dealloc_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_incompatible_method_types_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_loops_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_missing_super_call_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_nil_arg_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_non_nil_return_value_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_autorelease_pool_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_ns_error_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_obj_c_generics_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_base_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_retain_count_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_run_loop_autorelease_leak_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_self_init_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_super_dealloc_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_unused_ivars_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_cocoa_variadic_method_types_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_error_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_number_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_cf_retain_release_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_out_of_bounds_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_core_foundation_containers_pointer_sized_values_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_mig_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_ns_or_cf_error_deref_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_number_object_conversion_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_obj_c_property_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_os_object_retain_count_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_osx_sec_keychain_api_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_float_loop_counter_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcmp_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bcopy_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_bzero_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_decode_value_of_obj_c_type_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_deprecated_or_unsafe_buffer_handling_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_getpw_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_gets_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mkstemp_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_mktemp_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_rand_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_security_syntax_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_strcpy_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_unchecked_return_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_security_insecure_api_vfork_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_api_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_bad_size_arg_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_c_string_modeling_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_cstring_null_arg_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_dynamic_memory_modeling_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_malloc_sizeof_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_mismatched_deallocator_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_unix_vfork_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_valist_copy_to_self_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_valist_uninitialized_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_valist_unterminated_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_valist_valist_base_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_webkit_no_uncounted_member_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_webkit_ref_cntbl_base_virtual_dtor_highlighting=none
+resharper_cpp_clang_tidy_clang_analyzer_webkit_uncounted_lambda_captures_checker_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_absolute_value_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_abstract_final_class_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_abstract_vbase_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_address_of_packed_member_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_address_of_temporary_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_aix_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_align_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_alloca_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_alloca_with_align_alignof_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_delete_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_ellipsis_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_macro_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_member_template_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ambiguous_reversed_operator_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_analyzer_incompatible_plugin_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_anonymous_pack_parens_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_anon_enum_enum_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_arc_bridge_casts_disallowed_in_nonarc_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_arc_maybe_repeated_use_of_weak_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_arc_non_pod_memaccess_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_arc_perform_selector_leaks_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_arc_repeated_use_of_weak_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_arc_retain_cycles_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_arc_unsafe_retained_assign_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_argument_outside_range_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_array_bounds_pointer_arithmetic_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_asm_operand_widths_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_assign_enum_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_assume_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_atimport_in_framework_header_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_atomic_alignment_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_atomic_implicit_seq_cst_highlighting=suggestion
+resharper_cpp_clang_tidy_clang_diagnostic_atomic_memory_ordering_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_atomic_property_with_user_defined_accessor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_attribute_packed_for_bitfield_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_at_protocol_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_auto_disable_vptr_sanitizer_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_auto_import_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_auto_storage_class_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_auto_var_id_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_availability_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_avr_rtlib_linking_quirks_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_backslash_newline_escape_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bad_function_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_binding_in_condition_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bind_to_temporary_copy_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bitfield_constant_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bitfield_enum_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bitfield_width_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bitwise_conditional_parentheses_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bitwise_op_parentheses_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_block_capture_autoreleasing_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bool_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bool_operation_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_braced_scalar_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_bridge_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_builtin_assume_aligned_alignment_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_builtin_macro_redefined_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_builtin_memcpy_chk_size_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_builtin_requires_header_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_c11_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_c2x_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_c99_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_c99_designator_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_c99_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_called_once_parameter_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_call_to_pure_virtual_from_ctor_dtor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cast_align_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cast_calling_convention_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cast_function_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cast_of_sel_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cast_qual_unrelated_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cf_string_literal_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_char_subscripts_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_clang_cl_pch_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_class_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_class_varargs_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cmse_union_leak_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_comma_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_comment_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_compare_distinct_pointer_types_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_completion_handler_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_complex_component_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_macro_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_by_space_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_compound_token_split_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_concepts_ts_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_conditional_type_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_conditional_uninitialized_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_config_macros_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_constant_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_constant_evaluated_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_constant_logical_operand_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_constexpr_not_const_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_consumed_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_coroutine_missing_unhandled_exception_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_covered_switch_default_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_deprecated_writable_strings_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_compat_reserved_user_defined_literal_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_extra_semi_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_inline_namespace_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_long_long_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp11_narrowing_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp14_binary_literal_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp14_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp14_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_mangling_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp17_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp17_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp20_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp20_designator_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp20_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp2a_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp2b_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_bind_to_temporary_copy_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_extra_semi_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_local_type_template_args_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_compat_unnamed_type_template_args_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_binary_literal_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp98_cpp11_cpp14_cpp17_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cpp_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cstring_format_directive_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ctad_maybe_unsupported_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_ctu_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_cuda_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_custom_atomic_properties_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_cxx_attribute_extension_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dangling_else_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dangling_field_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dangling_gsl_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dangling_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dangling_initializer_list_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_darwin_sdk_settings_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_date_time_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dealloc_in_category_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_debug_compression_unavailable_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_declaration_after_statement_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_defaulted_function_deleted_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_delegating_ctor_cycles_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_delete_abstract_non_virtual_dtor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_delete_incomplete_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_delete_non_abstract_non_virtual_dtor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_delete_non_virtual_dtor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_altivec_src_compat_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_anon_enum_enum_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_array_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_attributes_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_comma_subscript_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_dtor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_copy_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_copy_with_user_provided_dtor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_declarations_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_dynamic_exception_spec_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_conditional_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_enum_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_enum_float_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_implementations_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_increment_bool_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_isa_usage_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_objc_pointer_introspection_perform_selector_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_register_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_this_capture_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_deprecated_volatile_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_direct_ivar_access_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_disabled_macro_expansion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_distributed_object_modifiers_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_division_by_zero_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dllexport_explicit_instantiation_decl_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dllimport_static_field_def_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dll_attribute_on_redeclaration_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_documentation_deprecated_sync_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_documentation_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_documentation_html_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_documentation_pedantic_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_documentation_unknown_command_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_dollar_in_identifier_extension_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_double_promotion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dtor_name_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dtor_typedef_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_duplicate_decl_specifier_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_duplicate_enum_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_arg_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_duplicate_method_match_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_duplicate_protocol_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dynamic_class_memaccess_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_dynamic_exception_spec_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_embedded_directive_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_empty_body_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_empty_decomposition_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_empty_init_stmt_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_empty_translation_unit_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_encode_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_conditional_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_enum_compare_switch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_enum_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_enum_enum_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_enum_float_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_enum_too_large_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_error_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_exceptions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_excess_initializers_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_exit_time_destructors_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_expansion_to_defined_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_explicit_initialize_call_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_explicit_ownership_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_export_unnamed_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_export_using_directive_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_extern_c_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_extern_initializer_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_extra_qualification_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_extra_semi_stmt_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_extra_tokens_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_final_dtor_non_final_class_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_fixed_enum_extension_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_fixed_point_overflow_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_flag_enum_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_flexible_array_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_float_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_float_equal_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_float_overflow_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_float_zero_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_extra_args_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_insufficient_args_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_invalid_specifier_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_nonliteral_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_non_iso_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_pedantic_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_security_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_type_confusion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_format_zero_length_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_fortify_source_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_for_loop_analysis_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_four_char_constants_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_framework_include_private_from_public_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_frame_address_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_frame_larger_than_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_free_nonheap_object_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_function_def_in_objc_container_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_function_multiversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gcc_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_global_constructors_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_global_isel_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_alignof_expression_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_anonymous_struct_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_array_member_paren_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_auto_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_binary_literal_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_case_range_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_complex_integer_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_compound_literal_initializer_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_conditional_omitted_operand_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_designator_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_initializer_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_empty_struct_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_initializer_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_flexible_array_union_member_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_folding_constant_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_imaginary_constant_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_include_next_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_inline_cpp_without_extern_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_label_as_value_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_redeclared_enum_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_statement_expression_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_static_float_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_string_literal_operator_template_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_union_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_variable_sized_type_not_at_end_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_gnu_zero_variadic_macro_arguments_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_header_guard_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_header_hygiene_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_hip_only_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_idiomatic_parentheses_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ignored_attributes_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_ignored_availability_without_sdk_settings_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_ignored_optimization_argument_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragmas_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_intrinsic_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ignored_pragma_optimize_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_ignored_qualifiers_highlighting=suggestion
+resharper_cpp_clang_tidy_clang_diagnostic_implicitly_unsigned_literal_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_atomic_properties_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_const_int_float_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_conversion_floating_point_to_bool_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_exception_spec_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_fallthrough_per_function_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_fixed_point_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_float_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_function_declaration_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_float_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_int_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_implicit_retain_self_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_import_preprocessor_directive_pedantic_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_inaccessible_base_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_include_next_absolute_path_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_include_next_outside_header_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incompatible_exception_spec_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incompatible_function_pointer_types_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incompatible_library_redeclaration_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incompatible_ms_struct_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_discards_qualifiers_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incompatible_pointer_types_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incompatible_property_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incompatible_sysroot_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incomplete_framework_module_declaration_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incomplete_implementation_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incomplete_module_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incomplete_setjmp_declaration_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_incomplete_umbrella_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_dllimport_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_destructor_override_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_inconsistent_missing_override_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_increment_bool_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_independent_class_attribute_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_infinite_recursion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_initializer_overrides_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_injected_class_name_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_inline_asm_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_inline_namespace_reopened_noninline_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_inline_new_delete_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_instantiation_after_specialization_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_integer_overflow_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_interrupt_service_routine_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_int_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_int_in_bool_context_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_int_to_pointer_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_int_to_void_pointer_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_constexpr_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_iboutlet_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_initializer_from_system_header_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_ios_deployment_target_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_noreturn_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_no_builtin_names_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_offsetof_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_or_nonexistent_directory_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_partial_specialization_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_pp_token_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_source_encoding_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_invalid_token_paste_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_jump_seh_finally_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_keyword_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_keyword_macro_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_knr_promoted_parameter_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_language_extension_token_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_large_by_value_copy_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_literal_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_literal_range_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_local_type_template_args_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_logical_not_parentheses_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_logical_op_parentheses_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_long_long_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_macro_redefined_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_main_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_main_return_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_malformed_warning_check_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_many_braces_around_scalar_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_max_tokens_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_max_unsigned_zero_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_memset_transposed_args_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_memsize_comparison_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_method_signatures_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_abstract_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_anon_tag_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_charize_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_comment_paste_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_const_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_cpp_macro_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_default_arg_redefinition_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_drectve_section_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_end_of_file_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_forward_reference_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_enum_value_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exception_spec_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_exists_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_explicit_constructor_call_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_extra_qualification_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_fixed_enum_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_flexible_array_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_goto_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_inaccessible_base_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_include_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_mutable_reference_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_pure_definition_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_redeclare_static_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_sealed_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_static_assert_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_template_shadow_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_union_member_reference_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_unqualified_friend_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_using_decl_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_microsoft_void_pseudo_dtor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_misleading_indentation_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_mismatched_new_delete_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_mismatched_parameter_types_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_mismatched_return_types_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_mismatched_tags_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_braces_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_constinit_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_declarations_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_exception_spec_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_field_initializers_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_method_return_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_noescape_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_noreturn_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_prototypes_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_missing_prototype_for_cc_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_selector_name_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_sysroot_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_missing_variable_declarations_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_misspelled_assumption_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_modules_ambiguous_internal_linkage_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_modules_import_nested_redundant_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_module_conflict_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_module_file_config_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_module_file_extension_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_module_import_in_extern_c_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_msvc_not_found_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_multichar_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_multiple_move_vbase_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nested_anon_types_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_newline_eof_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_new_returns_null_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_noderef_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nonnull_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nonportable_include_path_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nonportable_system_include_path_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nonportable_vector_initialization_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nontrivial_memaccess_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_non_c_typedef_for_linkage_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_non_literal_null_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_framework_module_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_non_modular_include_in_module_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_non_pod_varargs_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_non_power_of_two_alignment_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_non_virtual_dtor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nsconsumed_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nsreturns_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ns_object_attribute_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nullability_completeness_on_arrays_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nullability_declspec_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nullability_extension_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nullability_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nullability_inferred_on_nested_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_nullable_to_nonnull_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_null_arithmetic_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_null_character_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_null_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_null_dereference_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_arithmetic_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_null_pointer_subtraction_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_odr_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_old_style_cast_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_opencl_unsupported_rgba_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_openmp51_extensions_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_openmp_clauses_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_openmp_loop_form_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_openmp_mapping_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_openmp_target_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_option_ignored_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_ordered_compare_function_pointers_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_out_of_line_declaration_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_out_of_scope_function_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_overlength_strings_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_overloaded_shift_op_parentheses_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_overloaded_virtual_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_override_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_override_module_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_overriding_method_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_overriding_t_option_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_over_aligned_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_packed_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_padded_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_parentheses_equality_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_parentheses_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pass_failed_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pch_date_time_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pedantic_core_features_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pedantic_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pessimizing_move_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pointer_arith_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pointer_bool_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pointer_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pointer_integer_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pointer_sign_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_enum_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pointer_to_int_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pointer_type_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_poison_system_directories_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_potentially_evaluated_expression_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pragmas_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pragma_clang_attribute_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pragma_messages_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pragma_once_outside_header_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pragma_pack_suspicious_include_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pragma_system_header_outside_header_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_predefined_identifier_outside_function_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_c2x_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp14_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp17_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp20_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2b_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_cpp2b_compat_pedantic_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_pre_openmp51_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_private_extern_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_private_header_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_private_module_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_missing_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_out_of_date_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_profile_instr_unprofiled_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_property_access_dot_syntax_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_property_attribute_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_protocol_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_protocol_property_synthesis_ambiguity_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_psabi_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_qualified_void_return_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_quoted_include_in_framework_header_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_range_loop_analysis_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_range_loop_bind_reference_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_range_loop_construct_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_readonly_iboutlet_property_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_receiver_expr_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_receiver_forward_class_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_redeclared_class_member_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_redundant_move_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_redundant_parens_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_register_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_reinterpret_base_class_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_reorder_ctor_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_reorder_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_reorder_init_list_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_requires_expression_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_requires_super_attribute_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_reserved_identifier_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_reserved_id_macro_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_reserved_macro_identifier_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_reserved_user_defined_literal_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_retained_language_linkage_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_return_stack_address_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_return_std_move_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_return_type_c_linkage_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_return_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_rewrite_not_bool_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_section_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_selector_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_selector_type_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_self_assign_field_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_self_assign_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_self_assign_overloaded_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_self_move_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_semicolon_before_method_body_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_sentinel_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_serialized_diagnostics_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_shadow_field_in_constructor_modified_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_shadow_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shadow_ivar_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shadow_uncaptured_local_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_shift_count_negative_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shift_count_overflow_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shift_negative_value_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shift_op_parentheses_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shift_overflow_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shift_sign_overflow_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_shorten64_to32_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_signed_enum_bitfield_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_signed_unsigned_wchar_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_sign_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_sign_conversion_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_argument_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_decay_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_sizeof_array_div_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_div_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_sizeof_pointer_memaccess_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_slash_u_filename_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_slh_asm_goto_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_sometimes_uninitialized_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_source_uses_openmp_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_spir_compat_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_static_float_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_static_inline_explicit_instantiation_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_static_in_inline_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_static_local_in_inline_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_static_self_init_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_stdlibcxx_not_found_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_strict_prototypes_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_strict_selector_match_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_string_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_string_concatenation_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_string_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_string_plus_char_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_string_plus_int_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_strlcpy_strlcat_size_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_strncat_size_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_suggest_destructor_override_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_suggest_override_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_super_class_method_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_suspicious_bzero_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_switch_bool_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_switch_enum_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_switch_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_sync_fetch_and_nand_semantics_changed_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_bitwise_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_in_range_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_constant_out_of_range_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_objc_bool_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_overlap_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_pointer_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_type_limit_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_undefined_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_char_zero_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_enum_zero_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_unsigned_zero_compare_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_tautological_value_range_compare_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_tentative_definition_incomplete_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_analysis_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_attributes_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_beta_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_negative_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_precise_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_reference_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_thread_safety_verbose_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_trigraphs_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_typedef_redefinition_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_typename_missing_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_type_safety_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unable_to_open_stats_file_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unavailable_declarations_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undeclared_selector_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undefined_bool_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undefined_func_template_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undefined_inline_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undefined_internal_type_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undefined_reinterpret_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undefined_var_template_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undef_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_undef_prefix_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_underaligned_exception_object_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unevaluated_expression_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unguarded_availability_new_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unicode_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unicode_homoglyph_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unicode_whitespace_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unicode_zero_width_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_const_reference_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_uninitialized_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unknown_argument_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unknown_attributes_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unknown_cuda_version_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unknown_escape_sequence_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unknown_pragmas_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unknown_sanitizers_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unknown_warning_option_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unnamed_type_template_args_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unneeded_internal_declaration_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unneeded_member_function_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_break_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_loop_increment_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unreachable_code_return_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsequenced_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_abs_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_availability_guard_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_cb_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_dll_base_class_template_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_friend_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_gpopt_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_nan_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_target_opt_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unsupported_visibility_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unusable_partial_specialization_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_parameter_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unused_but_set_variable_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unused_comparison_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_const_variable_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_exception_parameter_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_function_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_getter_return_value_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_label_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_lambda_capture_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unused_local_typedef_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_macros_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_member_function_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_parameter_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unused_private_field_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_property_ivar_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_result_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_template_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_value_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_unused_variable_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_unused_volatile_lvalue_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_used_but_marked_unused_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_user_defined_literals_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_user_defined_warnings_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_varargs_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_variadic_macros_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_vector_conversion_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_vec_elem_size_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_vexing_parse_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_visibility_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_vla_extension_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_vla_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_enum_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_void_pointer_to_int_cast_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_void_ptr_dereference_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_warnings_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_wasm_exception_spec_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_weak_template_vtables_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_weak_vtables_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_writable_strings_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_xor_used_as_pow_highlighting=warning
+resharper_cpp_clang_tidy_clang_diagnostic_zero_as_null_pointer_constant_highlighting=none
+resharper_cpp_clang_tidy_clang_diagnostic_zero_length_array_highlighting=warning
+resharper_cpp_clang_tidy_concurrency_mt_unsafe_highlighting=warning
+resharper_cpp_clang_tidy_concurrency_thread_canceltype_asynchronous_highlighting=warning
+resharper_cpp_clang_tidy_cppcoreguidelines_avoid_c_arrays_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_avoid_goto_highlighting=warning
+resharper_cpp_clang_tidy_cppcoreguidelines_avoid_magic_numbers_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_avoid_non_const_global_variables_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_c_copy_assignment_signature_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_explicit_virtual_functions_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_init_variables_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_interfaces_global_init_highlighting=warning
+resharper_cpp_clang_tidy_cppcoreguidelines_macro_usage_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_narrowing_conversions_highlighting=warning
+resharper_cpp_clang_tidy_cppcoreguidelines_non_private_member_variables_in_classes_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_no_malloc_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_owning_memory_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_prefer_member_initializer_highlighting=suggestion
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_array_to_pointer_decay_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_constant_array_index_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_bounds_pointer_arithmetic_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_const_cast_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_cstyle_cast_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_member_init_highlighting=warning
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_reinterpret_cast_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_static_cast_downcast_highlighting=suggestion
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_union_access_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_pro_type_vararg_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_slicing_highlighting=none
+resharper_cpp_clang_tidy_cppcoreguidelines_special_member_functions_highlighting=suggestion
+resharper_cpp_clang_tidy_darwin_avoid_spinlock_highlighting=none
+resharper_cpp_clang_tidy_darwin_dispatch_once_nonstatic_highlighting=none
+resharper_cpp_clang_tidy_fuchsia_default_arguments_calls_highlighting=none
+resharper_cpp_clang_tidy_fuchsia_default_arguments_declarations_highlighting=none
+resharper_cpp_clang_tidy_fuchsia_header_anon_namespaces_highlighting=none
+resharper_cpp_clang_tidy_fuchsia_multiple_inheritance_highlighting=none
+resharper_cpp_clang_tidy_fuchsia_overloaded_operator_highlighting=none
+resharper_cpp_clang_tidy_fuchsia_statically_constructed_objects_highlighting=none
+resharper_cpp_clang_tidy_fuchsia_trailing_return_highlighting=none
+resharper_cpp_clang_tidy_fuchsia_virtual_inheritance_highlighting=none
+resharper_cpp_clang_tidy_google_build_explicit_make_pair_highlighting=none
+resharper_cpp_clang_tidy_google_build_namespaces_highlighting=none
+resharper_cpp_clang_tidy_google_build_using_namespace_highlighting=none
+resharper_cpp_clang_tidy_google_default_arguments_highlighting=none
+resharper_cpp_clang_tidy_google_explicit_constructor_highlighting=none
+resharper_cpp_clang_tidy_google_global_names_in_headers_highlighting=none
+resharper_cpp_clang_tidy_google_objc_avoid_nsobject_new_highlighting=none
+resharper_cpp_clang_tidy_google_objc_avoid_throwing_exception_highlighting=none
+resharper_cpp_clang_tidy_google_objc_function_naming_highlighting=none
+resharper_cpp_clang_tidy_google_objc_global_variable_declaration_highlighting=none
+resharper_cpp_clang_tidy_google_readability_avoid_underscore_in_googletest_name_highlighting=none
+resharper_cpp_clang_tidy_google_readability_braces_around_statements_highlighting=none
+resharper_cpp_clang_tidy_google_readability_casting_highlighting=none
+resharper_cpp_clang_tidy_google_readability_function_size_highlighting=none
+resharper_cpp_clang_tidy_google_readability_namespace_comments_highlighting=none
+resharper_cpp_clang_tidy_google_readability_todo_highlighting=none
+resharper_cpp_clang_tidy_google_runtime_int_highlighting=none
+resharper_cpp_clang_tidy_google_runtime_operator_highlighting=warning
+resharper_cpp_clang_tidy_google_upgrade_googletest_case_highlighting=suggestion
+resharper_cpp_clang_tidy_hicpp_avoid_c_arrays_highlighting=none
+resharper_cpp_clang_tidy_hicpp_avoid_goto_highlighting=warning
+resharper_cpp_clang_tidy_hicpp_braces_around_statements_highlighting=none
+resharper_cpp_clang_tidy_hicpp_deprecated_headers_highlighting=none
+resharper_cpp_clang_tidy_hicpp_exception_baseclass_highlighting=suggestion
+resharper_cpp_clang_tidy_hicpp_explicit_conversions_highlighting=none
+resharper_cpp_clang_tidy_hicpp_function_size_highlighting=none
+resharper_cpp_clang_tidy_hicpp_invalid_access_moved_highlighting=none
+resharper_cpp_clang_tidy_hicpp_member_init_highlighting=none
+resharper_cpp_clang_tidy_hicpp_move_const_arg_highlighting=none
+resharper_cpp_clang_tidy_hicpp_multiway_paths_covered_highlighting=warning
+resharper_cpp_clang_tidy_hicpp_named_parameter_highlighting=none
+resharper_cpp_clang_tidy_hicpp_new_delete_operators_highlighting=none
+resharper_cpp_clang_tidy_hicpp_noexcept_move_highlighting=none
+resharper_cpp_clang_tidy_hicpp_no_array_decay_highlighting=none
+resharper_cpp_clang_tidy_hicpp_no_assembler_highlighting=none
+resharper_cpp_clang_tidy_hicpp_no_malloc_highlighting=none
+resharper_cpp_clang_tidy_hicpp_signed_bitwise_highlighting=none
+resharper_cpp_clang_tidy_hicpp_special_member_functions_highlighting=none
+resharper_cpp_clang_tidy_hicpp_static_assert_highlighting=none
+resharper_cpp_clang_tidy_hicpp_undelegated_constructor_highlighting=none
+resharper_cpp_clang_tidy_hicpp_uppercase_literal_suffix_highlighting=none
+resharper_cpp_clang_tidy_hicpp_use_auto_highlighting=none
+resharper_cpp_clang_tidy_hicpp_use_emplace_highlighting=none
+resharper_cpp_clang_tidy_hicpp_use_equals_default_highlighting=none
+resharper_cpp_clang_tidy_hicpp_use_equals_delete_highlighting=none
+resharper_cpp_clang_tidy_hicpp_use_noexcept_highlighting=none
+resharper_cpp_clang_tidy_hicpp_use_nullptr_highlighting=none
+resharper_cpp_clang_tidy_hicpp_use_override_highlighting=none
+resharper_cpp_clang_tidy_hicpp_vararg_highlighting=none
+resharper_cpp_clang_tidy_highlighting_highlighting=suggestion
+resharper_cpp_clang_tidy_linuxkernel_must_check_errs_highlighting=warning
+resharper_cpp_clang_tidy_llvmlibc_callee_namespace_highlighting=none
+resharper_cpp_clang_tidy_llvmlibc_implementation_in_namespace_highlighting=none
+resharper_cpp_clang_tidy_llvmlibc_restrict_system_libc_headers_highlighting=none
+resharper_cpp_clang_tidy_llvm_else_after_return_highlighting=none
+resharper_cpp_clang_tidy_llvm_header_guard_highlighting=none
+resharper_cpp_clang_tidy_llvm_include_order_highlighting=none
+resharper_cpp_clang_tidy_llvm_namespace_comment_highlighting=none
+resharper_cpp_clang_tidy_llvm_prefer_isa_or_dyn_cast_in_conditionals_highlighting=none
+resharper_cpp_clang_tidy_llvm_prefer_register_over_unsigned_highlighting=suggestion
+resharper_cpp_clang_tidy_llvm_qualified_auto_highlighting=none
+resharper_cpp_clang_tidy_llvm_twine_local_highlighting=none
+resharper_cpp_clang_tidy_misc_definitions_in_headers_highlighting=none
+resharper_cpp_clang_tidy_misc_misplaced_const_highlighting=warning
+resharper_cpp_clang_tidy_misc_new_delete_overloads_highlighting=warning
+resharper_cpp_clang_tidy_misc_non_copyable_objects_highlighting=warning
+resharper_cpp_clang_tidy_misc_non_private_member_variables_in_classes_highlighting=none
+resharper_cpp_clang_tidy_misc_no_recursion_highlighting=none
+resharper_cpp_clang_tidy_misc_redundant_expression_highlighting=warning
+resharper_cpp_clang_tidy_misc_static_assert_highlighting=suggestion
+resharper_cpp_clang_tidy_misc_throw_by_value_catch_by_reference_highlighting=warning
+resharper_cpp_clang_tidy_misc_unconventional_assign_operator_highlighting=warning
+resharper_cpp_clang_tidy_misc_uniqueptr_reset_release_highlighting=suggestion
+resharper_cpp_clang_tidy_misc_unused_alias_decls_highlighting=suggestion
+resharper_cpp_clang_tidy_misc_unused_parameters_highlighting=none
+resharper_cpp_clang_tidy_misc_unused_using_decls_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_avoid_bind_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_avoid_c_arrays_highlighting=none
+resharper_cpp_clang_tidy_modernize_concat_nested_namespaces_highlighting=none
+resharper_cpp_clang_tidy_modernize_deprecated_headers_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_deprecated_ios_base_aliases_highlighting=warning
+resharper_cpp_clang_tidy_modernize_loop_convert_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_make_shared_highlighting=none
+resharper_cpp_clang_tidy_modernize_make_unique_highlighting=none
+resharper_cpp_clang_tidy_modernize_pass_by_value_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_raw_string_literal_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_redundant_void_arg_highlighting=none
+resharper_cpp_clang_tidy_modernize_replace_auto_ptr_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_replace_disallow_copy_and_assign_macro_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_replace_random_shuffle_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_return_braced_init_list_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_shrink_to_fit_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_unary_static_assert_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_auto_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_bool_literals_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_default_member_init_highlighting=none
+resharper_cpp_clang_tidy_modernize_use_emplace_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_equals_default_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_equals_delete_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_nodiscard_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_noexcept_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_nullptr_highlighting=none
+resharper_cpp_clang_tidy_modernize_use_override_highlighting=none
+resharper_cpp_clang_tidy_modernize_use_trailing_return_type_highlighting=none
+resharper_cpp_clang_tidy_modernize_use_transparent_functors_highlighting=suggestion
+resharper_cpp_clang_tidy_modernize_use_uncaught_exceptions_highlighting=warning
+resharper_cpp_clang_tidy_modernize_use_using_highlighting=none
+resharper_cpp_clang_tidy_mpi_buffer_deref_highlighting=warning
+resharper_cpp_clang_tidy_mpi_type_mismatch_highlighting=warning
+resharper_cpp_clang_tidy_objc_avoid_nserror_init_highlighting=warning
+resharper_cpp_clang_tidy_objc_dealloc_in_category_highlighting=warning
+resharper_cpp_clang_tidy_objc_forbidden_subclassing_highlighting=warning
+resharper_cpp_clang_tidy_objc_missing_hash_highlighting=warning
+resharper_cpp_clang_tidy_objc_nsinvocation_argument_lifetime_highlighting=warning
+resharper_cpp_clang_tidy_objc_property_declaration_highlighting=warning
+resharper_cpp_clang_tidy_objc_super_self_highlighting=warning
+resharper_cpp_clang_tidy_openmp_exception_escape_highlighting=warning
+resharper_cpp_clang_tidy_openmp_use_default_none_highlighting=warning
+resharper_cpp_clang_tidy_performance_faster_string_find_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_for_range_copy_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_implicit_conversion_in_loop_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_inefficient_algorithm_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_inefficient_string_concatenation_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_inefficient_vector_operation_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_move_constructor_init_highlighting=warning
+resharper_cpp_clang_tidy_performance_move_const_arg_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_noexcept_move_constructor_highlighting=none
+resharper_cpp_clang_tidy_performance_no_automatic_move_highlighting=warning
+resharper_cpp_clang_tidy_performance_no_int_to_ptr_highlighting=warning
+resharper_cpp_clang_tidy_performance_trivially_destructible_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_type_promotion_in_math_fn_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_unnecessary_copy_initialization_highlighting=suggestion
+resharper_cpp_clang_tidy_performance_unnecessary_value_param_highlighting=suggestion
+resharper_cpp_clang_tidy_portability_restrict_system_includes_highlighting=none
+resharper_cpp_clang_tidy_portability_simd_intrinsics_highlighting=none
+resharper_cpp_clang_tidy_readability_avoid_const_params_in_decls_highlighting=none
+resharper_cpp_clang_tidy_readability_braces_around_statements_highlighting=none
+resharper_cpp_clang_tidy_readability_const_return_type_highlighting=none
+resharper_cpp_clang_tidy_readability_container_size_empty_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_convert_member_functions_to_static_highlighting=none
+resharper_cpp_clang_tidy_readability_delete_null_pointer_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_else_after_return_highlighting=none
+resharper_cpp_clang_tidy_readability_function_cognitive_complexity_highlighting=none
+resharper_cpp_clang_tidy_readability_function_size_highlighting=none
+resharper_cpp_clang_tidy_readability_identifier_naming_highlighting=none
+resharper_cpp_clang_tidy_readability_implicit_bool_conversion_highlighting=none
+resharper_cpp_clang_tidy_readability_inconsistent_declaration_parameter_name_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_isolate_declaration_highlighting=none
+resharper_cpp_clang_tidy_readability_magic_numbers_highlighting=none
+resharper_cpp_clang_tidy_readability_make_member_function_const_highlighting=none
+resharper_cpp_clang_tidy_readability_misleading_indentation_highlighting=none
+resharper_cpp_clang_tidy_readability_misplaced_array_index_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_named_parameter_highlighting=none
+resharper_cpp_clang_tidy_readability_non_const_parameter_highlighting=none
+resharper_cpp_clang_tidy_readability_qualified_auto_highlighting=none
+resharper_cpp_clang_tidy_readability_redundant_access_specifiers_highlighting=none
+resharper_cpp_clang_tidy_readability_redundant_control_flow_highlighting=none
+resharper_cpp_clang_tidy_readability_redundant_declaration_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_redundant_function_ptr_dereference_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_redundant_member_init_highlighting=none
+resharper_cpp_clang_tidy_readability_redundant_preprocessor_highlighting=warning
+resharper_cpp_clang_tidy_readability_redundant_smartptr_get_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_redundant_string_cstr_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_redundant_string_init_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_simplify_boolean_expr_highlighting=none
+resharper_cpp_clang_tidy_readability_simplify_subscript_expr_highlighting=warning
+resharper_cpp_clang_tidy_readability_static_accessed_through_instance_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_static_definition_in_anonymous_namespace_highlighting=none
+resharper_cpp_clang_tidy_readability_string_compare_highlighting=warning
+resharper_cpp_clang_tidy_readability_suspicious_call_argument_highlighting=warning
+resharper_cpp_clang_tidy_readability_uniqueptr_delete_release_highlighting=suggestion
+resharper_cpp_clang_tidy_readability_uppercase_literal_suffix_highlighting=none
+resharper_cpp_clang_tidy_readability_use_anyofallof_highlighting=suggestion
+resharper_cpp_clang_tidy_zircon_temporary_objects_highlighting=none
+resharper_cpp_class_can_be_final_highlighting=hint
+resharper_cpp_class_disallow_lazy_merging_highlighting=warning
+resharper_cpp_class_is_incomplete_highlighting=warning
+resharper_cpp_class_needs_constructor_because_of_uninitialized_member_highlighting=warning
+resharper_cpp_class_never_used_highlighting=warning
+resharper_cpp_compile_time_constant_can_be_replaced_with_boolean_constant_highlighting=suggestion
+resharper_cpp_const_parameter_in_declaration_highlighting=suggestion
+resharper_cpp_const_value_function_return_type_highlighting=suggestion
+resharper_cpp_coroutine_call_resolve_error_highlighting=warning
+resharper_cpp_cv_qualifier_can_not_be_applied_to_reference_highlighting=warning
+resharper_cpp_c_style_cast_highlighting=suggestion
+resharper_cpp_declaration_hides_local_highlighting=warning
+resharper_cpp_declaration_hides_uncaptured_local_highlighting=hint
+resharper_cpp_declaration_specifier_without_declarators_highlighting=warning
+resharper_cpp_declarator_disambiguated_as_function_highlighting=warning
+resharper_cpp_declarator_never_used_highlighting=warning
+resharper_cpp_declarator_used_before_initialization_highlighting=error
+resharper_cpp_defaulted_special_member_function_is_implicitly_deleted_highlighting=warning
+resharper_cpp_default_case_not_handled_in_switch_statement_highlighting=warning
+resharper_cpp_default_initialization_with_no_user_constructor_highlighting=warning
+resharper_cpp_default_is_used_as_identifier_highlighting=warning
+resharper_cpp_deleting_void_pointer_highlighting=warning
+resharper_cpp_dependent_template_without_template_keyword_highlighting=warning
+resharper_cpp_dependent_type_without_typename_keyword_highlighting=warning
+resharper_cpp_deprecated_entity_highlighting=warning
+resharper_cpp_deprecated_register_storage_class_specifier_highlighting=warning
+resharper_cpp_dereference_operator_limit_exceeded_highlighting=warning
+resharper_cpp_discarded_postfix_operator_result_highlighting=suggestion
+resharper_cpp_doxygen_syntax_error_highlighting=warning
+resharper_cpp_doxygen_undocumented_parameter_highlighting=suggestion
+resharper_cpp_doxygen_unresolved_reference_highlighting=warning
+resharper_cpp_empty_declaration_highlighting=warning
+resharper_cpp_enforce_cv_qualifiers_order_highlighting=none
+resharper_cpp_enforce_cv_qualifiers_placement_highlighting=none
+resharper_cpp_enforce_do_statement_braces_highlighting=none
+resharper_cpp_enforce_for_statement_braces_highlighting=none
+resharper_cpp_enforce_function_declaration_style_highlighting=none
+resharper_cpp_enforce_if_statement_braces_highlighting=none
+resharper_cpp_enforce_nested_namespaces_style_highlighting=hint
+resharper_cpp_enforce_overriding_destructor_style_highlighting=suggestion
+resharper_cpp_enforce_overriding_function_style_highlighting=suggestion
+resharper_cpp_enforce_type_alias_code_style_highlighting=none
+resharper_cpp_enforce_while_statement_braces_highlighting=none
+resharper_cpp_entity_assigned_but_no_read_highlighting=warning
+resharper_cpp_entity_used_only_in_unevaluated_context_highlighting=warning
+resharper_cpp_enumerator_never_used_highlighting=warning
+resharper_cpp_equal_operands_in_binary_expression_highlighting=warning
+resharper_cpp_explicit_specialization_in_non_namespace_scope_highlighting=warning
+resharper_cpp_expression_without_side_effects_highlighting=warning
+resharper_cpp_final_function_in_final_class_highlighting=suggestion
+resharper_cpp_final_non_overriding_virtual_function_highlighting=suggestion
+resharper_cpp_for_loop_can_be_replaced_with_while_highlighting=suggestion
+resharper_cpp_functional_style_cast_highlighting=suggestion
+resharper_cpp_function_doesnt_return_value_highlighting=warning
+resharper_cpp_function_is_not_implemented_highlighting=warning
+resharper_cpp_header_has_been_already_included_highlighting=hint
+resharper_cpp_hidden_function_highlighting=warning
+resharper_cpp_hiding_function_highlighting=warning
+resharper_cpp_identical_operands_in_binary_expression_highlighting=warning
+resharper_cpp_if_can_be_replaced_by_constexpr_if_highlighting=suggestion
+resharper_cpp_implicit_default_constructor_not_available_highlighting=warning
+resharper_cpp_incompatible_pointer_conversion_highlighting=warning
+resharper_cpp_incomplete_switch_statement_highlighting=warning
+resharper_cpp_inconsistent_naming_highlighting=hint
+resharper_cpp_incorrect_blank_lines_near_braces_highlighting=none
+resharper_cpp_initialized_value_is_always_rewritten_highlighting=warning
+resharper_cpp_integral_to_pointer_conversion_highlighting=warning
+resharper_cpp_invalid_line_continuation_highlighting=warning
+resharper_cpp_join_declaration_and_assignment_highlighting=suggestion
+resharper_cpp_lambda_capture_never_used_highlighting=warning
+resharper_cpp_local_variable_may_be_const_highlighting=suggestion
+resharper_cpp_local_variable_might_not_be_initialized_highlighting=warning
+resharper_cpp_local_variable_with_non_trivial_dtor_is_never_used_highlighting=none
+resharper_cpp_long_float_highlighting=warning
+resharper_cpp_member_function_may_be_const_highlighting=suggestion
+resharper_cpp_member_function_may_be_static_highlighting=suggestion
+resharper_cpp_member_initializers_order_highlighting=suggestion
+resharper_cpp_mismatched_class_tags_highlighting=warning
+resharper_cpp_missing_blank_lines_highlighting=none
+resharper_cpp_missing_include_guard_highlighting=warning
+resharper_cpp_missing_indent_highlighting=none
+resharper_cpp_missing_keyword_throw_highlighting=warning
+resharper_cpp_missing_linebreak_highlighting=none
+resharper_cpp_missing_space_highlighting=none
+resharper_cpp_ms_ext_address_of_class_r_value_highlighting=warning
+resharper_cpp_ms_ext_binding_r_value_to_lvalue_reference_highlighting=warning
+resharper_cpp_ms_ext_copy_elision_in_copy_init_declarator_highlighting=warning
+resharper_cpp_ms_ext_double_user_conversion_in_copy_init_highlighting=warning
+resharper_cpp_ms_ext_not_initialized_static_const_local_var_highlighting=warning
+resharper_cpp_ms_ext_reinterpret_cast_from_nullptr_highlighting=warning
+resharper_cpp_multiple_spaces_highlighting=none
+resharper_cpp_must_be_public_virtual_to_implement_interface_highlighting=warning
+resharper_cpp_mutable_specifier_on_reference_member_highlighting=warning
+resharper_cpp_nodiscard_function_without_return_value_highlighting=warning
+resharper_cpp_non_exception_safe_resource_acquisition_highlighting=hint
+resharper_cpp_non_explicit_conversion_operator_highlighting=hint
+resharper_cpp_non_explicit_converting_constructor_highlighting=hint
+resharper_cpp_non_inline_function_definition_in_header_file_highlighting=warning
+resharper_cpp_non_inline_variable_definition_in_header_file_highlighting=warning
+resharper_cpp_not_all_paths_return_value_highlighting=warning
+resharper_cpp_no_discard_expression_highlighting=warning
+resharper_cpp_object_member_might_not_be_initialized_highlighting=warning
+resharper_cpp_outdent_is_off_prev_level_highlighting=none
+resharper_cpp_out_parameter_must_be_written_highlighting=warning
+resharper_cpp_parameter_may_be_const_highlighting=hint
+resharper_cpp_parameter_may_be_const_ptr_or_ref_highlighting=suggestion
+resharper_cpp_parameter_names_mismatch_highlighting=hint
+resharper_cpp_parameter_never_used_highlighting=hint
+resharper_cpp_parameter_value_is_reassigned_highlighting=warning
+resharper_cpp_pointer_conversion_drops_qualifiers_highlighting=warning
+resharper_cpp_pointer_to_integral_conversion_highlighting=warning
+resharper_cpp_polymorphic_class_with_non_virtual_public_destructor_highlighting=warning
+resharper_cpp_possibly_erroneous_empty_statements_highlighting=warning
+resharper_cpp_possibly_uninitialized_member_highlighting=warning
+resharper_cpp_possibly_unintended_object_slicing_highlighting=warning
+resharper_cpp_precompiled_header_is_not_included_highlighting=error
+resharper_cpp_precompiled_header_not_found_highlighting=error
+resharper_cpp_printf_bad_format_highlighting=warning
+resharper_cpp_printf_extra_arg_highlighting=warning
+resharper_cpp_printf_missed_arg_highlighting=error
+resharper_cpp_printf_risky_format_highlighting=warning
+resharper_cpp_private_special_member_function_is_not_implemented_highlighting=warning
+resharper_cpp_range_based_for_incompatible_reference_highlighting=warning
+resharper_cpp_redefinition_of_default_argument_in_override_function_highlighting=warning
+resharper_cpp_redundant_access_specifier_highlighting=hint
+resharper_cpp_redundant_base_class_access_specifier_highlighting=hint
+resharper_cpp_redundant_blank_lines_highlighting=none
+resharper_cpp_redundant_boolean_expression_argument_highlighting=warning
+resharper_cpp_redundant_cast_expression_highlighting=hint
+resharper_cpp_redundant_const_specifier_highlighting=hint
+resharper_cpp_redundant_control_flow_jump_highlighting=hint
+resharper_cpp_redundant_elaborated_type_specifier_highlighting=hint
+resharper_cpp_redundant_else_keyword_highlighting=hint
+resharper_cpp_redundant_else_keyword_inside_compound_statement_highlighting=hint
+resharper_cpp_redundant_empty_declaration_highlighting=hint
+resharper_cpp_redundant_empty_statement_highlighting=hint
+resharper_cpp_redundant_explicit_template_arguments_highlighting=hint
+resharper_cpp_redundant_inline_specifier_highlighting=hint
+resharper_cpp_redundant_lambda_parameter_list_highlighting=hint
+resharper_cpp_redundant_linebreak_highlighting=none
+resharper_cpp_redundant_member_initializer_highlighting=suggestion
+resharper_cpp_redundant_namespace_definition_highlighting=suggestion
+resharper_cpp_redundant_parentheses_highlighting=hint
+resharper_cpp_redundant_qualifier_highlighting=hint
+resharper_cpp_redundant_space_highlighting=none
+resharper_cpp_redundant_static_specifier_on_member_allocation_function_highlighting=hint
+resharper_cpp_redundant_template_keyword_highlighting=warning
+resharper_cpp_redundant_typename_keyword_highlighting=warning
+resharper_cpp_redundant_void_argument_list_highlighting=suggestion
+resharper_cpp_reinterpret_cast_from_void_ptr_highlighting=suggestion
+resharper_cpp_remove_redundant_braces_highlighting=none
+resharper_cpp_replace_memset_with_zero_initialization_highlighting=suggestion
+resharper_cpp_replace_tie_with_structured_binding_highlighting=suggestion
+resharper_cpp_return_no_value_in_non_void_function_highlighting=warning
+resharper_cpp_smart_pointer_vs_make_function_highlighting=suggestion
+resharper_cpp_some_object_members_might_not_be_initialized_highlighting=warning
+resharper_cpp_special_function_without_noexcept_specification_highlighting=warning
+resharper_cpp_static_data_member_in_unnamed_struct_highlighting=warning
+resharper_cpp_static_specifier_on_anonymous_namespace_member_highlighting=suggestion
+resharper_cpp_string_literal_to_char_pointer_conversion_highlighting=warning
+resharper_cpp_syntax_warning_highlighting=warning
+resharper_cpp_tabs_and_spaces_mismatch_highlighting=none
+resharper_cpp_tabs_are_disallowed_highlighting=none
+resharper_cpp_tabs_outside_indent_highlighting=none
+resharper_cpp_template_parameter_shadowing_highlighting=warning
+resharper_cpp_this_arg_member_func_delegate_ctor_is_unsuported_by_dot_net_core_highlighting=none
+resharper_cpp_throw_expression_can_be_replaced_with_rethrow_highlighting=warning
+resharper_cpp_too_wide_scope_highlighting=suggestion
+resharper_cpp_too_wide_scope_init_statement_highlighting=hint
+resharper_cpp_type_alias_never_used_highlighting=warning
+resharper_cpp_ue4_blueprint_callable_function_may_be_const_highlighting=hint
+resharper_cpp_ue4_blueprint_callable_function_may_be_static_highlighting=hint
+resharper_cpp_ue4_coding_standard_naming_violation_warning_highlighting=hint
+resharper_cpp_ue4_coding_standard_u_class_naming_violation_error_highlighting=error
+resharper_cpp_ue4_probable_memory_issues_with_u_objects_in_container_highlighting=warning
+resharper_cpp_ue4_probable_memory_issues_with_u_object_highlighting=warning
+resharper_cpp_ue_blueprint_callable_function_unused_highlighting=warning
+resharper_cpp_ue_blueprint_implementable_event_not_implemented_highlighting=warning
+resharper_cpp_ue_incorrect_engine_directory_highlighting=error
+resharper_cpp_ue_non_existent_input_action_highlighting=warning
+resharper_cpp_ue_non_existent_input_axis_highlighting=warning
+resharper_cpp_ue_source_file_without_predefined_macros_highlighting=warning
+resharper_cpp_ue_source_file_without_standard_library_highlighting=error
+resharper_cpp_ue_version_file_doesnt_exist_highlighting=error
+resharper_cpp_uninitialized_dependent_base_class_highlighting=warning
+resharper_cpp_uninitialized_non_static_data_member_highlighting=warning
+resharper_cpp_union_member_of_reference_type_highlighting=warning
+resharper_cpp_unnamed_namespace_in_header_file_highlighting=warning
+resharper_cpp_unnecessary_whitespace_highlighting=none
+resharper_cpp_unreachable_code_highlighting=warning
+resharper_cpp_unsigned_zero_comparison_highlighting=warning
+resharper_cpp_unused_include_directive_highlighting=warning
+resharper_cpp_user_defined_literal_suffix_does_not_start_with_underscore_highlighting=warning
+resharper_cpp_use_algorithm_with_count_highlighting=suggestion
+resharper_cpp_use_associative_contains_highlighting=suggestion
+resharper_cpp_use_auto_for_numeric_highlighting=hint
+resharper_cpp_use_auto_highlighting=hint
+resharper_cpp_use_elements_view_highlighting=suggestion
+resharper_cpp_use_erase_algorithm_highlighting=suggestion
+resharper_cpp_use_familiar_template_syntax_for_generic_lambdas_highlighting=suggestion
+resharper_cpp_use_range_algorithm_highlighting=suggestion
+resharper_cpp_use_std_size_highlighting=suggestion
+resharper_cpp_use_structured_binding_highlighting=hint
+resharper_cpp_use_type_trait_alias_highlighting=suggestion
+resharper_cpp_using_result_of_assignment_as_condition_highlighting=warning
+resharper_cpp_u_function_macro_call_has_no_effect_highlighting=warning
+resharper_cpp_u_property_macro_call_has_no_effect_highlighting=warning
+resharper_cpp_variable_can_be_made_constexpr_highlighting=suggestion
+resharper_cpp_virtual_function_call_inside_ctor_highlighting=warning
+resharper_cpp_virtual_function_in_final_class_highlighting=warning
+resharper_cpp_volatile_parameter_in_declaration_highlighting=suggestion
+resharper_cpp_wrong_includes_order_highlighting=hint
+resharper_cpp_wrong_indent_size_highlighting=none
+resharper_cpp_wrong_slashes_in_include_directive_highlighting=hint
+resharper_cpp_zero_constant_can_be_replaced_with_nullptr_highlighting=suggestion
+resharper_cpp_zero_valued_expression_used_as_null_pointer_highlighting=warning
+resharper_create_specialized_overload_highlighting=hint
+resharper_css_browser_compatibility_highlighting=warning
+resharper_css_caniuse_feature_requires_prefix_highlighting=hint
+resharper_css_caniuse_unsupported_feature_highlighting=hint
+resharper_css_not_resolved_highlighting=error
+resharper_css_obsolete_highlighting=hint
+resharper_css_property_does_not_override_vendor_property_highlighting=warning
+resharper_cyclic_reference_comment_highlighting=none
+resharper_c_declaration_with_implicit_int_type_highlighting=warning
+resharper_c_sharp_build_cs_invalid_module_name_highlighting=warning
+resharper_c_sharp_missing_plugin_dependency_highlighting=warning
+resharper_declaration_hides_highlighting=hint
+resharper_declaration_is_empty_highlighting=warning
+resharper_declaration_visibility_error_highlighting=error
+resharper_default_value_attribute_for_optional_parameter_highlighting=warning
+resharper_deleting_non_qualified_reference_highlighting=error
+resharper_dl_tag_contains_non_dt_or_dd_elements_highlighting=hint
+resharper_double_colons_expected_highlighting=error
+resharper_double_colons_preferred_highlighting=suggestion
+resharper_double_negation_in_pattern_highlighting=suggestion
+resharper_double_negation_of_boolean_highlighting=warning
+resharper_double_negation_operator_highlighting=suggestion
+resharper_duplicate_identifier_error_highlighting=error
+resharper_duplicate_reference_comment_highlighting=warning
+resharper_duplicate_resource_highlighting=warning
+resharper_duplicating_local_declaration_highlighting=warning
+resharper_duplicating_parameter_declaration_error_highlighting=error
+resharper_duplicating_property_declaration_error_highlighting=error
+resharper_duplicating_property_declaration_highlighting=warning
+resharper_duplicating_switch_label_highlighting=warning
+resharper_dynamic_shift_right_op_is_not_int_highlighting=warning
+resharper_elided_trailing_element_highlighting=warning
+resharper_empty_constructor_highlighting=warning
+resharper_empty_destructor_highlighting=warning
+resharper_empty_embedded_statement_highlighting=warning
+resharper_empty_for_statement_highlighting=warning
+resharper_empty_general_catch_clause_highlighting=warning
+resharper_empty_namespace_highlighting=warning
+resharper_empty_object_property_declaration_highlighting=error
+resharper_empty_return_value_for_type_annotated_function_highlighting=warning
+resharper_empty_statement_highlighting=warning
+resharper_empty_title_tag_highlighting=hint
+resharper_enforce_do_while_statement_braces_highlighting=none
+resharper_enforce_fixed_statement_braces_highlighting=none
+resharper_enforce_foreach_statement_braces_highlighting=none
+resharper_enforce_for_statement_braces_highlighting=none
+resharper_enforce_if_statement_braces_highlighting=none
+resharper_enforce_lock_statement_braces_highlighting=none
+resharper_enforce_using_statement_braces_highlighting=none
+resharper_enforce_while_statement_braces_highlighting=none
+resharper_entity_name_captured_only_global_highlighting=warning
+resharper_entity_name_captured_only_local_highlighting=warning
+resharper_enumerable_sum_in_explicit_unchecked_context_highlighting=warning
+resharper_enum_underlying_type_is_int_highlighting=warning
+resharper_equal_expression_comparison_highlighting=warning
+resharper_error_in_xml_doc_reference_highlighting=error
+resharper_es6_feature_highlighting=error
+resharper_es7_feature_highlighting=error
+resharper_eval_arguments_name_error_highlighting=error
+resharper_event_never_invoked_global_highlighting=suggestion
+resharper_event_never_subscribed_to_global_highlighting=suggestion
+resharper_event_never_subscribed_to_local_highlighting=suggestion
+resharper_event_unsubscription_via_anonymous_delegate_highlighting=warning
+resharper_experimental_feature_highlighting=error
+resharper_explicit_caller_info_argument_highlighting=warning
+resharper_expression_is_always_const_highlighting=warning
+resharper_expression_is_always_null_highlighting=warning
+resharper_field_can_be_made_read_only_global_highlighting=suggestion
+resharper_field_can_be_made_read_only_local_highlighting=suggestion
+resharper_field_hides_interface_property_with_default_implementation_highlighting=warning
+resharper_foreach_can_be_converted_to_query_using_another_get_enumerator_highlighting=hint
+resharper_foreach_can_be_partly_converted_to_query_using_another_get_enumerator_highlighting=hint
+resharper_format_string_placeholders_mismatch_highlighting=warning
+resharper_format_string_problem_highlighting=warning
+resharper_for_can_be_converted_to_foreach_highlighting=suggestion
+resharper_for_statement_condition_is_true_highlighting=warning
+resharper_functions_used_before_declared_highlighting=none
+resharper_function_complexity_overflow_highlighting=none
+resharper_function_never_returns_highlighting=warning
+resharper_function_parameter_named_arguments_highlighting=warning
+resharper_function_recursive_on_all_paths_highlighting=warning
+resharper_function_used_out_of_scope_highlighting=warning
+resharper_gc_suppress_finalize_for_type_without_destructor_highlighting=warning
+resharper_generic_enumerator_not_disposed_highlighting=warning
+resharper_heuristically_unreachable_code_highlighting=warning
+resharper_heuristic_unreachable_code_highlighting=warning
+resharper_hex_color_value_with_alpha_highlighting=error
+resharper_html_attributes_quotes_highlighting=hint
+resharper_html_attribute_not_resolved_highlighting=warning
+resharper_html_attribute_value_not_resolved_highlighting=warning
+resharper_html_dead_code_highlighting=warning
+resharper_html_event_not_resolved_highlighting=warning
+resharper_html_id_duplication_highlighting=warning
+resharper_html_id_not_resolved_highlighting=warning
+resharper_html_obsolete_highlighting=warning
+resharper_html_path_error_highlighting=warning
+resharper_html_tag_not_closed_highlighting=error
+resharper_html_tag_not_resolved_highlighting=warning
+resharper_html_tag_should_be_self_closed_highlighting=warning
+resharper_html_tag_should_not_be_self_closed_highlighting=warning
+resharper_html_warning_highlighting=warning
+resharper_identifier_typo_highlighting=suggestion
+resharper_implicit_any_error_highlighting=error
+resharper_implicit_any_type_warning_highlighting=warning
+resharper_import_keyword_not_with_invocation_highlighting=error
+resharper_inactive_preprocessor_branch_highlighting=warning
+resharper_inconsistently_synchronized_field_highlighting=warning
+resharper_inconsistent_function_returns_highlighting=warning
+resharper_inconsistent_naming_highlighting=warning
+resharper_inconsistent_order_of_locks_highlighting=warning
+resharper_incorrect_blank_lines_near_braces_highlighting=none
+resharper_incorrect_operand_in_type_of_comparison_highlighting=warning
+resharper_incorrect_triple_slash_location_highlighting=warning
+resharper_indexing_by_invalid_range_highlighting=warning
+resharper_inheritdoc_consider_usage_highlighting=none
+resharper_inheritdoc_invalid_usage_highlighting=warning
+resharper_inline_out_variable_declaration_highlighting=suggestion
+resharper_inline_temporary_variable_highlighting=hint
+resharper_internal_module_highlighting=suggestion
+resharper_internal_or_private_member_not_documented_highlighting=none
+resharper_interpolated_string_expression_is_not_i_formattable_highlighting=warning
+resharper_introduce_optional_parameters_global_highlighting=suggestion
+resharper_introduce_optional_parameters_local_highlighting=suggestion
+resharper_introduce_variable_to_apply_guard_highlighting=hint
+resharper_int_division_by_zero_highlighting=warning
+resharper_int_variable_overflow_highlighting=warning
+resharper_int_variable_overflow_in_checked_context_highlighting=warning
+resharper_int_variable_overflow_in_unchecked_context_highlighting=warning
+resharper_invalid_attribute_value_highlighting=warning
+resharper_invalid_json_syntax_highlighting=error
+resharper_invalid_task_element_highlighting=none
+resharper_invalid_value_highlighting=error
+resharper_invalid_value_type_highlighting=warning
+resharper_invalid_xml_doc_comment_highlighting=warning
+resharper_invert_condition_1_highlighting=hint
+resharper_invert_if_highlighting=hint
+resharper_invocation_is_skipped_highlighting=hint
+resharper_invocation_of_non_function_highlighting=warning
+resharper_invoked_expression_maybe_non_function_highlighting=warning
+resharper_invoke_as_extension_method_highlighting=suggestion
+resharper_is_expression_always_false_highlighting=warning
+resharper_is_expression_always_true_highlighting=warning
+resharper_iterator_method_result_is_ignored_highlighting=warning
+resharper_iterator_never_returns_highlighting=warning
+resharper_join_declaration_and_initializer_highlighting=suggestion
+resharper_join_declaration_and_initializer_js_highlighting=suggestion
+resharper_join_null_check_with_usage_highlighting=suggestion
+resharper_join_null_check_with_usage_when_possible_highlighting=none
+resharper_json_validation_failed_highlighting=error
+resharper_js_path_not_found_highlighting=error
+resharper_js_unreachable_code_highlighting=warning
+resharper_jump_must_be_in_loop_highlighting=warning
+resharper_label_or_semicolon_expected_highlighting=error
+resharper_lambda_expression_can_be_made_static_highlighting=none
+resharper_lambda_expression_must_be_static_highlighting=suggestion
+resharper_lambda_highlighting=suggestion
+resharper_lambda_should_not_capture_context_highlighting=warning
+resharper_less_specific_overload_than_main_signature_highlighting=warning
+resharper_lexical_declaration_needs_block_highlighting=error
+resharper_localizable_element_highlighting=warning
+resharper_local_function_can_be_made_static_highlighting=none
+resharper_local_function_hides_method_highlighting=warning
+resharper_local_function_redefined_later_highlighting=warning
+resharper_local_variable_hides_member_highlighting=warning
+resharper_long_literal_ending_lower_l_highlighting=warning
+resharper_loop_can_be_converted_to_query_highlighting=hint
+resharper_loop_can_be_partly_converted_to_query_highlighting=none
+resharper_loop_variable_is_never_changed_inside_loop_highlighting=warning
+resharper_l_value_is_expected_highlighting=error
+resharper_markup_attribute_typo_highlighting=suggestion
+resharper_markup_text_typo_highlighting=suggestion
+resharper_math_abs_method_is_redundant_highlighting=warning
+resharper_math_clamp_min_greater_than_max_highlighting=warning
+resharper_meaningless_default_parameter_value_highlighting=warning
+resharper_member_can_be_internal_highlighting=none
+resharper_member_can_be_made_static_global_highlighting=hint
+resharper_member_can_be_made_static_local_highlighting=hint
+resharper_member_can_be_private_global_highlighting=suggestion
+resharper_member_can_be_private_local_highlighting=suggestion
+resharper_member_can_be_protected_global_highlighting=suggestion
+resharper_member_can_be_protected_local_highlighting=suggestion
+resharper_member_hides_interface_member_with_default_implementation_highlighting=warning
+resharper_member_hides_static_from_outer_class_highlighting=warning
+resharper_member_initializer_value_ignored_highlighting=warning
+resharper_merge_and_pattern_highlighting=suggestion
+resharper_merge_cast_with_type_check_highlighting=suggestion
+resharper_merge_conditional_expression_highlighting=suggestion
+resharper_merge_conditional_expression_when_possible_highlighting=none
+resharper_merge_into_logical_pattern_highlighting=hint
+resharper_merge_into_negated_pattern_highlighting=hint
+resharper_merge_into_pattern_highlighting=suggestion
+resharper_merge_nested_property_patterns_highlighting=suggestion
+resharper_merge_sequential_checks_highlighting=hint
+resharper_merge_sequential_checks_when_possible_highlighting=none
+resharper_method_has_async_overload_highlighting=suggestion
+resharper_method_has_async_overload_with_cancellation_highlighting=suggestion
+resharper_method_overload_with_optional_parameter_highlighting=warning
+resharper_method_safe_this_highlighting=suggestion
+resharper_method_supports_cancellation_highlighting=suggestion
+resharper_missing_alt_attribute_in_img_tag_highlighting=hint
+resharper_missing_attribute_highlighting=warning
+resharper_missing_blank_lines_highlighting=none
+resharper_missing_body_tag_highlighting=warning
+resharper_missing_has_own_property_in_foreach_highlighting=warning
+resharper_missing_head_and_body_tags_highlighting=warning
+resharper_missing_head_tag_highlighting=warning
+resharper_missing_indent_highlighting=none
+resharper_missing_linebreak_highlighting=none
+resharper_missing_space_highlighting=none
+resharper_missing_title_tag_highlighting=hint
+resharper_misuse_of_owner_function_this_highlighting=warning
+resharper_more_specific_foreach_variable_type_available_highlighting=suggestion
+resharper_more_specific_signature_after_less_specific_highlighting=warning
+resharper_move_to_existing_positional_deconstruction_pattern_highlighting=hint
+resharper_multiple_declarations_in_foreach_highlighting=error
+resharper_multiple_nullable_attributes_usage_highlighting=warning
+resharper_multiple_order_by_highlighting=warning
+resharper_multiple_output_tags_highlighting=warning
+resharper_multiple_resolve_candidates_in_text_highlighting=warning
+resharper_multiple_spaces_highlighting=none
+resharper_multiple_statements_on_one_line_highlighting=none
+resharper_multiple_type_members_on_one_line_highlighting=none
+resharper_must_use_return_value_highlighting=warning
+resharper_mvc_action_not_resolved_highlighting=error
+resharper_mvc_area_not_resolved_highlighting=error
+resharper_mvc_controller_not_resolved_highlighting=error
+resharper_mvc_invalid_model_type_highlighting=error
+resharper_mvc_masterpage_not_resolved_highlighting=error
+resharper_mvc_partial_view_not_resolved_highlighting=error
+resharper_mvc_template_not_resolved_highlighting=error
+resharper_mvc_view_component_not_resolved_highlighting=error
+resharper_mvc_view_component_view_not_resolved_highlighting=error
+resharper_mvc_view_not_resolved_highlighting=error
+resharper_native_type_prototype_extending_highlighting=warning
+resharper_native_type_prototype_overwriting_highlighting=warning
+resharper_negation_of_relational_pattern_highlighting=suggestion
+resharper_negative_equality_expression_highlighting=suggestion
+resharper_negative_index_highlighting=warning
+resharper_nested_string_interpolation_highlighting=suggestion
+resharper_non_assigned_constant_highlighting=error
+resharper_non_atomic_compound_operator_highlighting=warning
+resharper_non_constant_equality_expression_has_constant_result_highlighting=warning
+resharper_non_parsable_element_highlighting=warning
+resharper_non_readonly_member_in_get_hash_code_highlighting=warning
+resharper_non_volatile_field_in_double_check_locking_highlighting=warning
+resharper_not_accessed_field_global_highlighting=suggestion
+resharper_not_accessed_field_local_highlighting=warning
+resharper_not_accessed_positional_property_global_highlighting=warning
+resharper_not_accessed_positional_property_local_highlighting=warning
+resharper_not_accessed_variable_highlighting=warning
+resharper_not_all_paths_return_value_highlighting=warning
+resharper_not_assigned_out_parameter_highlighting=warning
+resharper_not_declared_in_parent_culture_highlighting=warning
+resharper_not_null_member_is_not_initialized_highlighting=warning
+resharper_not_observable_annotation_redundancy_highlighting=warning
+resharper_not_overridden_in_specific_culture_highlighting=warning
+resharper_not_resolved_highlighting=warning
+resharper_not_resolved_in_text_highlighting=warning
+resharper_nullable_warning_suppression_is_used_highlighting=none
+resharper_n_unit_async_method_must_be_task_highlighting=warning
+resharper_n_unit_attribute_produces_too_many_tests_highlighting=none
+resharper_n_unit_auto_fixture_incorrect_argument_type_highlighting=warning
+resharper_n_unit_auto_fixture_missed_test_attribute_highlighting=warning
+resharper_n_unit_auto_fixture_missed_test_or_test_fixture_attribute_highlighting=warning
+resharper_n_unit_auto_fixture_redundant_argument_in_inline_auto_data_attribute_highlighting=warning
+resharper_n_unit_duplicate_values_highlighting=warning
+resharper_n_unit_ignored_parameter_attribute_highlighting=warning
+resharper_n_unit_implicit_unspecified_null_values_highlighting=warning
+resharper_n_unit_incorrect_argument_type_highlighting=warning
+resharper_n_unit_incorrect_expected_result_type_highlighting=warning
+resharper_n_unit_incorrect_range_bounds_highlighting=warning
+resharper_n_unit_method_with_parameters_and_test_attribute_highlighting=warning
+resharper_n_unit_missing_arguments_in_test_case_attribute_highlighting=warning
+resharper_n_unit_non_public_method_with_test_attribute_highlighting=warning
+resharper_n_unit_no_values_provided_highlighting=warning
+resharper_n_unit_parameter_type_is_not_compatible_with_attribute_highlighting=warning
+resharper_n_unit_range_attribute_bounds_are_out_of_range_highlighting=warning
+resharper_n_unit_range_step_sign_mismatch_highlighting=warning
+resharper_n_unit_range_step_value_must_not_be_zero_highlighting=warning
+resharper_n_unit_range_to_value_is_not_reachable_highlighting=warning
+resharper_n_unit_redundant_argument_instead_of_expected_result_highlighting=warning
+resharper_n_unit_redundant_argument_in_test_case_attribute_highlighting=warning
+resharper_n_unit_redundant_expected_result_in_test_case_attribute_highlighting=warning
+resharper_n_unit_test_case_attribute_requires_expected_result_highlighting=warning
+resharper_n_unit_test_case_result_property_duplicates_expected_result_highlighting=warning
+resharper_n_unit_test_case_result_property_is_obsolete_highlighting=warning
+resharper_n_unit_test_case_source_cannot_be_resolved_highlighting=warning
+resharper_n_unit_test_case_source_must_be_field_property_method_highlighting=warning
+resharper_n_unit_test_case_source_must_be_static_highlighting=warning
+resharper_n_unit_test_case_source_should_implement_i_enumerable_highlighting=warning
+resharper_object_creation_as_statement_highlighting=warning
+resharper_object_destructuring_without_parentheses_highlighting=error
+resharper_object_literals_are_not_comma_free_highlighting=error
+resharper_obsolete_element_error_highlighting=error
+resharper_obsolete_element_highlighting=warning
+resharper_octal_literals_not_allowed_error_highlighting=error
+resharper_ol_tag_contains_non_li_elements_highlighting=hint
+resharper_one_way_operation_contract_with_return_type_highlighting=warning
+resharper_operation_contract_without_service_contract_highlighting=warning
+resharper_operator_is_can_be_used_highlighting=warning
+resharper_optional_parameter_hierarchy_mismatch_highlighting=warning
+resharper_optional_parameter_ref_out_highlighting=warning
+resharper_other_tags_inside_script1_highlighting=error
+resharper_other_tags_inside_script2_highlighting=error
+resharper_other_tags_inside_unclosed_script_highlighting=error
+resharper_outdent_is_off_prev_level_highlighting=none
+resharper_output_tag_required_highlighting=warning
+resharper_out_parameter_value_is_always_discarded_global_highlighting=suggestion
+resharper_out_parameter_value_is_always_discarded_local_highlighting=warning
+resharper_overload_signature_inferring_highlighting=hint
+resharper_overridden_with_empty_value_highlighting=warning
+resharper_overridden_with_same_value_highlighting=suggestion
+resharper_parameter_doesnt_make_any_sense_highlighting=warning
+resharper_parameter_hides_member_highlighting=warning
+resharper_parameter_only_used_for_precondition_check_global_highlighting=suggestion
+resharper_parameter_only_used_for_precondition_check_local_highlighting=warning
+resharper_parameter_type_can_be_enumerable_global_highlighting=hint
+resharper_parameter_type_can_be_enumerable_local_highlighting=hint
+resharper_parameter_value_is_not_used_highlighting=warning
+resharper_partial_method_parameter_name_mismatch_highlighting=warning
+resharper_partial_method_with_single_part_highlighting=warning
+resharper_partial_type_with_single_part_highlighting=warning
+resharper_pass_string_interpolation_highlighting=hint
+resharper_path_not_resolved_highlighting=error
+resharper_pattern_always_matches_highlighting=warning
+resharper_pattern_is_always_true_or_false_highlighting=warning
+resharper_pattern_never_matches_highlighting=warning
+resharper_polymorphic_field_like_event_invocation_highlighting=warning
+resharper_possible_infinite_inheritance_highlighting=warning
+resharper_possible_intended_rethrow_highlighting=warning
+resharper_possible_interface_member_ambiguity_highlighting=warning
+resharper_possible_invalid_cast_exception_highlighting=warning
+resharper_possible_invalid_cast_exception_in_foreach_loop_highlighting=warning
+resharper_possible_invalid_operation_exception_highlighting=warning
+resharper_possible_loss_of_fraction_highlighting=warning
+resharper_possible_mistaken_argument_highlighting=warning
+resharper_possible_mistaken_call_to_get_type_1_highlighting=warning
+resharper_possible_mistaken_call_to_get_type_2_highlighting=warning
+resharper_possible_multiple_enumeration_highlighting=warning
+resharper_possible_multiple_write_access_in_double_check_locking_highlighting=warning
+resharper_possible_null_reference_exception_highlighting=warning
+resharper_possible_struct_member_modification_of_non_variable_struct_highlighting=warning
+resharper_possible_unintended_linear_search_in_set_highlighting=warning
+resharper_possible_unintended_queryable_as_enumerable_highlighting=suggestion
+resharper_possible_unintended_reference_comparison_highlighting=warning
+resharper_possible_write_to_me_highlighting=warning
+resharper_possibly_impure_method_call_on_readonly_variable_highlighting=warning
+resharper_possibly_incorrectly_broken_statement_highlighting=warning
+resharper_possibly_missing_indexer_initializer_comma_highlighting=warning
+resharper_possibly_mistaken_use_of_interpolated_string_insert_highlighting=warning
+resharper_possibly_mistaken_use_of_params_method_highlighting=warning
+resharper_possibly_unassigned_property_highlighting=hint
+resharper_private_field_can_be_converted_to_local_variable_highlighting=warning
+resharper_private_variable_can_be_made_readonly_highlighting=hint
+resharper_property_can_be_made_init_only_global_highlighting=suggestion
+resharper_property_can_be_made_init_only_local_highlighting=suggestion
+resharper_property_getter_cannot_have_parameters_highlighting=error
+resharper_property_not_resolved_highlighting=error
+resharper_property_setter_must_have_single_parameter_highlighting=error
+resharper_public_constructor_in_abstract_class_highlighting=suggestion
+resharper_pure_attribute_on_void_method_highlighting=warning
+resharper_qualified_expression_is_null_highlighting=warning
+resharper_qualified_expression_maybe_null_highlighting=warning
+resharper_razor_layout_not_resolved_highlighting=error
+resharper_razor_section_not_resolved_highlighting=error
+resharper_read_access_in_double_check_locking_highlighting=warning
+resharper_redundant_abstract_modifier_highlighting=warning
+resharper_redundant_always_match_subpattern_highlighting=suggestion
+resharper_redundant_anonymous_type_property_name_highlighting=warning
+resharper_redundant_argument_default_value_highlighting=warning
+resharper_redundant_array_creation_expression_highlighting=hint
+resharper_redundant_array_lower_bound_specification_highlighting=warning
+resharper_redundant_assignment_highlighting=warning
+resharper_redundant_attribute_parentheses_highlighting=hint
+resharper_redundant_attribute_usage_property_highlighting=suggestion
+resharper_redundant_base_constructor_call_highlighting=warning
+resharper_redundant_base_qualifier_highlighting=warning
+resharper_redundant_blank_lines_highlighting=none
+resharper_redundant_block_highlighting=warning
+resharper_redundant_bool_compare_highlighting=warning
+resharper_redundant_case_label_highlighting=warning
+resharper_redundant_cast_highlighting=warning
+resharper_redundant_catch_clause_highlighting=warning
+resharper_redundant_check_before_assignment_highlighting=warning
+resharper_redundant_collection_initializer_element_braces_highlighting=hint
+resharper_redundant_comparison_with_boolean_highlighting=warning
+resharper_redundant_configure_await_highlighting=suggestion
+resharper_redundant_css_hack_highlighting=warning
+resharper_redundant_declaration_semicolon_highlighting=hint
+resharper_redundant_default_member_initializer_highlighting=warning
+resharper_redundant_delegate_creation_highlighting=warning
+resharper_redundant_disable_warning_comment_highlighting=warning
+resharper_redundant_discard_designation_highlighting=suggestion
+resharper_redundant_else_block_highlighting=warning
+resharper_redundant_empty_case_else_highlighting=warning
+resharper_redundant_empty_constructor_highlighting=warning
+resharper_redundant_empty_finally_block_highlighting=warning
+resharper_redundant_empty_object_creation_argument_list_highlighting=hint
+resharper_redundant_empty_object_or_collection_initializer_highlighting=warning
+resharper_redundant_empty_switch_section_highlighting=warning
+resharper_redundant_enumerable_cast_call_highlighting=warning
+resharper_redundant_enum_case_label_for_default_section_highlighting=none
+resharper_redundant_explicit_array_creation_highlighting=warning
+resharper_redundant_explicit_array_size_highlighting=warning
+resharper_redundant_explicit_nullable_creation_highlighting=warning
+resharper_redundant_explicit_params_array_creation_highlighting=suggestion
+resharper_redundant_explicit_positional_property_declaration_highlighting=warning
+resharper_redundant_explicit_tuple_component_name_highlighting=warning
+resharper_redundant_extends_list_entry_highlighting=warning
+resharper_redundant_fixed_pointer_declaration_highlighting=suggestion
+resharper_redundant_highlighting=warning
+resharper_redundant_if_else_block_highlighting=hint
+resharper_redundant_if_statement_then_keyword_highlighting=none
+resharper_redundant_immediate_delegate_invocation_highlighting=suggestion
+resharper_redundant_intermediate_variable_highlighting=hint
+resharper_redundant_is_before_relational_pattern_highlighting=suggestion
+resharper_redundant_iterator_keyword_highlighting=warning
+resharper_redundant_jump_statement_highlighting=warning
+resharper_redundant_lambda_parameter_type_highlighting=warning
+resharper_redundant_lambda_signature_parentheses_highlighting=hint
+resharper_redundant_linebreak_highlighting=none
+resharper_redundant_local_class_name_highlighting=hint
+resharper_redundant_local_function_name_highlighting=hint
+resharper_redundant_logical_conditional_expression_operand_highlighting=warning
+resharper_redundant_me_qualifier_highlighting=warning
+resharper_redundant_my_base_qualifier_highlighting=warning
+resharper_redundant_my_class_qualifier_highlighting=warning
+resharper_redundant_name_qualifier_highlighting=warning
+resharper_redundant_not_null_constraint_highlighting=warning
+resharper_redundant_nullable_annotation_on_reference_type_constraint_highlighting=warning
+resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_base_type_highlighting=warning
+resharper_redundant_nullable_annotation_on_type_constraint_has_non_nullable_type_kind_highlighting=warning
+resharper_redundant_nullable_flow_attribute_highlighting=warning
+resharper_redundant_nullable_type_mark_highlighting=warning
+resharper_redundant_nullness_attribute_with_nullable_reference_types_highlighting=warning
+resharper_redundant_overflow_checking_context_highlighting=warning
+resharper_redundant_overload_global_highlighting=suggestion
+resharper_redundant_overload_local_highlighting=suggestion
+resharper_redundant_overridden_member_highlighting=warning
+resharper_redundant_params_highlighting=warning
+resharper_redundant_parentheses_highlighting=none
+resharper_redundant_parent_type_declaration_highlighting=warning
+resharper_redundant_pattern_parentheses_highlighting=hint
+resharper_redundant_property_parentheses_highlighting=hint
+resharper_redundant_property_pattern_clause_highlighting=suggestion
+resharper_redundant_qualifier_highlighting=warning
+resharper_redundant_query_order_by_ascending_keyword_highlighting=hint
+resharper_redundant_range_bound_highlighting=suggestion
+resharper_redundant_readonly_modifier_highlighting=suggestion
+resharper_redundant_record_body_highlighting=warning
+resharper_redundant_record_class_keyword_highlighting=warning
+resharper_redundant_setter_value_parameter_declaration_highlighting=hint
+resharper_redundant_space_highlighting=none
+resharper_redundant_string_format_call_highlighting=warning
+resharper_redundant_string_interpolation_highlighting=suggestion
+resharper_redundant_string_to_char_array_call_highlighting=warning
+resharper_redundant_string_type_highlighting=suggestion
+resharper_redundant_suppress_nullable_warning_expression_highlighting=warning
+resharper_redundant_ternary_expression_highlighting=warning
+resharper_redundant_to_string_call_for_value_type_highlighting=hint
+resharper_redundant_to_string_call_highlighting=warning
+resharper_redundant_type_arguments_of_method_highlighting=warning
+resharper_redundant_type_cast_highlighting=warning
+resharper_redundant_type_cast_structural_highlighting=warning
+resharper_redundant_type_check_in_pattern_highlighting=warning
+resharper_redundant_units_highlighting=warning
+resharper_redundant_unsafe_context_highlighting=warning
+resharper_redundant_using_directive_global_highlighting=warning
+resharper_redundant_using_directive_highlighting=warning
+resharper_redundant_variable_type_specification_highlighting=hint
+resharper_redundant_verbatim_prefix_highlighting=suggestion
+resharper_redundant_verbatim_string_prefix_highlighting=suggestion
+resharper_redundant_with_expression_highlighting=suggestion
+resharper_reference_equals_with_value_type_highlighting=warning
+resharper_reg_exp_inspections_highlighting=warning
+resharper_remove_constructor_invocation_highlighting=none
+resharper_remove_redundant_braces_highlighting=none
+resharper_remove_redundant_or_statement_false_highlighting=suggestion
+resharper_remove_redundant_or_statement_true_highlighting=suggestion
+resharper_remove_to_list_1_highlighting=suggestion
+resharper_remove_to_list_2_highlighting=suggestion
+resharper_replace_auto_property_with_computed_property_highlighting=hint
+resharper_replace_indicing_with_array_destructuring_highlighting=hint
+resharper_replace_indicing_with_short_hand_properties_after_destructuring_highlighting=hint
+resharper_replace_object_pattern_with_var_pattern_highlighting=suggestion
+resharper_replace_slice_with_range_indexer_highlighting=hint
+resharper_replace_substring_with_range_indexer_highlighting=hint
+resharper_replace_undefined_checking_series_with_object_destructuring_highlighting=hint
+resharper_replace_with_destructuring_swap_highlighting=hint
+resharper_replace_with_first_or_default_1_highlighting=suggestion
+resharper_replace_with_first_or_default_2_highlighting=suggestion
+resharper_replace_with_first_or_default_3_highlighting=suggestion
+resharper_replace_with_first_or_default_4_highlighting=suggestion
+resharper_replace_with_last_or_default_1_highlighting=suggestion
+resharper_replace_with_last_or_default_2_highlighting=suggestion
+resharper_replace_with_last_or_default_3_highlighting=suggestion
+resharper_replace_with_last_or_default_4_highlighting=suggestion
+resharper_replace_with_of_type_1_highlighting=suggestion
+resharper_replace_with_of_type_2_highlighting=suggestion
+resharper_replace_with_of_type_3_highlighting=suggestion
+resharper_replace_with_of_type_any_1_highlighting=suggestion
+resharper_replace_with_of_type_any_2_highlighting=suggestion
+resharper_replace_with_of_type_count_1_highlighting=suggestion
+resharper_replace_with_of_type_count_2_highlighting=suggestion
+resharper_replace_with_of_type_first_1_highlighting=suggestion
+resharper_replace_with_of_type_first_2_highlighting=suggestion
+resharper_replace_with_of_type_first_or_default_1_highlighting=suggestion
+resharper_replace_with_of_type_first_or_default_2_highlighting=suggestion
+resharper_replace_with_of_type_last_1_highlighting=suggestion
+resharper_replace_with_of_type_last_2_highlighting=suggestion
+resharper_replace_with_of_type_last_or_default_1_highlighting=suggestion
+resharper_replace_with_of_type_last_or_default_2_highlighting=suggestion
+resharper_replace_with_of_type_long_count_highlighting=suggestion
+resharper_replace_with_of_type_single_1_highlighting=suggestion
+resharper_replace_with_of_type_single_2_highlighting=suggestion
+resharper_replace_with_of_type_single_or_default_1_highlighting=suggestion
+resharper_replace_with_of_type_single_or_default_2_highlighting=suggestion
+resharper_replace_with_of_type_where_highlighting=suggestion
+resharper_replace_with_simple_assignment_false_highlighting=suggestion
+resharper_replace_with_simple_assignment_true_highlighting=suggestion
+resharper_replace_with_single_assignment_false_highlighting=suggestion
+resharper_replace_with_single_assignment_true_highlighting=suggestion
+resharper_replace_with_single_call_to_any_highlighting=suggestion
+resharper_replace_with_single_call_to_count_highlighting=suggestion
+resharper_replace_with_single_call_to_first_highlighting=suggestion
+resharper_replace_with_single_call_to_first_or_default_highlighting=suggestion
+resharper_replace_with_single_call_to_last_highlighting=suggestion
+resharper_replace_with_single_call_to_last_or_default_highlighting=suggestion
+resharper_replace_with_single_call_to_single_highlighting=suggestion
+resharper_replace_with_single_call_to_single_or_default_highlighting=suggestion
+resharper_replace_with_single_or_default_1_highlighting=suggestion
+resharper_replace_with_single_or_default_2_highlighting=suggestion
+resharper_replace_with_single_or_default_3_highlighting=suggestion
+resharper_replace_with_single_or_default_4_highlighting=suggestion
+resharper_replace_with_string_is_null_or_empty_highlighting=suggestion
+resharper_required_base_types_conflict_highlighting=warning
+resharper_required_base_types_direct_conflict_highlighting=warning
+resharper_required_base_types_is_not_inherited_highlighting=warning
+resharper_requires_fallback_color_highlighting=warning
+resharper_resource_item_not_resolved_highlighting=error
+resharper_resource_not_resolved_highlighting=error
+resharper_resx_not_resolved_highlighting=warning
+resharper_return_from_global_scopet_with_value_highlighting=warning
+resharper_return_type_can_be_enumerable_global_highlighting=hint
+resharper_return_type_can_be_enumerable_local_highlighting=hint
+resharper_return_type_can_be_not_nullable_highlighting=warning
+resharper_return_value_of_pure_method_is_not_used_highlighting=warning
+resharper_route_templates_action_route_prefix_can_be_extracted_to_controller_route_highlighting=hint
+resharper_route_templates_ambiguous_matching_constraint_constructor_highlighting=warning
+resharper_route_templates_ambiguous_route_match_highlighting=warning
+resharper_route_templates_constraint_argument_cannot_be_converted_highlighting=warning
+resharper_route_templates_controller_route_parameter_is_not_passed_to_methods_highlighting=hint
+resharper_route_templates_duplicated_parameter_highlighting=warning
+resharper_route_templates_matching_constraint_constructor_not_resolved_highlighting=warning
+resharper_route_templates_method_missing_route_parameters_highlighting=hint
+resharper_route_templates_optional_parameter_can_be_preceded_only_by_single_period_highlighting=warning
+resharper_route_templates_optional_parameter_must_be_at_the_end_of_segment_highlighting=warning
+resharper_route_templates_parameter_constraint_can_be_specified_highlighting=hint
+resharper_route_templates_parameter_type_and_constraints_mismatch_highlighting=warning
+resharper_route_templates_parameter_type_can_be_made_stricter_highlighting=suggestion
+resharper_route_templates_route_parameter_constraint_not_resolved_highlighting=warning
+resharper_route_templates_route_parameter_is_not_passed_to_method_highlighting=hint
+resharper_route_templates_route_token_not_resolved_highlighting=warning
+resharper_route_templates_symbol_not_resolved_highlighting=warning
+resharper_route_templates_syntax_error_highlighting=warning
+resharper_safe_cast_is_used_as_type_check_highlighting=suggestion
+resharper_same_imports_with_different_name_highlighting=warning
+resharper_same_variable_assignment_highlighting=warning
+resharper_script_tag_has_both_src_and_content_attributes_highlighting=error
+resharper_script_tag_with_content_before_includes_highlighting=hint
+resharper_sealed_member_in_sealed_class_highlighting=warning
+resharper_separate_control_transfer_statement_highlighting=none
+resharper_service_contract_without_operations_highlighting=warning
+resharper_shift_expression_real_shift_count_is_zero_highlighting=warning
+resharper_shift_expression_result_equals_zero_highlighting=warning
+resharper_shift_expression_right_operand_not_equal_real_count_highlighting=warning
+resharper_shift_expression_zero_left_operand_highlighting=warning
+resharper_similar_anonymous_type_nearby_highlighting=hint
+resharper_similar_expressions_comparison_highlighting=warning
+resharper_simplify_conditional_operator_highlighting=suggestion
+resharper_simplify_conditional_ternary_expression_highlighting=suggestion
+resharper_simplify_i_if_highlighting=suggestion
+resharper_simplify_linq_expression_use_all_highlighting=suggestion
+resharper_simplify_linq_expression_use_any_highlighting=suggestion
+resharper_simplify_string_interpolation_highlighting=suggestion
+resharper_specify_a_culture_in_string_conversion_explicitly_highlighting=warning
+resharper_specify_string_comparison_highlighting=hint
+resharper_specify_variable_type_explicitly_highlighting=hint
+resharper_spin_lock_in_readonly_field_highlighting=warning
+resharper_stack_alloc_inside_loop_highlighting=warning
+resharper_statement_termination_highlighting=warning
+resharper_static_member_initializer_referes_to_member_below_highlighting=warning
+resharper_static_member_in_generic_type_highlighting=none
+resharper_static_problem_in_text_highlighting=warning
+resharper_string_compare_is_culture_specific_1_highlighting=warning
+resharper_string_compare_is_culture_specific_2_highlighting=warning
+resharper_string_compare_is_culture_specific_3_highlighting=warning
+resharper_string_compare_is_culture_specific_4_highlighting=warning
+resharper_string_compare_is_culture_specific_5_highlighting=warning
+resharper_string_compare_is_culture_specific_6_highlighting=warning
+resharper_string_compare_to_is_culture_specific_highlighting=warning
+resharper_string_concatenation_to_template_string_highlighting=hint
+resharper_string_ends_with_is_culture_specific_highlighting=none
+resharper_string_index_of_is_culture_specific_1_highlighting=warning
+resharper_string_index_of_is_culture_specific_2_highlighting=warning
+resharper_string_index_of_is_culture_specific_3_highlighting=warning
+resharper_string_last_index_of_is_culture_specific_1_highlighting=warning
+resharper_string_last_index_of_is_culture_specific_2_highlighting=warning
+resharper_string_last_index_of_is_culture_specific_3_highlighting=warning
+resharper_string_literal_as_interpolation_argument_highlighting=suggestion
+resharper_string_literal_typo_highlighting=suggestion
+resharper_string_literal_wrong_quotes_highlighting=hint
+resharper_string_starts_with_is_culture_specific_highlighting=none
+resharper_structured_message_template_problem_highlighting=warning
+resharper_struct_can_be_made_read_only_highlighting=suggestion
+resharper_struct_member_can_be_made_read_only_highlighting=none
+resharper_suggest_base_type_for_parameter_highlighting=hint
+resharper_suggest_base_type_for_parameter_in_constructor_highlighting=hint
+resharper_suggest_discard_declaration_var_style_highlighting=hint
+resharper_suggest_var_or_type_built_in_types_highlighting=hint
+resharper_suggest_var_or_type_deconstruction_declarations_highlighting=hint
+resharper_suggest_var_or_type_elsewhere_highlighting=hint
+resharper_suggest_var_or_type_simple_types_highlighting=hint
+resharper_super_call_highlighting=suggestion
+resharper_super_call_prohibits_this_highlighting=error
+resharper_suppress_nullable_warning_expression_as_inverted_is_expression_highlighting=warning
+resharper_suspicious_instanceof_check_highlighting=warning
+resharper_suspicious_lambda_block_highlighting=warning
+resharper_suspicious_lock_over_synchronization_primitive_highlighting=warning
+resharper_suspicious_math_sign_method_highlighting=warning
+resharper_suspicious_parameter_name_in_argument_null_exception_highlighting=warning
+resharper_suspicious_this_usage_highlighting=warning
+resharper_suspicious_typeof_check_highlighting=warning
+resharper_suspicious_type_conversion_global_highlighting=warning
+resharper_swap_via_deconstruction_highlighting=suggestion
+resharper_switch_expression_handles_some_known_enum_values_with_exception_in_default_highlighting=hint
+resharper_switch_statement_for_enum_misses_default_section_highlighting=hint
+resharper_switch_statement_handles_some_known_enum_values_with_default_highlighting=hint
+resharper_switch_statement_missing_some_enum_cases_no_default_highlighting=none
+resharper_symbol_from_not_copied_locally_reference_used_warning_highlighting=warning
+resharper_syntax_is_not_allowed_highlighting=warning
+resharper_tabs_and_spaces_mismatch_highlighting=none
+resharper_tabs_are_disallowed_highlighting=none
+resharper_tabs_outside_indent_highlighting=none
+resharper_tail_recursive_call_highlighting=hint
+resharper_tasks_not_loaded_highlighting=warning
+resharper_ternary_can_be_replaced_by_its_condition_highlighting=warning
+resharper_this_in_global_context_highlighting=warning
+resharper_thread_static_at_instance_field_highlighting=warning
+resharper_thread_static_field_has_initializer_highlighting=warning
+resharper_throw_must_be_followed_by_expression_highlighting=error
+resharper_too_wide_local_variable_scope_highlighting=suggestion
+resharper_try_cast_always_succeeds_highlighting=suggestion
+resharper_try_statements_can_be_merged_highlighting=hint
+resharper_ts_not_resolved_highlighting=error
+resharper_ts_resolved_from_inaccessible_module_highlighting=error
+resharper_type_guard_doesnt_affect_anything_highlighting=warning
+resharper_type_guard_produces_never_type_highlighting=warning
+resharper_type_parameter_can_be_variant_highlighting=suggestion
+resharper_type_parameter_hides_type_param_from_outer_scope_highlighting=warning
+resharper_ul_tag_contains_non_li_elements_highlighting=hint
+resharper_unassigned_field_global_highlighting=suggestion
+resharper_unassigned_field_local_highlighting=warning
+resharper_unassigned_get_only_auto_property_highlighting=warning
+resharper_unassigned_readonly_field_highlighting=warning
+resharper_unclosed_script_highlighting=error
+resharper_undeclared_global_variable_using_highlighting=warning
+resharper_unexpected_value_highlighting=error
+resharper_unknown_css_class_highlighting=warning
+resharper_unknown_css_variable_highlighting=warning
+resharper_unknown_css_vendor_extension_highlighting=hint
+resharper_unknown_item_group_highlighting=warning
+resharper_unknown_metadata_highlighting=warning
+resharper_unknown_output_parameter_highlighting=warning
+resharper_unknown_property_highlighting=warning
+resharper_unknown_target_highlighting=warning
+resharper_unknown_task_attribute_highlighting=warning
+resharper_unknown_task_highlighting=warning
+resharper_unnecessary_whitespace_highlighting=none
+resharper_unreachable_switch_arm_due_to_integer_analysis_highlighting=warning
+resharper_unreachable_switch_case_due_to_integer_analysis_highlighting=warning
+resharper_unreal_header_tool_error_highlighting=error
+resharper_unreal_header_tool_parser_error_highlighting=error
+resharper_unreal_header_tool_warning_highlighting=warning
+resharper_unsafe_comma_in_object_properties_list_highlighting=warning
+resharper_unsupported_required_base_type_highlighting=warning
+resharper_unused_anonymous_method_signature_highlighting=warning
+resharper_unused_auto_property_accessor_global_highlighting=warning
+resharper_unused_auto_property_accessor_local_highlighting=warning
+resharper_unused_import_clause_highlighting=warning
+resharper_unused_inherited_parameter_highlighting=hint
+resharper_unused_locals_highlighting=warning
+resharper_unused_local_function_highlighting=warning
+resharper_unused_local_function_parameter_highlighting=warning
+resharper_unused_local_function_return_value_highlighting=warning
+resharper_unused_local_import_highlighting=warning
+resharper_unused_member_global_highlighting=suggestion
+resharper_unused_member_hierarchy_global_highlighting=suggestion
+resharper_unused_member_hierarchy_local_highlighting=warning
+resharper_unused_member_in_super_global_highlighting=suggestion
+resharper_unused_member_in_super_local_highlighting=warning
+resharper_unused_member_local_highlighting=warning
+resharper_unused_method_return_value_global_highlighting=suggestion
+resharper_unused_method_return_value_local_highlighting=warning
+resharper_unused_parameter_global_highlighting=suggestion
+resharper_unused_parameter_highlighting=warning
+resharper_unused_parameter_in_partial_method_highlighting=warning
+resharper_unused_parameter_local_highlighting=warning
+resharper_unused_property_highlighting=warning
+resharper_unused_tuple_component_in_return_value_highlighting=warning
+resharper_unused_type_global_highlighting=suggestion
+resharper_unused_type_local_highlighting=warning
+resharper_unused_type_parameter_highlighting=warning
+resharper_unused_variable_highlighting=warning
+resharper_usage_of_definitely_unassigned_value_highlighting=warning
+resharper_usage_of_possibly_unassigned_value_highlighting=warning
+resharper_useless_binary_operation_highlighting=warning
+resharper_useless_comparison_to_integral_constant_highlighting=warning
+resharper_use_array_creation_expression_1_highlighting=suggestion
+resharper_use_array_creation_expression_2_highlighting=suggestion
+resharper_use_array_empty_method_highlighting=suggestion
+resharper_use_as_instead_of_type_cast_highlighting=hint
+resharper_use_await_using_highlighting=suggestion
+resharper_use_cancellation_token_for_i_async_enumerable_highlighting=suggestion
+resharper_use_collection_count_property_highlighting=suggestion
+resharper_use_configure_await_false_for_async_disposable_highlighting=none
+resharper_use_configure_await_false_highlighting=suggestion
+resharper_use_deconstruction_highlighting=hint
+resharper_use_deconstruction_on_parameter_highlighting=hint
+resharper_use_empty_types_field_highlighting=suggestion
+resharper_use_event_args_empty_field_highlighting=suggestion
+resharper_use_format_specifier_in_format_string_highlighting=suggestion
+resharper_use_implicitly_typed_variable_evident_highlighting=hint
+resharper_use_implicitly_typed_variable_highlighting=none
+resharper_use_implicit_by_val_modifier_highlighting=hint
+resharper_use_indexed_property_highlighting=suggestion
+resharper_use_index_from_end_expression_highlighting=suggestion
+resharper_use_is_operator_1_highlighting=suggestion
+resharper_use_is_operator_2_highlighting=suggestion
+resharper_use_method_any_0_highlighting=suggestion
+resharper_use_method_any_1_highlighting=suggestion
+resharper_use_method_any_2_highlighting=suggestion
+resharper_use_method_any_3_highlighting=suggestion
+resharper_use_method_any_4_highlighting=suggestion
+resharper_use_method_is_instance_of_type_highlighting=suggestion
+resharper_use_nameof_expression_for_part_of_the_string_highlighting=none
+resharper_use_nameof_expression_highlighting=suggestion
+resharper_use_name_of_instead_of_type_of_highlighting=suggestion
+resharper_use_negated_pattern_in_is_expression_highlighting=hint
+resharper_use_negated_pattern_matching_highlighting=hint
+resharper_use_nullable_annotation_instead_of_attribute_highlighting=suggestion
+resharper_use_nullable_attributes_supported_by_compiler_highlighting=suggestion
+resharper_use_nullable_reference_types_annotation_syntax_highlighting=warning
+resharper_use_null_propagation_highlighting=hint
+resharper_use_null_propagation_when_possible_highlighting=none
+resharper_use_object_or_collection_initializer_highlighting=suggestion
+resharper_use_of_implicit_global_in_function_scope_highlighting=warning
+resharper_use_of_possibly_unassigned_property_highlighting=warning
+resharper_use_pattern_matching_highlighting=suggestion
+resharper_use_positional_deconstruction_pattern_highlighting=none
+resharper_use_string_interpolation_highlighting=suggestion
+resharper_use_switch_case_pattern_variable_highlighting=suggestion
+resharper_use_throw_if_null_method_highlighting=none
+resharper_use_verbatim_string_highlighting=hint
+resharper_using_of_reserved_word_error_highlighting=error
+resharper_using_of_reserved_word_highlighting=warning
+resharper_value_parameter_not_used_highlighting=warning
+resharper_value_range_attribute_violation_highlighting=warning
+resharper_value_should_have_units_highlighting=error
+resharper_variable_can_be_made_const_highlighting=hint
+resharper_variable_can_be_made_let_highlighting=hint
+resharper_variable_can_be_moved_to_inner_block_highlighting=hint
+resharper_variable_can_be_not_nullable_highlighting=warning
+resharper_variable_hides_outer_variable_highlighting=warning
+resharper_variable_used_before_declared_highlighting=warning
+resharper_variable_used_in_inner_scope_before_declared_highlighting=warning
+resharper_variable_used_out_of_scope_highlighting=warning
+resharper_vb_check_for_reference_equality_instead_1_highlighting=suggestion
+resharper_vb_check_for_reference_equality_instead_2_highlighting=suggestion
+resharper_vb_possible_mistaken_argument_highlighting=warning
+resharper_vb_possible_mistaken_call_to_get_type_1_highlighting=warning
+resharper_vb_possible_mistaken_call_to_get_type_2_highlighting=warning
+resharper_vb_remove_to_list_1_highlighting=suggestion
+resharper_vb_remove_to_list_2_highlighting=suggestion
+resharper_vb_replace_with_first_or_default_highlighting=suggestion
+resharper_vb_replace_with_last_or_default_highlighting=suggestion
+resharper_vb_replace_with_of_type_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_any_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_any_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_count_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_count_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_first_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_first_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_first_or_default_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_first_or_default_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_last_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_last_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_last_or_default_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_last_or_default_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_single_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_single_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_single_or_default_1_highlighting=suggestion
+resharper_vb_replace_with_of_type_single_or_default_2_highlighting=suggestion
+resharper_vb_replace_with_of_type_where_highlighting=suggestion
+resharper_vb_replace_with_single_assignment_1_highlighting=suggestion
+resharper_vb_replace_with_single_assignment_2_highlighting=suggestion
+resharper_vb_replace_with_single_call_to_any_highlighting=suggestion
+resharper_vb_replace_with_single_call_to_count_highlighting=suggestion
+resharper_vb_replace_with_single_call_to_first_highlighting=suggestion
+resharper_vb_replace_with_single_call_to_first_or_default_highlighting=suggestion
+resharper_vb_replace_with_single_call_to_last_highlighting=suggestion
+resharper_vb_replace_with_single_call_to_last_or_default_highlighting=suggestion
+resharper_vb_replace_with_single_call_to_single_highlighting=suggestion
+resharper_vb_replace_with_single_call_to_single_or_default_highlighting=suggestion
+resharper_vb_replace_with_single_or_default_highlighting=suggestion
+resharper_vb_simplify_linq_expression_10_highlighting=hint
+resharper_vb_simplify_linq_expression_1_highlighting=suggestion
+resharper_vb_simplify_linq_expression_2_highlighting=suggestion
+resharper_vb_simplify_linq_expression_3_highlighting=suggestion
+resharper_vb_simplify_linq_expression_4_highlighting=suggestion
+resharper_vb_simplify_linq_expression_5_highlighting=suggestion
+resharper_vb_simplify_linq_expression_6_highlighting=suggestion
+resharper_vb_simplify_linq_expression_7_highlighting=hint
+resharper_vb_simplify_linq_expression_8_highlighting=hint
+resharper_vb_simplify_linq_expression_9_highlighting=hint
+resharper_vb_string_compare_is_culture_specific_1_highlighting=warning
+resharper_vb_string_compare_is_culture_specific_2_highlighting=warning
+resharper_vb_string_compare_is_culture_specific_3_highlighting=warning
+resharper_vb_string_compare_is_culture_specific_4_highlighting=warning
+resharper_vb_string_compare_is_culture_specific_5_highlighting=warning
+resharper_vb_string_compare_is_culture_specific_6_highlighting=warning
+resharper_vb_string_compare_to_is_culture_specific_highlighting=warning
+resharper_vb_string_ends_with_is_culture_specific_highlighting=none
+resharper_vb_string_index_of_is_culture_specific_1_highlighting=warning
+resharper_vb_string_index_of_is_culture_specific_2_highlighting=warning
+resharper_vb_string_index_of_is_culture_specific_3_highlighting=warning
+resharper_vb_string_last_index_of_is_culture_specific_1_highlighting=warning
+resharper_vb_string_last_index_of_is_culture_specific_2_highlighting=warning
+resharper_vb_string_last_index_of_is_culture_specific_3_highlighting=warning
+resharper_vb_string_starts_with_is_culture_specific_highlighting=none
+resharper_vb_unreachable_code_highlighting=warning
+resharper_vb_use_array_creation_expression_1_highlighting=suggestion
+resharper_vb_use_array_creation_expression_2_highlighting=suggestion
+resharper_vb_use_first_instead_highlighting=warning
+resharper_vb_use_method_any_1_highlighting=suggestion
+resharper_vb_use_method_any_2_highlighting=suggestion
+resharper_vb_use_method_any_3_highlighting=suggestion
+resharper_vb_use_method_any_4_highlighting=suggestion
+resharper_vb_use_method_any_5_highlighting=suggestion
+resharper_vb_use_method_is_instance_of_type_highlighting=suggestion
+resharper_vb_use_type_of_is_operator_1_highlighting=suggestion
+resharper_vb_use_type_of_is_operator_2_highlighting=suggestion
+resharper_virtual_member_call_in_constructor_highlighting=warning
+resharper_virtual_member_never_overridden_global_highlighting=suggestion
+resharper_virtual_member_never_overridden_local_highlighting=suggestion
+resharper_void_method_with_must_use_return_value_attribute_highlighting=warning
+resharper_web_config_module_not_resolved_highlighting=error
+resharper_web_config_module_qualification_resolve_highlighting=warning
+resharper_web_config_redundant_add_namespace_tag_highlighting=warning
+resharper_web_config_redundant_location_tag_highlighting=warning
+resharper_web_config_tag_prefix_redundand_highlighting=warning
+resharper_web_config_type_not_resolved_highlighting=error
+resharper_web_config_unused_add_tag_highlighting=warning
+resharper_web_config_unused_element_due_to_config_source_attribute_highlighting=warning
+resharper_web_config_unused_remove_or_clear_tag_highlighting=warning
+resharper_web_config_web_config_path_warning_highlighting=warning
+resharper_web_config_wrong_module_highlighting=error
+resharper_web_ignored_path_highlighting=none
+resharper_web_mapped_path_highlighting=hint
+resharper_with_expression_instead_of_initializer_highlighting=suggestion
+resharper_with_statement_using_error_highlighting=error
+resharper_wrong_expression_statement_highlighting=warning
+resharper_wrong_indent_size_highlighting=none
+resharper_wrong_metadata_use_highlighting=none
+resharper_wrong_public_modifier_specification_highlighting=hint
+resharper_wrong_require_relative_path_highlighting=hint
+resharper_xaml_assign_null_to_not_null_attribute_highlighting=warning
+resharper_xaml_avalonia_wrong_binding_mode_for_stream_binding_operator_highlighting=warning
+resharper_xaml_binding_without_context_not_resolved_highlighting=hint
+resharper_xaml_binding_with_context_not_resolved_highlighting=warning
+resharper_xaml_compiled_binding_missing_data_type_error_highlighting_highlighting=error
+resharper_xaml_constructor_warning_highlighting=warning
+resharper_xaml_decimal_parsing_is_culture_dependent_highlighting=warning
+resharper_xaml_dependency_property_resolve_error_highlighting=warning
+resharper_xaml_duplicate_style_setter_highlighting=warning
+resharper_xaml_dynamic_resource_error_highlighting=error
+resharper_xaml_element_name_reference_not_resolved_highlighting=error
+resharper_xaml_empty_grid_length_definition_highlighting=error
+resharper_xaml_grid_definitions_can_be_converted_to_attribute_highlighting=hint
+resharper_xaml_ignored_path_highlighting_highlighting=none
+resharper_xaml_index_out_of_grid_definition_highlighting=warning
+resharper_xaml_invalid_member_type_highlighting=error
+resharper_xaml_invalid_resource_target_type_highlighting=error
+resharper_xaml_invalid_resource_type_highlighting=error
+resharper_xaml_invalid_type_highlighting=error
+resharper_xaml_language_level_highlighting=error
+resharper_xaml_mapped_path_highlighting_highlighting=hint
+resharper_xaml_method_arguments_will_be_ignored_highlighting=warning
+resharper_xaml_missing_grid_index_highlighting=warning
+resharper_xaml_overloads_collision_highlighting=warning
+resharper_xaml_parent_is_out_of_current_component_tree_highlighting=warning
+resharper_xaml_path_error_highlighting=warning
+resharper_xaml_possible_null_reference_exception_highlighting=suggestion
+resharper_xaml_redundant_attached_property_highlighting=warning
+resharper_xaml_redundant_binding_mode_attribute_highlighting=warning
+resharper_xaml_redundant_collection_property_highlighting=warning
+resharper_xaml_redundant_freeze_attribute_highlighting=warning
+resharper_xaml_redundant_grid_definitions_highlighting=warning
+resharper_xaml_redundant_grid_span_highlighting=warning
+resharper_xaml_redundant_modifiers_attribute_highlighting=warning
+resharper_xaml_redundant_namespace_alias_highlighting=warning
+resharper_xaml_redundant_name_attribute_highlighting=warning
+resharper_xaml_redundant_property_type_qualifier_highlighting=warning
+resharper_xaml_redundant_resource_highlighting=warning
+resharper_xaml_redundant_styled_value_highlighting=warning
+resharper_xaml_redundant_update_source_trigger_attribute_highlighting=warning
+resharper_xaml_redundant_xamarin_forms_class_declaration_highlighting=warning
+resharper_xaml_resource_file_path_case_mismatch_highlighting=warning
+resharper_xaml_routed_event_resolve_error_highlighting=warning
+resharper_xaml_static_resource_not_resolved_highlighting=warning
+resharper_xaml_style_class_not_found_highlighting=warning
+resharper_xaml_style_invalid_target_type_highlighting=error
+resharper_xaml_unexpected_text_token_highlighting=error
+resharper_xaml_xaml_duplicate_device_family_type_view_highlighting_highlighting=error
+resharper_xaml_xaml_mismatched_device_family_view_clr_name_highlighting_highlighting=warning
+resharper_xaml_xaml_relative_source_default_mode_warning_highlighting_highlighting=warning
+resharper_xaml_xaml_unknown_device_family_type_highlighting_highlighting=warning
+resharper_xaml_xaml_xamarin_forms_data_type_and_binding_context_type_mismatched_highlighting_highlighting=warning
+resharper_xaml_x_key_attribute_disallowed_highlighting=error
+resharper_xml_doc_comment_syntax_problem_highlighting=warning
+resharper_xunit_xunit_test_with_console_output_highlighting=warning
+csharp_style_prefer_implicitly_typed_lambda_expression = true:suggestion
+csharp_style_expression_bodied_methods = true:silent
+csharp_style_prefer_tuple_swap = true:suggestion
+csharp_style_prefer_unbound_generic_type_in_nameof = true:suggestion
+csharp_style_prefer_utf8_string_literals = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+csharp_style_expression_bodied_constructors = true:silent
+csharp_style_expression_bodied_operators = true:silent
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_unused_value_assignment_preference = discard_variable:suggestion
+csharp_style_unused_value_expression_statement_preference = discard_variable:silent
+csharp_style_expression_bodied_properties = true:silent
+csharp_prefer_simple_using_statement = true:suggestion
+csharp_prefer_braces = true:silent
+csharp_style_prefer_method_group_conversion = true:silent
+csharp_style_prefer_top_level_statements = true:silent
+csharp_style_prefer_primary_constructors = true:suggestion
+csharp_prefer_system_threading_lock = true:suggestion
+csharp_style_prefer_simple_property_accessors = true:suggestion
+csharp_style_expression_bodied_indexers = true:silent
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_style_throw_expression = true:suggestion
+csharp_style_prefer_null_check_over_type_check = true:suggestion
+csharp_style_prefer_local_over_anonymous_function = true:suggestion
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_prefer_range_operator = true:suggestion
+csharp_style_prefer_index_operator = true:suggestion
+csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
+csharp_prefer_static_local_function = true:suggestion
+csharp_style_prefer_readonly_struct = true:suggestion
+csharp_prefer_static_anonymous_function = true:suggestion
+csharp_style_prefer_readonly_struct_member = true:suggestion
+csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
+csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
+csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent
+csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
+csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
+csharp_style_conditional_delegate_call = true:suggestion
+csharp_style_prefer_switch_expression = true:suggestion
+csharp_style_prefer_pattern_matching = true:silent
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_prefer_not_pattern = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_prefer_extended_property_pattern = true:suggestion
+
+[*.{cshtml,htm,html,proto,razor}]
+indent_style=tab
+indent_size=tab
+tab_width=4
+
+[*.{asax,ascx,aspx,axaml,c,c++,cc,cginc,compute,cp,cpp,cs,css,cu,cuh,cxx,h,hh,hlsl,hlsli,hlslinc,hpp,hxx,inc,inl,ino,ipp,js,jsx,master,mpp,mq4,mq5,mqh,paml,skin,tpp,ts,tsx,usf,ush,vb,xaml,xamlx,xoml}]
+indent_style=space
+indent_size=4
+tab_width=4
+
+[ "*.proto" ]
+indent_style=tab
+indent_size=tab
+tab_width=4
+
+[*.{asax,ascx,aspx,axaml,cs,cshtml,css,htm,html,js,jsx,master,paml,razor,skin,ts,tsx,vb,xaml,xamlx,xoml}]
+indent_style=space
+indent_size=4
+tab_width=4
+
+[*.{appxmanifest,axml,build,config,csproj,dbml,discomap,dtd,json,jsproj,lsproj,njsproj,nuspec,proj,props,resjson,resw,resx,StyleCop,targets,tasks,vbproj,xml,xsd}]
+indent_style=space
+indent_size=2
+tab_width=2
+
+[*.{appxmanifest,asax,ascx,aspx,axaml,axml,build,c,c++,cc,cginc,compute,config,cp,cpp,cs,cshtml,csproj,css,cu,cuh,cxx,dbml,discomap,dtd,h,hh,hlsl,hlsli,hlslinc,hpp,htm,html,hxx,inc,inl,ino,ipp,js,json,jsproj,jsx,lsproj,master,mpp,mq4,mq5,mqh,njsproj,nuspec,paml,proj,props,proto,razor,resjson,resw,resx,skin,StyleCop,targets,tasks,tpp,ts,tsx,usf,ush,vb,vbproj,xaml,xamlx,xml,xoml,xsd}]
+indent_style=space
+indent_size= 4
+tab_width= 4
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:silent
+dotnet_style_prefer_conditional_expression_over_return = true:silent
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_prefer_simplified_interpolation = true:suggestion
+dotnet_style_namespace_match_folder = true:suggestion
+insert_final_newline = true
+end_of_line = lf
+dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
+dotnet_style_readonly_field = true:suggestion
+dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
+dotnet_style_allow_multiple_blank_lines_experimental = true:silent
+dotnet_code_quality_unused_parameters = all:suggestion
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
diff --git a/Luna b/Luna
index 91417405d..b0cd45bed 160000
--- a/Luna
+++ b/Luna
@@ -1 +1 @@
-Subproject commit 91417405d327f89d4bb3a802fea2ab185f1e9962
+Subproject commit b0cd45bed8cb955ddb6ec2e464b36726e72d38e8
diff --git a/Penumbra.Api b/Penumbra.Api
index 439b83946..696007d8a 160000
--- a/Penumbra.Api
+++ b/Penumbra.Api
@@ -1 +1 @@
-Subproject commit 439b83946bcea82080813d9b310b76b253bcf763
+Subproject commit 696007d8a630218333c2b472b42b31e16a840d75
diff --git a/Penumbra.CrashHandler/Penumbra.CrashHandler.csproj b/Penumbra.CrashHandler/Penumbra.CrashHandler.csproj
index ae3b4549c..4e26a60c2 100644
--- a/Penumbra.CrashHandler/Penumbra.CrashHandler.csproj
+++ b/Penumbra.CrashHandler/Penumbra.CrashHandler.csproj
@@ -1,19 +1,19 @@
-
-
- Exe
- true
-
-
-
- embedded
-
-
-
- embedded
-
-
-
- false
-
-
-
+
+
+ Exe
+ true
+
+
+
+ embedded
+
+
+
+ embedded
+
+
+
+ false
+
+
+
diff --git a/Penumbra.GameData b/Penumbra.GameData
index 826bdc1cb..1db22f281 160000
--- a/Penumbra.GameData
+++ b/Penumbra.GameData
@@ -1 +1 @@
-Subproject commit 826bdc1cb1e448e215a21c64d8e4ae73a8743078
+Subproject commit 1db22f2819e655d51dcf86077670030399fd2cfb
diff --git a/Penumbra.slnx b/Penumbra.slnx
index 06b79f834..604735057 100644
--- a/Penumbra.slnx
+++ b/Penumbra.slnx
@@ -12,10 +12,12 @@
-
+
+
-
+
+
@@ -35,6 +37,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Penumbra/Api/Api/ModSettingsApi.cs b/Penumbra/Api/Api/ModSettingsApi.cs
index 8bff18245..0deb0ac62 100644
--- a/Penumbra/Api/Api/ModSettingsApi.cs
+++ b/Penumbra/Api/Api/ModSettingsApi.cs
@@ -307,6 +307,7 @@ private void OnModOptionEdited(in ModOptionChanged.Arguments arguments)
case ModOptionChangeType.OptionFilesAdded:
case ModOptionChangeType.OptionSwapsChanged:
case ModOptionChangeType.OptionMetaChanged:
+ case ModOptionChangeType.ConditionChanged:
TriggerSettingEdited(arguments.Mod);
break;
}
diff --git a/Penumbra/Api/DalamudSubstitutionProvider.cs b/Penumbra/Api/DalamudSubstitutionProvider.cs
index 78bec4ef3..0787345e0 100644
--- a/Penumbra/Api/DalamudSubstitutionProvider.cs
+++ b/Penumbra/Api/DalamudSubstitutionProvider.cs
@@ -1,5 +1,6 @@
using Dalamud.Interface;
using Dalamud.Plugin.Services;
+using Penumbra.Collections.Cache;
using Penumbra.Collections.Manager;
using Penumbra.Communication;
using Penumbra.Services;
@@ -12,6 +13,7 @@ public class DalamudSubstitutionProvider : IDisposable, Luna.IApiService
private readonly ITextureSubstitutionProvider _substitution;
private readonly IUiBuilder _uiBuilder;
private readonly ActiveCollectionData _activeCollectionData;
+ private readonly CollectionCacheManager _caches; // May be required to not be disposed on disposal.
private readonly Configuration _config;
private readonly CommunicatorService _communicator;
@@ -19,10 +21,11 @@ public bool Enabled
=> _config.UseDalamudUiTextureRedirection;
public DalamudSubstitutionProvider(ITextureSubstitutionProvider substitution, ActiveCollectionData activeCollectionData,
- Configuration config, CommunicatorService communicator, IUiBuilder ui)
+ Configuration config, CommunicatorService communicator, IUiBuilder ui, CollectionCacheManager caches)
{
_substitution = substitution;
_uiBuilder = ui;
+ _caches = caches;
_activeCollectionData = activeCollectionData;
_config = config;
_communicator = communicator;
@@ -43,10 +46,17 @@ public void ResetSubstitutions(IEnumerable paths)
if (!_uiBuilder.UiPrepared)
return;
- var transformed = paths
- .Where(p => (p.Path.StartsWith("ui/"u8) || p.Path.StartsWith("common/font/"u8)) && p.Path.EndsWith(".tex"u8))
- .Select(p => p.ToString());
- _substitution.InvalidatePaths(transformed);
+ try
+ {
+ var transformed = paths
+ .Where(p => (p.Path.StartsWith("ui/"u8) || p.Path.StartsWith("common/font/"u8)) && p.Path.EndsWith(".tex"u8))
+ .Select(p => p.ToString());
+ _substitution.InvalidatePaths(transformed);
+ }
+ catch (Exception ex)
+ {
+ Penumbra.Log.Error($"Failed to reset texture substitutions:\n{ex}");
+ }
}
public void Enable()
diff --git a/Penumbra/Api/IpcProviders.cs b/Penumbra/Api/IpcProviders.cs
index 8e7ab0034..418e9d6ff 100644
--- a/Penumbra/Api/IpcProviders.cs
+++ b/Penumbra/Api/IpcProviders.cs
@@ -9,8 +9,13 @@ namespace Penumbra.Api;
public sealed class IpcProviders : IDisposable, IApiService, IRequiredService
{
+ private static readonly HashSet InternalCallers = [];
+
private readonly List _providers;
+ public static IReadOnlySet Callers
+ => InternalCallers;
+
private readonly EventProvider _disposedProvider;
private readonly EventProvider _initializedProvider;
private readonly CharacterUtility _characterUtility;
@@ -77,9 +82,10 @@ public IpcProviders(IDalamudPluginInterface pi, IPenumbraApi api, CharacterUtili
IpcSubscribers.ModSettingChanged.Provider(pi, api.ModSettings),
IpcSubscribers.CopyModSettings.Provider(pi, api.ModSettings),
- IpcSubscribers.ApiVersion.Provider(pi, api),
- new FuncProvider<(int Major, int Minor)>(pi, "Penumbra.ApiVersions", () => api.ApiVersion), // backward compatibility
- new FuncProvider(pi, "Penumbra.ApiVersion", () => api.ApiVersion.Breaking), // backward compatibility
+ IpcSubscribers.ApiVersion.Provider(pi, InternalCallers, api),
+ new FuncProvider<(int Major, int Minor)>(pi, InternalCallers, "Penumbra.ApiVersions",
+ () => api.ApiVersion), // backward compatibility
+ new FuncProvider(pi, InternalCallers, "Penumbra.ApiVersion", () => api.ApiVersion.Breaking), // backward compatibility
IpcSubscribers.GetModDirectory.Provider(pi, api.PluginState),
IpcSubscribers.GetConfiguration.Provider(pi, api.PluginState),
IpcSubscribers.ModDirectoryChanged.Provider(pi, api.PluginState),
@@ -111,11 +117,11 @@ public IpcProviders(IDalamudPluginInterface pi, IPenumbraApi api, CharacterUtili
IpcSubscribers.GetGameObjectResourceTrees.Provider(pi, api.ResourceTree),
IpcSubscribers.GetPlayerResourceTrees.Provider(pi, api.ResourceTree),
- IpcSubscribers.CreateTemporaryCollection.Provider(pi, api.Temporary),
+ IpcSubscribers.CreateTemporaryCollection.Provider(pi, InternalCallers, api.Temporary),
IpcSubscribers.DeleteTemporaryCollection.Provider(pi, api.Temporary),
IpcSubscribers.AssignTemporaryCollection.Provider(pi, api.Temporary),
- IpcSubscribers.AddTemporaryModAll.Provider(pi, api.Temporary),
- IpcSubscribers.AddTemporaryMod.Provider(pi, api.Temporary),
+ IpcSubscribers.AddTemporaryModAll.Provider(pi, InternalCallers, api.Temporary),
+ IpcSubscribers.AddTemporaryMod.Provider(pi, InternalCallers, api.Temporary),
IpcSubscribers.RemoveTemporaryModAll.Provider(pi, api.Temporary),
IpcSubscribers.RemoveTemporaryMod.Provider(pi, api.Temporary),
IpcSubscribers.SetTemporaryModSettings.Provider(pi, api.Temporary),
diff --git a/Penumbra/Collections/Cache/CustomResourceCache.cs b/Penumbra/Collections/Cache/CustomResourceCache.cs
index e63f86376..18eabbbc8 100644
--- a/Penumbra/Collections/Cache/CustomResourceCache.cs
+++ b/Penumbra/Collections/Cache/CustomResourceCache.cs
@@ -1,7 +1,7 @@
using FFXIVClientStructs.FFXIV.Client.System.Resource;
+using Luna;
using Penumbra.Api.Enums;
using Penumbra.Interop.Hooks.ResourceLoading;
-using Penumbra.Interop.SafeHandles;
using Penumbra.String.Classes;
namespace Penumbra.Collections.Cache;
diff --git a/Penumbra/Collections/Manager/ActiveCollectionMigration.cs b/Penumbra/Collections/Manager/ActiveCollectionMigration.cs
index 3ec8ccffe..227205708 100644
--- a/Penumbra/Collections/Manager/ActiveCollectionMigration.cs
+++ b/Penumbra/Collections/Manager/ActiveCollectionMigration.cs
@@ -3,7 +3,6 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Penumbra.Files;
-using Penumbra.Services;
namespace Penumbra.Collections.Manager;
@@ -19,7 +18,7 @@ public static void MigrateUngenderedCollections(FilenameService fileNames)
{
var oldName = type.ToString()[4..];
var value = jObject[oldName];
- if (value == null)
+ if (value is null)
continue;
jObject.Remove(oldName);
diff --git a/Penumbra/Collections/Manager/ActiveCollections.cs b/Penumbra/Collections/Manager/ActiveCollections.cs
index a7b0be5ee..a33876ef1 100644
--- a/Penumbra/Collections/Manager/ActiveCollections.cs
+++ b/Penumbra/Collections/Manager/ActiveCollections.cs
@@ -80,7 +80,7 @@ public ModCollection Interface
/// Get the collection assigned to an individual or Default if unassigned.
public ModCollection Individual(ActorIdentifier identifier)
- => Individuals.TryGetCollection(identifier, out var c) ? c : Default;
+ => Individuals.TryGetCollection(identifier, out var c, false) ? c : Default;
/// The list of group assignments.
private ModCollection?[] SpecialCollections
@@ -547,16 +547,16 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id)
return
$"Assignment is redundant due to overwriting Male Players and Female Players{racialString} with an identical collection.\nYou can remove it.";
- if (male == null)
+ if (male is null)
{
- if (female == null && @base == yourself)
+ if (female is null && @base == yourself)
return
$"Assignment is redundant due to overwriting Base{racialString} with an identical collection.\nYou can remove it.";
if (female == yourself && @base == yourself)
return
$"Assignment is redundant due to overwriting Base and Female Players{racialString} with an identical collection.\nYou can remove it.";
}
- else if (male == yourself && female == null && @base == yourself)
+ else if (male == yourself && female is null && @base == yourself)
{
return
$"Assignment is redundant due to overwriting Base and Male Players{racialString} with an identical collection.\nYou can remove it.";
@@ -570,7 +570,7 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id)
case IdentifierType.Player when id.HomeWorld != ushort.MaxValue:
{
var global = ByType(CollectionType.Individual, _actors.CreatePlayer(id.PlayerName, ushort.MaxValue));
- return (global != null ? global.Identity.Index : null) == checkAssignment.Identity.Index
+ return global?.Identity.Index == checkAssignment.Identity.Index
? "Assignment is redundant due to an identical Any-World assignment existing.\nYou can remove it."
: string.Empty;
}
@@ -579,12 +579,12 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id)
{
var global = ByType(CollectionType.Individual,
_actors.CreateOwned(id.PlayerName, ushort.MaxValue, id.Kind, id.DataId));
- if ((global != null ? global.Identity.Index : null) == checkAssignment.Identity.Index)
+ if (global?.Identity.Index == checkAssignment.Identity.Index)
return "Assignment is redundant due to an identical Any-World assignment existing.\nYou can remove it.";
}
var unowned = ByType(CollectionType.Individual, _actors.CreateNpc(id.Kind, id.DataId));
- return (unowned != null ? unowned.Identity.Index : null) == checkAssignment.Identity.Index
+ return unowned?.Identity.Index == checkAssignment.Identity.Index
? "Assignment is redundant due to an identical unowned NPC assignment existing.\nYou can remove it."
: string.Empty;
}
@@ -606,7 +606,7 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id)
collection1 = CollectionType.Default;
}
- if (femaleNpc == null)
+ if (femaleNpc is null)
{
femaleNpc = Default;
if (femaleNpc.Identity.Index != checkAssignment.Identity.Index)
@@ -626,7 +626,7 @@ public string RedundancyCheck(CollectionType type, ActorIdentifier id)
foreach (var parentType in group)
{
var assignment = ByType(parentType);
- if (assignment == null)
+ if (assignment is null)
continue;
if (assignment.Identity.Index == checkAssignment.Identity.Index)
diff --git a/Penumbra/Collections/Manager/IndividualCollections.Access.cs b/Penumbra/Collections/Manager/IndividualCollections.Access.cs
index d0a706300..564520bcf 100644
--- a/Penumbra/Collections/Manager/IndividualCollections.Access.cs
+++ b/Penumbra/Collections/Manager/IndividualCollections.Access.cs
@@ -2,6 +2,7 @@
using Dalamud.Game.ClientState.Objects.Types;
using Penumbra.GameData.Actors;
using Penumbra.GameData.Enums;
+using Penumbra.GameData.Interop;
using Penumbra.String;
namespace Penumbra.Collections.Manager;
@@ -20,9 +21,9 @@ public int Count
public (string DisplayName, ModCollection Collection) this[int index]
=> (_assignments[index].DisplayName, _assignments[index].Collection);
- public bool TryGetCollection(ActorIdentifier identifier, [NotNullWhen(true)] out ModCollection? collection)
+ public bool TryGetCollection(ActorIdentifier identifier, [NotNullWhen(true)] out ModCollection? collection, bool hostile)
{
- if (Count == 0)
+ if (Count is 0)
{
collection = null;
return false;
@@ -53,7 +54,7 @@ public bool TryGetCollection(ActorIdentifier identifier, [NotNullWhen(true)] out
return true;
// Handle Ownership.
- if (!_config.UseOwnerNameForCharacterCollection)
+ if (!_config.UseOwnerNameForCharacterCollection || hostile && !_config.UseOwnerForHostiles)
return false;
identifier = _actors.CreateIndividualUnchecked(IdentifierType.Player, identifier.PlayerName,
@@ -85,7 +86,7 @@ public enum SpecialResult
public (ActorIdentifier, SpecialResult) ConvertSpecialIdentifier(ActorIdentifier identifier)
{
- if (identifier.Type != IdentifierType.Special)
+ if (identifier.Type is not IdentifierType.Special)
return (identifier, SpecialResult.Invalid);
if (_actors.ResolvePartyBannerPlayer(identifier.Special, out var id))
@@ -105,8 +106,7 @@ public enum SpecialResult
return (_actors.GetCurrentPlayer(), SpecialResult.FittingRoom);
case ScreenActor.DyePreview when _config.UseCharacterCollectionInTryOn:
return (_actors.GetCurrentPlayer(), SpecialResult.DyePreview);
- case ScreenActor.Portrait when _config.UseCharacterCollectionsInCards:
- return (_actors.GetCurrentPlayer(), SpecialResult.Portrait);
+ case ScreenActor.Portrait when _config.UseCharacterCollectionsInCards: return (_actors.GetCurrentPlayer(), SpecialResult.Portrait);
case ScreenActor.ExamineScreen:
{
identifier = _actors.GetInspectPlayer();
@@ -126,10 +126,11 @@ public enum SpecialResult
}
public bool TryGetCollection(IGameObject? gameObject, out ModCollection? collection)
- => TryGetCollection(_actors.FromObject(gameObject, true, false, false), out collection);
+ => TryGetCollection(_actors.FromObject(gameObject, true, false, false), out collection,
+ gameObject is ICharacter c && c.StatusFlags.HasFlag(StatusFlags.Hostile));
public unsafe bool TryGetCollection(FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject* gameObject, out ModCollection? collection)
- => TryGetCollection(_actors.FromObject(gameObject, out _, true, false, false), out collection);
+ => TryGetCollection(_actors.FromObject(gameObject, out _, true, false, false), out collection, ((Actor)gameObject).IsHostile);
private bool CheckWorlds(ActorIdentifier identifier, out ModCollection? collection)
{
diff --git a/Penumbra/Collections/ModCollectionSave.cs b/Penumbra/Collections/ModCollectionSave.cs
index aa971e9c3..65c432768 100644
--- a/Penumbra/Collections/ModCollectionSave.cs
+++ b/Penumbra/Collections/ModCollectionSave.cs
@@ -4,7 +4,6 @@
using Penumbra.Files;
using Penumbra.Mods.Manager;
using Penumbra.Mods.Settings;
-using Penumbra.Services;
namespace Penumbra.Collections;
@@ -29,10 +28,9 @@ public void Save(Stream stream)
j.WriteNumber("Version"u8, ModCollection.CurrentVersion);
j.WriteString("Id"u8, modCollection.Identity.Identifier);
j.WriteString("Name"u8, modCollection.Identity.Name);
- j.WritePropertyName("Settings"u8);
// Write all used and unused settings by mod directory name.
- j.WriteStartObject();
+ j.WriteStartObject("Settings"u8);
var list = new List<(string, ModSettings.SavedSettings)>(modCollection.Settings.Count + modCollection.Settings.Unused.Count);
for (var i = 0; i < modCollection.Settings.Count; ++i)
{
diff --git a/Penumbra/Communication/ModDataChanged.cs b/Penumbra/Communication/ModDataChanged.cs
index d8e8d07fb..01d651bf6 100644
--- a/Penumbra/Communication/ModDataChanged.cs
+++ b/Penumbra/Communication/ModDataChanged.cs
@@ -9,7 +9,7 @@ public sealed class ModDataChanged(LunaLogger log) : EventBase
+ ///
ModFileSystemCache = -10,
///
@@ -20,6 +20,9 @@ public enum Priority
///
ModPanelHeader = 0,
+
+ ///
+ GroupNameCache = 0,
}
/// The arguments for a ModDataChanged event.
diff --git a/Penumbra/Communication/ModOptionChanged.cs b/Penumbra/Communication/ModOptionChanged.cs
index ba5b25838..b0b050417 100644
--- a/Penumbra/Communication/ModOptionChanged.cs
+++ b/Penumbra/Communication/ModOptionChanged.cs
@@ -26,11 +26,14 @@ public enum Priority
///
ItemSwapTab = 0,
+ ///
+ GroupNameCache = 0,
+
///
CollectionStorage = 100,
- ///
- ModGroupEditUpdater = 1000,
+ ///
+ LayoutManager = int.MaxValue,
}
/// The arguments for a ModOptionChanged event.
@@ -39,7 +42,7 @@ public enum Priority
/// The changed group inside the mod, if any.
/// The changed option inside the group or null if it does not concern a specific option.
/// The changed data container inside the group or null if it does not concern a specific data container.
- /// The old name of the group or option for and .
+ /// The GUID of the changed object if available, empty otherwise. For and , the replaced GUID.
/// The index of the group or option moved or deleted from.
public readonly record struct Arguments(
ModOptionChangeType Type,
@@ -47,6 +50,6 @@ public readonly record struct Arguments(
IModGroup? Group,
IModOption? Option,
IModDataContainer? Container,
- string? OldName,
+ Guid Id,
int DeletedIndex);
}
diff --git a/Penumbra/Communication/ModPathChanged.cs b/Penumbra/Communication/ModPathChanged.cs
index 1319dcf52..c2f6ad01f 100644
--- a/Penumbra/Communication/ModPathChanged.cs
+++ b/Penumbra/Communication/ModPathChanged.cs
@@ -21,9 +21,6 @@ public enum Priority
///
ApiModSettings = int.MinValue + 1,
- ///
- EphemeralConfig = -500,
-
///
CollectionCacheManagerAddition = -100,
diff --git a/Penumbra/Config/Configuration.cs b/Penumbra/Config/Configuration.cs
index ddde2f2a5..f781e3678 100644
--- a/Penumbra/Config/Configuration.cs
+++ b/Penumbra/Config/Configuration.cs
@@ -7,6 +7,7 @@
using Penumbra.Api.Enums;
using Penumbra.Files;
using Penumbra.Import.Structs;
+using Penumbra.Import.Textures;
using Penumbra.Interop.Services;
using Penumbra.Services;
using Penumbra.UI.Classes;
@@ -68,6 +69,7 @@ public bool EnableMods
public bool UseCharacterCollectionInInspect { get; set; } = true;
public bool UseCharacterCollectionInTryOn { get; set; } = true;
public bool UseOwnerNameForCharacterCollection { get; set; } = true;
+ public bool UseOwnerForHostiles { get; set; } = false;
public bool UseNoModsInInspect { get; set; } = false;
public bool HideChangedItemFilters { get; set; } = false;
public bool ReplaceNonAsciiOnImport { get; set; } = false;
@@ -77,6 +79,7 @@ public bool EnableMods
public bool DefaultTemporaryMode { get; set; } = false;
public bool EnableDirectoryWatch { get; set; } = false;
public bool EnableAutomaticModImport { get; set; } = false;
+ public bool EnableContainerPeeking { get; set; } = true;
public bool AutoDismissModImportSuccessReports { get; set; } = true;
public bool AlwaysShowDetailedModImport { get; set; } = false;
public bool PreventExportLoopback { get; set; } = true;
@@ -108,6 +111,9 @@ public bool EnableMods
[ConfigProperty(EventName = "ShowRenameChanged")]
private RenameField _showRename = RenameField.BothDataPrio;
+ [ConfigProperty(EventName = "AuxiliaryDeviceModeChanged")]
+ private AuxiliaryDeviceMode _auxiliaryDeviceMode = AuxiliaryDeviceMode.Singleton;
+
public ChangedItemMode ChangedItemDisplay { get; set; } = ChangedItemMode.GroupedCollapsed;
public int OptionGroupCollapsibleMin { get; set; } = 5;
@@ -247,7 +253,7 @@ public string ToFilePath(FilenameService fileNames)
public void Save(Stream stream)
{
- using var writer = new StreamWriter(stream);
+ using var writer = new StreamWriter(stream, leaveOpen: true);
using var jWriter = new JsonTextWriter(writer);
jWriter.Formatting = Formatting.Indented;
var serializer = new JsonSerializer { Formatting = Formatting.Indented };
diff --git a/Penumbra/Config/EphemeralConfig.cs b/Penumbra/Config/EphemeralConfig.cs
index 54611dc75..3056f6354 100644
--- a/Penumbra/Config/EphemeralConfig.cs
+++ b/Penumbra/Config/EphemeralConfig.cs
@@ -17,6 +17,8 @@ public sealed partial class EphemeralConfig : ISavable, IService
[JsonIgnore]
private readonly SaveService _saveService;
+ private bool _init;
+
public int Version { get; set; } = Configuration.Constants.CurrentVersion;
public int LastSeenVersion { get; set; } = PenumbraChangelog.LastChangelogVersion;
public bool DebugSeparateWindow { get; set; } = false;
@@ -59,6 +61,7 @@ static void HandleDeserializationError(object? sender, ErrorEventArgs errorArgs)
try
{
var text = File.ReadAllText(_saveService.FileNames.EphemeralConfigFile);
+ _init = true;
JsonConvert.PopulateObject(text, this, new JsonSerializerSettings
{
Error = HandleDeserializationError,
@@ -70,11 +73,16 @@ static void HandleDeserializationError(object? sender, ErrorEventArgs errorArgs)
"Error reading ephemeral Configuration, reverting to default.",
"Error reading ephemeral Configuration", NotificationType.Error);
}
+
+ _init = false;
}
/// Save the current configuration.
public void Save()
- => _saveService.DelaySave(this, TimeSpan.FromSeconds(5));
+ {
+ if (!_init)
+ _saveService.DelaySave(this, TimeSpan.FromSeconds(5));
+ }
public string ToFilePath(FilenameService fileNames)
@@ -82,7 +90,7 @@ public string ToFilePath(FilenameService fileNames)
public void Save(Stream stream)
{
- using var writer = new StreamWriter(stream);
+ using var writer = new StreamWriter(stream, leaveOpen: true);
using var jWriter = new JsonTextWriter(writer);
jWriter.Formatting = Formatting.Indented;
var serializer = new JsonSerializer { Formatting = Formatting.Indented };
diff --git a/Penumbra/Config/FilterConfig.cs b/Penumbra/Config/FilterConfig.cs
index 1999b79a8..d0b4e0a21 100644
--- a/Penumbra/Config/FilterConfig.cs
+++ b/Penumbra/Config/FilterConfig.cs
@@ -4,7 +4,6 @@
using Newtonsoft.Json.Linq;
using Penumbra.Enums;
using Penumbra.Files;
-using Penumbra.Services;
using Penumbra.UI.Classes;
using Penumbra.UI.ModsTab.Selector;
using Penumbra.UI.ResourceWatcher;
@@ -338,7 +337,7 @@ private void LoadResourceWatcherTab(JObject j)
_resourceLoggerCategoryFilter = resourceWatcher["CategoryFilter"]?.Value() is { } categoryFilter
? (ResourceCategoryFlag)categoryFilter
: ResourceExtensions.AllResourceCategories;
- _resourceLoggerTypeFilter = resourceWatcher["TypeFilter"]?.Value() is { } typeFilter
+ _resourceLoggerTypeFilter = resourceWatcher["TypeFilter"]?.Value() is { } typeFilter
? (ResourceTypeFlag)typeFilter
: ResourceExtensions.AllResourceTypes;
_resourceLoggerLoadStateFilter = resourceWatcher["LoadStateFilter"]?.Value() is { } loadStateFilter
diff --git a/Penumbra/Config/UiConfig.cs b/Penumbra/Config/UiConfig.cs
index 6f7792cbc..375c3fb23 100644
--- a/Penumbra/Config/UiConfig.cs
+++ b/Penumbra/Config/UiConfig.cs
@@ -3,7 +3,6 @@
using Luna.Generators;
using Newtonsoft.Json.Linq;
using Penumbra.Files;
-using Penumbra.Services;
using MessageService = Penumbra.Services.MessageService;
namespace Penumbra;
diff --git a/Penumbra/Files/GroupDeserialization.cs b/Penumbra/Files/GroupDeserialization.cs
new file mode 100644
index 000000000..b39f7c9df
--- /dev/null
+++ b/Penumbra/Files/GroupDeserialization.cs
@@ -0,0 +1,594 @@
+using System.Text.Json;
+using Dalamud.Interface.ImGuiNotification;
+using Luna;
+using Penumbra.Api.Enums;
+using Penumbra.GameData.Structs;
+using Penumbra.Mods.Groups;
+using Penumbra.Mods.Settings;
+using Penumbra.Mods.SubMods;
+using Penumbra.String;
+using Penumbra.String.Classes;
+
+namespace Penumbra.Files;
+
+public static class GroupDeserialization
+{
+ public static IModGroup? ReadGroup(ModDeserialization.Context context, ref Utf8JsonReader reader, string filePath)
+ {
+ if (reader.TokenType is JsonTokenType.Null)
+ return null;
+
+ if (reader.TokenType is not JsonTokenType.StartObject)
+ throw new InvalidMetaException(context.Mod, filePath, $"Object start for group expected, but got {reader.TokenType}.");
+
+ var groupReader = reader.CreateObjectLimit();
+ if (reader.TryPeekEnumProperty("Type"u8, out GroupType type) is not JsonFunctions.PeekError.Success)
+ type = GroupType.Single;
+
+ return type switch
+ {
+ GroupType.Single => ReadSingle(context, groupReader, ref reader),
+ GroupType.Multi => ReadMulti(context, groupReader, ref reader),
+ GroupType.Imc => ReadImc(context, groupReader, ref reader),
+ GroupType.Combining => ReadCombining(context, groupReader, ref reader),
+ _ => throw new JsonException($"{type} is not a valid group type for mod {context.Mod.Name}."),
+ };
+ }
+
+ public static void ReadDefaultContainer(ModDeserialization.Context context, ref Utf8JsonReader reader, string filePath)
+ {
+ if (reader.TokenType is JsonTokenType.Null)
+ {
+ context.Mod.Default.Files.Clear();
+ context.Mod.Default.FileSwaps.Clear();
+ context.Mod.Default.Manipulations.Clear();
+ return;
+ }
+
+ if (reader.TokenType is not JsonTokenType.StartObject)
+ throw new InvalidMetaException(context.Mod, filePath,
+ $"Object start for default container expected, but got {reader.TokenType}.");
+
+ var containerReader = reader.CreateObjectLimit();
+ var visited = 0;
+ while (containerReader.Read(ref reader))
+ {
+ if (reader.TokenType is not JsonTokenType.PropertyName)
+ throw new InvalidMetaException(context.Mod, filePath, "Property name expected.");
+
+ if (!LoadDataContainer(ref reader, context.Mod.Default, context.Mod.ModPath, ref visited))
+ reader.Skip();
+ }
+
+ if ((visited & 1) is not 1)
+ context.Mod.Default.Files.Clear();
+ if ((visited & 2) is not 2)
+ context.Mod.Default.FileSwaps.Clear();
+ if ((visited & 4) is not 4)
+ context.Mod.Default.Manipulations.Clear();
+ }
+
+ public static IModGroup? ReadGroupFile(SaveService saveService, ModDeserialization.Context context, FileInfo file)
+ => IJsonParsable.ReadJson(saveService, file.FullName, true, context).Group;
+
+ public static void ReadDefaultContainerFile(SaveService saveService, ModDeserialization.Context context)
+ {
+ var file = saveService.FileNames.OptionGroupFile(context.Mod, -1, false);
+ if (!File.Exists(file))
+ {
+ context.Mod.Default.Files.Clear();
+ context.Mod.Default.FileSwaps.Clear();
+ context.Mod.Default.Manipulations.Clear();
+ return;
+ }
+
+ IJsonParsable.ReadJson(saveService, file, true, context);
+ }
+
+ public static MultiModGroup ReadMulti(ModDeserialization.Context context, Utf8JsonObjectLimit groupReader, ref Utf8JsonReader j)
+ {
+ var ret = new MultiModGroup(context.Mod);
+ while (groupReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (j.ArrayProperty("Options"u8, out var array, true))
+ LoadMultiOptions(context, array, ref j, ret);
+ else if (!ReadJsonBase(context, ref j, ret))
+ j.Skip();
+ }
+
+ ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings);
+
+ return ret;
+ }
+
+ public static SingleModGroup ReadSingle(ModDeserialization.Context context, Utf8JsonObjectLimit groupReader, ref Utf8JsonReader j)
+ {
+ var ret = new SingleModGroup(context.Mod);
+ while (groupReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (j.ArrayProperty("Options"u8, out var array, true))
+ LoadSingleOptions(context, array, ref j, ret);
+ else if (!ReadJsonBase(context, ref j, ret))
+ j.Skip();
+ }
+
+ ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings);
+
+ return ret;
+ }
+
+ public static ImcModGroup? ReadImc(ModDeserialization.Context context, Utf8JsonObjectLimit groupReader, ref Utf8JsonReader j)
+ {
+ var ret = new ImcModGroup(context.Mod);
+ while (groupReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (j.ArrayProperty("Options"u8, out var array, true))
+ LoadImcOptions(context, array, ref j, ret);
+ else if (j.ObjectProperty("Identifier"u8, out var identifier))
+ ret.Identifier = MetaDeserialization.ReadImc(identifier, ref j, out _) ?? default;
+ else if (j.ObjectProperty("DefaultEntry"u8, out var entry))
+ ret.DefaultEntry = MetaDeserialization.ReadImcEntry(entry, ref j) ?? new ImcEntry();
+ else if (j.BoolProperty("AllVariants"u8, out var allVariants))
+ ret.AllVariants = allVariants;
+ else if (j.BoolProperty("OnlyAttributes"u8, out var onlyAttributes))
+ ret.OnlyAttributes = onlyAttributes;
+ else if (!ReadJsonBase(context, ref j, ret))
+ j.Skip();
+ }
+
+ if (ret.Identifier.ObjectType is GameData.Enums.ObjectType.Unknown || ret.DefaultEntry.MaterialId is 0)
+ {
+ Penumbra.Messager.NotificationMessage($"Could not add IMC group {ret.Name} because the associated IMC Entry is invalid.",
+ NotificationType.Warning);
+ return null;
+ }
+
+ ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings);
+ return ret;
+ }
+
+ public static CombiningModGroup ReadCombining(ModDeserialization.Context context, Utf8JsonObjectLimit groupReader, ref Utf8JsonReader j)
+ {
+ var ret = CombiningModGroup.EmptyData(context.Mod);
+ while (groupReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (j.ArrayProperty("Options"u8, out var array, true))
+ LoadCombiningOptions(context, array, ref j, ret);
+ else if (j.ArrayProperty("Containers"u8, out var containers, true))
+ LoadCombiningContainers(containers, ref j, ret);
+ else if (!ReadJsonBase(context, ref j, ret))
+ j.Skip();
+ }
+
+ var requiredContainers = 1 << ret.OptionData.Count;
+ if (requiredContainers > ret.Data.Count)
+ {
+ Penumbra.Messager.NotificationMessage(
+ $"Combining Group {ret.Name} in {context.Mod.Name} has not enough data containers for its {ret.OptionData.Count} options, filling with empty containers.",
+ NotificationType.Warning);
+ ret.Data.EnsureCapacity(requiredContainers);
+ ret.Data.AddRange(Enumerable.Repeat(0, requiredContainers - ret.Data.Count).Select(_ => new CombinedDataContainer(ret)));
+ }
+ else if (requiredContainers < ret.Data.Count)
+ {
+ Penumbra.Messager.NotificationMessage(
+ $"Combining Group {ret.Name} in {context.Mod.Name} has more than {IModGroup.MaxCombiningOptions} options, ignoring excessive options.",
+ NotificationType.Warning);
+ ret.Data.RemoveRange(requiredContainers, ret.Data.Count - requiredContainers);
+ }
+
+ ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings);
+ return ret;
+ }
+
+
+ private static void LoadSingleOptions(ModDeserialization.Context context, Utf8JsonObjectLimit optionArray, ref Utf8JsonReader j,
+ SingleModGroup ret)
+ {
+ while (optionArray.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.StartObject)
+ throw new JsonException("New Object expected.");
+
+ var option = new SingleSubMod(ret);
+ var optionReader = j.CreateObjectLimit();
+ var visited = 0;
+ while (optionReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (LoadOptionData(context, ref j, option))
+ continue;
+
+ if (LoadDataContainer(ref j, option, ret.Mod.ModPath, ref visited))
+ continue;
+
+ j.Skip();
+ }
+
+ ret.OptionData.Add(option);
+ }
+ }
+
+ private static void LoadMultiOptions(ModDeserialization.Context context, Utf8JsonObjectLimit optionArray, ref Utf8JsonReader j,
+ MultiModGroup ret)
+ {
+ var warned = false;
+ var visited = 0;
+ while (optionArray.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.StartObject)
+ throw new JsonException("New Object expected.");
+
+ if (ret.OptionData.Count is IModGroup.MaxMultiOptions)
+ {
+ if (!warned)
+ continue;
+
+ Penumbra.Messager.NotificationMessage(
+ $"Multi Group {ret.Name} in {ret.Mod.Name} has more than {IModGroup.MaxMultiOptions} options, ignoring excessive options.",
+ NotificationType.Warning);
+ warned = true;
+ }
+ else
+ {
+ var option = new MultiSubMod(ret);
+ var optionReader = j.CreateObjectLimit();
+ while (optionReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (j.NumberProperty("Priority"u8, out int priority))
+ {
+ option.Priority = new ModPriority(priority);
+ continue;
+ }
+
+ if (LoadOptionData(context, ref j, option))
+ continue;
+
+ if (LoadDataContainer(ref j, option, ret.Mod.ModPath, ref visited))
+ continue;
+
+ j.Skip();
+ }
+
+ ret.OptionData.Add(option);
+ }
+ }
+ }
+
+ private static void LoadImcOptions(ModDeserialization.Context context, Utf8JsonObjectLimit optionArray, ref Utf8JsonReader j,
+ ImcModGroup ret)
+ {
+ var rollingMask = 0ul;
+ while (optionArray.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.StartObject)
+ throw new JsonException("New Object expected.");
+
+ var option = new ImcSubMod(ret);
+ var optionReader = j.CreateObjectLimit();
+ while (optionReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (j.NumberProperty("AttributeMask"u8, out ushort mask))
+ {
+ option.AttributeMask = (ushort)(mask & ImcEntry.AttributesMask);
+ continue;
+ }
+
+ if (j.BoolProperty("IsDisableSubMod"u8, out var isDisable))
+ {
+ option.IsDisableSubMod = isDisable;
+ continue;
+ }
+
+ if (LoadOptionData(context, ref j, option))
+ continue;
+
+ j.Skip();
+ }
+
+ if (option.IsDisableSubMod && ret.OptionData.FirstOrDefault(m => m.IsDisableSubMod) is { } disable)
+ {
+ Penumbra.Messager.NotificationMessage(
+ $"Could not add IMC option {option.Name} to {ret.Name} because it already contains {disable.Name} as disable option.",
+ NotificationType.Warning);
+ }
+ else if ((option.AttributeMask & rollingMask) is not 0)
+ {
+ Penumbra.Messager.NotificationMessage(
+ $"Could not add IMC option {option.Name} to {ret.Name} because it contains attributes already in use.",
+ NotificationType.Warning);
+ }
+ else
+ {
+ rollingMask |= option.AttributeMask;
+ ret.OptionData.Add(option);
+ if (option.IsDisableSubMod)
+ ret.CanBeDisabled = true;
+ }
+ }
+ }
+
+ private static void LoadCombiningOptions(ModDeserialization.Context context, Utf8JsonObjectLimit optionArray, ref Utf8JsonReader j,
+ CombiningModGroup ret)
+ {
+ var warned = false;
+ while (optionArray.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.StartObject)
+ throw new JsonException("New Object expected.");
+
+ if (ret.OptionData.Count is IModGroup.MaxCombiningOptions)
+ {
+ if (warned)
+ continue;
+
+ Penumbra.Messager.NotificationMessage(
+ $"Combining Group {ret.Name} in {ret.Mod.Name} has more than {IModGroup.MaxCombiningOptions} options, ignoring excessive options.",
+ NotificationType.Warning);
+ warned = true;
+ }
+ else
+ {
+ var option = new CombiningSubMod(ret);
+ var optionReader = j.CreateObjectLimit();
+ while (optionReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (LoadOptionData(context, ref j, option))
+ continue;
+
+ j.Skip();
+ }
+
+ ret.OptionData.Add(option);
+ }
+ }
+ }
+
+ private static void LoadCombiningContainers(Utf8JsonObjectLimit containerArray, ref Utf8JsonReader j, CombiningModGroup ret)
+ {
+ var visited = 0;
+ while (containerArray.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.StartObject)
+ throw new JsonException("New Object expected.");
+
+ var container = new CombinedDataContainer(ret);
+ var containerReader = j.CreateObjectLimit();
+ while (containerReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (j.StringProperty("Name"u8, out string? name, true))
+ {
+ container.Name = name ?? string.Empty;
+ continue;
+ }
+
+ if (LoadDataContainer(ref j, container, ret.Mod.ModPath, ref visited))
+ continue;
+
+ j.Skip();
+ }
+
+ ret.Data.Add(container);
+ }
+ }
+
+ /// Load the relevant data for a selectable option from a JToken of that option.
+ [MethodImpl(MethodImplOptions.AggressiveOptimization | MethodImplOptions.AggressiveInlining)]
+ private static bool LoadOptionData(ModDeserialization.Context context, ref Utf8JsonReader j, IModOption option)
+ {
+ if (ReadJsonObject(context, ref j, option))
+ return true;
+
+ if (j.NumberProperty("Color"u8, out int number))
+ {
+ option.Color = IModOption.ConvertColor(number);
+ return true;
+ }
+
+ return false;
+ }
+
+ /// Load all file redirections, file swaps and meta manipulations from a JToken of that option into a data container.
+ [MethodImpl(MethodImplOptions.AggressiveOptimization | MethodImplOptions.AggressiveInlining)]
+ private static unsafe bool LoadDataContainer(ref Utf8JsonReader j, IModDataContainer data, DirectoryInfo basePath, ref int visited)
+ {
+ Span buffer = stackalloc byte[Utf8GamePath.MaxGamePathLength + 1];
+ if (j.ObjectProperty("Files"u8, out var files, true))
+ {
+ data.Files.Clear();
+ while (files.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException($"Expected property in file dictionary, got {j.TokenType}.");
+
+ var length = j.CopyString(buffer);
+ buffer[length] = 0;
+ if (length is 0 || !Utf8GamePath.FromSpan(buffer[..length], MetaDataComputation.All, out var gamePathTmp))
+ continue;
+
+ if (!j.Read() || !j.TryReadString(out var rel) || !Utf8RelPath.FromString(rel, out var relPath))
+ throw new JsonException($"Expected relative path in file dictionary for key {gamePathTmp}.");
+
+ data.Files.TryAdd(gamePathTmp.Clone(), new FullPath(basePath, relPath));
+ }
+
+ visited |= 1;
+ return true;
+ }
+
+ if (j.ObjectProperty("FileSwaps"u8, out var swaps, true))
+ {
+ data.FileSwaps.Clear();
+ while (swaps.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException($"Expected property in file dictionary, got {j.TokenType}.");
+
+ var length = j.CopyString(buffer);
+ buffer[length] = 0;
+ if (length is 0 || !Utf8GamePath.FromSpan(buffer[..length], MetaDataComputation.All, out var gamePathTmp))
+ continue;
+
+ if (!j.Read() || !j.TryReadString(out var swap))
+ throw new JsonException($"Expected game path in file swap dictionary for key {gamePathTmp}.");
+
+ data.FileSwaps.TryAdd(gamePathTmp.Clone(), new FullPath(swap!));
+ }
+
+ visited |= 2;
+ return true;
+ }
+
+ if (j.ArrayProperty("Manipulations"u8, out _, true))
+ {
+ data.Manipulations = MetaDeserialization.ReadMetaDictionary(ref j, data);
+ visited |= 4;
+ return true;
+ }
+
+ return false;
+ }
+
+ private static bool ReadJsonObject(ModDeserialization.Context context, ref Utf8JsonReader j, IModObject @object)
+ {
+ if (j.StringProperty("Name"u8, out string? name, true))
+ {
+ @object.Name = name ?? string.Empty;
+ return true;
+ }
+
+ if (j.StringProperty("Description"u8, out string? description, true))
+ {
+ @object.Description = description ?? string.Empty;
+ return true;
+ }
+
+ if (j.GuidProperty("Id"u8, out var id))
+ {
+ @object.Id = id;
+ return true;
+ }
+
+ if (j.ArrayProperty("Layout"u8, out _, true))
+ {
+ @object.Layout = j.ReadFlagEnumArray()?.Reduce(@object) ?? ModSettingsLayout.None;
+ return true;
+ }
+
+ if (j.ObjectProperty("Condition"u8, out _, true))
+ {
+ if (j.TokenType is JsonTokenType.Null)
+ {
+ @object.Condition = null;
+ return true;
+ }
+
+ if (!ConditionParser.TryParse(ref j, out var condition))
+ throw new JsonException("Could not parse condition.");
+
+ if (condition?.Reduce() is { } c and not TrueCondition)
+ context.Conditions[@object] = c;
+ else
+ @object.Condition = null;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ private static bool ReadJsonBase(ModDeserialization.Context context, ref Utf8JsonReader j, IModGroup group)
+ {
+ if (ReadJsonObject(context, ref j, group))
+ return true;
+
+ if (j.StringProperty("Image"u8, out string? image, true))
+ {
+ group.Image = image ?? string.Empty;
+ return true;
+ }
+
+ if (j.NumberProperty("Page"u8, out int page))
+ {
+ group.Page = page;
+ return true;
+ }
+
+ if (j.NumberProperty("Priority"u8, out int priority))
+ {
+ group.Priority = new ModPriority(priority);
+ return true;
+ }
+
+ if (j.NumberProperty("DefaultSettings"u8, out ulong settings))
+ {
+ group.DefaultSettings = new Setting(settings);
+ return true;
+ }
+
+ if (j.GuidProperty("ParentSettings"u8, out var parent))
+ {
+ context.Parents[group] = parent;
+ return true;
+ }
+
+ return false;
+ }
+
+ private struct GroupIntermediate : IJsonParsable
+ {
+ public IModGroup? Group;
+
+ public static GroupIntermediate Read(ref Utf8JsonReader j, string filePath, object? parent)
+ {
+ if (parent is not ModDeserialization.Context context)
+ throw new ArgumentException("The user input for reading a mod group has to be the deserialization context.");
+
+ if (!j.Read())
+ throw new InvalidMetaException(context.Mod, filePath, "Empty or malformed JSON encountered.");
+
+ return new GroupIntermediate { Group = ReadGroup(context, ref j, filePath) };
+ }
+ }
+
+ private struct DefaultOptionIntermediate : IJsonParsable
+ {
+ public static DefaultOptionIntermediate Read(ref Utf8JsonReader j, string filePath, object? parent)
+ {
+ if (parent is not ModDeserialization.Context context)
+ throw new ArgumentException("The user input for reading a default option has to be the deserialization context.");
+
+ if (!j.Read())
+ throw new InvalidMetaException(context.Mod, filePath, "Empty or malformed JSON encountered.");
+
+ ReadDefaultContainer(context, ref j, filePath);
+ return default;
+ }
+ }
+}
diff --git a/Penumbra/Files/GroupSerialization.cs b/Penumbra/Files/GroupSerialization.cs
new file mode 100644
index 000000000..068cf1733
--- /dev/null
+++ b/Penumbra/Files/GroupSerialization.cs
@@ -0,0 +1,196 @@
+using System.Text.Json;
+using ImSharp;
+using Luna;
+using Penumbra.Mods;
+using Penumbra.Mods.Groups;
+using Penumbra.Mods.SubMods;
+using Penumbra.UI.Classes;
+
+namespace Penumbra.Files;
+
+public static class GroupSerialization
+{
+ public static void WriteDefaultContainer(Utf8JsonWriter j, Mod mod, DirectoryInfo? basePath = null)
+ {
+ if (ContainerEmpty(mod.Default))
+ return;
+
+ j.WriteStartObject("DefaultData"u8);
+ FillContainer(j, mod.Default, basePath ?? mod.ModPath);
+ j.WriteEndObject();
+ }
+
+ public static void WriteGroup(Utf8JsonWriter j, IModGroup group, DirectoryInfo? basePath = null)
+ {
+ j.WriteStartObject();
+ FillGroup(j, group, basePath);
+ j.WriteEndObject();
+ }
+
+ public static void FillGroup(Utf8JsonWriter j, IModGroup group, DirectoryInfo? basePath = null)
+ {
+ j.WriteString("Type"u8, group.Type.StringU8);
+ FillSubObject(j, group);
+ j.WriteSignedIfNot("Priority"u8, group.Priority.Value, 0);
+ j.WriteNonEmptyString("Image"u8, group.Image);
+ j.WriteSignedIfNot("Page"u8, group.Page, 0);
+ j.WriteUnsignedIfNot("DefaultSettings"u8, group.DefaultSettings.Value, 0ul);
+ if (group.ParentSetting is {} parent)
+ j.WriteString("ParentSetting"u8, parent.Id);
+
+ basePath ??= group.Mod.ModPath;
+ switch (group)
+ {
+ case SingleModGroup single:
+ if (group.Options.Count > 0)
+ {
+ j.WriteStartArray("Options"u8);
+ foreach (var option in single.OptionData)
+ {
+ j.WriteStartObject();
+ FillOption(j, option, basePath);
+ FillContainer(j, option, basePath);
+ j.WriteEndObject();
+ }
+
+ j.WriteEndArray();
+ }
+
+ break;
+ case MultiModGroup multi:
+ if (group.Options.Count > 0)
+ {
+ j.WriteStartArray("Options"u8);
+ foreach (var option in multi.OptionData)
+ {
+ j.WriteStartObject();
+ FillOption(j, option, basePath);
+ j.WriteSignedIfNot("Priority"u8, option.Priority.Value, 0);
+ FillContainer(j, option, basePath);
+ j.WriteEndObject();
+ }
+
+ j.WriteEndArray();
+ }
+
+ break;
+ case ImcModGroup imc:
+ j.WriteStartObject("Identifier"u8);
+ imc.Identifier.AddToJson(j);
+ j.WriteEndObject();
+ j.WritePropertyName("DefaultEntry"u8);
+ imc.DefaultEntry.WriteJson(j);
+ j.WriteBoolIf("AllVariants"u8, imc.AllVariants, false);
+ j.WriteBoolIf("OnlyAttributes"u8, imc.OnlyAttributes, false);
+ if (imc.OptionData.Count > 0)
+ {
+ j.WriteStartArray("Options"u8);
+ foreach (var option in imc.OptionData)
+ {
+ j.WriteStartObject();
+ FillOption(j, option, basePath);
+ if (option.IsDisableSubMod)
+ j.WriteBoolean("IsDisableSubMod"u8, true);
+ else
+ j.WriteNumber("AttributeMask"u8, option.AttributeMask);
+ j.WriteEndObject();
+ }
+
+ j.WriteEndArray();
+ }
+
+ break;
+ case CombiningModGroup combining:
+ if (group.Options.Count > 0)
+ {
+ j.WriteStartArray("Options"u8);
+ foreach (var option in combining.OptionData)
+ {
+ j.WriteStartObject();
+ FillOption(j, option, basePath);
+ j.WriteEndObject();
+ }
+
+ j.WriteEndArray();
+ }
+
+ j.WriteStartArray("Containers"u8);
+ foreach (var container in combining.Data)
+ {
+ j.WriteStartObject();
+ j.WriteNonEmptyString("Name"u8, container.Name);
+ FillContainer(j, container, basePath);
+ j.WriteEndObject();
+ }
+
+ j.WriteEndArray();
+ break;
+ }
+ }
+
+ public static void FillOption(Utf8JsonWriter j, IModOption option, DirectoryInfo? basePath = null)
+ {
+ FillSubObject(j, option);
+ WriteOptionColor(j, option);
+ }
+
+ public static void FillSubObject(Utf8JsonWriter j, IModObject @object)
+ {
+ j.WriteString("Id"u8, @object.Id);
+ j.WriteString("Name"u8, @object.Name);
+ j.WriteNonEmptyString("Description"u8, @object.Description);
+ if (@object.Layout is not ModSettingsLayout.None)
+ {
+ j.WriteStartArray("Layout"u8);
+ foreach (var layout in @object.Layout.Iterate())
+ j.WriteStringValue(layout.StringU8);
+ j.WriteEndArray();
+ }
+
+ if (@object.Condition is not null)
+ {
+ j.WritePropertyName("Condition"u8);
+ @object.Condition.WriteJson(j);
+ }
+ }
+
+ public static void FillContainer(Utf8JsonWriter j, IModDataContainer container, DirectoryInfo basePath)
+ {
+ if (container.Files.Count > 0)
+ {
+ j.WriteStartObject("Files"u8);
+ foreach (var (gamePath, file) in container.Files)
+ {
+ if (file.ToRelPath(basePath, out var relPath))
+ j.WriteString(gamePath.Path.Span, relPath.Path.Span);
+ }
+
+ j.WriteEndObject();
+ }
+
+ if (container.FileSwaps.Count > 0)
+ {
+ j.WriteStartObject("FileSwaps"u8);
+ foreach (var (gamePath, file) in container.FileSwaps)
+ j.WriteString(gamePath.Path.Span, file.InternalName.Span);
+
+ j.WriteEndObject();
+ }
+
+ if (container.Manipulations.Count > 0)
+ {
+ j.WritePropertyName("Manipulations"u8);
+ MetaSerialization.WriteMetaDictionary(j, container.Manipulations);
+ }
+ }
+
+ public static bool ContainerEmpty(IModDataContainer? container)
+ => container is null || container.Files.Count is 0 && container.FileSwaps.Count is 0 && container.Manipulations.Count is 0;
+
+ private static void WriteOptionColor(Utf8JsonWriter j, IModOption option)
+ {
+ var c = option.ColorAsInteger;
+ if (c is not 0)
+ j.WriteNumber("Color"u8, c);
+ }
+}
diff --git a/Penumbra/Files/MetaDeserialization.cs b/Penumbra/Files/MetaDeserialization.cs
new file mode 100644
index 000000000..beb9953f8
--- /dev/null
+++ b/Penumbra/Files/MetaDeserialization.cs
@@ -0,0 +1,653 @@
+using System.Text.Json;
+using ImSharp;
+using Luna;
+using Penumbra.GameData.Enums;
+using Penumbra.GameData.Files.AtchStructs;
+using Penumbra.GameData.Structs;
+using Penumbra.Meta;
+using Penumbra.Meta.Manipulations;
+using Penumbra.Mods.SubMods;
+
+namespace Penumbra.Files;
+
+public static class MetaDeserialization
+{
+ public static MetaDictionary ReadMetaDictionary(ref Utf8JsonReader reader, IModDataContainer? container)
+ {
+ var ret = new MetaDictionary();
+ // Null, empty.
+ if (reader.TokenType is JsonTokenType.Null)
+ return ret;
+
+ if (reader.TokenType is not JsonTokenType.StartArray)
+ throw new JsonException($"Meta Dictionary must be an array but starts with {reader.TokenType}.");
+
+ var arrayReader = reader.CreateObjectLimit();
+ var objectCount = 0;
+
+ while (arrayReader.Read(ref reader))
+ {
+ // Invalid.
+ if (reader.TokenType is not JsonTokenType.StartObject)
+ throw new JsonException($"Every meta entry must be an object, but encountered {reader.TokenType}.");
+
+ var objectReader = reader.CreateObjectLimit();
+ ++objectCount;
+
+ // Try to get the type. Skip the respective object if it has an invalid or no type, but keep reading the dictionary.
+ switch (reader.TryPeekEnumProperty("Type"u8, out MetaManipulationType type))
+ {
+ case JsonFunctions.PeekError.Invalid:
+ if (container is not null)
+ Penumbra.Log.Warning(
+ $"Invalid manipulation type encountered in {container.Mod.Name} - {container.GetFullName()}, manipulation {objectCount}.");
+ else
+ Penumbra.Log.Warning($"Invalid manipulation type encountered in manipulation {objectCount}.");
+
+ while (objectReader.Read(ref reader))
+ ; // Skip current object.
+ continue;
+ case JsonFunctions.PeekError.Missing:
+ if (container is not null)
+ Penumbra.Log.Warning(
+ $"Manipulation without type encountered in {container.Mod.Name} - {container.GetFullName()}, manipulation {objectCount}.");
+ else
+ Penumbra.Log.Warning($"Manipulation without type encountered in manipulation {objectCount}.");
+
+ while (objectReader.Read(ref reader))
+ ; // Skip current object.
+ continue;
+ // Malformed JSON can not be ignored, throw.
+ case JsonFunctions.PeekError.Malformed:
+ if (container is not null)
+ throw new JsonException(
+ $"Meta Dictionary with malformed JSON encountered in {container.Mod.Name} - {container.GetFullName()}.");
+
+ throw new JsonException("Meta Dictionary with malformed JSON encountered.");
+ }
+
+ try
+ {
+ AddSingleManipulation(container, objectReader, ref reader, ret, type);
+ }
+ catch (Exception ex)
+ {
+ if (container is not null)
+ Penumbra.Log.Warning(
+ $"Invalid manipulation encountered in {container.Mod.Name} - {container.GetFullName()}, manipulation {objectCount}:\n{ex}");
+ else
+ Penumbra.Log.Warning($"Invalid manipulation encountered in manipulation {objectCount}:\n{ex}");
+ }
+
+ // Make sure the current manipulation object is finished.
+ while (objectReader.Read(ref reader))
+ ;
+ }
+
+ return ret;
+ }
+
+ public static EqpIdentifier? ReadEqp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out EqpEntry? entry)
+ {
+ entry = null;
+ var setId = PrimaryId.Zero;
+ var slot = EquipSlot.Unknown;
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("Slot"u8, out EquipSlot s))
+ slot = s;
+ else if (j.NumberProperty("SetId"u8, out ushort i))
+ setId = new PrimaryId(i);
+ else if (j.NumberProperty("Entry"u8, out ulong e))
+ entry = (EqpEntry)e;
+ else
+ j.Skip();
+ }
+
+ var ret = new EqpIdentifier(setId, slot);
+ return ret.Validate() ? ret : null;
+ }
+
+ public static EqdpIdentifier? ReadEqdp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out EqdpEntry? entry)
+ {
+ entry = null;
+ var gender = Gender.Unknown;
+ var race = ModelRace.Unknown;
+ var setId = PrimaryId.Zero;
+ var slot = EquipSlot.Unknown;
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("Gender"u8, out Gender g))
+ gender = g;
+ else if (j.EnumProperty("Race"u8, out ModelRace r))
+ race = r;
+ else if (j.EnumProperty("Slot"u8, out EquipSlot s))
+ slot = s;
+ else if (j.NumberProperty("SetId"u8, out ushort i))
+ setId = new PrimaryId(i);
+ else if (j.NumberProperty("Entry"u8, out ushort e))
+ entry = (EqdpEntry)e;
+ else
+ j.Skip();
+ }
+
+ var ret = new EqdpIdentifier(setId, slot, Names.CombinedRace(gender, race));
+ return ret.Validate() ? ret : null;
+ }
+
+ public static EstIdentifier? ReadEst(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out EstEntry? entry)
+ {
+ entry = null;
+ var gender = Gender.Unknown;
+ var race = ModelRace.Unknown;
+ var setId = PrimaryId.Zero;
+ var slot = default(EstType);
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("Gender"u8, out Gender g))
+ gender = g;
+ else if (j.EnumProperty("Race"u8, out ModelRace r))
+ race = r;
+ else if (j.EnumProperty("Slot"u8, out EstType s))
+ slot = s;
+ else if (j.NumberProperty("SetId"u8, out ushort i))
+ setId = new PrimaryId(i);
+ else if (j.NumberProperty("Entry"u8, out ushort e))
+ entry = new EstEntry(e);
+ else
+ j.Skip();
+ }
+
+ var ret = new EstIdentifier(setId, slot, Names.CombinedRace(gender, race));
+ return ret.Validate() ? ret : null;
+ }
+
+ public static GmpEntry? ReadGmpEntry(Utf8JsonObjectLimit entryReader, ref Utf8JsonReader j)
+ {
+ var enabled = false;
+ var animated = false;
+ ushort rotationA = 0;
+ ushort rotationB = 0;
+ ushort rotationC = 0;
+ byte unknownA = 0;
+ byte unknownB = 0;
+
+ while (entryReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.BoolProperty("Enabled"u8, out var e))
+ enabled = e;
+ else if (j.BoolProperty("Animated"u8, out var a))
+ animated = a;
+ else if (j.NumberProperty("RotationA"u8, out ushort ra))
+ rotationA = ra;
+ else if (j.NumberProperty("RotationB"u8, out ushort rb))
+ rotationB = rb;
+ else if (j.NumberProperty("RotationC"u8, out ushort rc))
+ rotationC = rc;
+ else if (j.NumberProperty("UnknownA"u8, out byte ua))
+ unknownA = ua;
+ else if (j.NumberProperty("UnknownB"u8, out byte ub))
+ unknownB = ub;
+ else
+ j.Skip();
+ }
+
+ return new GmpEntry
+ {
+ Enabled = enabled,
+ Animated = animated,
+ RotationA = rotationA,
+ RotationB = rotationB,
+ RotationC = rotationC,
+ UnknownA = unknownA,
+ UnknownB = unknownB,
+ };
+ }
+
+ public static GmpIdentifier? ReadGmp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out GmpEntry? entry)
+ {
+ entry = null;
+ var setId = PrimaryId.Zero;
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.NumberProperty("SetId"u8, out ushort i))
+ setId = new PrimaryId(i);
+ else if (j.ObjectProperty("Entry"u8, out var entryReader))
+ entry = ReadGmpEntry(entryReader, ref j);
+ else
+ j.Skip();
+ }
+
+ var ret = new GmpIdentifier(setId);
+ return ret.Validate() ? ret : null;
+ }
+
+ public static RspIdentifier? ReadRsp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out RspEntry? entry)
+ {
+ entry = null;
+ var subRace = SubRace.Unknown;
+ var attribute = RspAttribute.NumAttributes;
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("SubRace"u8, out SubRace s))
+ subRace = s;
+ else if (j.EnumProperty("Attribute"u8, out RspAttribute a))
+ attribute = a;
+ else if (j.NumberProperty("Entry"u8, out float e))
+ entry = new RspEntry(e);
+ else
+ j.Skip();
+ }
+
+ var ret = new RspIdentifier(subRace, attribute);
+ return ret.Validate() ? ret : null;
+ }
+
+ public static AtchEntry? ReadAtchEntry(Utf8JsonObjectLimit entryReader, ref Utf8JsonReader j)
+ {
+ var ret = new AtchEntry();
+
+ while (entryReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.StringProperty("Bone"u8, out StringU8 bone))
+ {
+ if (bone.Length is not 0 && ret.SetBoneName(bone))
+ continue;
+
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.NumberProperty("Scale"u8, out float s))
+ ret.Scale = s;
+ else if (j.NumberProperty("OffsetX"u8, out float ox))
+ ret.OffsetX = ox;
+ else if (j.NumberProperty("OffsetY"u8, out float oy))
+ ret.OffsetY = oy;
+ else if (j.NumberProperty("OffsetZ"u8, out float oz))
+ ret.OffsetZ = oz;
+ else if (j.NumberProperty("RotationX"u8, out float rx))
+ ret.RotationX = rx;
+ else if (j.NumberProperty("RotationY"u8, out float ry))
+ ret.RotationY = ry;
+ else if (j.NumberProperty("RotationZ"u8, out float rz))
+ ret.RotationZ = rz;
+ else
+ j.Skip();
+ }
+
+ if (ret.Bone.Length is 0)
+ return null;
+
+ return ret;
+ }
+
+
+ public static AtchIdentifier? ReadAtch(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out AtchEntry? entry)
+ {
+ entry = null;
+ var gender = Gender.Unknown;
+ var race = ModelRace.Unknown;
+ var type = AtchType.Unknown;
+ ushort index = 0;
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("Gender"u8, out Gender g))
+ gender = g;
+ else if (j.EnumProperty("Race"u8, out ModelRace r))
+ race = r;
+ else if (j.NumberProperty("Index"u8, out ushort i))
+ index = i;
+ else if (j.StringProperty("Type"u8, out StringU8 value))
+ type = AtchType.FromString(value);
+ else if (j.ObjectProperty("Entry"u8, out var entryReader))
+ entry = ReadAtchEntry(entryReader, ref j);
+ else
+ j.Skip();
+ }
+
+ var ret = new AtchIdentifier(type, Names.CombinedRace(gender, race), index);
+ return ret.Validate() ? ret : null;
+ }
+
+ public static ShpIdentifier? ReadShp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out ShpEntry? entry)
+ {
+ entry = null;
+ ShapeAttributeString shape = default;
+ var slot = HumanSlot.Unknown;
+ PrimaryId? id = null;
+ var connectorCondition = ShapeConnectorCondition.None;
+ var genderRaceCondition = GenderRace.Unknown;
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.StringProperty("Shape"u8, out StringU8 shp))
+ {
+ if (ShapeAttributeString.TryRead(shp, out shape))
+ continue;
+
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("Slot"u8, out HumanSlot s))
+ slot = s;
+ else if (j.EnumProperty("ConnectorCondition"u8, out ShapeConnectorCondition cc))
+ connectorCondition = cc;
+ else if (j.NumberProperty("GenderRaceCondition"u8, out ushort gr))
+ genderRaceCondition = (GenderRace)gr;
+ else if (j.NumberProperty("Id"u8, out ushort i))
+ id = i;
+ else if (j.BoolProperty("Entry"u8, out var e))
+ entry = new ShpEntry(e);
+ else
+ j.Skip();
+ }
+
+ if (shape.Length is 0)
+ return null;
+
+ var ret = new ShpIdentifier(slot, id, shape, connectorCondition, genderRaceCondition);
+ return ret.Validate() ? ret : null;
+ }
+
+ public static AtrIdentifier? ReadAtr(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out AtrEntry? entry)
+ {
+ entry = null;
+ ShapeAttributeString attribute = default;
+ var slot = HumanSlot.Unknown;
+ PrimaryId? id = null;
+ var genderRaceCondition = GenderRace.Unknown;
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.StringProperty("Attribute"u8, out StringU8 atr))
+ {
+ if (ShapeAttributeString.TryRead(atr, out attribute))
+ continue;
+
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("Slot"u8, out HumanSlot s))
+ slot = s;
+ else if (j.NumberProperty("GenderRaceCondition"u8, out ushort gr))
+ genderRaceCondition = (GenderRace) gr;
+ else if (j.NumberProperty("Id"u8, out ushort i))
+ id = i;
+ else if (j.BoolProperty("Entry"u8, out var e))
+ entry = new AtrEntry(e);
+ else
+ j.Skip();
+ }
+
+ if (attribute.Length is 0)
+ return null;
+
+ var ret = new AtrIdentifier(slot, id, attribute, genderRaceCondition);
+ return ret.Validate() ? ret : null;
+ }
+
+ public static ImcEntry? ReadImcEntry(Utf8JsonObjectLimit entryReader, ref Utf8JsonReader j)
+ {
+ byte materialId = 0;
+ byte decalId = 0;
+ byte vfxId = 0;
+ byte materialAnimationId = 0;
+ byte soundId = 0;
+ ushort attributeMask = 0;
+
+ while (entryReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.NumberProperty("MaterialId"u8, out byte mi))
+ materialId = mi;
+ else if (j.NumberProperty("DecalId"u8, out byte di))
+ decalId = di;
+ else if (j.NumberProperty("VfxId"u8, out byte vi))
+ vfxId = vi;
+ else if (j.NumberProperty("MaterialAnimationId"u8, out byte mai))
+ materialAnimationId = mai;
+ else if (j.NumberProperty("AttributeMask"u8, out ushort am))
+ attributeMask = am;
+ else if (j.NumberProperty("SoundId"u8, out byte si))
+ soundId = si;
+ else
+ j.Skip();
+ }
+
+ return new ImcEntry(materialId, decalId, attributeMask, soundId, vfxId, materialAnimationId);
+ }
+
+ public static ImcIdentifier? ReadImc(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j, out ImcEntry? entry)
+ {
+ entry = null;
+ var objectType = ObjectType.Unknown;
+ var primaryId = PrimaryId.Zero;
+ var variant = Variant.Zero;
+ var secondaryId = SecondaryId.Zero;
+ var equipSlot = EquipSlot.Unknown;
+ ushort variantParse = 0;
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("ObjectType"u8, out ObjectType t))
+ objectType = t;
+ else if (j.EnumProperty("EquipSlot"u8, out EquipSlot s))
+ equipSlot = s;
+ else if (j.NumberProperty("PrimaryId"u8, out ushort i1))
+ primaryId = new PrimaryId(i1);
+ else if (j.NumberProperty("Variant"u8, out variantParse))
+ variant = new Variant((byte)variantParse);
+ else if (j.NumberProperty("SecondaryId"u8, out ushort i2))
+ secondaryId = new SecondaryId(i2);
+ else if (j.ObjectProperty("Entry"u8, out var entryReader))
+ entry = ReadImcEntry(entryReader, ref j);
+ else
+ j.Skip();
+ }
+
+ if (variantParse > byte.MaxValue)
+ return null;
+
+ var ret = new ImcIdentifier(primaryId, variant, objectType, secondaryId, equipSlot,
+ objectType is ObjectType.Monster or ObjectType.Weapon ? BodySlot.Body : BodySlot.Unknown);
+ return ret.Validate() ? ret : null;
+ }
+
+ public static GlobalEqpManipulation? ReadGeqp(Utf8JsonObjectLimit objectReader, ref Utf8JsonReader j)
+ {
+ var type = (GlobalEqpType)100;
+ var condition = PrimaryId.Zero;
+
+ while (objectReader.Read(ref j))
+ {
+ if (j.TokenType is not JsonTokenType.PropertyName)
+ {
+ j.SkipCurrentObject();
+ return null;
+ }
+
+ if (j.EnumProperty("Type"u8, out GlobalEqpType t))
+ type = t;
+ else if (j.NumberProperty("Condition"u8, out ushort i))
+ condition = new PrimaryId(i);
+ else
+ j.Skip();
+ }
+
+ var ret = new GlobalEqpManipulation
+ {
+ Type = type,
+ Condition = condition,
+ };
+ return ret.Validate() ? ret : null;
+ }
+
+ private static void AddSingleManipulation(IModDataContainer? container, Utf8JsonObjectLimit objectReader, ref Utf8JsonReader reader,
+ MetaDictionary ret,
+ MetaManipulationType type)
+ {
+ while (objectReader.Read(ref reader))
+ {
+ if (reader.TokenType is not JsonTokenType.PropertyName)
+ throw new JsonException("Property name expected.");
+
+ if (reader.ObjectProperty("Manipulation"u8, out var manipulationReader))
+ switch (type)
+ {
+ case MetaManipulationType.Imc
+ when CheckIdentifier(container, "IMC", ReadImc(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.Eqdp
+ when CheckIdentifier(container, "EQDP", ReadEqdp(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.Eqp
+ when CheckIdentifier(container, "EQP", ReadEqp(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.Est
+ when CheckIdentifier(container, "EST", ReadEst(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.Gmp
+ when CheckIdentifier(container, "GMP", ReadGmp(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.Rsp
+ when CheckIdentifier(container, "RSP", ReadRsp(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.Atch
+ when CheckIdentifier(container, "ATCH", ReadAtch(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.Shp
+ when CheckIdentifier(container, "SHP", ReadShp(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.Atr
+ when CheckIdentifier(container, "ATR", ReadAtr(manipulationReader, ref reader, out var e), e, out var identifier,
+ out var entry):
+ ret.TryAdd(identifier, entry);
+ break;
+ case MetaManipulationType.GlobalEqp
+ when CheckIdentifier(container, "Global EQP", ReadGeqp(manipulationReader, ref reader), (int?)0, out var identifier,
+ out _):
+ ret.TryAdd(identifier);
+ break;
+ }
+ else
+ // Skip other properties.
+ reader.Skip();
+ }
+ }
+
+ private static bool CheckIdentifier(IModDataContainer? container, string? type, TIdentifier? i, TEntry? e,
+ out TIdentifier identifier, out TEntry entry)
+ where TIdentifier : struct where TEntry : struct
+ {
+ if (i.HasValue)
+ if (e.HasValue)
+ {
+ identifier = i.Value;
+ entry = e.Value;
+ return true;
+ }
+
+ if (container is not null)
+ Penumbra.Log.Warning($"Invalid {type} Manipulation encountered in {container.Mod.Name} - {container.GetFullName()}.");
+ else
+ Penumbra.Log.Warning($"Invalid {type} Manipulation encountered.");
+ identifier = default;
+ entry = default;
+ return false;
+ }
+}
diff --git a/Penumbra/Files/MetaSerialization.cs b/Penumbra/Files/MetaSerialization.cs
new file mode 100644
index 000000000..37d9d1083
--- /dev/null
+++ b/Penumbra/Files/MetaSerialization.cs
@@ -0,0 +1,166 @@
+using System.Buffers;
+using System.Text.Json;
+using Luna;
+using Penumbra.GameData.Files.AtchStructs;
+using Penumbra.GameData.Structs;
+using Penumbra.Meta.Manipulations;
+
+namespace Penumbra.Files;
+
+public static class MetaSerialization
+{
+ /// Write all meta entries in a meta dictionary as a new JSON array.
+ public static Utf8JsonWriter WriteMetaDictionary(Utf8JsonWriter j, MetaDictionary meta)
+ {
+ j.WriteStartArray();
+ if (meta.Count > 0)
+ {
+ SerializeTo(j, meta.Imc);
+ SerializeTo(j, meta.Eqp);
+ SerializeTo(j, meta.Eqdp);
+ SerializeTo(j, meta.Est);
+ SerializeTo(j, meta.Rsp);
+ SerializeTo(j, meta.Gmp);
+ SerializeTo(j, meta.Atch);
+ SerializeTo(j, meta.Shp);
+ SerializeTo(j, meta.Atr);
+ SerializeTo(j, meta.GlobalEqp);
+ }
+
+ j.WriteEndArray();
+ return j;
+ }
+
+ public static ReadOnlyMemory Serialize(IEnumerable> manipulations)
+ where TIdentifier : unmanaged, IMetaIdentifier
+ where TEntry : unmanaged
+ {
+ var data = new ArrayBufferWriter();
+ using var writer = new Utf8JsonWriter(data, JsonFunctions.WriterOptions);
+ writer.WriteStartArray();
+ SerializeTo(writer, manipulations);
+ writer.WriteEndArray();
+ return data.WrittenMemory;
+ }
+
+ public static ReadOnlyMemory Serialize(IEnumerable manipulations)
+ {
+ var data = new ArrayBufferWriter();
+ using var writer = new Utf8JsonWriter(data, JsonFunctions.WriterOptions);
+ writer.WriteStartArray();
+ SerializeTo(writer, manipulations);
+ writer.WriteEndArray();
+ return data.WrittenMemory;
+ }
+
+ /// Add all given entries to a pre-existing JSON array.
+ public static Utf8JsonWriter SerializeTo(Utf8JsonWriter j,
+ IEnumerable> manipulations)
+ where TIdentifier : unmanaged, IMetaIdentifier
+ where TEntry : unmanaged
+ {
+ foreach (var (identifier, entry) in manipulations)
+ Serialize(j, identifier, entry);
+ return j;
+ }
+
+ /// Add all given entries to a pre-existing JSON array.
+ public static Utf8JsonWriter SerializeTo(Utf8JsonWriter j, IEnumerable manipulations)
+ {
+ foreach (var manip in manipulations)
+ Serialize(j, manip);
+ return j;
+ }
+
+ /// Serialize a single identifier and entry pair.
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, TIdentifier identifier, TEntry entry)
+ where TIdentifier : unmanaged, IMetaIdentifier
+ where TEntry : unmanaged
+ {
+ if (typeof(TIdentifier) == typeof(EqpIdentifier) && typeof(TEntry) == typeof(EqpEntryInternal))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(EqpIdentifier) && typeof(TEntry) == typeof(EqpEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(EqdpIdentifier) && typeof(TEntry) == typeof(EqdpEntryInternal))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(EqdpIdentifier) && typeof(TEntry) == typeof(EqdpEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(EstIdentifier) && typeof(TEntry) == typeof(EstEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(GmpIdentifier) && typeof(TEntry) == typeof(GmpEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(RspIdentifier) && typeof(TEntry) == typeof(RspEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(ImcIdentifier) && typeof(TEntry) == typeof(ImcEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(AtchIdentifier) && typeof(TEntry) == typeof(AtchEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(ShpIdentifier) && typeof(TEntry) == typeof(ShpEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(AtrIdentifier) && typeof(TEntry) == typeof(AtrEntry))
+ Serialize(j, Unsafe.As(ref identifier), Unsafe.As(ref entry));
+ else if (typeof(TIdentifier) == typeof(GlobalEqpManipulation))
+ Serialize(j, Unsafe.As(ref identifier));
+ return j;
+ }
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EqpIdentifier identifier, EqpEntryInternal entry)
+ => Serialize(j, identifier, entry.ToEntry(identifier.Slot));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EqpIdentifier identifier, EqpEntry entry)
+ => Serialize(j, "Eqp"u8, identifier, entry, static (w, e) => w.WriteNumberValue((ulong)e));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EqdpIdentifier identifier, EqdpEntryInternal entry)
+ => Serialize(j, identifier, entry.ToEntry(identifier.Slot));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EqdpIdentifier identifier, EqdpEntry entry)
+ => Serialize(j, "Eqdp"u8, identifier, entry, static (w, e) => w.WriteNumberValue((ushort)e));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, EstIdentifier identifier, EstEntry entry)
+ => Serialize(j, "Est"u8, identifier, entry, static (w, e) => w.WriteNumberValue(e.Value));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, GmpIdentifier identifier, GmpEntry entry)
+ => Serialize(j, "Gmp"u8, identifier, entry, static (w, e) => e.WriteJson(w));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, ImcIdentifier identifier, ImcEntry entry)
+ => Serialize(j, "Imc"u8, identifier, entry, static (w, e) => e.WriteJson(w));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, RspIdentifier identifier, RspEntry entry)
+ => Serialize(j, "Rsp"u8, identifier, entry, static (w, e) => w.WriteNumberValue(e.Value));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, AtchIdentifier identifier, AtchEntry entry)
+ => Serialize(j, "Atch"u8, identifier, entry, static (w, e) => e.WriteJson(w));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, ShpIdentifier identifier, ShpEntry entry)
+ => Serialize(j, "Shp"u8, identifier, entry, static (w, e) => w.WriteBooleanValue(e.Value));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, AtrIdentifier identifier, AtrEntry entry)
+ => Serialize(j, "Atr"u8, identifier, entry, static (w, e) => w.WriteBooleanValue(e.Value));
+
+ public static Utf8JsonWriter Serialize(Utf8JsonWriter j, GlobalEqpManipulation identifier)
+ {
+ j.WriteStartObject();
+ j.WriteString("Type"u8, "GlobalEqp"u8);
+ j.WriteStartObject("Manipulation"u8);
+ identifier.AddToJson(j);
+ j.WriteEndObject();
+ j.WriteEndObject();
+ return j;
+ }
+
+ private static Utf8JsonWriter Serialize(Utf8JsonWriter j, ReadOnlySpan type, TIdentifier identifier,
+ TEntry entry,
+ Action writeEntry)
+ where TIdentifier : IMetaIdentifier
+ {
+ j.WriteStartObject();
+ j.WriteString("Type"u8, type);
+ j.WriteStartObject("Manipulation"u8);
+ identifier.AddToJson(j);
+ j.WritePropertyName("Entry"u8);
+ writeEntry(j, entry);
+ j.WriteEndObject();
+ j.WriteEndObject();
+ return j;
+ }
+}
diff --git a/Penumbra/Files/ModDeserialization.cs b/Penumbra/Files/ModDeserialization.cs
new file mode 100644
index 000000000..543340812
--- /dev/null
+++ b/Penumbra/Files/ModDeserialization.cs
@@ -0,0 +1,420 @@
+using System.Text.Json;
+using Luna;
+using Penumbra.GameData.Structs;
+using Penumbra.Mods;
+using Penumbra.Mods.Groups;
+using Penumbra.Mods.Manager;
+using Penumbra.Mods.Manager.OptionEditor;
+using Penumbra.Mods.SubMods;
+
+namespace Penumbra.Files;
+
+public static class ModDeserialization
+{
+ public sealed class Context(Mod mod) : IDisposable
+ {
+ public readonly Mod Mod = mod;
+ public readonly Dictionary Parents = [];
+ public readonly Dictionary> Conditions = [];
+
+ public void Dispose()
+ {
+ foreach (var (group, guid) in Parents)
+ {
+ if (!Mod.SubObjects.TryGetValue(guid, out var parentObject))
+ throw new InvalidMetaException(Mod, string.Empty, $"The specified parent object {guid} for {group.Name} does not exist.");
+
+ if (CycleChecker.Check(group, parentObject))
+ throw new InvalidMetaException(Mod, string.Empty,
+ $"The specified parent object {parentObject.Name} for {group.Name} would cause a cycle.");
+
+ group.ParentSetting = parentObject;
+ }
+
+ foreach (var (@object, condition) in Conditions)
+ ResolveConditions(@object, condition);
+
+ if (CheckCyclicConditions(Mod) is { } error)
+ throw new InvalidMetaException(Mod, string.Empty, error);
+ }
+
+ private static string? ValidateCondition(IModObject parent, Guid condition, out IModOption? option)
+ {
+ if (!parent.Mod.SubObjects.TryGetValue(condition, out var @object) || @object is not IModOption o)
+ {
+ option = null;
+ return $"The specified option {condition} for {parent.Name}'s conditions does not exist or is not an option.";
+ }
+
+ option = o;
+ return LayoutManager.ValidateCondition(parent, option);
+ }
+
+ private static string? CheckCyclicConditions(Mod _)
+ {
+ // TODO
+ return null;
+ }
+
+ private static ICondition Convert(IModObject parent, SettingIdCondition condition)
+ {
+ if (ValidateCondition(parent, condition.Option, out var option) is { } error)
+ throw new InvalidMetaException(parent.Mod, string.Empty, error);
+ return new SettingCondition(option!);
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ private static void ResolveConditions(IModObject @object, ICondition condition)
+ {
+ var reduced = condition.EditConditions(m => m is SettingIdCondition id ? Convert(@object, id) : null)?.Reduce();
+ if (reduced is not null and not TrueCondition)
+ @object.Condition = reduced;
+ }
+ }
+
+
+ public static ModDataChangeType ReloadMod(SaveService files, Mod mod)
+ {
+ mod.ModPath.Refresh();
+ if (!mod.ModPath.Exists)
+ throw new MetaMissingException(mod, mod.ModPath.FullName);
+
+ var metaPath = files.FileNames.ModMetaPath(mod);
+ if (!File.Exists(metaPath))
+ throw new MetaMissingException(mod, metaPath);
+
+ using var context = new Context(mod);
+ var meta = IJsonParsable.ReadJson(files, metaPath, false, context).Changes;
+ MigrateGroups(files, context);
+
+ return meta;
+ }
+
+ private static void MigrateGroups(SaveService files, Context context)
+ {
+ if (context.Mod.LoadedVersion >= 4)
+ return;
+
+ GroupDeserialization.ReadDefaultContainerFile(files, context);
+ foreach (var groupFile in files.FileNames.GetOptionGroupFiles(context.Mod))
+ {
+ if (GroupDeserialization.ReadGroupFile(files, context, groupFile) is { } group)
+ context.Mod.AddGroup(group, groupFile.FullName);
+ }
+ }
+
+ public ref struct ModMetaData : IJsonParsable
+ {
+ public ModDataChangeType Changes;
+
+ public static ModMetaData Read(scoped ref Utf8JsonReader reader, string filePath, object? userInput)
+ {
+ if (userInput is not Context context)
+ throw new ArgumentException("The user input for reading a Mod has to be the mod object.");
+
+ if (!reader.Read() || reader.TokenType is not JsonTokenType.StartObject)
+ throw new InvalidMetaException(context.Mod, filePath, "File is empty or malformed.");
+
+ ModDataChangeType visited = 0;
+ ModDataChangeType ret = 0;
+ var encounteredDefault = false;
+ var objectReader = reader.CreateObjectLimit();
+
+ context.Mod.Groups.Clear();
+ context.Mod.SubObjects.Clear();
+ while (objectReader.Read(ref reader))
+ {
+ if (reader.TokenType is not JsonTokenType.PropertyName)
+ throw new InvalidMetaException(context.Mod, filePath, $"Expected property name but got {reader.TokenType}.");
+
+ if (reader.NumberProperty("FileVersion"u8, out uint fileVersion))
+ {
+ if (context.Mod.LoadedVersion != fileVersion)
+ {
+ ret |= ModDataChangeType.Migration;
+ context.Mod.LoadedVersion = fileVersion;
+ }
+
+ visited |= ModDataChangeType.Migration;
+ continue;
+ }
+
+ if (reader.GuidProperty("Identifier"u8, out var identifier))
+ {
+ if (context.Mod.StableIdentifier != identifier)
+ {
+ ret |= ModDataChangeType.Identifier;
+ context.Mod.StableIdentifier = identifier;
+ }
+
+ visited |= ModDataChangeType.Identifier;
+ continue;
+ }
+
+ if (reader.StringProperty("Name"u8, out string? name, true))
+ {
+ if (string.IsNullOrEmpty(name))
+ throw new InvalidMetaException(context.Mod, filePath, "Mod with empty name is not allowed.");
+
+ if (context.Mod.Name != name)
+ {
+ ret |= ModDataChangeType.Name;
+ context.Mod.Name = name;
+ }
+
+ visited |= ModDataChangeType.Name;
+ continue;
+ }
+
+ if (reader.StringProperty("Author"u8, out string? author, true))
+ {
+ author ??= string.Empty;
+ if (context.Mod.Author != author)
+ {
+ ret |= ModDataChangeType.Author;
+ context.Mod.Author = author;
+ }
+
+ visited |= ModDataChangeType.Author;
+ continue;
+ }
+
+ if (reader.StringProperty("Description"u8, out string? description, true))
+ {
+ description ??= string.Empty;
+ if (context.Mod.Description != description)
+ {
+ ret |= ModDataChangeType.Description;
+ context.Mod.Description = description;
+ }
+
+ visited |= ModDataChangeType.Description;
+ continue;
+ }
+
+ if (reader.StringProperty("Image"u8, out string? image, true))
+ {
+ image ??= string.Empty;
+ if (context.Mod.Image != image)
+ {
+ ret |= ModDataChangeType.Image;
+ context.Mod.Image = image;
+ }
+
+ visited |= ModDataChangeType.Image;
+ continue;
+ }
+
+ if (reader.StringProperty("Version"u8, out string? version, true))
+ {
+ version ??= string.Empty;
+ if (context.Mod.Version != version)
+ {
+ ret |= ModDataChangeType.Version;
+ context.Mod.Version = version;
+ }
+
+ visited |= ModDataChangeType.Version;
+ continue;
+ }
+
+ if (reader.StringProperty("Website"u8, out string? website, true))
+ {
+ website ??= string.Empty;
+ if (context.Mod.Website != website)
+ {
+ ret |= ModDataChangeType.Website;
+ context.Mod.Website = website;
+ }
+
+ visited |= ModDataChangeType.Website;
+ continue;
+ }
+
+ if (reader.ArrayProperty("ModTags"u8, out _, true))
+ {
+ var tags = reader.ReadStringArray() ?? [];
+ ret |= ModDataEditor.UpdateTags(context.Mod, tags!, null);
+ visited |= ModDataChangeType.ModTags;
+ continue;
+ }
+
+ if (reader.ArrayProperty("DefaultPreferredItems"u8, out _, true))
+ {
+ var items = reader.ReadNumberArray();
+ if (items is null)
+ {
+ if (context.Mod.DefaultPreferredItems.Count > 0)
+ {
+ ret |= ModDataChangeType.DefaultChangedItems;
+ context.Mod.DefaultPreferredItems.Clear();
+ }
+ }
+ else if (!context.Mod.DefaultPreferredItems.SetEquals(items.Select(i => new CustomItemId(i))))
+ {
+ ret |= ModDataChangeType.DefaultChangedItems;
+ context.Mod.DefaultPreferredItems.Clear();
+ context.Mod.DefaultPreferredItems.UnionWith(items.Select(i => new CustomItemId(i)));
+ }
+
+ visited |= ModDataChangeType.DefaultChangedItems;
+ continue;
+ }
+
+ if (reader.ArrayProperty("RequiredFeatures"u8, out _, true))
+ {
+ var features = reader.ReadFlagEnumArray() ?? FeatureFlags.None;
+ if (context.Mod.RequiredFeatures != features)
+ {
+ ret |= ModDataChangeType.RequiredFeatures;
+ context.Mod.RequiredFeatures = features;
+ }
+
+ visited |= ModDataChangeType.RequiredFeatures;
+ continue;
+ }
+
+ if (reader.ObjectProperty("DefaultData"u8, out _, true))
+ {
+ GroupDeserialization.ReadDefaultContainer(context, ref reader, filePath);
+ encounteredDefault = true;
+ continue;
+ }
+
+ if (reader.ObjectProperty("PageNames"u8, out var pageNameReader, true))
+ {
+ context.Mod.PageNames.Clear();
+ while (pageNameReader.Read(ref reader))
+ {
+ if (reader.TokenType is not JsonTokenType.PropertyName || !reader.TryReadNumber(out var pageNumber))
+ throw new InvalidMetaException(context.Mod, filePath, "PageNames dictionary expected number as property name.");
+
+ if (!pageNameReader.Read(ref reader) || !reader.TryReadString(out var pageName, "", true))
+ throw new InvalidMetaException(context.Mod, filePath,
+ "PageNames dictionary expected string or null as property value.");
+
+ context.Mod.PageNames.TryAdd(pageNumber, pageName ?? $"Page {pageNumber + 1}");
+ }
+
+ visited |= ModDataChangeType.PageNames;
+ continue;
+ }
+
+ if (ReadGroups(ref reader, filePath, context))
+ continue;
+
+ reader.Skip();
+ }
+
+ ret |= SetDefaults(context.Mod, filePath, visited);
+
+ if (context.Mod.LoadedVersion >= 4 && !encounteredDefault)
+ {
+ context.Mod.Default.Files.Clear();
+ context.Mod.Default.FileSwaps.Clear();
+ context.Mod.Default.Manipulations.Clear();
+ }
+
+ return new ModMetaData { Changes = ret };
+ }
+
+ private static bool ReadGroups(ref Utf8JsonReader reader, string filePath, Context context)
+ {
+ if (!reader.ArrayProperty("Groups"u8, out var arrayReader, true))
+ return false;
+
+ while (arrayReader.Read(ref reader))
+ {
+ if (GroupDeserialization.ReadGroup(context, ref reader, filePath) is { } group)
+ context.Mod.AddGroup(group, filePath);
+ }
+
+ return true;
+ }
+
+ private static ModDataChangeType SetDefaults(Mod mod, string filePath, ModDataChangeType visited)
+ {
+ if (!visited.HasFlag(ModDataChangeType.Migration) || mod.LoadedVersion < 1)
+ throw new InvalidMetaException(mod, filePath, "No file version provided.");
+
+ if (!visited.HasFlag(ModDataChangeType.Name) || mod.Name.Length is 0)
+ throw new InvalidMetaException(mod, filePath, "Either no or empty mod name provided.");
+
+ ModDataChangeType ret = 0;
+ if (!visited.HasFlag(ModDataChangeType.Identifier))
+ {
+ mod.StableIdentifier = Guid.NewGuid();
+ ret |= ModDataChangeType.Identifier;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.Author) && mod.Author.Length > 0)
+ {
+ mod.Author = string.Empty;
+ ret |= ModDataChangeType.Author;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.Description) && mod.Description.Length > 0)
+ {
+ mod.Description = string.Empty;
+ ret |= ModDataChangeType.Description;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.Image) && mod.Image.Length > 0)
+ {
+ mod.Image = string.Empty;
+ ret |= ModDataChangeType.Image;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.Version) && mod.Version.Length > 0)
+ {
+ mod.Version = string.Empty;
+ ret |= ModDataChangeType.Version;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.Website) && mod.Website.Length > 0)
+ {
+ mod.Website = string.Empty;
+ ret |= ModDataChangeType.Website;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.PreferredChangedItems) && mod.DefaultPreferredItems.Count > 0)
+ {
+ mod.DefaultPreferredItems.Clear();
+ ret |= ModDataChangeType.DefaultChangedItems;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.RequiredFeatures) && mod.RequiredFeatures is not FeatureFlags.None)
+ {
+ mod.RequiredFeatures = FeatureFlags.None;
+ ret |= ModDataChangeType.RequiredFeatures;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.ModTags) && mod.ModTags.Count > 0)
+ {
+ mod.ModTags = [];
+ ret |= ModDataChangeType.ModTags;
+ }
+
+ if (!visited.HasFlag(ModDataChangeType.PageNames) && mod.PageNames.Count > 0)
+ {
+ mod.PageNames = [];
+ ret |= ModDataChangeType.PageNames;
+ }
+
+ return ret;
+ }
+ }
+}
+
+public sealed class MetaMissingException(Mod mod, string metaPath) : FileNotFoundException
+{
+ public readonly Mod Mod = mod;
+ public readonly string MetaPath = metaPath;
+}
+
+public sealed class InvalidMetaException(Mod mod, string filePath, string reason) : JsonException
+{
+ public readonly Mod Mod = mod;
+ public readonly string FilePath = filePath;
+ public readonly string Reason = reason;
+}
diff --git a/Penumbra/Files/ModSerialization.cs b/Penumbra/Files/ModSerialization.cs
new file mode 100644
index 000000000..daa717c3a
--- /dev/null
+++ b/Penumbra/Files/ModSerialization.cs
@@ -0,0 +1,67 @@
+using System.Text.Json;
+using ImSharp;
+using Luna;
+using Penumbra.Mods;
+
+namespace Penumbra.Files;
+
+public static class ModSerialization
+{
+ public const uint CurrentFileVersion = 4;
+
+ public static void WriteMod(Utf8JsonWriter j, Mod mod)
+ {
+ j.WriteStartObject();
+
+ j.WriteNumber("FileVersion"u8, CurrentFileVersion);
+ j.WriteString("Identifier"u8, mod.StableIdentifier);
+ j.WriteString("LastWrite"u8, DateTime.UtcNow);
+ j.WriteString("Name"u8, mod.Name);
+ j.WriteNonEmptyString("Author"u8, mod.Author);
+ j.WriteNonEmptyString("Description"u8, mod.Description);
+ j.WriteNonEmptyString("Image"u8, mod.Image);
+ j.WriteNonEmptyString("Version"u8, mod.Version);
+ j.WriteNonEmptyString("Website"u8, mod.Website);
+
+ if (mod.ModTags.Count > 0)
+ {
+ j.WriteStartArray("ModTags"u8);
+ foreach (var tag in mod.ModTags)
+ j.WriteStringValue(tag);
+ j.WriteEndArray();
+ }
+
+ if (mod.DefaultPreferredItems.Count > 0)
+ {
+ j.WriteStartArray("DefaultPreferredItems"u8);
+ foreach (var item in mod.DefaultPreferredItems)
+ j.WriteNumberValue(item);
+ j.WriteEndArray();
+ }
+
+ if (mod.RequiredFeatures is not FeatureFlags.None)
+ {
+ var features = mod.RequiredFeatures;
+ j.WriteStartArray("RequiredFeatures"u8);
+ foreach (var flag in FeatureFlags.Values)
+ {
+ if ((features & flag) is not FeatureFlags.None)
+ j.WriteStringValue(flag.ToNameU8());
+ }
+
+ j.WriteEndArray();
+ }
+
+ GroupSerialization.WriteDefaultContainer(j, mod, mod.ModPath);
+
+ if (mod.Groups.Count > 0)
+ {
+ j.WriteStartArray("Groups"u8);
+ foreach (var group in mod.Groups)
+ GroupSerialization.WriteGroup(j, group, mod.ModPath);
+ j.WriteEndArray();
+ }
+
+ j.WriteEndObject();
+ }
+}
diff --git a/Penumbra/Import/TexToolsImport.cs b/Penumbra/Import/TexToolsImport.cs
index 7981b4472..13e08d7e3 100644
--- a/Penumbra/Import/TexToolsImport.cs
+++ b/Penumbra/Import/TexToolsImport.cs
@@ -4,6 +4,8 @@
using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager;
using Penumbra.Services;
+using SharpCompress.Archives;
+using SharpCompress.Writers.Zip;
using FileMode = System.IO.FileMode;
using ZipArchive = SharpCompress.Archives.Zip.ZipArchive;
using ZipArchiveEntry = SharpCompress.Archives.Zip.ZipArchiveEntry;
@@ -26,8 +28,8 @@ public partial class TexToolsImporter : IDisposable
private readonly CancellationTokenSource _cancellation = new();
private readonly CancellationToken _token;
- public ImporterState State { get; private set; }
- public readonly List<(FileInfo File, DirectoryInfo? Mod, Exception? Error)> ExtractedMods;
+ public ImporterState State { get; private set; }
+ public readonly List ExtractedMods;
private readonly Configuration _config;
private readonly DuplicateManager _duplicates;
@@ -37,8 +39,9 @@ public partial class TexToolsImporter : IDisposable
private readonly MigrationManager _migrationManager;
public TexToolsImporter(int count, IEnumerable modPackFiles, Action handler,
- Configuration config, DuplicateManager duplicates, ModNormalizer modNormalizer, ModManager modManager, FileCompactor compactor,
- MigrationManager migrationManager, TexToolsImporter? previous)
+ TaskCompletionSource taskCompletionSource, Configuration config, DuplicateManager duplicates,
+ ModNormalizer modNormalizer, ModManager modManager, FileCompactor compactor, MigrationManager migrationManager,
+ TexToolsImporter? previous)
{
if (previous is not null)
{
@@ -58,7 +61,7 @@ public TexToolsImporter(int count, IEnumerable modPackFiles, Action(count + _previousModPackCount);
+ ExtractedMods = new List(count + _previousModPackCount);
_token = _cancellation.Token;
if (previous is not null)
ExtractedMods.AddRange(previous.ExtractedMods);
@@ -68,7 +71,9 @@ public TexToolsImporter(int count, IEnumerable modPackFiles, Action { taskCompletionSource.SetResult(ExtractedMods.Skip(_previousModPackCount).ToArray()); },
+ TaskScheduler.Default);
}
private void CloseStreams()
@@ -100,14 +105,14 @@ private void ImportFiles()
_currentModDirectory = null;
if (_token.IsCancellationRequested)
{
- ExtractedMods.Add((file, null, new TaskCanceledException("Task canceled by user.")));
+ ExtractedMods.Add(new ModImportResult(file, null, new TaskCanceledException("Task canceled by user.")));
continue;
}
try
{
var directory = VerifyVersionAndImport(file);
- ExtractedMods.Add((file, directory, null));
+ ExtractedMods.Add(new ModImportResult(file, directory, null));
if (_config.AutoDeduplicateOnImport)
{
State = ImporterState.DeduplicatingFiles;
@@ -116,7 +121,7 @@ private void ImportFiles()
}
catch (Exception e)
{
- ExtractedMods.Add((file, _currentModDirectory, e));
+ ExtractedMods.Add(new ModImportResult(file, _currentModDirectory, e));
_currentNumOptions = 0;
_currentOptionIdx = 0;
_currentFileIdx = 0;
@@ -137,7 +142,7 @@ private DirectoryInfo VerifyVersionAndImport(FileInfo modPackFile)
return HandleRegularArchive(modPackFile);
using var zfs = modPackFile.OpenRead();
- using var extractedModPack = ZipArchive.Open(zfs);
+ using var extractedModPack = ZipArchive.OpenArchive(zfs);
var mpl = FindZipEntry(extractedModPack, "TTMPL.mpl");
if (mpl == null)
@@ -161,10 +166,10 @@ private DirectoryInfo VerifyVersionAndImport(FileInfo modPackFile)
}
// You can in no way rely on any file paths in TTMPs so we need to just do this, sorry
- private static ZipArchiveEntry? FindZipEntry(ZipArchive file, string fileName)
+ private static IArchiveEntry? FindZipEntry(IWritableArchive file, string fileName)
=> file.Entries.FirstOrDefault(e => e is { IsDirectory: false, Key: not null } && e.Key.Contains(fileName));
- private static string GetStringFromZipEntry(ZipArchiveEntry entry, Encoding encoding)
+ private static string GetStringFromZipEntry(IArchiveEntry entry, Encoding encoding)
{
using var ms = new MemoryStream();
using var s = entry.OpenEntryStream();
@@ -184,7 +189,7 @@ private void WriteZipEntryToTempFile(Stream s)
_tmpFileStream = null;
}
- private StreamDisposer GetSqPackStreamStream(ZipArchive file, string entryName)
+ private StreamDisposer GetSqPackStreamStream(IWritableArchive file, string entryName)
{
State = ImporterState.WritingPackToDisk;
diff --git a/Penumbra/Import/TexToolsImporter.Archives.cs b/Penumbra/Import/TexToolsImporter.Archives.cs
index c53408056..34760cc3f 100644
--- a/Penumbra/Import/TexToolsImporter.Archives.cs
+++ b/Penumbra/Import/TexToolsImporter.Archives.cs
@@ -8,19 +8,12 @@
using SharpCompress.Archives;
using SharpCompress.Archives.Rar;
using SharpCompress.Archives.SevenZip;
-using SharpCompress.Common;
using ZipArchive = SharpCompress.Archives.Zip.ZipArchive;
namespace Penumbra.Import;
public partial class TexToolsImporter
{
- private static readonly ExtractionOptions ExtractionOptions = new()
- {
- ExtractFullPath = true,
- Overwrite = true,
- };
-
///
/// Extract regular compressed archives that are folders containing penumbra-formatted mods.
/// The mod has to either contain a meta.json at top level, or one folder deep.
@@ -31,7 +24,7 @@ public partial class TexToolsImporter
private DirectoryInfo HandleRegularArchive(FileInfo modPackFile)
{
using var zfs = modPackFile.OpenRead();
- using var archive = ArchiveFactory.Open(zfs);
+ using var archive = ArchiveFactory.OpenArchive(zfs);
var baseName = FindArchiveModMeta(archive, out var leadDir);
var name = string.Empty;
@@ -40,34 +33,35 @@ private DirectoryInfo HandleRegularArchive(FileInfo modPackFile)
_currentModName = modPackFile.Name;
_currentGroupName = string.Empty;
_currentOptionName = DefaultTexToolsData.Name;
- _currentNumFiles =
- archive switch
- {
- RarArchive r => r.Entries.Count,
- ZipArchive z => z.Entries.Count,
- SevenZipArchive s => s.Entries.Count,
- _ => archive.Entries.Count(),
- };
+ _currentNumFiles = archive switch
+ {
+ RarArchive r => r.Entries.Count,
+ ZipArchive z => z.Entries.Count,
+ SevenZipArchive s => s.Entries.Count,
+ _ => archive.Entries.Count(),
+ };
Penumbra.Log.Information($" -> Importing {archive.Type} Archive.");
_currentModDirectory = ModCreator.CreateModFolder(_baseDirectory, Path.GetRandomFileName(), _config.ReplaceNonAsciiOnImport, true);
-
State = ImporterState.ExtractingModFiles;
_currentFileIdx = 0;
ArchiveUtility.ForEachEntry(archive, reader =>
{
_token.ThrowIfCancellationRequested();
- if (reader.Entry.IsDirectory)
+ if (reader.Entry.IsDirectory || string.IsNullOrEmpty(reader.Entry.Key))
{
--_currentNumFiles;
return;
}
+ if (!string.IsNullOrEmpty(reader.Entry.LinkTarget))
+ throw new ArchiveUtility.SymbolicLinkException(reader.Entry.Key, reader.Entry.LinkTarget);
+
Penumbra.Log.Information($" -> Extracting {reader.Entry.Key}");
// Check that the mod has a valid name in the meta.json file.
- if (Path.GetFileName(reader.Entry.Key) == "meta.json")
+ if (Path.GetFileName(reader.Entry.Key.AsSpan()).Equals("meta.json", StringComparison.OrdinalIgnoreCase))
{
using var s = new MemoryStream();
using var e = reader.OpenEntryStream();
@@ -80,7 +74,7 @@ private DirectoryInfo HandleRegularArchive(FileInfo modPackFile)
if (name.Length is 0)
throw new Exception("Invalid mod archive: mod meta has no name.");
- using var f = File.OpenWrite(Path.Combine(_currentModDirectory.FullName, reader.Entry.Key!));
+ using var f = File.OpenWrite(Path.CombineSafely(_currentModDirectory.FullName, reader.Entry.Key!));
s.Seek(0, SeekOrigin.Begin);
s.WriteTo(f);
}
@@ -105,7 +99,7 @@ private DirectoryInfo HandleRegularArchive(FileInfo modPackFile)
if (leadDir)
{
_currentModDirectory = ModCreator.CreateModFolder(_baseDirectory, baseName, _config.ReplaceNonAsciiOnImport, false);
- Directory.Move(Path.Combine(oldName, baseName), _currentModDirectory.FullName);
+ Directory.Move(Path.CombineSafely(oldName, baseName), _currentModDirectory.FullName);
Directory.Delete(oldName);
}
else
@@ -138,18 +132,10 @@ private void HandleFileMigrationsAndWrite(ArchiveUtility.ReaderShim reader)
{
switch (Path.GetExtension(reader.Entry.Key))
{
- case ".mdl":
- _migrationManager.MigrateMdlDuringExtraction(reader, _currentModDirectory!.FullName);
- break;
- case ".mtrl":
- _migrationManager.MigrateMtrlDuringExtraction(reader, _currentModDirectory!.FullName);
- break;
- case ".tex":
- _migrationManager.FixMipMaps(reader, _currentModDirectory!.FullName);
- break;
- default:
- reader.WriteEntryToDirectory(_currentModDirectory!.FullName);
- break;
+ case ".mdl": _migrationManager.MigrateMdlDuringExtraction(reader, _currentModDirectory!.FullName); break;
+ case ".mtrl": _migrationManager.MigrateMtrlDuringExtraction(reader, _currentModDirectory!.FullName); break;
+ case ".tex": _migrationManager.FixMipMaps(reader, _currentModDirectory!.FullName); break;
+ default: reader.WriteEntryToDirectory(_currentModDirectory!.FullName); break;
}
}
diff --git a/Penumbra/Import/TexToolsImporter.ModPack.cs b/Penumbra/Import/TexToolsImporter.ModPack.cs
index 30d23efe3..aa670e266 100644
--- a/Penumbra/Import/TexToolsImporter.ModPack.cs
+++ b/Penumbra/Import/TexToolsImporter.ModPack.cs
@@ -7,7 +7,8 @@
using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.Util;
-using ZipArchive = SharpCompress.Archives.Zip.ZipArchive;
+using SharpCompress.Archives;
+using SharpCompress.Writers.Zip;
namespace Penumbra.Import;
@@ -16,7 +17,7 @@ public partial class TexToolsImporter
private DirectoryInfo? _currentModDirectory;
// Version 1 mod packs are a simple collection of files without much information.
- private DirectoryInfo ImportV1ModPack(FileInfo modPackFile, ZipArchive extractedModPack, string modRaw)
+ private DirectoryInfo ImportV1ModPack(FileInfo modPackFile, IWritableArchive extractedModPack, string modRaw)
{
_currentOptionIdx = 0;
_currentNumOptions = 1;
@@ -53,7 +54,7 @@ private DirectoryInfo ImportV1ModPack(FileInfo modPackFile, ZipArchive extracted
}
// Version 2 mod packs can either be simple or extended, import accordingly.
- private DirectoryInfo ImportV2ModPack(FileInfo _, ZipArchive extractedModPack, string modRaw)
+ private DirectoryInfo ImportV2ModPack(FileInfo _, IWritableArchive extractedModPack, string modRaw)
{
var modList = JsonConvert.DeserializeObject(modRaw, JsonSettings)!;
@@ -83,7 +84,7 @@ private DirectoryInfo ImportV2ModPack(FileInfo _, ZipArchive extractedModPack, s
}
// Simple V2 mod packs are basically the same as V1 mod packs.
- private DirectoryInfo ImportSimpleV2ModPack(ZipArchive extractedModPack, SimpleModPack modList)
+ private DirectoryInfo ImportSimpleV2ModPack(IWritableArchive extractedModPack, SimpleModPack modList)
{
_currentOptionIdx = 0;
_currentNumOptions = 1;
@@ -126,7 +127,7 @@ private static string GetGroupName(string groupName, ISet names)
}
// Extended V2 mod packs contain multiple options that need to be handled separately.
- private DirectoryInfo ImportExtendedV2ModPack(ZipArchive extractedModPack, string modRaw)
+ private DirectoryInfo ImportExtendedV2ModPack(IWritableArchive extractedModPack, string modRaw)
{
_currentOptionIdx = 0;
Penumbra.Log.Information(" -> Importing Extended V2 ModPack");
@@ -251,7 +252,7 @@ private void ExtractMod(DirectoryInfo outDirectory, SimpleMod mod)
var data = stream.ReadFile(mod.ModOffset);
_currentFileName = mod.FullPath;
- var extractedFile = new FileInfo(Path.Combine(outDirectory.FullName, mod.FullPath));
+ var extractedFile = new FileInfo(Path.CombineSafely(outDirectory.FullName, mod.FullPath));
extractedFile.Directory?.Create();
diff --git a/Penumbra/Import/Textures/AuxiliaryDeviceMode.cs b/Penumbra/Import/Textures/AuxiliaryDeviceMode.cs
new file mode 100644
index 000000000..95e4789c5
--- /dev/null
+++ b/Penumbra/Import/Textures/AuxiliaryDeviceMode.cs
@@ -0,0 +1,28 @@
+using Luna.Generators;
+
+namespace Penumbra.Import.Textures;
+
+/// Presented to the user as "Hardware Acceleration Mode for Texture Compression".
+[NamedEnum(Utf16: false)]
+[TooltipEnum]
+public enum AuxiliaryDeviceMode
+{
+ [Name("Ephemeral")]
+ [Tooltip("Create an ephemeral Direct3D device object per texture compression operation.")]
+ Transient,
+
+ [Name("Persistent")]
+ [Tooltip(
+ "Create a persistent Direct3D device object on the first texture compression operation and keep it until Penumbra is unloaded or when this setting is changed.")]
+ Singleton,
+
+ [Name("Use Main Game Device")]
+ [Tooltip(
+ "Do not create an auxiliary Direct3D device object, and use the game's main one instead.\nWill cause freezes while doing texture compression operations.\nPrefer the above options if possible.")]
+ Borrowed,
+
+ [Name("Disable Hardware Acceleration")]
+ [Tooltip(
+ "Do not create an auxiliary Direct3D device object, and use a software compression method instead.\nWill significantly slow down texture compression operations, and significantly degrade the output quality.\nONLY USE AS A LAST RESORT.")]
+ None,
+}
diff --git a/Penumbra/Import/Textures/SaveToDdsTexFileEffect.cs b/Penumbra/Import/Textures/SaveToDdsTexFileEffect.cs
new file mode 100644
index 000000000..bde3a7252
--- /dev/null
+++ b/Penumbra/Import/Textures/SaveToDdsTexFileEffect.cs
@@ -0,0 +1,70 @@
+using Dalamud.Plugin.Services;
+using Luna.DirectX;
+using OtterTex;
+
+namespace Penumbra.Import.Textures;
+
+/// An image processing effect that saves its input to a file.
+/// Dalamud's texture readback provider.
+/// The texture manager service.
+/// Whether to save as TEX.
+/// The path to save at.
+/// Which texture compression type to use.
+/// Whether to add mipmaps to the saved texture.
+public class SaveToDdsTexFileEffect(
+ ITextureReadbackProvider readbackProvider,
+ TextureManager textureManager,
+ bool asTex,
+ string path,
+ CombinedTexture.TextureSaveType textureSaveType = CombinedTexture.TextureSaveType.AsIs,
+ bool? mipMaps = null) : ScratchImageReadbackEffect(readbackProvider)
+{
+ /// Constructs a , inferring the format from the path's extension.
+ /// Dalamud's texture readback provider.
+ /// The texture manager service.
+ /// The path to save at.
+ /// Which texture compression type to use.
+ /// Whether to add mipmaps to the saved texture.
+ public SaveToDdsTexFileEffect(ITextureReadbackProvider readbackProvider, TextureManager textureManager, string path,
+ CombinedTexture.TextureSaveType textureSaveType = CombinedTexture.TextureSaveType.AsIs,
+ bool? mipMaps = null)
+ : this(readbackProvider, textureManager, IsTex(path), path, textureSaveType, mipMaps)
+ { }
+
+ ///
+ protected override async Task Run(ScratchImage scratch, CancellationToken cancellationToken)
+ {
+ var converted = textureSaveType switch
+ {
+ CombinedTexture.TextureSaveType.AsIs => mipMaps is { } mips ? TextureManager.AddMipMaps(scratch, mips) : scratch,
+ CombinedTexture.TextureSaveType.Bitmap => TextureManager.CreateUncompressed(scratch, mipMaps ?? false, cancellationToken),
+ CombinedTexture.TextureSaveType.BC1 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC1UNorm,
+ cancellationToken),
+ CombinedTexture.TextureSaveType.BC3 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC3UNorm,
+ cancellationToken),
+ CombinedTexture.TextureSaveType.BC4 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC4UNorm,
+ cancellationToken),
+ CombinedTexture.TextureSaveType.BC5 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC5UNorm,
+ cancellationToken),
+ CombinedTexture.TextureSaveType.BC7 => await textureManager.CreateCompressedAsync(scratch, mipMaps ?? false, DXGIFormat.BC7UNorm,
+ cancellationToken),
+ _ => throw new Exception("Wrong save type."),
+ };
+
+ try
+ {
+ if (asTex)
+ TextureManager.SaveTex(path, converted);
+ else
+ converted.SaveDDS(path);
+ }
+ finally
+ {
+ if (converted != scratch)
+ converted.Dispose();
+ }
+ }
+
+ private static bool IsTex(string? path)
+ => Path.GetExtension(path)?.ToLowerInvariant() is ".tex" or ".atex";
+}
diff --git a/Penumbra/Import/Textures/SaveToScratchImageEffect.cs b/Penumbra/Import/Textures/SaveToScratchImageEffect.cs
new file mode 100644
index 000000000..d751d50aa
--- /dev/null
+++ b/Penumbra/Import/Textures/SaveToScratchImageEffect.cs
@@ -0,0 +1,63 @@
+using Dalamud.Interface.Textures.TextureWraps;
+using Dalamud.Plugin.Services;
+using ImSharp;
+using Luna.DirectX;
+using OtterTex;
+using Penumbra.Util;
+
+namespace Penumbra.Import.Textures;
+
+/// An image processing effect that saves its input to a .
+/// Dalamud's texture readback provider.
+///
+public abstract class SaveToScratchImageEffect(ITextureReadbackProvider readbackProvider) : WrapEffectBase, IDisposable
+{
+ private ScratchImage? _scratch;
+
+ /// The last run's image.
+ public ScratchImage? ScratchImage
+ => _scratch;
+
+ ///
+ public override int Count
+ => 0;
+
+ ///
+ public override ImTextureId this[int index]
+ => throw new NotSupportedException();
+
+ ~SaveToScratchImageEffect()
+ => Dispose(false);
+
+ /// Gets the last run's image, transferring its ownership to the caller.
+ public ScratchImage? DetachScratchImage()
+ {
+ var scratch = _scratch;
+ _scratch = null;
+ return scratch;
+ }
+
+ ///
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ /// Releases the resources used by this object.
+ /// True if called explicitly, false if garbage collected.
+ protected virtual void Dispose(bool disposing)
+ {
+ _scratch?.Dispose();
+ _scratch = null;
+ }
+
+ ///
+ protected override async Task Run(IDalamudTextureWrap wrap, CancellationToken cancellationToken)
+ {
+ var scratch = await readbackProvider.GetScratchImageAsync(wrap, true, cancellationToken)
+ .ConfigureAwait(false);
+ _scratch?.Dispose();
+ _scratch = scratch;
+ }
+}
diff --git a/Penumbra/Import/Textures/ScratchImageReadbackEffect.cs b/Penumbra/Import/Textures/ScratchImageReadbackEffect.cs
new file mode 100644
index 000000000..9a12f44a0
--- /dev/null
+++ b/Penumbra/Import/Textures/ScratchImageReadbackEffect.cs
@@ -0,0 +1,37 @@
+using Dalamud.Interface.Textures.TextureWraps;
+using Dalamud.Plugin.Services;
+using ImSharp;
+using Luna.DirectX;
+using OtterTex;
+using Penumbra.Util;
+
+namespace Penumbra.Import.Textures;
+
+/// Base class for effects that retrieve the pixel data as a and process it on the CPU side.
+/// Dalamud's texture readback provider.
+///
+public abstract class ScratchImageReadbackEffect(ITextureReadbackProvider readbackProvider) : WrapEffectBase
+{
+ ///
+ public override int Count
+ => 0;
+
+ ///
+ public override ImTextureId this[int index]
+ => throw new NotSupportedException();
+
+ ///
+ protected override async Task Run(IDalamudTextureWrap wrap, CancellationToken cancellationToken)
+ {
+ using var scratch = await readbackProvider.GetScratchImageAsync(wrap, true, cancellationToken)
+ .ConfigureAwait(false);
+ cancellationToken.ThrowIfCancellationRequested();
+ await Run(scratch, cancellationToken).ConfigureAwait(false);
+ }
+
+ /// Runs this effect.
+ /// The input texture.
+ /// A cancellation token.
+ /// A task that represents this effect running.
+ protected abstract Task Run(ScratchImage scratch, CancellationToken cancellationToken);
+}
diff --git a/Penumbra/Import/Textures/TexFileParser.cs b/Penumbra/Import/Textures/TexFileParser.cs
index f1338c9eb..22145d93d 100644
--- a/Penumbra/Import/Textures/TexFileParser.cs
+++ b/Penumbra/Import/Textures/TexFileParser.cs
@@ -247,9 +247,9 @@ public static TexFile.TextureFormat ToTexFormat(this DXGIFormat format)
DXGIFormat.BC1UNorm => TexFile.TextureFormat.BC1,
DXGIFormat.BC2UNorm => TexFile.TextureFormat.BC2,
DXGIFormat.BC3UNorm => TexFile.TextureFormat.BC3,
- DXGIFormat.BC4UNorm => (TexFile.TextureFormat)0x6120, // TODO: upstream to Lumina
+ DXGIFormat.BC4UNorm => TexFile.TextureFormat.BC4,
DXGIFormat.BC5UNorm => TexFile.TextureFormat.BC5,
- DXGIFormat.BC6HSF16 => (TexFile.TextureFormat)0x6330, // TODO: upstream to Lumina
+ DXGIFormat.BC6HSF16 => TexFile.TextureFormat.BC6H,
DXGIFormat.BC7UNorm => TexFile.TextureFormat.BC7,
DXGIFormat.R16G16B16A16Typeless => TexFile.TextureFormat.D16,
DXGIFormat.R24G8Typeless => TexFile.TextureFormat.D24S8,
@@ -274,9 +274,9 @@ public static DXGIFormat ToDXGI(this TexFile.TextureFormat format)
TexFile.TextureFormat.BC1 => DXGIFormat.BC1UNorm,
TexFile.TextureFormat.BC2 => DXGIFormat.BC2UNorm,
TexFile.TextureFormat.BC3 => DXGIFormat.BC3UNorm,
- (TexFile.TextureFormat)0x6120 => DXGIFormat.BC4UNorm, // TODO: upstream to Lumina
+ TexFile.TextureFormat.BC4 => DXGIFormat.BC4UNorm,
TexFile.TextureFormat.BC5 => DXGIFormat.BC5UNorm,
- (TexFile.TextureFormat)0x6330 => DXGIFormat.BC6HSF16, // TODO: upstream to Lumina
+ TexFile.TextureFormat.BC6H => DXGIFormat.BC6HSF16,
TexFile.TextureFormat.BC7 => DXGIFormat.BC7UNorm,
TexFile.TextureFormat.D16 => DXGIFormat.R16G16B16A16Typeless,
TexFile.TextureFormat.D24S8 => DXGIFormat.R24G8Typeless,
diff --git a/Penumbra/Import/Textures/TextureManager.cs b/Penumbra/Import/Textures/TextureManager.cs
index ce66922df..1e42688f4 100644
--- a/Penumbra/Import/Textures/TextureManager.cs
+++ b/Penumbra/Import/Textures/TextureManager.cs
@@ -2,15 +2,23 @@
using Dalamud.Interface.Textures;
using Dalamud.Interface.Textures.TextureWraps;
using Dalamud.Plugin.Services;
+using ImSharp;
using Lumina.Data.Files;
using Luna;
+using Luna.DirectX;
using OtterTex;
using TerraFX.Interop.DirectX;
using TerraFX.Interop.Windows;
namespace Penumbra.Import.Textures;
-public sealed class TextureManager(IDataManager gameData, LunaLogger logger, ITextureProvider textureProvider, IUiBuilder uiBuilder)
+public sealed class TextureManager(
+ IDataManager gameData,
+ LunaLogger logger,
+ ITextureProvider textureProvider,
+ IUiBuilder uiBuilder,
+ IFramework framework,
+ Configuration configuration)
: SingleTaskQueue, IDisposable, IService
{
private readonly LunaLogger _logger = logger;
@@ -19,6 +27,8 @@ public sealed class TextureManager(IDataManager gameData, LunaLogger logger, ITe
private readonly ConcurrentDictionary _tasks = new();
private bool _disposed;
+ private ComPtr _auxDevice;
+
public IReadOnlyDictionary Tasks
=> _tasks;
@@ -28,6 +38,11 @@ public void Dispose()
foreach (var (_, cancel) in _tasks.Values.ToArray())
cancel.Cancel();
_tasks.Clear();
+ if (_auxDevice.Valid)
+ {
+ _auxDevice.Dispose();
+ configuration.AuxiliaryDeviceModeChanged -= OnAuxiliaryDeviceModeChanged;
+ }
}
public Task SavePng(string input, string output)
@@ -69,6 +84,9 @@ public Task SaveAs(CombinedTexture.TextureSaveType type, bool mipMaps, bool asTe
int width = 0, int height = 0)
=> Enqueue(new SaveAsAction(this, type, mipMaps, asTex, image, output, rgba, width, height));
+ public Task RunEffectGraph(EffectGraph graph)
+ => Enqueue(new RunEffectGraphAction(graph, framework));
+
private Task Enqueue(IAction action)
{
if (_disposed)
@@ -305,6 +323,17 @@ public override int GetHashCode()
=> HashCode.Combine(_outputPath?.ToLowerInvariant(), _outputStream, _type, _mipMaps, _asTex, _input);
}
+ private sealed class RunEffectGraphAction(EffectGraph graph, IFramework framework) : IAction
+ {
+ private readonly EffectGraph _graph = graph;
+
+ public bool Equals(IAction? other)
+ => other is RunEffectGraphAction rhs && _graph == rhs._graph;
+
+ public void Execute(CancellationToken token)
+ => _graph.Run(framework, token).Wait(token);
+ }
+
/// Load a texture wrap for a given image.
public IDalamudTextureWrap LoadTextureWrap(BaseImage image, byte[]? rgba = null, int width = 0, int height = 0)
{
@@ -476,8 +505,56 @@ public static ScratchImage CreateUncompressed(ScratchImage input, bool mipMaps,
return AddMipMaps(input, mipMaps);
}
+ private void OnAuxiliaryDeviceModeChanged(AuxiliaryDeviceMode newMode, AuxiliaryDeviceMode oldMode)
+ {
+ if (_auxDevice.Valid && newMode is not AuxiliaryDeviceMode.Singleton)
+ {
+ _auxDevice.Dispose();
+ configuration.AuxiliaryDeviceModeChanged -= OnAuxiliaryDeviceModeChanged;
+ }
+ }
+
+ private unsafe ComPtr GetAuxiliaryDevice()
+ {
+ switch (configuration.AuxiliaryDeviceMode)
+ {
+ case AuxiliaryDeviceMode.Transient:
+ var clone = new ComPtr();
+ CloneDevice((ID3D11Device*)uiBuilder.DeviceHandle, clone.GetAddressOf());
+ return clone;
+ case AuxiliaryDeviceMode.Singleton:
+ if (!_auxDevice.Valid)
+ {
+ configuration.AuxiliaryDeviceModeChanged += OnAuxiliaryDeviceModeChanged;
+ CloneDevice((ID3D11Device*)uiBuilder.DeviceHandle, _auxDevice.GetAddressOf());
+ }
+
+ return new ComPtr(_auxDevice);
+ case AuxiliaryDeviceMode.Borrowed: return new ComPtr((ID3D11Device*)uiBuilder.DeviceHandle);
+ default: return default;
+ }
+ }
+
+ private unsafe bool CanUseAuxiliaryDeviceImmediately()
+ => configuration.AuxiliaryDeviceMode is not AuxiliaryDeviceMode.Borrowed
+ || framework.IsInFrameworkUpdateThread && Im.Context.Pointer->WithinFrameScope;
+
+ private static unsafe void CloneDevice(ID3D11Device* device, ID3D11Device** clone)
+ {
+ using var adapter = new ComPtr();
+ using (var dxgiDevice = new ComPtr())
+ {
+ Marshal.ThrowExceptionForHR(DxUtility.NonOwningComPtr(device).As(&dxgiDevice));
+ Marshal.ThrowExceptionForHR(dxgiDevice.Get()->GetAdapter(adapter.GetAddressOf()));
+ }
+
+ var featureLevel = device->GetFeatureLevel();
+ Marshal.ThrowExceptionForHR(DirectX.D3D11CreateDevice(adapter, D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_UNKNOWN, HMODULE.NULL,
+ device->GetCreationFlags(), &featureLevel, 1, D3D11.D3D11_SDK_VERSION, clone, null, null));
+ }
+
/// Create a BC3 or BC7 block-compressed .dds from the input (optionally with mipmaps). Returns input (+ mipmaps) if it is already the correct format.
- public unsafe ScratchImage CreateCompressed(ScratchImage input, bool mipMaps, DXGIFormat format, CancellationToken cancel)
+ public ScratchImage CreateCompressed(ScratchImage input, bool mipMaps, DXGIFormat format, CancellationToken cancel)
{
if (input.Meta.Format == format)
return input;
@@ -493,61 +570,79 @@ public unsafe ScratchImage CreateCompressed(ScratchImage input, bool mipMaps, DX
// See https://github.com/microsoft/DirectXTex/wiki/Compress#parameters for the format condition.
if (format is DXGIFormat.BC6HUF16 or DXGIFormat.BC6HSF16 or DXGIFormat.BC7UNorm or DXGIFormat.BC7UNormSRGB)
{
- ref var device = ref *(ID3D11Device*)uiBuilder.DeviceHandle;
- IDXGIDevice* dxgiDevice;
- Marshal.ThrowExceptionForHR(device.QueryInterface(TerraFX.Interop.Windows.Windows.__uuidof(), (void**)&dxgiDevice));
+ var immediate = CanUseAuxiliaryDeviceImmediately();
+ if (!immediate && framework.IsInFrameworkUpdateThread)
+ throw new InvalidOperationException("TextureManager's auxiliary Direct3D device is not ready");
+ using var auxDevice = GetAuxiliaryDevice();
+ if (auxDevice.Valid)
+ {
+ return immediate
+ ? Compress(input, auxDevice, format, CompressFlags.Parallel)
+ : CompressAsync(input, auxDevice, format, CompressFlags.Parallel).Result;
+ }
+ }
+ return input.Compress(format, CompressFlags.BC7Quick | CompressFlags.Parallel);
+ }
+
+ public Task CreateCompressedAsync(ScratchImage input, bool mipMaps, DXGIFormat format, CancellationToken cancel)
+ {
+ if (input.Meta.Format == format)
+ return Task.FromResult(input);
+
+ if (input.Meta.Format.IsCompressed())
+ {
+ input = input.Decompress(DXGIFormat.B8G8R8A8UNorm);
+ cancel.ThrowIfCancellationRequested();
+ }
+
+ input = AddMipMaps(input, mipMaps);
+ cancel.ThrowIfCancellationRequested();
+ // See https://github.com/microsoft/DirectXTex/wiki/Compress#parameters for the format condition.
+ if (format is DXGIFormat.BC6HUF16 or DXGIFormat.BC6HSF16 or DXGIFormat.BC7UNorm or DXGIFormat.BC7UNormSRGB)
+ {
+ using var auxDevice = GetAuxiliaryDevice();
+ if (auxDevice.Valid)
+ {
+ return CanUseAuxiliaryDeviceImmediately()
+ ? Task.FromResult(Compress(input, auxDevice, format, CompressFlags.Parallel))
+ : CompressAsync(input, auxDevice, format, CompressFlags.Parallel);
+ }
+ }
+
+ return Task.FromResult(input.Compress(format, CompressFlags.BC7Quick | CompressFlags.Parallel));
+ }
+
+ private static unsafe ScratchImage Compress(ScratchImage input, ComPtr device, DXGIFormat format,
+ CompressFlags compressFlags = CompressFlags.Default, float alphaWeight = 1.0f)
+ => input.Compress((nint)device.Get(), format, compressFlags, alphaWeight);
+
+ private Task CompressAsync(ScratchImage input, ComPtr device, DXGIFormat format,
+ CompressFlags compressFlags = CompressFlags.Default, float alphaWeight = 1.0f)
+ {
+ var deviceAsync = new ComPtr(device);
+ var tcs = new TaskCompletionSource();
+ Action action = null!;
+
+ action = () =>
+ {
+ uiBuilder.Draw -= action;
try
{
- IDXGIAdapter* adapter = null;
- Marshal.ThrowExceptionForHR(dxgiDevice->GetAdapter(&adapter));
- try
- {
- dxgiDevice->Release();
- dxgiDevice = null;
-
- ID3D11Device* deviceClone = null;
- ID3D11DeviceContext* contextClone = null;
- var featureLevel = device.GetFeatureLevel();
- Marshal.ThrowExceptionForHR(DirectX.D3D11CreateDevice(
- adapter,
- D3D_DRIVER_TYPE.D3D_DRIVER_TYPE_UNKNOWN,
- HMODULE.NULL,
- device.GetCreationFlags(),
- &featureLevel,
- 1,
- D3D11.D3D11_SDK_VERSION,
- &deviceClone,
- null,
- &contextClone));
- try
- {
- adapter->Release();
- adapter = null;
- return input.Compress((nint)deviceClone, format, CompressFlags.Parallel);
- }
- finally
- {
- if (contextClone is not null)
- contextClone->Release();
- if (deviceClone is not null)
- deviceClone->Release();
- }
- }
- finally
- {
- if (adapter is not null)
- adapter->Release();
- }
+ tcs.SetResult(Compress(input, deviceAsync, format, compressFlags, alphaWeight));
+ }
+ catch (Exception e)
+ {
+ tcs.SetException(e);
}
finally
{
- if (dxgiDevice is not null)
- dxgiDevice->Release();
+ deviceAsync.Dispose();
}
- }
+ };
- return input.Compress(format, CompressFlags.BC7Quick | CompressFlags.Parallel);
+ uiBuilder.Draw += action;
+ return tcs.Task;
}
diff --git a/Penumbra/Interop/Hooks/PostProcessing/PreBoneDeformerReplacer.cs b/Penumbra/Interop/Hooks/PostProcessing/PreBoneDeformerReplacer.cs
index 970a8fd90..6f6a96b14 100644
--- a/Penumbra/Interop/Hooks/PostProcessing/PreBoneDeformerReplacer.cs
+++ b/Penumbra/Interop/Hooks/PostProcessing/PreBoneDeformerReplacer.cs
@@ -2,10 +2,10 @@
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using FFXIVClientStructs.FFXIV.Client.System.Resource;
+using Luna;
using Penumbra.Api.Enums;
using Penumbra.Interop.Hooks.ResourceLoading;
using Penumbra.Interop.PathResolving;
-using Penumbra.Interop.SafeHandles;
using Penumbra.String;
using Penumbra.String.Classes;
using CharacterUtility = Penumbra.Interop.Services.CharacterUtility;
@@ -62,7 +62,7 @@ private void SetupHssReplacements(CharacterBase* drawObject, uint slotIndex, Spa
if (!_framework.IsInFrameworkUpdateThread)
Penumbra.Log.Warning(
$"{nameof(PreBoneDeformerReplacer)}.{nameof(SetupHssReplacements)}(0x{(nint)drawObject:X}, {slotIndex}) called out of framework thread");
-
+
var preBoneDeformer = GetPreBoneDeformerForCharacter(drawObject);
try
{
diff --git a/Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs b/Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs
index e724ebc74..d27fc5b6b 100644
--- a/Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs
+++ b/Penumbra/Interop/Hooks/ResourceLoading/ResourceLoader.cs
@@ -1,9 +1,9 @@
using FFXIVClientStructs.FFXIV.Client.System.Resource;
+using Luna;
using Penumbra.Api.Enums;
using Penumbra.Collections;
using Penumbra.Interop.Hooks.Resources;
using Penumbra.Interop.PathResolving;
-using Penumbra.Interop.SafeHandles;
using Penumbra.Interop.Structs;
using Penumbra.String;
using Penumbra.String.Classes;
diff --git a/Penumbra/Interop/Hooks/ResourceLoading/ResourceService.cs b/Penumbra/Interop/Hooks/ResourceLoading/ResourceService.cs
index 1700b980a..df5b87a91 100644
--- a/Penumbra/Interop/Hooks/ResourceLoading/ResourceService.cs
+++ b/Penumbra/Interop/Hooks/ResourceLoading/ResourceService.cs
@@ -2,9 +2,9 @@
using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.System.Resource;
+using Luna;
using Penumbra.Api.Enums;
using Penumbra.GameData;
-using Penumbra.Interop.SafeHandles;
using Penumbra.Interop.Structs;
using Penumbra.String;
using Penumbra.String.Classes;
diff --git a/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs b/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs
index bec0831af..2420e2b08 100644
--- a/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs
+++ b/Penumbra/Interop/MaterialPreview/LiveColorTablePreviewer.cs
@@ -1,8 +1,8 @@
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
+using Luna;
using Penumbra.GameData.Interop;
-using Penumbra.Interop.SafeHandles;
namespace Penumbra.Interop.MaterialPreview;
@@ -34,9 +34,9 @@ public LiveColorTablePreviewer(ObjectManager objects, IFramework framework, Mate
throw new InvalidOperationException("Draw object doesn't have color table textures");
_colorTableTexture = colorSetTextures + (MaterialInfo.ModelSlot * CharacterBase.MaterialsPerSlot + MaterialInfo.MaterialSlot);
-
- _originalColorTableTexture = new SafeTextureHandle(*_colorTableTexture, true);
+
+ _originalColorTableTexture = new SafeTextureHandle(*_colorTableTexture);
if (_originalColorTableTexture.Texture == null)
throw new InvalidOperationException("Material doesn't have a color table");
diff --git a/Penumbra/Interop/MaterialPreview/MaterialInfo.cs b/Penumbra/Interop/MaterialPreview/MaterialInfo.cs
index 13f6aaccc..4c44ed412 100644
--- a/Penumbra/Interop/MaterialPreview/MaterialInfo.cs
+++ b/Penumbra/Interop/MaterialPreview/MaterialInfo.cs
@@ -107,7 +107,7 @@ private static unsafe Model GetDrawObject(DrawObjectType type, Actor address)
DrawObjectType.Character => address.Model,
DrawObjectType.Mainhand => address.AsCharacter->DrawData.Weapon(DrawDataContainer.WeaponSlot.MainHand).DrawObject,
DrawObjectType.Offhand => address.AsCharacter->DrawData.Weapon(DrawDataContainer.WeaponSlot.OffHand).DrawObject,
- DrawObjectType.Vfx => address.AsCharacter->DrawData.Weapon(DrawDataContainer.WeaponSlot.Unk).DrawObject,
+ DrawObjectType.Vfx => address.AsCharacter->DrawData.Weapon(DrawDataContainer.WeaponSlot.System).DrawObject,
_ => Model.Null,
};
}
diff --git a/Penumbra/Interop/PathResolving/CollectionResolver.cs b/Penumbra/Interop/PathResolving/CollectionResolver.cs
index 5d7350697..ed80bde78 100644
--- a/Penumbra/Interop/PathResolving/CollectionResolver.cs
+++ b/Penumbra/Interop/PathResolving/CollectionResolver.cs
@@ -36,14 +36,14 @@ public sealed unsafe class CollectionResolver(
///
public ModCollection PlayerCollection()
{
- var gameObject = objects[0];
+ var gameObject = objects[0];
if (!gameObject.Valid)
return collectionManager.Active.ByType(CollectionType.Yourself)
?? collectionManager.Active.Default;
var player = actors.GetCurrentPlayer();
var _ = false;
- return CollectionByIdentifier(player)
+ return CollectionByIdentifier(player, false)
?? CheckYourself(player, gameObject)
?? CollectionByAttributes(gameObject, ref _)
?? collectionManager.Active.Default;
@@ -52,7 +52,7 @@ public ModCollection PlayerCollection()
/// Identify the correct collection for a game object.
public ResolveData IdentifyCollection(GameObject* gameObject, bool useCache)
{
- if (gameObject == null)
+ if (gameObject is null)
return collectionManager.Active.Default.ToResolveData();
try
@@ -107,7 +107,7 @@ private bool LoginScreen(GameObject* gameObject, out ResolveData ret)
{
// Also check for empty names because sometimes named other characters
// might be loaded before being officially logged in.
- if (clientState.IsLoggedIn || gameObject->Name[0] != '\0')
+ if (clientState.IsLoggedIn || gameObject->Name[0] is not (byte)'\0')
{
ret = ResolveData.Invalid;
return false;
@@ -122,7 +122,7 @@ private bool LoginScreen(GameObject* gameObject, out ResolveData ret)
var notYetReady = false;
var lobby = AgentLobby.Instance();
var characterList = CharaSelectCharacterList.Instance();
- if (lobby != null && characterList != null)
+ if (lobby is not null && characterList is not null)
{
// The lobby uses the first 8 cutscene actors.
var idx = gameObject->ObjectIndex - ObjectIndex.CutsceneStart.Index;
@@ -133,7 +133,7 @@ private bool LoginScreen(GameObject* gameObject, out ResolveData ret)
var identifier = actors.CreatePlayer(new ByteString(item->Name), item->HomeWorldId);
Penumbra.Log.Excessive(
$"Identified {identifier.Incognito(null)} in cutscene for actor {idx + 200} at 0x{(ulong)gameObject:X} of race {(gameObject->IsCharacter() ? ((Character*)gameObject)->DrawData.CustomizeData.Race.ToString() : "Unknown")}.");
- if (identifier.IsValid && CollectionByIdentifier(identifier) is { } coll)
+ if (identifier.IsValid && CollectionByIdentifier(identifier, false) is { } coll)
{
// Do not add this to caches because game objects are reused for different draw objects.
ret = coll.ToResolveData(gameObject);
@@ -166,7 +166,7 @@ private bool Aesthetician(GameObject* gameObject, out ResolveData ret)
var player = actors.GetCurrentPlayer();
var notYetReady = false;
- var collection = (player.IsValid ? CollectionByIdentifier(player) : null)
+ var collection = (player.IsValid ? CollectionByIdentifier(player, false) : null)
?? collectionManager.Active.ByType(CollectionType.Yourself)
?? CollectionByAttributes(gameObject, ref notYetReady)
?? collectionManager.Active.Default;
@@ -189,31 +189,32 @@ private ResolveData DefaultState(GameObject* gameObject)
}
var notYetReady = false;
- var collection = CollectionByIdentifier(identifier)
+ var hostile = ((Actor)gameObject).IsHostile;
+ var collection = CollectionByIdentifier(identifier, hostile)
?? CheckYourself(identifier, gameObject)
?? CollectionByAttributes(gameObject, ref notYetReady)
- ?? CheckOwnedCollection(identifier, owner, ref notYetReady)
+ ?? CheckOwnedCollection(identifier, owner, ref notYetReady, hostile)
?? collectionManager.Active.Default;
return notYetReady ? collection.ToResolveData(gameObject) : cache.Set(collection, identifier, gameObject);
}
/// Check both temporary and permanent character collections. Temporary first.
- private ModCollection? CollectionByIdentifier(ActorIdentifier identifier)
+ private ModCollection? CollectionByIdentifier(ActorIdentifier identifier, bool hostile)
{
- if (tempCollections.Collections.TryGetCollection(identifier, out var collection))
+ if (tempCollections.Collections.TryGetCollection(identifier, out var collection, hostile))
return collection;
- // Always inherit ownership for temporary collections.
- if (identifier.Type is IdentifierType.Owned)
+ // Always inherit non-hostile ownership for temporary collections
+ if (identifier.Type is IdentifierType.Owned && !hostile)
{
var playerIdentifier = actors.CreateIndividualUnchecked(IdentifierType.Player, identifier.PlayerName,
identifier.HomeWorld.Id, ObjectKind.None, uint.MaxValue);
- if (tempCollections.Collections.TryGetCollection(playerIdentifier, out collection))
+ if (tempCollections.Collections.TryGetCollection(playerIdentifier, out collection, hostile))
return collection;
}
- if (collectionManager.Active.Individuals.TryGetCollection(identifier, out collection))
+ if (collectionManager.Active.Individuals.TryGetCollection(identifier, out collection, hostile))
return collection;
return null;
@@ -223,7 +224,7 @@ private ResolveData DefaultState(GameObject* gameObject)
private ModCollection? CheckYourself(ActorIdentifier identifier, Actor actor)
{
if (actor.Index == 0
- || cutscenes.GetParentIndex(actor.Index.Index) == 0
+ || cutscenes.GetParentIndex(actor.Index.Index) is 0
|| identifier.Equals(actors.GetCurrentPlayer()))
return collectionManager.Active.ByType(CollectionType.Yourself);
@@ -244,7 +245,7 @@ private ResolveData DefaultState(GameObject* gameObject)
if (!IsModelHuman((uint)actor.AsCharacter->ModelContainer.ModelCharaId))
return null;
- if (actor.Customize->Data[0] == 0)
+ if (actor.Customize->Data[0] is 0)
{
notYetReady = true;
return null;
@@ -271,9 +272,12 @@ private ResolveData DefaultState(GameObject* gameObject)
}
/// Get the collection applying to the owner if it is available.
- private ModCollection? CheckOwnedCollection(ActorIdentifier identifier, Actor owner, ref bool notYetReady)
+ private ModCollection? CheckOwnedCollection(ActorIdentifier identifier, Actor owner, ref bool notYetReady, bool hostile)
{
- if (identifier.Type != IdentifierType.Owned || !config.UseOwnerNameForCharacterCollection || !owner.Valid)
+ if (identifier.Type is not IdentifierType.Owned
+ || !config.UseOwnerNameForCharacterCollection
+ || hostile && !config.UseOwnerForHostiles
+ || !owner.Valid)
return null;
var id = actors.CreateIndividualUnchecked(IdentifierType.Player, identifier.PlayerName, identifier.HomeWorld.Id,
diff --git a/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs b/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs
index dfd27d77e..0ed4b1af0 100644
--- a/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs
+++ b/Penumbra/Interop/ResourceTree/ResolveContext.PathResolution.cs
@@ -95,7 +95,7 @@ private unsafe Utf8GamePath ResolveMaterialPath(Utf8GamePath modelPath, Resource
// Resolving a material path through the game's code can dereference null pointers for materials that involve IMC metadata.
return ModelType switch
{
- ModelType.Human when IsEquipmentOrAccessorySlot(SlotIndex) && mtrlFileName[8] != (byte)'b'
+ ModelType.Human when IsEquipmentOrAccessorySlot(SlotIndex) && (SlotIndex >= 5 || mtrlFileName[8] != (byte)'b')
=> ResolveEquipmentMaterialPath(modelPath, imc, mtrlFileName),
ModelType.DemiHuman => ResolveEquipmentMaterialPath(modelPath, imc, mtrlFileName),
ModelType.Weapon => ResolveWeaponMaterialPath(modelPath, imc, mtrlFileName),
diff --git a/Penumbra/Interop/SafeHandles/SafeResourceHandle.cs b/Penumbra/Interop/SafeHandles/SafeResourceHandle.cs
deleted file mode 100644
index a5e73867d..000000000
--- a/Penumbra/Interop/SafeHandles/SafeResourceHandle.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
-
-namespace Penumbra.Interop.SafeHandles;
-
-public unsafe class SafeResourceHandle : SafeHandle, ICloneable
-{
- public ResourceHandle* ResourceHandle
- => (ResourceHandle*)handle;
-
- public override bool IsInvalid
- => handle == 0;
-
- public SafeResourceHandle(ResourceHandle* handle, bool incRef, bool ownsHandle = true)
- : base(0, ownsHandle)
- {
- if (incRef && !ownsHandle)
- throw new ArgumentException("Non-owning SafeResourceHandle with IncRef is unsupported");
-
- if (incRef && handle != null)
- handle->IncRef();
- SetHandle((nint)handle);
- }
-
- public SafeResourceHandle Clone()
- => new(ResourceHandle, true);
-
- object ICloneable.Clone()
- => Clone();
-
- public static SafeResourceHandle CreateInvalid()
- => new(null, false);
-
- protected override bool ReleaseHandle()
- {
- var handle = Interlocked.Exchange(ref this.handle, 0);
- if (handle != 0)
- ((ResourceHandle*)handle)->DecRef();
-
- return true;
- }
-}
diff --git a/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs b/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs
deleted file mode 100644
index fd0208047..000000000
--- a/Penumbra/Interop/SafeHandles/SafeTextureHandle.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using FFXIVClientStructs.FFXIV.Client.Graphics.Kernel;
-
-namespace Penumbra.Interop.SafeHandles;
-
-public unsafe class SafeTextureHandle : SafeHandle
-{
- public Texture* Texture
- => (Texture*)handle;
-
- public override bool IsInvalid
- => handle == 0;
-
- public SafeTextureHandle(Texture* handle, bool incRef, bool ownsHandle = true)
- : base(0, ownsHandle)
- {
- if (incRef && !ownsHandle)
- throw new ArgumentException("Non-owning SafeTextureHandle with IncRef is unsupported");
-
- if (incRef && handle != null)
- handle->IncRef();
- SetHandle((nint)handle);
- }
-
- public void Exchange(ref nint ppTexture)
- {
- lock (this)
- {
- handle = Interlocked.Exchange(ref ppTexture, handle);
- }
- }
-
- public static SafeTextureHandle CreateInvalid()
- => new(null, false);
-
- protected override bool ReleaseHandle()
- {
- nint handle;
- lock (this)
- {
- handle = this.handle;
- this.handle = 0;
- }
-
- if (handle != 0)
- ((Texture*)handle)->DecRef();
-
- return true;
- }
-}
diff --git a/Penumbra/Interop/Services/CharacterUtility.cs b/Penumbra/Interop/Services/CharacterUtility.cs
index 26e47d296..b7c9d2322 100644
--- a/Penumbra/Interop/Services/CharacterUtility.cs
+++ b/Penumbra/Interop/Services/CharacterUtility.cs
@@ -157,5 +157,8 @@ public void ResetAll()
}
public void Dispose()
- => ResetAll();
+ {
+ _framework.Update -= LoadDefaultResources;
+ ResetAll();
+ }
}
diff --git a/Penumbra/Meta/Manipulations/AtchIdentifier.cs b/Penumbra/Meta/Manipulations/AtchIdentifier.cs
index 0cc4f7ab9..f275d03a4 100644
--- a/Penumbra/Meta/Manipulations/AtchIdentifier.cs
+++ b/Penumbra/Meta/Manipulations/AtchIdentifier.cs
@@ -1,3 +1,4 @@
+using ImSharp;
using Newtonsoft.Json.Linq;
using Penumbra.GameData.Data;
using Penumbra.GameData.Enums;
@@ -18,11 +19,11 @@ public ModelRace Race
public int CompareTo(AtchIdentifier other)
{
var typeComparison = Type.CompareTo(other.Type);
- if (typeComparison != 0)
+ if (typeComparison is not 0)
return typeComparison;
var genderRaceComparison = GenderRace.CompareTo(other.GenderRace);
- if (genderRaceComparison != 0)
+ if (genderRaceComparison is not 0)
return genderRaceComparison;
return EntryIndex.CompareTo(other.EntryIndex);
@@ -41,9 +42,12 @@ public MetaIndex FileIndex()
public bool Validate()
{
+ if (EntryIndex is ushort.MaxValue || GenderRace is GenderRace.Unknown || Type is AtchType.Unknown)
+ return false;
+
var race = (int)GenderRace / 100;
var remainder = (int)GenderRace - 100 * race;
- if (remainder != 1)
+ if (remainder is not 1)
return false;
return race is >= 0 and <= 18;
@@ -52,13 +56,23 @@ public bool Validate()
public JObject AddToJson(JObject jObj)
{
var (gender, race) = GenderRace.Split();
- jObj["Gender"] = gender.ToString();
- jObj["Race"] = race.ToString();
+ jObj["Gender"] = gender.String;
+ jObj["Race"] = race.String;
jObj["Type"] = Type.ToAbbreviation();
jObj["Index"] = EntryIndex;
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ var (gender, race) = GenderRace.Split();
+ j.WriteString("Gender"u8, gender.StringU8);
+ j.WriteString("Race"u8, race.StringU8);
+ j.WriteString("Type"u8, Type.ToAbbreviation());
+ j.WriteNumber("Index"u8, EntryIndex);
+ return j;
+ }
+
public static AtchIdentifier? FromJson(JObject jObj)
{
var gender = jObj["Gender"]?.ToObject() ?? Gender.Unknown;
diff --git a/Penumbra/Meta/Manipulations/AtrIdentifier.cs b/Penumbra/Meta/Manipulations/AtrIdentifier.cs
index fc8246e70..a55f31127 100644
--- a/Penumbra/Meta/Manipulations/AtrIdentifier.cs
+++ b/Penumbra/Meta/Manipulations/AtrIdentifier.cs
@@ -1,3 +1,4 @@
+using ImSharp;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Penumbra.Collections.Cache;
@@ -110,6 +111,18 @@ public JObject AddToJson(JObject jObj)
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ if (Slot is not HumanSlot.Unknown)
+ j.WriteString("Slot"u8, Slot.StringU8);
+ if (Id.HasValue)
+ j.WriteNumber("Id"u8, Id.Value.Id);
+ j.WriteString("Attribute"u8, Attribute.AsSpan);
+ if (GenderRaceCondition is not GenderRace.Unknown)
+ j.WriteNumber("GenderRaceCondition"u8, (uint)GenderRaceCondition);
+ return j;
+ }
+
public static AtrIdentifier? FromJson(JObject jObj)
{
var attribute = jObj["Attribute"]?.ToObject();
diff --git a/Penumbra/Meta/Manipulations/Eqdp.cs b/Penumbra/Meta/Manipulations/Eqdp.cs
index 250e589da..141292dea 100644
--- a/Penumbra/Meta/Manipulations/Eqdp.cs
+++ b/Penumbra/Meta/Manipulations/Eqdp.cs
@@ -1,3 +1,4 @@
+using ImSharp;
using Newtonsoft.Json.Linq;
using Penumbra.GameData.Data;
using Penumbra.GameData.Enums;
@@ -30,7 +31,7 @@ public bool Validate()
if (mask == 0)
return false;
- if (FileIndex() == (MetaIndex)(-1))
+ if (FileIndex() is (MetaIndex)(-1))
return false;
// No check for set id.
@@ -40,11 +41,11 @@ public bool Validate()
public int CompareTo(EqdpIdentifier other)
{
var gr = GenderRace.CompareTo(other.GenderRace);
- if (gr != 0)
+ if (gr is not 0)
return gr;
var set = SetId.Id.CompareTo(other.SetId.Id);
- if (set != 0)
+ if (set is not 0)
return set;
return Slot.CompareTo(other.Slot);
@@ -63,13 +64,23 @@ public int CompareTo(EqdpIdentifier other)
public JObject AddToJson(JObject jObj)
{
var (gender, race) = GenderRace.Split();
- jObj["Gender"] = gender.ToString();
- jObj["Race"] = race.ToString();
- jObj["SetId"] = SetId.Id.ToString();
- jObj["Slot"] = Slot.ToString();
+ jObj["Gender"] = gender.String;
+ jObj["Race"] = race.String;
+ jObj["SetId"] = SetId.Id;
+ jObj["Slot"] = Slot.String;
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ var (gender, race) = GenderRace.Split();
+ j.WriteString("Gender"u8, gender.StringU8);
+ j.WriteString("Race"u8, race.StringU8);
+ j.WriteNumber("SetId"u8, SetId.Id);
+ j.WriteString("Slot"u8, Slot.StringU8);
+ return j;
+ }
+
public MetaManipulationType Type
=> MetaManipulationType.Eqdp;
}
diff --git a/Penumbra/Meta/Manipulations/Eqp.cs b/Penumbra/Meta/Manipulations/Eqp.cs
index fc0181a23..5a01e69b2 100644
--- a/Penumbra/Meta/Manipulations/Eqp.cs
+++ b/Penumbra/Meta/Manipulations/Eqp.cs
@@ -1,3 +1,4 @@
+using ImSharp;
using Newtonsoft.Json.Linq;
using Penumbra.GameData.Data;
using Penumbra.GameData.Enums;
@@ -20,7 +21,7 @@ public override string ToString()
public bool Validate()
{
var mask = Eqp.Mask(Slot);
- if (mask == 0)
+ if (mask is 0)
return false;
// No check for set id.
@@ -30,7 +31,7 @@ public bool Validate()
public int CompareTo(EqpIdentifier other)
{
var set = SetId.Id.CompareTo(other.SetId.Id);
- if (set != 0)
+ if (set is not 0)
return set;
return Slot.CompareTo(other.Slot);
@@ -46,11 +47,18 @@ public int CompareTo(EqpIdentifier other)
public JObject AddToJson(JObject jObj)
{
- jObj["SetId"] = SetId.Id.ToString();
- jObj["Slot"] = Slot.ToString();
+ jObj["SetId"] = SetId.Id;
+ jObj["Slot"] = Slot.String;
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ j.WriteNumber("SetId"u8, SetId.Id);
+ j.WriteString("Slot"u8, Slot.StringU8);
+ return j;
+ }
+
public MetaManipulationType Type
=> MetaManipulationType.Eqp;
}
diff --git a/Penumbra/Meta/Manipulations/Est.cs b/Penumbra/Meta/Manipulations/Est.cs
index ff18f2113..ce17fbee4 100644
--- a/Penumbra/Meta/Manipulations/Est.cs
+++ b/Penumbra/Meta/Manipulations/Est.cs
@@ -1,3 +1,4 @@
+using ImSharp;
using Luna.Generators;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -92,13 +93,23 @@ public int CompareTo(EstIdentifier other)
public JObject AddToJson(JObject jObj)
{
var (gender, race) = GenderRace.Split();
- jObj["Gender"] = gender.ToString();
- jObj["Race"] = race.ToString();
- jObj["SetId"] = SetId.Id.ToString();
- jObj["Slot"] = Slot.ToString();
+ jObj["Gender"] = gender.String;
+ jObj["Race"] = race.String;
+ jObj["SetId"] = SetId.Id;
+ jObj["Slot"] = Slot.String;
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ var (gender, race) = GenderRace.Split();
+ j.WriteString("Gender"u8, gender.StringU8);
+ j.WriteString("Race"u8, race.StringU8);
+ j.WriteNumber("SetId"u8, SetId.Id);
+ j.WriteString("Slot"u8, Slot.StringU8);
+ return j;
+ }
+
public MetaManipulationType Type
=> MetaManipulationType.Est;
}
diff --git a/Penumbra/Meta/Manipulations/GlobalEqpManipulation.cs b/Penumbra/Meta/Manipulations/GlobalEqpManipulation.cs
index 57ff8aae9..dc31c9117 100644
--- a/Penumbra/Meta/Manipulations/GlobalEqpManipulation.cs
+++ b/Penumbra/Meta/Manipulations/GlobalEqpManipulation.cs
@@ -1,3 +1,5 @@
+using System.Text.Json;
+using ImSharp;
using Newtonsoft.Json.Linq;
using Penumbra.GameData.Data;
using Penumbra.GameData.Enums;
@@ -13,7 +15,7 @@ namespace Penumbra.Meta.Manipulations;
public bool Validate()
{
- if (!Enum.IsDefined(Type))
+ if (!Type.Defined)
return false;
if (Type.HasCondition())
@@ -25,10 +27,19 @@ public bool Validate()
public JObject AddToJson(JObject jObj)
{
jObj[nameof(Type)] = Type.ToString();
- jObj[nameof(Condition)] = Condition.Id;
+ if (Type.HasCondition() && Condition.Id is not 0)
+ jObj[nameof(Condition)] = Condition.Id;
return jObj;
}
+ public Utf8JsonWriter AddToJson(Utf8JsonWriter j)
+ {
+ j.WriteString("Type"u8, Type.StringU8);
+ if(Type.HasCondition() && Condition.Id is not 0)
+ j.WriteNumber("Condition"u8, Condition.Id);
+ return j;
+ }
+
public static GlobalEqpManipulation? FromJson(JObject? jObj)
{
if (jObj == null)
@@ -52,7 +63,7 @@ public bool Equals(GlobalEqpManipulation other)
public int CompareTo(GlobalEqpManipulation other)
{
var typeComp = Type.CompareTo(other);
- return typeComp != 0 ? typeComp : Condition.Id.CompareTo(other.Condition.Id);
+ return typeComp is not 0 ? typeComp : Condition.Id.CompareTo(other.Condition.Id);
}
public override bool Equals(object? obj)
diff --git a/Penumbra/Meta/Manipulations/Gmp.cs b/Penumbra/Meta/Manipulations/Gmp.cs
index 53c1bf7d4..461eecf53 100644
--- a/Penumbra/Meta/Manipulations/Gmp.cs
+++ b/Penumbra/Meta/Manipulations/Gmp.cs
@@ -33,10 +33,16 @@ public int CompareTo(GmpIdentifier other)
public JObject AddToJson(JObject jObj)
{
- jObj["SetId"] = SetId.Id.ToString();
+ jObj["SetId"] = SetId.Id;
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ j.WriteNumber("SetId"u8, SetId.Id);
+ return j;
+ }
+
public MetaManipulationType Type
=> MetaManipulationType.Gmp;
}
diff --git a/Penumbra/Meta/Manipulations/IMetaIdentifier.cs b/Penumbra/Meta/Manipulations/IMetaIdentifier.cs
index 450aead92..88eb83363 100644
--- a/Penumbra/Meta/Manipulations/IMetaIdentifier.cs
+++ b/Penumbra/Meta/Manipulations/IMetaIdentifier.cs
@@ -1,3 +1,4 @@
+using System.Text.Json;
using Newtonsoft.Json.Linq;
using Penumbra.GameData.Data;
using Penumbra.Interop.Structs;
@@ -28,6 +29,7 @@ public interface IMetaIdentifier
public bool Validate();
public JObject AddToJson(JObject jObj);
+ public Utf8JsonWriter AddToJson(Utf8JsonWriter j);
public MetaManipulationType Type { get; }
diff --git a/Penumbra/Meta/Manipulations/Imc.cs b/Penumbra/Meta/Manipulations/Imc.cs
index dbcd53478..744fa017d 100644
--- a/Penumbra/Meta/Manipulations/Imc.cs
+++ b/Penumbra/Meta/Manipulations/Imc.cs
@@ -1,3 +1,4 @@
+using ImSharp;
using Newtonsoft.Json.Linq;
using Penumbra.GameData.Data;
using Penumbra.GameData.Enums;
@@ -35,16 +36,16 @@ public void AddChangedItems(ObjectIdentification identifier, IDictionary GamePaths.Mdl.Equipment(PrimaryId, GenderRace.MidlanderMale, EquipSlot),
- ObjectType.Equipment => GamePaths.Mtrl.Equipment(PrimaryId, GenderRace.MidlanderMale, EquipSlot, Variant, "a"),
+ ObjectType.Equipment => GamePaths.Mtrl.Equipment(PrimaryId, GenderRace.MidlanderMale, EquipSlot, Variant, "a"),
ObjectType.Accessory when allVariants => GamePaths.Mdl.Accessory(PrimaryId, GenderRace.MidlanderMale, EquipSlot),
- ObjectType.Accessory => GamePaths.Mtrl.Accessory(PrimaryId, GenderRace.MidlanderMale, EquipSlot, Variant, "a"),
- ObjectType.Weapon => GamePaths.Mtrl.Weapon(PrimaryId, SecondaryId.Id, Variant, "a"),
+ ObjectType.Accessory => GamePaths.Mtrl.Accessory(PrimaryId, GenderRace.MidlanderMale, EquipSlot, Variant, "a"),
+ ObjectType.Weapon => GamePaths.Mtrl.Weapon(PrimaryId, SecondaryId.Id, Variant, "a"),
ObjectType.DemiHuman => GamePaths.Mtrl.DemiHuman(PrimaryId, SecondaryId.Id, EquipSlot, Variant,
"a"),
ObjectType.Monster => GamePaths.Mtrl.Monster(PrimaryId, SecondaryId.Id, Variant, "a"),
_ => string.Empty,
};
- if (path.Length == 0)
+ if (path.Length is 0)
return;
identifier.Identify(changedItems, path);
@@ -66,8 +67,8 @@ public string ToStringWithoutImc()
=> ObjectType switch
{
ObjectType.Equipment or ObjectType.Accessory => $"{PrimaryId} - {EquipSlot.ToName()} - {Variant}",
- ObjectType.DemiHuman => $"{PrimaryId} - DemiHuman - {SecondaryId} - {EquipSlot.ToName()} - {Variant}",
- _ => $"{PrimaryId} - {ObjectType.ToName()} - {SecondaryId} - {BodySlot} - {Variant}",
+ ObjectType.DemiHuman => $"{PrimaryId} - DemiHuman - {SecondaryId} - {EquipSlot.ToName()} - {Variant}",
+ _ => $"{PrimaryId} - {ObjectType.ToName()} - {SecondaryId} - {BodySlot} - {Variant}",
};
public bool Validate()
@@ -110,32 +111,32 @@ public bool Validate()
public int CompareTo(ImcIdentifier other)
{
var o = ObjectType.CompareTo(other.ObjectType);
- if (o != 0)
+ if (o is not 0)
return o;
var i = PrimaryId.Id.CompareTo(other.PrimaryId.Id);
- if (i != 0)
+ if (i is not 0)
return i;
if (ObjectType is ObjectType.Equipment or ObjectType.Accessory)
{
var e = EquipSlot.CompareTo(other.EquipSlot);
- return e != 0 ? e : Variant.Id.CompareTo(other.Variant.Id);
+ return e is not 0 ? e : Variant.Id.CompareTo(other.Variant.Id);
}
if (ObjectType is ObjectType.DemiHuman)
{
var e = EquipSlot.CompareTo(other.EquipSlot);
- if (e != 0)
+ if (e is not 0)
return e;
}
var s = SecondaryId.Id.CompareTo(other.SecondaryId.Id);
- if (s != 0)
+ if (s is not 0)
return s;
var b = BodySlot.CompareTo(other.BodySlot);
- return b != 0 ? b : Variant.Id.CompareTo(other.Variant.Id);
+ return b is not 0 ? b : Variant.Id.CompareTo(other.Variant.Id);
}
public static ImcIdentifier? FromJson(JObject? jObj)
@@ -182,15 +183,46 @@ public int CompareTo(ImcIdentifier other)
public JObject AddToJson(JObject jObj)
{
- jObj["ObjectType"] = ObjectType.ToString();
- jObj["PrimaryId"] = PrimaryId.Id;
- jObj["SecondaryId"] = SecondaryId.Id;
- jObj["Variant"] = Variant.Id;
- jObj["EquipSlot"] = EquipSlot.ToString();
- jObj["BodySlot"] = BodySlot.ToString();
+ jObj["ObjectType"] = ObjectType.String;
+ jObj["PrimaryId"] = PrimaryId.Id;
+ jObj["Variant"] = Variant.Id;
+ switch (ObjectType)
+ {
+ case ObjectType.Equipment or ObjectType.Accessory: jObj["EquipSlot"] = EquipSlot.String; break;
+ case ObjectType.Monster or ObjectType.Weapon:
+ jObj["SecondaryId"] = SecondaryId.Id;
+ jObj["BodySlot"] = BodySlot.String;
+ break;
+ case ObjectType.DemiHuman:
+ jObj["SecondaryId"] = SecondaryId.Id;
+ jObj["EquipSlot"] = EquipSlot.String;
+ break;
+ }
+
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ j.WriteString("ObjectType"u8, ObjectType.StringU8);
+ j.WriteNumber("PrimaryId"u8, PrimaryId.Id);
+ j.WriteNumber("Variant"u8, Variant.Id);
+ switch (ObjectType)
+ {
+ case ObjectType.Equipment or ObjectType.Accessory: j.WriteString("EquipSlot"u8, EquipSlot.StringU8); break;
+ case ObjectType.Monster or ObjectType.Weapon:
+ j.WriteNumber("SecondaryId"u8, SecondaryId.Id);
+ j.WriteString("BodySlot"u8, BodySlot.StringU8);
+ break;
+ case ObjectType.DemiHuman:
+ j.WriteNumber("SecondaryId"u8, SecondaryId.Id);
+ j.WriteString("EquipSlot"u8, EquipSlot.StringU8);
+ break;
+ }
+
+ return j;
+ }
+
public MetaManipulationType Type
=> MetaManipulationType.Imc;
}
diff --git a/Penumbra/Meta/Manipulations/Rsp.cs b/Penumbra/Meta/Manipulations/Rsp.cs
index 743eb9c9d..b4a3c4c82 100644
--- a/Penumbra/Meta/Manipulations/Rsp.cs
+++ b/Penumbra/Meta/Manipulations/Rsp.cs
@@ -1,3 +1,4 @@
+using ImSharp;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Penumbra.GameData.Data;
@@ -27,6 +28,13 @@ public JObject AddToJson(JObject jObj)
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ j.WriteString("SubRace"u8, SubRace.StringU8);
+ j.WriteString("Attribute"u8, Attribute.StringU8);
+ return j;
+ }
+
public static RspIdentifier? FromJson(JObject? jObj)
{
if (jObj == null)
@@ -38,6 +46,8 @@ public JObject AddToJson(JObject jObj)
return ret.Validate() ? ret : null;
}
+
+
public MetaManipulationType Type
=> MetaManipulationType.Rsp;
diff --git a/Penumbra/Meta/Manipulations/ShpIdentifier.cs b/Penumbra/Meta/Manipulations/ShpIdentifier.cs
index 6098f0b0e..e2c80aaea 100644
--- a/Penumbra/Meta/Manipulations/ShpIdentifier.cs
+++ b/Penumbra/Meta/Manipulations/ShpIdentifier.cs
@@ -1,3 +1,4 @@
+using ImSharp;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
@@ -106,13 +107,13 @@ public MetaIndex FileIndex()
public bool Validate()
{
- if (!Enum.IsDefined(Slot) || Slot is HumanSlot.UnkBonus)
+ if (!Slot.Defined || Slot is HumanSlot.UnkBonus)
return false;
if (!ShapeAttributeHashSet.GenderRaceIndices.ContainsKey(GenderRaceCondition))
return false;
- if (!Enum.IsDefined(ConnectorCondition))
+ if (!ConnectorCondition.Defined)
return false;
if (Slot is HumanSlot.Unknown && Id is not null)
@@ -142,7 +143,7 @@ public JObject AddToJson(JObject jObj)
if (Slot is not HumanSlot.Unknown)
jObj["Slot"] = Slot.ToString();
if (Id.HasValue)
- jObj["Id"] = Id.Value.Id.ToString();
+ jObj["Id"] = Id.Value.Id;
jObj["Shape"] = Shape.ToString();
if (ConnectorCondition is not ShapeConnectorCondition.None)
jObj["ConnectorCondition"] = ConnectorCondition.ToString();
@@ -151,6 +152,20 @@ public JObject AddToJson(JObject jObj)
return jObj;
}
+ public System.Text.Json.Utf8JsonWriter AddToJson(System.Text.Json.Utf8JsonWriter j)
+ {
+ if (Slot is not HumanSlot.Unknown)
+ j.WriteString("Slot"u8, Slot.StringU8);
+ if (Id.HasValue)
+ j.WriteNumber("Id"u8, Id.Value.Id);
+ j.WriteString("Shape"u8, Shape.AsSpan);
+ if (ConnectorCondition is not ShapeConnectorCondition.None)
+ j.WriteString("ConnectorCondition"u8, ConnectorCondition.StringU8);
+ if (GenderRaceCondition is not GenderRace.Unknown)
+ j.WriteNumber("GenderRaceCondition"u8, (uint)GenderRaceCondition);
+ return j;
+ }
+
public static ShpIdentifier? FromJson(JObject jObj)
{
var shape = jObj["Shape"]?.ToObject();
diff --git a/Penumbra/Mods/DebugUtilities.cs b/Penumbra/Mods/DebugUtilities.cs
new file mode 100644
index 000000000..42f0d4675
--- /dev/null
+++ b/Penumbra/Mods/DebugUtilities.cs
@@ -0,0 +1,249 @@
+using System.Text.Json;
+using Luna;
+using Penumbra.Files;
+using Penumbra.Mods.Groups;
+using Penumbra.Mods.Manager;
+using Penumbra.Mods.SubMods;
+using Penumbra.Util;
+using static Penumbra.Files.ModDeserialization;
+
+namespace Penumbra.Mods;
+
+public static class DebugUtilities
+{
+ public static void CompareModSerDeser(ModManager mods)
+ {
+ foreach (var mod in mods)
+ {
+ var testMod = new Mod(mod.ModPath);
+
+ try
+ {
+ ReloadMod(mods.DataEditor.SaveService, testMod);
+ var equal = CompareMod(mod, testMod, false);
+ if (!equal)
+ {
+ Penumbra.Log.Information($"[ModTest] Failure Failure {mod.Name}");
+ // Only for debugging purposes check again to step through on failures only.
+ equal = CompareMod(mod, testMod, false);
+ }
+ else
+ {
+ try
+ {
+ using var ms = new MemoryStream();
+ using (var j = new Utf8JsonWriter(ms, JsonFunctions.WriterOptions))
+ {
+ ModSerialization.WriteMod(j, mod);
+ }
+
+ var text = ms.ToArray();
+ var reader = new Utf8JsonReader(text);
+ var writtenMod = new Mod(mod.ModPath);
+ var context = new Context(writtenMod);
+ ModMetaData.Read(ref reader, "memory", context);
+ var writtenEqual = CompareMod(mod, writtenMod, false);
+ if (writtenEqual)
+ {
+ Penumbra.Log.Debug($"[ModTest] Success Success {mod.Name}");
+ }
+ else
+ {
+ Penumbra.Log.Information($"[ModTest] Success Failure {mod.Name}");
+ File.WriteAllBytes(Path.Combine(mod.ModPath.Parent!.FullName, mod.ModPath.Name + ".json"), text);
+ // Only for debugging purposes check again to step through on failures only.
+ writtenEqual = CompareMod(mod, writtenMod, false);
+ }
+ }
+ catch (Exception ex)
+ {
+ Penumbra.Log.Information($"[ModTest] Success Failure {mod.Name} {ex.GetType().Name}");
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ Penumbra.Log.Information($"[ModTest] Failure Failure {mod.Name} {ex.GetType().Name}");
+ }
+ }
+ }
+
+ /// Compare two mods for exact equality in all their parsed properties.
+ public static bool CompareMod(Mod lhs, Mod rhs, bool checkLocal)
+ {
+ // Meta
+ // Do not check StableIdentifier due to NewGuid().
+ if (lhs.Name != rhs.Name)
+ return false;
+ if (lhs.Author != rhs.Author)
+ return false;
+ if (lhs.Description != rhs.Description)
+ return false;
+ if (lhs.Version != rhs.Version)
+ return false;
+ if (lhs.Website != rhs.Website)
+ return false;
+ if (lhs.Image != rhs.Image)
+ return false;
+ if (!lhs.ModTags.SequenceEqual(rhs.ModTags))
+ return false;
+ if (!lhs.DefaultPreferredItems.SetEquals(rhs.DefaultPreferredItems))
+ return false;
+ if (lhs.RequiredFeatures != rhs.RequiredFeatures)
+ return false;
+
+ // Local
+ if (checkLocal)
+ {
+ if (lhs.Path.Folder != rhs.Path.Folder)
+ return false; // Skip node because duplication.
+ if (lhs.ImportDate != rhs.ImportDate)
+ return false;
+ if (lhs.LastConfigEdit != rhs.LastConfigEdit)
+ return false;
+ if (lhs.IgnoreLastConfig != rhs.IgnoreLastConfig)
+ return false;
+ if (!lhs.LocalTags.SequenceEqual(rhs.LocalTags))
+ return false;
+ if (lhs.Note != rhs.Note)
+ return false;
+ if (!lhs.PreferredChangedItems.SetEquals(rhs.PreferredChangedItems))
+ return false;
+ if (lhs.Favorite != rhs.Favorite)
+ return false;
+ }
+
+ // Data
+ if (!CheckContainer(lhs.Default, rhs.Default))
+ return false;
+
+ if (lhs.Groups.Count != rhs.Groups.Count)
+ return false;
+
+ foreach (var (lGroup, rGroup) in lhs.Groups.Zip(rhs.Groups))
+ {
+ if (!CheckGroup(lGroup, rGroup))
+ return false;
+ }
+
+ return true;
+ }
+
+ private static bool CheckSubObject(IModObject lhs, IModObject rhs)
+ {
+ // Skipped ID because of NewGuid().
+ if (lhs.Name != rhs.Name)
+ return false;
+ if (lhs.Description != rhs.Description)
+ return false;
+ if (lhs.Layout != rhs.Layout)
+ return false;
+ if (!EqualityComparer>.Default.Equals(lhs.Condition, rhs.Condition))
+ return false;
+
+ return true;
+ }
+
+ private static bool CheckGroup(IModGroup lGroup, IModGroup rGroup)
+ {
+ if (lGroup.Type != rGroup.Type)
+ return false;
+ if (!CheckSubObject(lGroup, rGroup))
+ return false;
+
+ if (lGroup.DefaultSettings != rGroup.DefaultSettings)
+ return false;
+ if (lGroup.Image != rGroup.Image)
+ return false;
+ if (lGroup.Page != rGroup.Page)
+ return false;
+ if (lGroup.Priority != rGroup.Priority)
+ return false;
+ if (lGroup.DefaultSettings != rGroup.DefaultSettings)
+ return false;
+ if (lGroup.ParentSetting != rGroup.ParentSetting)
+ return false;
+
+ if (lGroup is ImcModGroup l)
+ {
+ if (rGroup is not ImcModGroup r)
+ return false;
+
+ if (l.AllVariants != r.AllVariants)
+ return false;
+ if (l.CanBeDisabled != r.CanBeDisabled)
+ return false;
+ if (l.OnlyAttributes != r.OnlyAttributes)
+ return false;
+ if (!l.Identifier.Equals(r.Identifier))
+ return false;
+ if (!l.DefaultEntry.Equals(r.DefaultEntry))
+ return false;
+ }
+
+ if (lGroup.Options.Count != rGroup.Options.Count)
+ return false;
+ if (lGroup.DataContainers.Count != rGroup.DataContainers.Count)
+ return false;
+
+ foreach (var (lOption, rOption) in lGroup.Options.Zip(rGroup.Options))
+ {
+ if (!CheckOption(lOption, rOption))
+ return false;
+ }
+
+ foreach (var (lContainer, rContainer) in lGroup.DataContainers.Zip(rGroup.DataContainers))
+ {
+ if (!CheckContainer(lContainer, rContainer))
+ return false;
+ }
+
+ return true;
+ }
+
+ private static bool CheckOption(IModOption lhs, IModOption rhs)
+ {
+ if (!CheckSubObject(lhs, rhs))
+ return false;
+
+ switch (lhs, rhs)
+ {
+ case (MultiSubMod l, MultiSubMod r): return l.Priority == r.Priority;
+ case (ImcSubMod l, ImcSubMod r):
+ if (l.IsDisableSubMod != r.IsDisableSubMod)
+ return false;
+
+ return l.AttributeMask == r.AttributeMask;
+ }
+
+ return true;
+ }
+
+ private static bool CheckContainer(IModDataContainer lhs, IModDataContainer rhs)
+ {
+ if (!lhs.Files.SetEquals(rhs.Files))
+ {
+ foreach (var key in rhs.Files.Keys)
+ {
+ if (!lhs.Files.TryGetValue(key, out var path))
+ return false;
+ }
+ return false;
+ }
+
+ if (!lhs.FileSwaps.SetEquals(rhs.FileSwaps))
+ return false;
+ if (!lhs.Manipulations.Equals(rhs.Manipulations))
+ return false;
+
+ if (lhs is CombinedDataContainer l)
+ {
+ if (rhs is not CombinedDataContainer r)
+ return false;
+
+ return l.Name == r.Name;
+ }
+
+ return true;
+ }
+}
diff --git a/Penumbra/Mods/Editor/ModMerger.cs b/Penumbra/Mods/Editor/ModMerger.cs
index 1b5f10343..67cb472cd 100644
--- a/Penumbra/Mods/Editor/ModMerger.cs
+++ b/Penumbra/Mods/Editor/ModMerger.cs
@@ -95,14 +95,14 @@ private void MergeWithOptions()
case GroupType.Single:
case GroupType.Multi:
{
- var (group, groupIdx, groupCreated) = _groupEditor.FindOrAddModGroup(MergeToMod!, originalGroup.Type, originalGroup.Name);
+ var (group, groupCreated) = _groupEditor.FindOrAddModGroup(MergeToMod!, originalGroup.Type, originalGroup.Name);
if (group is null)
throw new Exception(
$"The merged group {originalGroup.Name} already existed, but had a different type than the original group of type {originalGroup.Type}.");
if (groupCreated)
{
- _createdGroups.Add(groupIdx);
+ _createdGroups.Add(group.Index);
group.Description = originalGroup.Description;
group.Image = originalGroup.Image;
group.DefaultSettings = originalGroup.DefaultSettings;
@@ -112,7 +112,7 @@ private void MergeWithOptions()
foreach (var originalOption in originalGroup.Options)
{
- var (option, _, optionCreated) = _groupEditor.FindOrAddOption(group, originalOption.Name);
+ var (option, optionCreated) = _groupEditor.FindOrAddOption(group, originalOption.Name);
if (optionCreated)
{
_createdOptions.Add(option!);
@@ -220,10 +220,10 @@ private void MergeIntoOption(string groupName, string optionName)
return;
}
- var (group, groupIdx, groupCreated) = _groupEditor.FindOrAddModGroup(MergeToMod!, GroupType.Multi, groupName, SaveType.None);
+ var (group, groupCreated) = _groupEditor.FindOrAddModGroup(MergeToMod!, GroupType.Multi, groupName, SaveType.None);
if (groupCreated)
- _createdGroups.Add(groupIdx);
- var (option, _, optionCreated) = _groupEditor.FindOrAddOption(group!, optionName, SaveType.None);
+ _createdGroups.Add(group!.Index);
+ var (option, optionCreated) = _groupEditor.FindOrAddOption(group!, optionName, SaveType.None);
if (optionCreated)
_createdOptions.Add(option!);
var dir = ModCreator.NewOptionDirectory(MergeToMod!.ModPath, groupName, _config.ReplaceNonAsciiOnImport);
@@ -362,8 +362,8 @@ public void SplitIntoMod(string modName)
}
else
{
- var (group, _, _) = _groupEditor.FindOrAddModGroup(result, originalGroup.Type, originalGroup.Name);
- var (option, _, _) = _groupEditor.FindOrAddOption(group!, originalOption.GetName());
+ var (group, _) = _groupEditor.FindOrAddModGroup(result, originalGroup.Type, originalGroup.Name);
+ var (option, _) = _groupEditor.FindOrAddOption(group!, originalOption.GetName());
var folder = Path.Combine(dir.FullName, group!.Name, option!.Name);
var files = CopySubModFiles(originalOption, new DirectoryInfo(folder));
_groupEditor.SetFiles((IModDataContainer)option, files, SaveType.None);
diff --git a/Penumbra/Mods/Groups/CombiningModGroup.cs b/Penumbra/Mods/Groups/CombiningModGroup.cs
index ac71a0cf2..ac34bd978 100644
--- a/Penumbra/Mods/Groups/CombiningModGroup.cs
+++ b/Penumbra/Mods/Groups/CombiningModGroup.cs
@@ -22,18 +22,24 @@ public GroupType Type
public GroupDrawBehaviour Behaviour
=> GroupDrawBehaviour.MultiSelection;
- public Mod Mod { get; }
- public string Name { get; set; } = "Group";
- public string Description { get; set; } = string.Empty;
- public string Image { get; set; } = string.Empty;
- public ModPriority Priority { get; set; }
- public int Page { get; set; }
- public Setting DefaultSettings { get; set; }
- public ModSettingsLayout Layout { get; set; }
- public ParentSetting ParentSetting { get; set; } = ParentSetting.None;
- public ICondition? Condition { get; set; }
- public readonly List OptionData = [];
- public List Data { get; private set; }
+ public int Index { get; private set; } = -1;
+
+ public void SetIndex(int index)
+ => Index = index;
+
+ public Mod Mod { get; }
+ public Guid Id { get; set; } = Guid.NewGuid();
+ public string Name { get; set; } = "Group";
+ public string Description { get; set; } = string.Empty;
+ public string Image { get; set; } = string.Empty;
+ public ModPriority Priority { get; set; }
+ public int Page { get; set; }
+ public Setting DefaultSettings { get; set; }
+ public ModSettingsLayout Layout { get; set; }
+ public IModObject? ParentSetting { get; set; }
+ public ICondition? Condition { get; set; }
+ public readonly IndexList OptionData = [];
+ public IndexList Data { get; private set; }
/// Groups that allow all available options to be selected at once.
public CombiningModGroup(Mod mod)
@@ -62,10 +68,6 @@ public bool IsOption
public IModOption? AddOption(string name, string description = "")
{
- var groupIdx = Mod.Groups.IndexOf(this);
- if (groupIdx < 0)
- return null;
-
var subMod = new CombiningSubMod(this)
{
Name = name,
@@ -83,7 +85,7 @@ public bool IsOption
return null;
var options = json["Options"];
- if (options != null)
+ if (options is not null)
foreach (var child in options.Children())
{
if (ret.OptionData.Count == IModGroup.MaxCombiningOptions)
@@ -100,7 +102,7 @@ public bool IsOption
var requiredContainers = 1 << ret.OptionData.Count;
var containers = json["Containers"];
- if (containers != null)
+ if (containers is not null)
foreach (var child in containers.Children())
{
if (requiredContainers <= ret.Data.Count)
@@ -121,7 +123,8 @@ public bool IsOption
$"Combining Group {ret.Name} in {mod.Name} has not enough data containers for its {ret.OptionData.Count} options, filling with empty containers.",
NotificationType.Warning);
ret.Data.EnsureCapacity(requiredContainers);
- ret.Data.AddRange(Enumerable.Repeat(0, requiredContainers - ret.Data.Count).Select(_ => new CombinedDataContainer(ret)));
+ ret.Data.AddRange(Enumerable.Repeat(0, requiredContainers - ret.Data.Count)
+ .Select(_ => new CombinedDataContainer(ret)));
}
ret.DefaultSettings = ret.FixSetting(ret.DefaultSettings);
@@ -129,9 +132,6 @@ public bool IsOption
return ret;
}
- public int GetIndex()
- => ModGroup.GetIndex(this);
-
public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer)
=> new CombiningModGroupEditDrawer(editDrawer, this);
@@ -210,6 +210,9 @@ internal static CombiningModGroup WithoutMod(string name)
};
/// For loading when no empty container should be created.
+ internal static CombiningModGroup EmptyData(Mod mod)
+ => new(mod, false);
+
private CombiningModGroup(Mod mod, bool _)
{
Mod = mod;
diff --git a/Penumbra/Mods/Groups/IModGroup.cs b/Penumbra/Mods/Groups/IModGroup.cs
index 95ddc54fd..40f9e4440 100644
--- a/Penumbra/Mods/Groups/IModGroup.cs
+++ b/Penumbra/Mods/Groups/IModGroup.cs
@@ -21,37 +21,13 @@ public enum GroupDrawBehaviour
MultiSelection,
}
-public readonly struct ParentSetting
-{
- public readonly string? Group;
- public readonly string? Option;
-
- public static readonly ParentSetting None = new(null);
-
- public bool IsNone
- => Group is null;
-
- public ParentSetting(string? group = null)
- {
- Group = group;
- Option = null;
- }
-
- public ParentSetting(string group, string? option = null)
- {
- Group = group;
- Option = option;
- }
-}
-
-public interface IModGroup
+public interface IModGroup : IModObject, IIndexed
{
public const int MaxMultiOptions = 32;
public const int MaxCombiningOptions = 8;
- public Mod Mod { get; }
- public string Name { get; set; }
- public string Description { get; set; }
+ IModGroup IModObject.Group
+ => this;
/// Unused in Penumbra but for better TexTools interop.
public string Image { get; set; }
@@ -65,9 +41,13 @@ public interface IModGroup
public Setting DefaultSettings { get; set; }
- public ModSettingsLayout Layout { get; set; }
- public ParentSetting ParentSetting { get; set; }
- public ICondition? Condition { get; set; }
+ public IModObject? ParentSetting { get; set; }
+
+ IModObject? CycleChecker.IHasParent.Parent
+ => ParentSetting;
+
+ bool CycleChecker.IHasParent.CausesCycle(IModObject parent)
+ => ReferenceEquals(this, parent.Group);
public FullPath? FindBestMatch(Utf8GamePath gamePath);
public IModOption? AddOption(string name, string description = "");
@@ -76,8 +56,6 @@ public interface IModGroup
public IReadOnlyList DataContainers { get; }
public bool IsOption { get; }
- public int GetIndex();
-
public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer);
public void AddData(ModSettings settings, Setting setting, Dictionary redirections, MetaDictionary manipulations);
diff --git a/Penumbra/Mods/Groups/ImcModGroup.cs b/Penumbra/Mods/Groups/ImcModGroup.cs
index acc188db0..30ffc3aef 100644
--- a/Penumbra/Mods/Groups/ImcModGroup.cs
+++ b/Penumbra/Mods/Groups/ImcModGroup.cs
@@ -16,7 +16,13 @@ namespace Penumbra.Mods.Groups;
public class ImcModGroup(Mod mod) : IModGroup
{
+ public int Index { get; private set; } = -1;
+
+ public void SetIndex(int index)
+ => Index = index;
+
public Mod Mod { get; } = mod;
+ public Guid Id { get; set; } = Guid.NewGuid();
public string Name { get; set; } = "Option";
public string Description { get; set; } = string.Empty;
public string Image { get; set; } = string.Empty;
@@ -31,7 +37,7 @@ public GroupDrawBehaviour Behaviour
public int Page { get; set; }
public Setting DefaultSettings { get; set; } = Setting.Zero;
public ModSettingsLayout Layout { get; set; }
- public ParentSetting ParentSetting { get; set; } = ParentSetting.None;
+ public IModObject? ParentSetting { get; set; }
public ICondition? Condition { get; set; }
public ImcIdentifier Identifier;
@@ -64,12 +70,8 @@ public bool CanBeDisabled
}
}
- public IModOption? AddOption(string name, string description = "")
+ public IModOption AddOption(string name, string description = "")
{
- var groupIdx = Mod.Groups.IndexOf(this);
- if (groupIdx < 0)
- return null;
-
var subMod = new ImcSubMod(this)
{
Name = name,
@@ -80,7 +82,7 @@ public bool CanBeDisabled
return subMod;
}
- public readonly List OptionData = [];
+ public readonly IndexList OptionData = [];
public IReadOnlyList Options
=> OptionData;
@@ -122,7 +124,7 @@ public void AddData(ModSettings settings, Setting setting, Dictionary m.IsDisableSubMod);
if (idx >= 0)
{
- if (OptionData[idx].Condition is not {} condition || condition.Evaluate(context))
+ if (OptionData[idx].Condition is not { } condition || condition.Evaluate(context))
return setting.HasFlag(idx);
return false;
@@ -258,7 +259,7 @@ private ushort GetCurrentMask(in ModSettingContext context, Setting setting)
continue;
var option = OptionData[i];
- if(option.Condition is null || option.Condition.Evaluate(context))
+ if (option.Condition is null || option.Condition.Evaluate(context))
mask ^= option.AttributeMask;
}
diff --git a/Penumbra/Mods/Groups/ModGroupConditionDrawer.cs b/Penumbra/Mods/Groups/ModGroupConditionDrawer.cs
index fbc85ec3d..05201a9c0 100644
--- a/Penumbra/Mods/Groups/ModGroupConditionDrawer.cs
+++ b/Penumbra/Mods/Groups/ModGroupConditionDrawer.cs
@@ -1,55 +1,94 @@
using ImSharp;
+using ImSharp.ImNodes;
using Luna;
+using Penumbra.Communication;
+using Penumbra.Services;
+using Penumbra.UI.ModsTab;
namespace Penumbra.Mods.Groups;
-public sealed class ModGroupConditionDrawer : ConditionDrawer, IUiService
+public sealed class ModGroupConditionCache : ConditionDrawerCache
{
- private string _group = string.Empty;
- private string _option = string.Empty;
+ private readonly CommunicatorService _communicator;
+ private readonly ConditionCombo _conditionCombo = new() { Flags = ComboFlags.NoArrowButton };
- protected override bool DrawCustom(ICondition? condition, ModSettingContext context,
- out ICondition? replaced)
+ public ModGroupConditionCache(CommunicatorService communicator, ModSettingContext context)
+ : base(context)
{
- var ret = false;
- replaced = null;
- switch (condition)
+ _communicator = communicator;
+ _communicator.ModOptionChanged.Subscribe(OnModOptionChange, ModOptionChanged.Priority.LayoutManager);
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ _communicator.ModOptionChanged.Unsubscribe(OnModOptionChange);
+ }
+
+ private void OnModOptionChange(in ModOptionChanged.Arguments arguments)
+ {
+ if (arguments.Mod != Context.Mod)
+ return;
+
+ Dirty |= IManagedCache.DirtyFlags.Custom;
+ }
+
+ protected override ICondition? CreateNewCondition()
+ {
+ var option = Context.Mod.Groups.Where(g => g != Context.Object?.Group).SelectMany(g => g.Options).FirstOrDefault();
+ return option is null ? null : new SettingCondition(option);
+ }
+
+ protected override CustomNode? HandleCustomCondition(Action?> setter,
+ ICondition condition, ParentConditionType parent, byte depth)
+ {
+ if (condition is not SettingCondition setting)
+ return null;
+
+ var node = new SettingNode(IdCounter++, setting, setter, IdCounter++, parent, depth);
+ var ownSize = node.GetOwnSize(this);
+ AddNode(node, ownSize.X, false);
+ node.SubtreeHeight = ownSize.Y;
+ return node;
+ }
+
+ private sealed class SettingNode(
+ NodeId id,
+ SettingCondition condition,
+ Action?> setter,
+ AttributeId output,
+ ParentConditionType parent,
+ byte depth) : CustomNode(id, condition, setter, output, parent, depth)
+ {
+ public override Vector2 GetOwnSize(ConditionDrawerCache drawerCache)
+ => drawerCache.ConstantNodeSize with { X = drawerCache.ButtonSize.X * 10 };
+
+ ///
+ public override Rgba32 TitleColor(ConditionDrawerCache drawerCache)
+ => Rgba32.Transparent;
+
+ ///
+ public override Rgba32 BorderColor(ConditionDrawerCache drawerCache)
+ => drawerCache.NodeColors.CustomBorder;
+
+ public override bool DrawContent(ConditionDrawerCache drawerCache, ImSharp.ImNodes.Node node)
{
- case null:
+ var actualSize = GetActualSize(drawerCache);
+ DrawOutputConnector(node, actualSize, Output);
+ var ret = false;
+
+ var combo = ((ModGroupConditionCache)drawerCache)._conditionCombo;
+ using (node.TitleBar())
{
- if (ImEx.Icon.Button(LunaStyle.AddObjectIcon, "Add a new condition."u8, _group.Length is 0 && _option.Length is 0))
+ if (combo.Draw("##combo"u8, drawerCache.Context.Object!, actualSize.X, condition, out var newCondition))
{
- replaced = new SingleSettingCondition(_group, _option);
- _group = string.Empty;
- _option = string.Empty;
- ret = true;
+ Setter(newCondition);
+ ret = true;
}
-
- Im.Line.SameInner();
- Im.Item.SetNextWidth(Im.ContentRegion.Available.X * 0.4f);
- Im.Input.Text("##Group"u8, ref _group, "Group..."u8);
- Im.Line.SameInner();
- Im.Item.SetNextWidth(Im.ContentRegion.Available.X);
- Im.Input.Text("##Options"u8, ref _option, "Options..."u8);
- }
- break;
- case SingleSettingCondition single:
- {
- Im.FrameDummy();
- Im.Line.SameInner();
- ImEx.TextFramed(single.Group, new Vector2(Im.ContentRegion.Available.X * 0.4f, 0));
- Im.Line.SameInner();
- ImEx.TextFramed(single.Option, Im.ContentRegion.Available with { Y = 0 });
}
- break;
- case MultiSettingAllCondition all:
- { }
- break;
- case MultiSettingAnyCondition any:
- { }
- break;
- }
- return ret;
+ var buttonSize = new Vector2(MathF.Round(actualSize.X / (Parent is ParentConditionType.Not ? 3 : 4)), drawerCache.ButtonSize.Y - ImNodes.Style.NodeBorderThickness);
+ Im.Cursor.X += ImNodes.Style.NodeBorderThickness;
+ return ret | DefaultButtons(drawerCache, node, buttonSize);
+ }
}
}
diff --git a/Penumbra/Mods/Groups/ModGroupConditionParser.cs b/Penumbra/Mods/Groups/ModGroupConditionParser.cs
index 43d70405a..ae0b80212 100644
--- a/Penumbra/Mods/Groups/ModGroupConditionParser.cs
+++ b/Penumbra/Mods/Groups/ModGroupConditionParser.cs
@@ -4,67 +4,3 @@
namespace Penumbra.Mods.Groups;
-public sealed class ModGroupConditionParser : ConditionParser, IService
-{
- protected override ICondition? ParseCustomType(ref Utf8JsonReader reader, Utf8JsonObjectReader obj, StringU8 type)
- {
- if (type.Equals("SingleSetting"u8))
- {
- var group = string.Empty;
- var option = string.Empty;
- while (obj.Read(ref reader))
- {
- if (reader.TokenType is not JsonTokenType.PropertyName)
- continue;
-
- if (reader.CheckPropertyValue("Group"u8, JsonTokenType.String))
- reader.TryReadString(out group!);
- else if (reader.CheckPropertyValue("Option"u8, JsonTokenType.String))
- reader.TryReadString(out option!);
- }
-
- if (group.Length is 0 || option.Length is 0)
- return null;
-
- return new SingleSettingCondition(group, option);
- }
-
- if (type.Equals("MultiSettingAll"u8))
- {
- var (group, options) = GetMulti(obj, ref reader);
- if (group.Length is 0 || options is null)
- return null;
-
- return new MultiSettingAllCondition(group, options);
- }
-
- if (type.Equals("MultiSettingAny"u8))
- {
- var (group, options) = GetMulti(obj, ref reader);
- if (group.Length is 0 || options is null)
- return null;
-
- return new MultiSettingAnyCondition(group, options);
- }
-
- return null;
-
- static (string, string[]?) GetMulti(Utf8JsonObjectReader obj, ref Utf8JsonReader reader)
- {
- var group = string.Empty;
- List? options = null;
- while (obj.Read(ref reader))
- {
- if (reader.TokenType is not JsonTokenType.PropertyName)
- continue;
-
- if (reader.CheckPropertyValue("Group"u8, JsonTokenType.String))
- reader.TryReadString(out group!);
- else if (reader.CheckPropertyValue("Options"u8))
- options = reader.ReadStringArray();
- }
-
- return (group, options?.OfType().ToArray());
- }
- }
-}
diff --git a/Penumbra/Mods/Groups/ModGroupEditUpdater.cs b/Penumbra/Mods/Groups/ModGroupEditUpdater.cs
deleted file mode 100644
index 5e66f6215..000000000
--- a/Penumbra/Mods/Groups/ModGroupEditUpdater.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-using Luna;
-using Penumbra.Communication;
-using Penumbra.Mods.Manager.OptionEditor;
-using Penumbra.Services;
-
-namespace Penumbra.Mods.Groups;
-
-public sealed class ModGroupEditUpdater : IRequiredService, IDisposable
-{
- private readonly CommunicatorService _communicator;
-
- public ModGroupEditUpdater(CommunicatorService communicator)
- {
- _communicator = communicator;
- _communicator.ModOptionChanged.Subscribe(OnModOptionChange, ModOptionChanged.Priority.ModGroupEditUpdater);
- }
-
- private static void OnModOptionChange(in ModOptionChanged.Arguments arguments)
- {
- switch (arguments.Type)
- {
- case ModOptionChangeType.GroupRenamed:
- foreach (var group in arguments.Mod.Groups)
- {
- if (group.ParentSetting.Group == arguments.OldName)
- group.ParentSetting = new ParentSetting(arguments.Group!.Name, group.ParentSetting.Option);
-
- Fix(group.Condition, arguments.OldName!, arguments.Group!.Name, true);
- foreach (var option in group.Options)
- Fix(option.Condition, arguments.OldName!, arguments.Group!.Name, true);
- }
-
- break;
- case ModOptionChangeType.OptionRenamed:
- foreach (var group in arguments.Mod.Groups)
- {
- if (group.ParentSetting.Option == arguments.OldName)
- group.ParentSetting = new ParentSetting(group.ParentSetting.Group!, arguments.Option!.Name);
-
- Fix(group.Condition, arguments.OldName!, arguments.Option!.Name, false);
- foreach (var option in group.Options)
- Fix(option.Condition, arguments.OldName!, arguments.Option!.Name, false);
- }
-
- break;
- case ModOptionChangeType.PrepareGroupDeletion:
- foreach (var group in arguments.Mod.Groups)
- {
- if (group.ParentSetting.Group == arguments.Group!.Name)
- group.ParentSetting = ParentSetting.None;
- }
-
- break;
- case ModOptionChangeType.OptionDeleted:
- foreach (var group in arguments.Mod.Groups)
- {
- if (group.ParentSetting.Option == arguments.OldName)
- group.ParentSetting = new ParentSetting(group.ParentSetting.Group);
- }
-
- break;
- }
- }
-
- private static void Fix(ICondition? condition, string oldText, string newText, bool group)
- {
- switch (condition)
- {
- case MultiSettingCondition all when group:
- if (all.Group == oldText)
- all.Group = newText;
- break;
- case MultiSettingCondition all:
- for (var i = 0; i < all.Count; ++i)
- {
- if (all[i] == oldText)
- all[i] = newText;
- }
-
- break;
- case SingleSettingCondition single when group:
- if (single.Group == oldText)
- single.Group = newText;
- break;
- case SingleSettingCondition single:
- if (single.Option == oldText)
- single.Option = newText;
- break;
- }
- }
-
- private static IEnumerable> GetAllConditions(Mod mod)
- {
- foreach (var group in mod.Groups)
- {
- if (group.Condition is not null)
- yield return group.Condition;
-
- foreach (var option in group.Options)
- {
- if (option.Condition is not null)
- yield return option.Condition;
- }
- }
- }
-
- public void Dispose()
- => _communicator.ModOptionChanged.Unsubscribe(OnModOptionChange);
-}
diff --git a/Penumbra/Mods/Groups/ModSaveGroup.cs b/Penumbra/Mods/Groups/ModSaveGroup.cs
index 0b4134469..8da851341 100644
--- a/Penumbra/Mods/Groups/ModSaveGroup.cs
+++ b/Penumbra/Mods/Groups/ModSaveGroup.cs
@@ -3,7 +3,6 @@
using Penumbra.Files;
using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
-using Penumbra.Services;
namespace Penumbra.Mods.Groups;
@@ -29,7 +28,7 @@ public static ModSaveGroup WithoutMod(DirectoryInfo basePath, IModGroup group, i
=> new(basePath, group, groupIndex, onlyAscii);
public ModSaveGroup(IModGroup group, bool onlyAscii)
- : this(group.Mod.ModPath, group, group.GetIndex(), onlyAscii)
+ : this(group.Mod.ModPath, group, group.Index, onlyAscii)
{ }
public ModSaveGroup(DirectoryInfo basePath, DefaultSubMod @default, bool onlyAscii)
@@ -53,7 +52,7 @@ public ModSaveGroup(DirectoryInfo basePath, IModDataContainer container, bool on
else
{
_group = container.Group!;
- _groupIdx = _group.GetIndex();
+ _groupIdx = _group.Index;
}
}
@@ -64,7 +63,7 @@ public ModSaveGroup(IModDataContainer container, bool onlyAscii)
_defaultMod = container as DefaultSubMod;
_onlyAscii = onlyAscii;
_group = container.Group;
- _groupIdx = _group?.GetIndex() ?? -1;
+ _groupIdx = _group?.Index ?? -1;
}
public string ToFilePath(FilenameService fileNames)
@@ -73,7 +72,7 @@ public string ToFilePath(FilenameService fileNames)
public void Save(Stream stream)
{
// TODO: System.Text.Json
- using var w = new StreamWriter(stream);
+ using var w = new StreamWriter(stream, leaveOpen: true);
using var j = new JsonTextWriter(w);
j.Formatting = Formatting.Indented;
var serializer = new JsonSerializer { Formatting = Formatting.Indented };
diff --git a/Penumbra/Mods/Groups/ModSettingContext.cs b/Penumbra/Mods/Groups/ModSettingContext.cs
index 83da17072..c3801cf68 100644
--- a/Penumbra/Mods/Groups/ModSettingContext.cs
+++ b/Penumbra/Mods/Groups/ModSettingContext.cs
@@ -1,103 +1,50 @@
using System.Text.Json;
+using ImSharp;
using Luna;
-using Penumbra.Api.Enums;
using Penumbra.Mods.Settings;
+using Penumbra.Mods.SubMods;
namespace Penumbra.Mods.Groups;
-public readonly record struct ModSettingContext(Mod Mod, ModSettings Settings);
-
-public sealed class MultiSettingAllCondition(string group, params IReadOnlyCollection options) : MultiSettingCondition(group, options)
+public readonly record struct ModSettingContext(Mod Mod, ModSettings Settings, IModObject? Object = null) : IConditionContext
{
- protected override ReadOnlySpan Type
- => "MultiSettingAll"u8;
-
- public override ICondition DeepCopy()
- => new MultiSettingAllCondition(Group, this);
-
- protected override bool EvaluateGroup(IModGroup group, Setting settings)
+ public static ICondition? ParseCustomType(ref Utf8JsonReader reader, Utf8JsonObjectLimit obj, StringU8 type)
{
- var matches = 0;
- foreach (var option in this)
+ if (!type.Equals("Setting"u8))
+ return null;
+
+ var guid = Guid.Empty;
+ while (obj.Read(ref reader))
{
- var optionIndex = group.Options.IndexOf(o => o.Name == option);
- if (optionIndex < 0)
- break;
-
- if (group.Type is GroupType.Single)
- {
- if (optionIndex == settings.AsIndex)
- ++matches;
- }
- else if (settings.HasFlag(optionIndex))
- {
- ++matches;
- }
- }
+ if (reader.TokenType is not JsonTokenType.PropertyName)
+ return null;
- return matches == Count;
- }
-}
+ if (!reader.GuidProperty("Setting"u8, out guid))
+ reader.Skip();
+ }
-public sealed class MultiSettingAnyCondition(string group, params IReadOnlyCollection options) : MultiSettingCondition(group, options)
-{
- protected override ReadOnlySpan Type
- => "MultiSettingAny"u8;
+ if (guid == Guid.Empty)
+ return null;
- public override ICondition DeepCopy()
- => new MultiSettingAnyCondition(Group, this);
+ return new SettingIdCondition(guid);
+ }
- protected override bool EvaluateGroup(IModGroup group, Setting settings)
- {
- foreach (var option in this)
- {
- var optionIndex = group.Options.IndexOf(o => o.Name == option);
- if (optionIndex < 0)
- break;
-
- if (group.Type is GroupType.Single)
- {
- if (optionIndex == settings.AsIndex)
- return true;
- }
- else if (settings.HasFlag(optionIndex))
- {
- return true;
- }
- }
+ public ICondition? GetRoot()
+ => Object?.Condition;
- return false;
- }
+ public void SetRoot(ICondition? condition)
+ => Object?.Condition = condition?.Reduce();
}
-public sealed class SingleSettingCondition(string group, string option) : ICondition
+public sealed class SettingCondition(IModOption option) : ICondition
{
- public string Group = group;
- public string Option = option;
-
- public bool Evaluate(in ModSettingContext context)
- {
- foreach (var (index, group) in context.Mod.Groups.Index())
- {
- if (group.Name != Group)
- continue;
-
- var settings = context.Settings.IsEmpty ? group.DefaultSettings : context.Settings.Settings[index];
- var option = group.Options.IndexOf(o => o.Name == Option);
- if (option < 0)
- continue;
-
- switch (group.Type)
- {
- case GroupType.Single when option == settings.AsIndex:
- case GroupType.Multi when settings.HasFlag(option):
- return true;
- }
- }
+ public IModOption Option { get; set; } = option;
- return false;
- }
+ public bool Equals(ICondition? other)
+ => other is SettingCondition s && Option == s.Option;
+ public bool Evaluate(in ModSettingContext context)
+ => Option.IsEnabled(context.Settings);
public ICondition Reduce()
=> this;
@@ -105,80 +52,55 @@ public ICondition Reduce()
public void WriteJson(Utf8JsonWriter j)
{
j.WriteStartObject();
- j.WriteString("Type"u8, "SingleSetting"u8);
- j.WriteString("Group"u8, Group);
- j.WriteString("Option"u8, Option);
+ j.WriteString("Type"u8, "Setting"u8);
+ j.WriteString("Setting"u8, Option.Id);
j.WriteEndObject();
}
- ///
public ICondition DeepCopy()
- => new SingleSettingCondition(Group, Option);
+ => new SettingCondition(Option);
public IEnumerable> Subconditions
=> [];
public int RemoveSubconditions(Func, bool> predicate)
=> 0;
+
+ public ICondition? EditConditions(Func, ICondition?> method)
+ => method(this);
}
-public abstract class MultiSettingCondition(string group) : List, ICondition
+public sealed class SettingIdCondition(Guid id) : ICondition
{
- protected MultiSettingCondition(string group, IReadOnlyCollection options)
- : this(group)
- {
- EnsureCapacity(options.Count);
- AddRange(options);
- }
-
- public string Group = group;
+ public Guid Option { get; } = id;
- public abstract ICondition DeepCopy();
- protected abstract ReadOnlySpan Type { get; }
- protected abstract bool EvaluateGroup(IModGroup group, Setting settings);
+ public bool Equals(ICondition? other)
+ => other is SettingIdCondition s && Option == s.Option;
public bool Evaluate(in ModSettingContext context)
- {
- if (Count is 0)
- return true;
-
- foreach (var (index, group) in context.Mod.Groups.Index())
- {
- if (group.Name != Group)
- continue;
-
- if (group.Type is GroupType.Single && Count > 1)
- continue;
-
- var settings = context.Settings.IsEmpty ? group.DefaultSettings : context.Settings.Settings[index];
- if (EvaluateGroup(group, settings))
- return true;
- }
-
- return false;
- }
+ => throw new NotImplementedException(
+ $"{nameof(SettingIdCondition)} can not be evaluated and is only for parsing and subsequent conversion to {nameof(SettingCondition)}.");
public ICondition Reduce()
- {
- this.RemoveDuplicates();
- return this;
- }
+ => this;
public void WriteJson(Utf8JsonWriter j)
{
j.WriteStartObject();
- j.WriteString("Type"u8, Type);
- j.WriteString("Group"u8, Group);
- j.WriteStartArray("Options"u8);
- foreach (var option in this)
- j.WriteStringValue(option);
- j.WriteEndArray();
+ j.WriteString("Type"u8, "Setting"u8);
+ j.WriteString("Setting"u8, Option);
j.WriteEndObject();
}
+ public ICondition DeepCopy()
+ => new SettingIdCondition(Option);
+
public IEnumerable> Subconditions
=> [];
public int RemoveSubconditions(Func, bool> predicate)
=> 0;
+
+ public ICondition? EditConditions(Func, ICondition?> method)
+ => method(this);
}
diff --git a/Penumbra/Mods/Groups/MultiModGroup.cs b/Penumbra/Mods/Groups/MultiModGroup.cs
index 00102ab55..cb2f4add6 100644
--- a/Penumbra/Mods/Groups/MultiModGroup.cs
+++ b/Penumbra/Mods/Groups/MultiModGroup.cs
@@ -14,7 +14,8 @@
namespace Penumbra.Mods.Groups;
/// Groups that allow all available options to be selected at once.
-public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup
+public sealed class
+ MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup
{
public GroupType Type
=> GroupType.Multi;
@@ -22,7 +23,13 @@ public GroupType Type
public GroupDrawBehaviour Behaviour
=> GroupDrawBehaviour.MultiSelection;
+ public int Index { get; private set; } = -1;
+
+ public void SetIndex(int index)
+ => Index = index;
+
public Mod Mod { get; } = mod;
+ public Guid Id { get; set; } = Guid.NewGuid();
public string Name { get; set; } = "Group";
public string Description { get; set; } = string.Empty;
public string Image { get; set; } = string.Empty;
@@ -30,9 +37,9 @@ public GroupDrawBehaviour Behaviour
public int Page { get; set; }
public Setting DefaultSettings { get; set; }
public ModSettingsLayout Layout { get; set; }
- public ParentSetting ParentSetting { get; set; } = ParentSetting.None;
+ public IModObject? ParentSetting { get; set; }
public ICondition? Condition { get; set; }
- public readonly List OptionData = [];
+ public readonly IndexList OptionData = [];
public IReadOnlyList Options
=> OptionData;
@@ -52,12 +59,8 @@ public bool IsOption
return null;
}
- public IModOption? AddOption(string name, string description = "")
+ public IModOption AddOption(string name, string description = "")
{
- var groupIdx = Mod.Groups.IndexOf(this);
- if (groupIdx < 0)
- return null;
-
var subMod = new MultiSubMod(this)
{
Name = name,
@@ -109,9 +112,6 @@ public SingleModGroup ConvertToSingle()
return single;
}
- public int GetIndex()
- => ModGroup.GetIndex(this);
-
public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer)
=> new MultiModGroupEditDrawer(editDrawer, this);
diff --git a/Penumbra/Mods/Groups/SingleModGroup.cs b/Penumbra/Mods/Groups/SingleModGroup.cs
index 67994bd7f..3d73b7371 100644
--- a/Penumbra/Mods/Groups/SingleModGroup.cs
+++ b/Penumbra/Mods/Groups/SingleModGroup.cs
@@ -21,7 +21,13 @@ public GroupType Type
public GroupDrawBehaviour Behaviour
=> GroupDrawBehaviour.SingleSelection;
+ public int Index { get; private set; } = -1;
+
+ public void SetIndex(int index)
+ => Index = index;
+
public Mod Mod { get; } = mod;
+ public Guid Id { get; set; } = Guid.NewGuid();
public string Name { get; set; } = "Option";
public string Description { get; set; } = string.Empty;
public string Image { get; set; } = string.Empty;
@@ -29,10 +35,10 @@ public GroupDrawBehaviour Behaviour
public int Page { get; set; }
public Setting DefaultSettings { get; set; }
public ModSettingsLayout Layout { get; set; }
- public ParentSetting ParentSetting { get; set; } = ParentSetting.None;
+ public IModObject? ParentSetting { get; set; }
public ICondition? Condition { get; set; }
- public readonly List OptionData = [];
+ public readonly IndexList OptionData = [];
public FullPath? FindBestMatch(Utf8GamePath gamePath)
{
@@ -96,9 +102,6 @@ public MultiModGroup ConvertToMulti()
return multi;
}
- public int GetIndex()
- => ModGroup.GetIndex(this);
-
public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer)
=> new SingleModGroupEditDrawer(editDrawer, this);
diff --git a/Penumbra/Mods/Manager/ModDataEditor.cs b/Penumbra/Mods/Manager/ModDataEditor.cs
index 2dba04818..31999aae1 100644
--- a/Penumbra/Mods/Manager/ModDataEditor.cs
+++ b/Penumbra/Mods/Manager/ModDataEditor.cs
@@ -30,6 +30,8 @@ public enum ModDataChangeType : uint
FileSystemFolder = 0x010000,
FileSystemSortOrder = 0x020000,
LastConfigEdit = 0x040000,
+ Identifier = 0x080000,
+ PageNames = 0x100000,
}
public class ModDataEditor(SaveService saveService, CommunicatorService communicatorService, ItemData itemData, LocalModDatabase database)
@@ -113,6 +115,17 @@ public void ChangeRequiredFeatures(Mod mod, FeatureFlags flags)
communicatorService.ModDataChanged.Invoke(new ModDataChanged.Arguments(ModDataChangeType.RequiredFeatures, mod, null));
}
+ public bool ForceIdentifier(Mod mod, Guid newGuid)
+ {
+ if (newGuid == Guid.Empty || mod.StableIdentifier == newGuid || mod.SubObjects.ContainsKey(newGuid))
+ return false;
+
+ mod.StableIdentifier = newGuid;
+ saveService.QueueSave(new ModMeta(mod));
+ communicatorService.ModDataChanged.Invoke(new ModDataChanged.Arguments(ModDataChangeType.Identifier, mod, null));
+ return true;
+ }
+
public void ChangeModTag(Mod mod, int tagIdx, string newTag)
=> ChangeTag(mod, tagIdx, newTag, false);
@@ -159,6 +172,27 @@ public void ChangeModNote(Mod mod, string newNote)
communicatorService.ModDataChanged.Invoke(new ModDataChanged.Arguments(ModDataChangeType.Favorite, mod, null));
}
+ public void ChangePageName(Mod mod, int page, string newName)
+ {
+ var oldName = string.Empty;
+ if (newName.Length is 0)
+ {
+ if (!mod.PageNames.Remove(page))
+ return;
+ }
+ else if (mod.PageNames.TryGetValue(page, out oldName) && oldName == newName)
+ {
+ return;
+ }
+ else
+ {
+ mod.PageNames[page] = newName;
+ }
+
+ saveService.QueueSave(new ModMeta(mod));
+ communicatorService.ModDataChanged.Invoke(new ModDataChanged.Arguments(ModDataChangeType.PageNames, mod, oldName ?? string.Empty));
+ }
+
private void ChangeTag(Mod mod, int tagIdx, string newTag, bool local)
{
var which = local ? mod.LocalTags : mod.ModTags;
diff --git a/Penumbra/Mods/Manager/ModImportManager.cs b/Penumbra/Mods/Manager/ModImportManager.cs
index 006fb473d..13ad17308 100644
--- a/Penumbra/Mods/Manager/ModImportManager.cs
+++ b/Penumbra/Mods/Manager/ModImportManager.cs
@@ -16,7 +16,7 @@ public class ModImportManager(
FileCompactor compactor) : IDisposable, IService
{
private readonly Dictionary _uniqueModsToUnpack = new(StringComparer.OrdinalIgnoreCase);
- internal readonly Queue> ModsToUnpack = new();
+ internal readonly Queue ModsToUnpack = new();
/// Mods need to be added thread-safely outside of iteration.
private readonly ConcurrentQueue _modsToAdd = new();
@@ -31,14 +31,14 @@ public void TryUnpacking()
if (Importing && _import!.State is not ImporterState.Done)
return;
- List newMods;
+ UnpackRequest newMods;
lock (ModsToUnpack)
{
- if (!ModsToUnpack.TryDequeue(out newMods!))
+ if (!ModsToUnpack.TryDequeue(out newMods))
return;
}
- var files = newMods.Where(s =>
+ var files = newMods.Paths.Where(s =>
{
if (File.Exists(s))
return true;
@@ -50,10 +50,13 @@ public void TryUnpacking()
Penumbra.Log.Debug($"Unpacking mods: {string.Join("\n\t", files.Select(f => f.FullName))}.");
if (files.Length == 0)
+ {
+ newMods.TaskCompletionSource.SetResult([]);
return;
+ }
- _import = new TexToolsImporter(files.Length, files, AddNewMod, config, duplicates, modNormalizer, modManager, compactor,
- migrationManager, _import);
+ _import = new TexToolsImporter(files.Length, files, AddNewMod, newMods.TaskCompletionSource, config, duplicates, modNormalizer,
+ modManager, compactor, migrationManager, _import);
}
public bool Importing
@@ -65,10 +68,7 @@ public bool IsImporting([NotNullWhen(true)] out TexToolsImporter? importer)
return _import != null;
}
- public void AddUnpack(IEnumerable paths)
- => AddUnpack(paths.ToList());
-
- public void AddUnpack(params List paths)
+ public Task AddUnpack(params List paths)
{
lock (ModsToUnpack)
{
@@ -95,9 +95,13 @@ public void AddUnpack(params List paths)
if (paths.Count > 0)
{
Penumbra.Log.Debug($"Adding mods to install: {string.Join("\n\t", paths)}");
- ModsToUnpack.Enqueue(paths);
+ var tcs = new TaskCompletionSource();
+ ModsToUnpack.Enqueue(new UnpackRequest(paths, tcs));
+ return tcs.Task;
}
}
+
+ return Task.FromResult(Array.Empty());
}
public void ClearImport()
@@ -156,4 +160,6 @@ private void AddNewMod(FileInfo file, DirectoryInfo? dir, Exception? error)
_modsToAdd.Enqueue(dir);
}
}
+
+ internal readonly record struct UnpackRequest(List Paths, TaskCompletionSource TaskCompletionSource);
}
diff --git a/Penumbra/Mods/Manager/ModImportResult.cs b/Penumbra/Mods/Manager/ModImportResult.cs
new file mode 100644
index 000000000..5350544cb
--- /dev/null
+++ b/Penumbra/Mods/Manager/ModImportResult.cs
@@ -0,0 +1,3 @@
+namespace Penumbra.Mods.Manager;
+
+public readonly record struct ModImportResult(FileInfo File, DirectoryInfo? Mod, Exception? Error);
diff --git a/Penumbra/Mods/Manager/OptionEditor/CombiningModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/CombiningModGroupEditor.cs
index f8d21a92e..b7682682a 100644
--- a/Penumbra/Mods/Manager/OptionEditor/CombiningModGroupEditor.cs
+++ b/Penumbra/Mods/Manager/OptionEditor/CombiningModGroupEditor.cs
@@ -43,6 +43,6 @@ public void SetDisplayName(CombinedDataContainer container, string name, SaveTyp
container.Name = name;
SaveService.Save(saveType, new ModSaveGroup(container.Group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, container.Group.Mod, container.Group, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, container.Group.Mod, container.Group, null, null, Guid.Empty, -1));
}
}
diff --git a/Penumbra/Mods/Manager/OptionEditor/ImcModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/ImcModGroupEditor.cs
index 7f8adfc1a..a27cc478a 100644
--- a/Penumbra/Mods/Manager/OptionEditor/ImcModGroupEditor.cs
+++ b/Penumbra/Mods/Manager/OptionEditor/ImcModGroupEditor.cs
@@ -20,11 +20,12 @@ public sealed class ImcModGroupEditor(CommunicatorService communicator, SaveServ
if (!ModGroupEditor.VerifyFileName(mod, null, newName, true))
return null;
- var maxPriority = mod.Groups.Count == 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1;
+ var maxPriority = mod.Groups.Count is 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1;
var group = CreateGroup(mod, newName, identifier, defaultEntry, maxPriority);
mod.Groups.Add(group);
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupAdded, mod, group, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupAdded, mod, group, null, null, group.Id,
+ -1));
return group;
}
@@ -42,7 +43,8 @@ public sealed class ImcModGroupEditor(CommunicatorService communicator, SaveServ
};
group.OptionData.Add(subMod);
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, subMod, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, subMod, null,
+ subMod.Id, -1));
return subMod;
}
@@ -56,7 +58,8 @@ public void ChangeDefaultAttribute(ImcModGroup group, in ImcAttributeCache cache
return;
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null,
+ group.Id, -1));
}
public void ChangeDefaultEntry(ImcModGroup group, in ImcEntry newEntry, SaveType saveType = SaveType.Queue)
@@ -67,7 +70,8 @@ public void ChangeDefaultEntry(ImcModGroup group, in ImcEntry newEntry, SaveType
group.DefaultEntry = entry;
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null,
+ group.Id, -1));
}
public void ChangeOptionAttribute(ImcSubMod option, in ImcAttributeCache cache, int idx, bool value, SaveType saveType = SaveType.Queue)
@@ -76,7 +80,8 @@ public void ChangeOptionAttribute(ImcSubMod option, in ImcAttributeCache cache,
return;
SaveService.Save(saveType, new ModSaveGroup(option.Group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, option.Mod, option.Group, option, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, option.Mod, option.Group,
+ option, null, option.Id, -1));
}
public void ChangeAllVariants(ImcModGroup group, bool allVariants, SaveType saveType = SaveType.Queue)
@@ -86,7 +91,8 @@ public void ChangeAllVariants(ImcModGroup group, bool allVariants, SaveType save
group.AllVariants = allVariants;
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null,
+ group.Id, -1));
}
public void ChangeOnlyAttributes(ImcModGroup group, bool onlyAttributes, SaveType saveType = SaveType.Queue)
@@ -96,7 +102,8 @@ public void ChangeOnlyAttributes(ImcModGroup group, bool onlyAttributes, SaveTyp
group.OnlyAttributes = onlyAttributes;
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null,
+ group.Id, -1));
}
public void ChangeCanBeDisabled(ImcModGroup group, bool canBeDisabled, SaveType saveType = SaveType.Queue)
@@ -106,7 +113,8 @@ public void ChangeCanBeDisabled(ImcModGroup group, bool canBeDisabled, SaveType
group.CanBeDisabled = canBeDisabled;
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null,
+ group.Id, -1));
}
protected override ImcModGroup CreateGroup(Mod mod, string newName, ModPriority priority, SaveType saveType = SaveType.ImmediateSync)
@@ -117,7 +125,8 @@ protected override ImcModGroup CreateGroup(Mod mod, string newName, ModPriority
};
- private static ImcModGroup CreateGroup(Mod mod, string newName, ImcIdentifier identifier, ImcEntry defaultEntry, ModPriority priority, SaveType saveType = SaveType.ImmediateSync)
+ private static ImcModGroup CreateGroup(Mod mod, string newName, ImcIdentifier identifier, ImcEntry defaultEntry, ModPriority priority,
+ SaveType saveType = SaveType.ImmediateSync)
=> new(mod)
{
Name = newName,
diff --git a/Penumbra/Mods/Manager/OptionEditor/LayoutManager.cs b/Penumbra/Mods/Manager/OptionEditor/LayoutManager.cs
new file mode 100644
index 000000000..ee362be57
--- /dev/null
+++ b/Penumbra/Mods/Manager/OptionEditor/LayoutManager.cs
@@ -0,0 +1,104 @@
+using Luna;
+using Penumbra.Communication;
+using Penumbra.Files;
+using Penumbra.Mods.Groups;
+using Penumbra.Mods.SubMods;
+using Penumbra.Services;
+
+namespace Penumbra.Mods.Manager.OptionEditor;
+
+public sealed class LayoutManager : IRequiredService, IDisposable
+{
+ public readonly SaveService SaveService;
+ public readonly CommunicatorService Communicator;
+ public readonly LunaLogger Log;
+
+ public LayoutManager(SaveService saveService, CommunicatorService communicator, LunaLogger log)
+ {
+ SaveService = saveService;
+ Communicator = communicator;
+ Log = log;
+
+ Communicator.ModOptionChanged.Subscribe(OnModOptionChange, ModOptionChanged.Priority.LayoutManager);
+ }
+
+ public void Dispose()
+ {
+ Communicator.ModOptionChanged.Unsubscribe(OnModOptionChange);
+ }
+
+ public static string? ValidateCondition(IModObject parent, IModOption option)
+ {
+ if (option == parent)
+ return $"The option {parent.Name} can not depend on itself.";
+
+ if (option.Group == parent)
+ return $"The group {parent.Name} can not depend on an option {option.Name} of itself.";
+
+ if (option.Group.Behaviour is GroupDrawBehaviour.SingleSelection && option.Group == parent.Group)
+ return $"The option {parent.Name} can not depend on another option {option.Name} in its own single group {parent.Group.Name}.";
+
+ return null;
+ }
+
+
+ private void OnModOptionChange(in ModOptionChanged.Arguments arguments)
+ {
+ switch (arguments.Type)
+ {
+ case ModOptionChangeType.OptionDeleted:
+ {
+ if (arguments.Mod.SubObjects.Remove(arguments.Id, out var obj))
+ foreach (var @object in arguments.Mod.SubObjects.Values)
+ RemoveObjectFromObject(@object, obj);
+ return;
+ }
+ case ModOptionChangeType.PrepareGroupDeletion:
+ {
+ var group = arguments.Group;
+ foreach (var option in group?.Options ?? [])
+ {
+ if (arguments.Mod.SubObjects.Remove(option.Id, out var obj))
+ foreach (var @object in arguments.Mod.SubObjects.Values.Where(o => o.Group != group))
+ RemoveObjectFromObject(@object, obj);
+ }
+
+ return;
+ }
+ case ModOptionChangeType.GroupDeleted:
+ {
+ if (arguments.Mod.SubObjects.Remove(arguments.Id, out var obj))
+ foreach (var @object in arguments.Mod.SubObjects.Values)
+ RemoveObjectFromObject(@object, obj);
+ return;
+ }
+ case ModOptionChangeType.OptionAdded when arguments.Option is { } option:
+ {
+ if (!arguments.Mod.SubObjects.TryAdd(option.Id, option))
+ Log.Error($"Could not add option {option.Name} to {arguments.Mod.Name}'s sub objects: GUID {option.Id} already present.");
+ return;
+ }
+ case ModOptionChangeType.GroupAdded when arguments.Group is { } group:
+ {
+ foreach (var @object in group.Options.Prepend(group))
+ {
+ if (!arguments.Mod.SubObjects.TryAdd(@object.Id, @object))
+ Log.Error(
+ $"Could not add option {@object.Name} to {arguments.Mod.Name}'s sub objects: GUID {@object.Id} already present.");
+ }
+
+ return;
+ }
+ }
+ }
+
+ private static void RemoveObjectFromObject(IModObject @object, IModObject toRemove)
+ {
+ if (@object is IModGroup group && ReferenceEquals(group.ParentSetting, toRemove))
+ group.ParentSetting = null;
+ @object.Condition?.RemoveSubconditions(c => c is SettingCondition s && s.Option == toRemove);
+ @object.Condition = @object.Condition?.Reduce();
+ if (@object.Condition is TrueCondition)
+ @object.Condition = null;
+ }
+}
diff --git a/Penumbra/Mods/Manager/OptionEditor/ModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/ModGroupEditor.cs
index be6ff416e..17ab6a23e 100644
--- a/Penumbra/Mods/Manager/OptionEditor/ModGroupEditor.cs
+++ b/Penumbra/Mods/Manager/OptionEditor/ModGroupEditor.cs
@@ -19,6 +19,7 @@ public enum ModOptionChangeType
GroupAdded,
GroupDeleted,
GroupMoved,
+ GroupIdentifierChanged,
GroupTypeChanged,
PriorityChanged,
OptionRenamed,
@@ -29,10 +30,12 @@ public enum ModOptionChangeType
OptionFilesAdded,
OptionSwapsChanged,
OptionMetaChanged,
+ OptionIdentifierChanged,
DisplayChange,
PrepareChange,
PrepareGroupDeletion,
DefaultOptionChanged,
+ ConditionChanged,
}
public class ModGroupEditor(
@@ -64,7 +67,8 @@ public void ChangeModGroupDefaultOption(IModGroup group, Setting defaultOption)
group.DefaultSettings = defaultOption;
saveService.QueueSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport));
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DefaultOptionChanged, group.Mod, group, null, null, null, -1));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DefaultOptionChanged, group.Mod, group, null,
+ null, group.Id, -1));
}
/// Rename an option group if possible.
@@ -76,32 +80,110 @@ public void RenameModGroup(IModGroup group, string newName)
saveService.ImmediateDelete(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport));
group.Name = newName;
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupRenamed, group.Mod, group, null, null, oldName, -1));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupRenamed, group.Mod, group, null, null,
+ group.Id, -1));
saveService.ImmediateSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport));
}
/// Delete a given option group. Fires an event to prepare before actually deleting.
public void DeleteModGroup(IModGroup group)
{
- var mod = group.Mod;
- var idx = group.GetIndex();
- var oldName = group.Name;
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareGroupDeletion, mod, group, null, null, null, -1));
+ var mod = group.Mod;
+ var idx = group.Index;
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareGroupDeletion, mod, group, null, null,
+ group.Id, -1));
mod.Groups.RemoveAt(idx);
saveService.SaveAllOptionGroups(mod, false, config.ReplaceNonAsciiOnImport);
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupDeleted, mod, null, null, null, oldName, idx));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupDeleted, mod, null, null, null, group.Id,
+ idx));
}
/// Move the index of a given option group.
public void MoveModGroup(IModGroup group, int groupIdxTo)
{
var mod = group.Mod;
- var idxFrom = group.GetIndex();
+ var idxFrom = group.Index;
if (!mod.Groups.Move(ref idxFrom, ref groupIdxTo))
return;
saveService.SaveAllOptionGroups(mod, false, config.ReplaceNonAsciiOnImport);
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupMoved, mod, group, null, null, null, idxFrom));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupMoved, mod, group, null, null, group.Id,
+ idxFrom));
+ }
+
+ /// Force the GUID of an object to a specific value. Empty GUIDs are not allowed.
+ /// The object to edit.
+ /// The desired new GUID.
+ /// False if the new GUID is already used in this mod or if it is empty, true otherwise.
+ public bool ForceIdentifier(IModObject @object, Guid newGuid)
+ {
+ if (newGuid == Guid.Empty || @object.Mod.StableIdentifier == newGuid || @object.Mod.SubObjects.ContainsKey(newGuid))
+ return false;
+
+ var oldGuid = @object.Id;
+ @object.Id = newGuid;
+ saveService.SaveAllOptionGroups(@object.Mod, false, config.ReplaceNonAsciiOnImport);
+ var changeType = @object is IModGroup ? ModOptionChangeType.GroupIdentifierChanged : ModOptionChangeType.OptionIdentifierChanged;
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(changeType, @object.Mod, @object.Group, @object as IModOption, null,
+ oldGuid, -1));
+ return true;
+ }
+
+ public void SetCondition(IModObject @object, ICondition? condition, bool force)
+ {
+ if (!force && (condition?.Equals(@object.Condition) ?? @object.Condition is null))
+ return;
+
+ @object.Condition = condition;
+ saveService.QueueSave(new ModSaveGroup(@object.Group, config.ReplaceNonAsciiOnImport));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.ConditionChanged, @object.Mod, @object.Group,
+ @object as IModOption, null, @object.Id, -1));
+ }
+
+ public void SetPage(IModGroup group, int page)
+ {
+ if (group.Page == page)
+ return;
+
+ group.Page = page;
+ saveService.QueueSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, group.Mod, group,
+ null, null, group.Id, -1));
+ }
+
+ public void SetParent(IModGroup group, IModObject? parent)
+ {
+ if (ReferenceEquals(group.ParentSetting, parent))
+ return;
+
+ group.ParentSetting = parent;
+ saveService.QueueSave(new ModSaveGroup(group.Group, config.ReplaceNonAsciiOnImport));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, group.Mod, group.Group, null,
+ null, group.Id, -1));
+ }
+
+ public void SetLayout(IModObject @object, ModSettingsLayout layout)
+ {
+ layout = layout.Reduce(@object);
+ if (@object.Layout == layout)
+ return;
+
+ @object.Layout = layout;
+ saveService.QueueSave(new ModSaveGroup(@object.Group, config.ReplaceNonAsciiOnImport));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, @object.Mod, @object.Group,
+ @object as IModOption, null, @object.Id, -1));
+ }
+
+ public void SetColor(IModOption option, int colorType)
+ {
+ var color = IModOption.ConvertColor(colorType);
+ if (color == option.Color)
+ return;
+
+ option.Color = color;
+ saveService.QueueSave(new ModSaveGroup(option.Group, config.ReplaceNonAsciiOnImport));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, option.Mod, option.Group,
+ option, null, option.Id, -1));
}
/// Change the internal priority of the given option group.
@@ -112,7 +194,8 @@ public void ChangeGroupPriority(IModGroup group, ModPriority newPriority)
group.Priority = newPriority;
saveService.QueueSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport));
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PriorityChanged, group.Mod, group, null, null, null, -1));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PriorityChanged, group.Mod, group, null, null,
+ group.Id, -1));
}
/// Change the description of the given option group.
@@ -123,7 +206,8 @@ public void ChangeGroupDescription(IModGroup group, string newDescription)
group.Description = newDescription;
saveService.QueueSave(new ModSaveGroup(group, config.ReplaceNonAsciiOnImport));
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, group.Mod, group, null, null, null, -1));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, group.Mod, group, null, null,
+ group.Id, -1));
}
/// Rename the given option.
@@ -135,7 +219,8 @@ public void RenameOption(IModOption option, string newName)
option.Name = newName;
saveService.QueueSave(new ModSaveGroup(option.Group, config.ReplaceNonAsciiOnImport));
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionRenamed, option.Mod, option.Group, option, null, oldName, -1));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionRenamed, option.Mod, option.Group, option,
+ null, option.Id, -1));
}
/// Change the description of the given option.
@@ -146,7 +231,8 @@ public void ChangeOptionDescription(IModOption option, string newDescription)
option.Description = newDescription;
saveService.QueueSave(new ModSaveGroup(option.Group, config.ReplaceNonAsciiOnImport));
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, option.Mod, option.Group, option, null, null, -1));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.DisplayChange, option.Mod, option.Group, option,
+ null, option.Id, -1));
}
/// Set the meta manipulations for a given option. Replaces existing manipulations.
@@ -155,10 +241,12 @@ public void SetManipulations(IModDataContainer subMod, MetaDictionary manipulati
if (subMod.Manipulations.Equals(manipulations))
return;
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareChange, (Mod)subMod.Mod, subMod.Group, null, subMod, null, -1));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareChange, (Mod)subMod.Mod, subMod.Group,
+ null, subMod, Guid.Empty, -1));
subMod.Manipulations.SetTo(manipulations);
saveService.Save(saveType, new ModSaveGroup(subMod, config.ReplaceNonAsciiOnImport));
- communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, (Mod)subMod.Mod, subMod.Group, null, subMod, null, -1));
+ communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMetaChanged, (Mod)subMod.Mod,
+ subMod.Group, null, subMod, Guid.Empty, -1));
}
/// Set the file redirections for a given option. Replaces existing redirections.
@@ -167,10 +255,12 @@ public void SetFiles(IModDataContainer subMod, IReadOnlyDictionary Forces a file save of the given container's group.
@@ -185,7 +275,8 @@ public void AddFiles(IModDataContainer subMod, IReadOnlyDictionary Verify that a new option group name is unique in this mod.
@@ -267,24 +360,24 @@ public void DeleteOption(IModOption option)
_ => null,
};
- public (IModGroup?, int, bool) FindOrAddModGroup(Mod mod, GroupType type, string name, SaveType saveType = SaveType.ImmediateSync)
+ public (IModGroup?, bool) FindOrAddModGroup(Mod mod, GroupType type, string name, SaveType saveType = SaveType.ImmediateSync)
=> type switch
{
GroupType.Single => SingleEditor.FindOrAddModGroup(mod, name, saveType),
GroupType.Multi => MultiEditor.FindOrAddModGroup(mod, name, saveType),
GroupType.Imc => ImcEditor.FindOrAddModGroup(mod, name, saveType),
GroupType.Combining => CombiningEditor.FindOrAddModGroup(mod, name, saveType),
- _ => (null, -1, false),
+ _ => (null, false),
};
- public (IModOption?, int, bool) FindOrAddOption(IModGroup group, string name, SaveType saveType = SaveType.ImmediateSync)
+ public (IModOption?, bool) FindOrAddOption(IModGroup group, string name, SaveType saveType = SaveType.ImmediateSync)
=> group switch
{
SingleModGroup s => SingleEditor.FindOrAddOption(s, name, saveType),
MultiModGroup m => MultiEditor.FindOrAddOption(m, name, saveType),
ImcModGroup i => ImcEditor.FindOrAddOption(i, name, saveType),
CombiningModGroup c => CombiningEditor.FindOrAddOption(c, name, saveType),
- _ => (null, -1, false),
+ _ => (null, false),
};
public void MoveOption(IModOption option, int toIdx)
diff --git a/Penumbra/Mods/Manager/OptionEditor/ModOptionEditor.cs b/Penumbra/Mods/Manager/OptionEditor/ModOptionEditor.cs
index d4e57f3bb..7bb320b2a 100644
--- a/Penumbra/Mods/Manager/OptionEditor/ModOptionEditor.cs
+++ b/Penumbra/Mods/Manager/OptionEditor/ModOptionEditor.cs
@@ -25,30 +25,30 @@ public abstract class ModOptionEditor(
if (!ModGroupEditor.VerifyFileName(mod, null, newName, true))
return null;
- var maxPriority = mod.Groups.Count == 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1;
+ var maxPriority = mod.Groups.Count is 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1;
var group = CreateGroup(mod, newName, maxPriority);
mod.Groups.Add(group);
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupAdded, mod, group, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupAdded, mod, group, null, null, group.Id,
+ -1));
return group;
}
/// Add a new mod, empty option group of the given type and name if it does not exist already.
- public (TGroup, int, bool) FindOrAddModGroup(Mod mod, string newName, SaveType saveType = SaveType.ImmediateSync)
+ public (TGroup, bool) FindOrAddModGroup(Mod mod, string newName, SaveType saveType = SaveType.ImmediateSync)
{
var idx = mod.Groups.IndexOf(g => g.Name == newName);
if (idx >= 0)
{
var existingGroup = mod.Groups[idx] as TGroup
?? throw new Exception($"Mod group with name {newName} exists, but is of the wrong type.");
- return (existingGroup, idx, false);
+ return (existingGroup, false);
}
- idx = mod.Groups.Count;
if (AddModGroup(mod, newName, saveType) is not { } group)
throw new Exception($"Could not create new mod group with name {newName}.");
- return (group, idx, true);
+ return (group, true);
}
/// Add a new empty option of the given name for the given group.
@@ -58,25 +58,26 @@ public abstract class ModOptionEditor(
return null;
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, option, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, option, null,
+ option.Id, -1));
return option;
}
/// Add a new empty option of the given name for the given group if it does not exist already.
- public (TOption, int, bool) FindOrAddOption(TGroup group, string newName, SaveType saveType = SaveType.Queue)
+ public (TOption, bool) FindOrAddOption(TGroup group, string newName, SaveType saveType = SaveType.Queue)
{
var idx = group.Options.IndexOf(o => o.Name == newName);
if (idx >= 0)
{
var existingOption = group.Options[idx] as TOption
?? throw new Exception($"Mod option with name {newName} exists, but is of the wrong type."); // Should never happen.
- return (existingOption, idx, false);
+ return (existingOption, false);
}
if (AddOption(group, newName, saveType) is not { } option)
throw new Exception($"Could not create new option with name {newName} in {group.Name}.");
- return (option, idx, true);
+ return (option, true);
}
/// Add an existing option to a given group.
@@ -86,7 +87,8 @@ public abstract class ModOptionEditor(
return null;
SaveService.QueueSave(new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, clonedOption, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionAdded, group.Mod, group, clonedOption,
+ null, option.Id, -1));
return clonedOption;
}
@@ -95,24 +97,26 @@ public void DeleteOption(TOption option)
{
var mod = option.Mod;
var group = option.Group;
- var optionIdx = option.GetIndex();
- var oldName = option.Name;
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareChange, mod, group, option, null, null, -1));
+ var optionIdx = option.Index;
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PrepareChange, mod, group, option, null,
+ option.Id, -1));
RemoveOption((TGroup)group, optionIdx);
SaveService.QueueSave(new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionDeleted, mod, group, null, null, oldName, optionIdx));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionDeleted, mod, group, null, null,
+ option.Id, optionIdx));
}
/// Move an option inside the given option group.
public void MoveOption(TOption option, int optionIdxTo)
{
- var idx = option.GetIndex();
+ var idx = option.Index;
var group = (TGroup)option.Group;
if (!MoveOption(group, idx, optionIdxTo))
return;
SaveService.QueueSave(new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMoved, group.Mod, group, option, null, null, idx));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.OptionMoved, group.Mod, group, option, null,
+ option.Id, idx));
}
protected abstract TGroup CreateGroup(Mod mod, string newName, ModPriority priority, SaveType saveType = SaveType.ImmediateSync);
@@ -149,6 +153,7 @@ public static void HandlingInfo(this ModOptionChangeType type, out bool requires
ModOptionChangeType.OptionMetaChanged => (false, true, false),
ModOptionChangeType.DisplayChange => (false, false, false),
ModOptionChangeType.DefaultOptionChanged => (true, false, false),
+ ModOptionChangeType.ConditionChanged => (false, true, false),
_ => (false, false, false),
};
}
diff --git a/Penumbra/Mods/Manager/OptionEditor/MultiModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/MultiModGroupEditor.cs
index 671b5ce22..be4f2b563 100644
--- a/Penumbra/Mods/Manager/OptionEditor/MultiModGroupEditor.cs
+++ b/Penumbra/Mods/Manager/OptionEditor/MultiModGroupEditor.cs
@@ -13,11 +13,11 @@ public sealed class MultiModGroupEditor(CommunicatorService communicator, SaveSe
{
public void ChangeToSingle(MultiModGroup group)
{
- var idx = group.GetIndex();
+ var idx = group.Index;
var singleGroup = group.ConvertToSingle();
group.Mod.Groups[idx] = singleGroup;
SaveService.QueueSave(new ModSaveGroup(singleGroup, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupTypeChanged, singleGroup.Mod, singleGroup, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupTypeChanged, singleGroup.Mod, singleGroup, null, null, group.Id, -1));
}
/// Change the internal priority of the given option.
@@ -28,7 +28,7 @@ public void ChangeOptionPriority(MultiSubMod option, ModPriority newPriority)
option.Priority = newPriority;
SaveService.QueueSave(new ModSaveGroup(option.Group, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PriorityChanged, option.Mod, option.Group, option, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.PriorityChanged, option.Mod, option.Group, option, null, option.Id, -1));
}
protected override MultiModGroup CreateGroup(Mod mod, string newName, ModPriority priority, SaveType saveType = SaveType.ImmediateSync)
diff --git a/Penumbra/Mods/Manager/OptionEditor/SingleModGroupEditor.cs b/Penumbra/Mods/Manager/OptionEditor/SingleModGroupEditor.cs
index 592a57ce3..22a14f4ae 100644
--- a/Penumbra/Mods/Manager/OptionEditor/SingleModGroupEditor.cs
+++ b/Penumbra/Mods/Manager/OptionEditor/SingleModGroupEditor.cs
@@ -13,11 +13,11 @@ public sealed class SingleModGroupEditor(CommunicatorService communicator, SaveS
{
public void ChangeToMulti(SingleModGroup group)
{
- var idx = group.GetIndex();
+ var idx = group.Index;
var multiGroup = group.ConvertToMulti();
group.Mod.Groups[idx] = multiGroup;
SaveService.QueueSave(new ModSaveGroup(multiGroup, Config.ReplaceNonAsciiOnImport));
- Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupTypeChanged, multiGroup.Mod, multiGroup, null, null, null, -1));
+ Communicator.ModOptionChanged.Invoke(new ModOptionChanged.Arguments(ModOptionChangeType.GroupTypeChanged, multiGroup.Mod, multiGroup, null, null, group.Id, -1));
}
protected override SingleModGroup CreateGroup(Mod mod, string newName, ModPriority priority, SaveType saveType = SaveType.ImmediateSync)
diff --git a/Penumbra/Mods/Mod.cs b/Penumbra/Mods/Mod.cs
index 2a6c55b58..538f148dd 100644
--- a/Penumbra/Mods/Mod.cs
+++ b/Penumbra/Mods/Mod.cs
@@ -1,5 +1,6 @@
using Luna;
using Luna.Generators;
+using Penumbra.Files;
using Penumbra.GameData.Data;
using Penumbra.GameData.Structs;
using Penumbra.Meta.Manipulations;
@@ -56,15 +57,18 @@ public override string ToString()
=> Name;
// Meta Data
- public string Name { get; internal set; } = "New Mod";
- public string Author { get; internal set; } = string.Empty;
- public string Description { get; internal set; } = string.Empty;
- public string Version { get; internal set; } = string.Empty;
- public string Website { get; internal set; } = string.Empty;
- public string Image { get; internal set; } = string.Empty;
- public IReadOnlyList ModTags { get; internal set; } = [];
- public HashSet DefaultPreferredItems { get; internal set; } = [];
- public FeatureFlags RequiredFeatures { get; internal set; } = 0;
+ public uint LoadedVersion { get; internal set; } = ModMeta.CurrentFileVersion;
+ public Guid StableIdentifier { get; internal set; } = Guid.NewGuid();
+ public string Name { get; internal set; } = "New Mod";
+ public string Author { get; internal set; } = string.Empty;
+ public string Description { get; internal set; } = string.Empty;
+ public string Version { get; internal set; } = string.Empty;
+ public string Website { get; internal set; } = string.Empty;
+ public string Image { get; internal set; } = string.Empty;
+ public IReadOnlyList ModTags { get; internal set; } = [];
+ public HashSet DefaultPreferredItems { get; internal set; } = [];
+ public FeatureFlags RequiredFeatures { get; internal set; } = 0;
+ public Dictionary PageNames { get; internal set; } = [];
// Local Data
@@ -78,8 +82,25 @@ public override string ToString()
public bool Favorite { get; internal set; }
// Options
- public readonly DefaultSubMod Default;
- public readonly List Groups = [];
+ public readonly Dictionary SubObjects = [];
+ public readonly DefaultSubMod Default;
+ public readonly IndexList Groups = [];
+
+ /// Add a group and all its options to this mod and its dictionary.
+ /// Throws if the GUID for any of the objects already exists in the mod.
+ public void AddGroup(IModGroup? group, string filePath)
+ {
+ if (group is null)
+ return;
+
+ Groups.Add(group);
+ foreach (var obj in group.Options.Prepend(group))
+ {
+ if (!SubObjects.TryAdd(obj.Id, obj))
+ throw new InvalidMetaException(this, filePath,
+ $"Multiple groups or options with the GUID {obj.Id} exist inside this mod.");
+ }
+ }
/// Compute the required feature flags for this mod.
public FeatureFlags ComputeRequiredFeatures()
diff --git a/Penumbra/Mods/ModCreator.cs b/Penumbra/Mods/ModCreator.cs
index e7c5401bb..760de31a5 100644
--- a/Penumbra/Mods/ModCreator.cs
+++ b/Penumbra/Mods/ModCreator.cs
@@ -108,7 +108,7 @@ public void LoadAllGroups(Mod mod)
changes = changes
|| saveService.FileNames.OptionGroupFile(mod.ModPath.FullName, mod.Groups.Count, group.Name, true)
!= Path.Combine(file.DirectoryName!, file.Name.ReplaceBadXivSymbols(true));
- mod.Groups.Add(group);
+ mod.AddGroup(group, file.FullName);
}
else
{
@@ -245,7 +245,7 @@ public void IncorporateAllMetaChanges(Mod mod, bool delete, bool removeDefaultVa
public static DirectoryInfo? NewSubFolderName(DirectoryInfo parentFolder, string subFolderName, bool onlyAscii)
{
var newModFolderBase = NewOptionDirectory(parentFolder, subFolderName, onlyAscii);
- var newModFolder = FileSystemUtility.ObtainUniqueFile(newModFolderBase.FullName);
+ var newModFolder = newModFolderBase.FullName.ObtainUniqueFile();
return newModFolder.Length == 0 ? null : new DirectoryInfo(newModFolder);
}
diff --git a/Penumbra/Mods/ModMeta.cs b/Penumbra/Mods/ModMeta.cs
index 7153f1dab..9bae851d5 100644
--- a/Penumbra/Mods/ModMeta.cs
+++ b/Penumbra/Mods/ModMeta.cs
@@ -21,17 +21,17 @@ public void Save(Stream stream)
j.WriteStartObject();
j.WriteNumber("FileVersion"u8, CurrentFileVersion);
- j.WriteString("Name"u8, mod.Name);
- j.WriteString("Author"u8, mod.Author);
- j.WriteString("Description"u8, mod.Description);
- j.WriteString("Image"u8, mod.Image);
- j.WriteString("Version"u8, mod.Version);
- j.WriteString("Website"u8, mod.Website);
+ j.WriteString("Identifier"u8, mod.StableIdentifier);
+ j.WriteString("Name"u8, mod.Name);
+ j.WriteNonEmptyString("Author"u8, mod.Author);
+ j.WriteNonEmptyString("Description"u8, mod.Description);
+ j.WriteNonEmptyString("Image"u8, mod.Image);
+ j.WriteNonEmptyString("Version"u8, mod.Version);
+ j.WriteNonEmptyString("Website"u8, mod.Website);
if (mod.ModTags.Count > 0)
{
- j.WritePropertyName("ModTags"u8);
- j.WriteStartArray();
+ j.WriteStartArray("ModTags"u8);
foreach (var tag in mod.ModTags)
j.WriteStringValue(tag);
j.WriteEndArray();
@@ -39,8 +39,7 @@ public void Save(Stream stream)
if (mod.DefaultPreferredItems.Count > 0)
{
- j.WritePropertyName("DefaultPreferredItems"u8);
- j.WriteStartArray();
+ j.WriteStartArray("DefaultPreferredItems"u8);
foreach (var item in mod.DefaultPreferredItems)
j.WriteNumberValue(item);
j.WriteEndArray();
@@ -49,8 +48,7 @@ public void Save(Stream stream)
if (mod.RequiredFeatures is not FeatureFlags.None)
{
var features = mod.RequiredFeatures;
- j.WritePropertyName("RequiredFeatures"u8);
- j.WriteStartArray();
+ j.WriteStartArray("RequiredFeatures"u8);
foreach (var flag in FeatureFlags.Values)
{
if ((features & flag) is not FeatureFlags.None)
@@ -60,6 +58,14 @@ public void Save(Stream stream)
j.WriteEndArray();
}
+ if (mod.PageNames.Count > 0)
+ {
+ j.WriteStartObject("PageNames"u8);
+ foreach (var (page, name) in mod.PageNames)
+ j.WriteString($"{page}", name);
+ j.WriteEndObject();
+ }
+
j.WriteEndObject();
j.Flush();
}
@@ -90,6 +96,7 @@ public static ModDataChangeType Load(ModDataEditor editor, ModCreator creator, M
public struct Dto
{
public uint? FileVersion;
+ public Guid? StableIdentifier;
public string? Name;
public string? Author;
public string? Description;
@@ -109,6 +116,15 @@ public ModDataChangeType Apply(ModDataEditor editor, ModCreator creator, Mod mod
mod.Name = Name ?? string.Empty;
}
+ if (mod.StableIdentifier != StableIdentifier)
+ {
+ if (StableIdentifier.HasValue)
+ mod.StableIdentifier = StableIdentifier.Value;
+ else
+ mod.StableIdentifier = Guid.NewGuid();
+ changes |= ModDataChangeType.Identifier;
+ }
+
if (mod.Author != Author)
{
changes |= ModDataChangeType.Author;
@@ -186,31 +202,33 @@ public static Dto Read(ref Utf8JsonReader reader)
throw new JsonException("Empty Data");
var ret = new Dto();
- var obj = reader.CreateObjectReader();
+ var obj = reader.CreateObjectLimit();
while (obj.Read(ref reader))
{
if (reader.TokenType is not JsonTokenType.PropertyName)
throw new JsonException("Expected property");
- if (reader.CheckPropertyValue("FileVersion"u8))
+ if (reader.CheckProperty("FileVersion"u8))
ret.FileVersion = reader.TryReadNumber(out uint fv) ? fv : throw new JsonException();
- else if (reader.CheckPropertyValue("Name"u8))
+ else if (reader.CheckProperty("Identifier"u8))
+ ret.StableIdentifier = reader.TryGetGuid(out var guid) ? guid : null;
+ else if (reader.CheckProperty("Name"u8))
ret.Name = reader.GetString();
- else if (reader.CheckPropertyValue("Author"u8))
+ else if (reader.CheckProperty("Author"u8))
ret.Author = reader.GetString();
- else if (reader.CheckPropertyValue("Description"u8))
+ else if (reader.CheckProperty("Description"u8))
ret.Description = reader.GetString();
- else if (reader.CheckPropertyValue("Image"u8))
+ else if (reader.CheckProperty("Image"u8))
ret.Image = reader.GetString();
- else if (reader.CheckPropertyValue("Version"u8))
+ else if (reader.CheckProperty("Version"u8))
ret.Version = reader.GetString();
- else if (reader.CheckPropertyValue("Website"u8))
+ else if (reader.CheckProperty("Website"u8))
ret.Website = reader.GetString();
- else if (reader.CheckPropertyValue("ModTags"u8))
+ else if (reader.CheckProperty("ModTags"u8))
ret.ModTags = reader.ReadStringArray()!;
- else if (reader.CheckPropertyValue("DefaultPreferredItems"u8))
+ else if (reader.CheckProperty("DefaultPreferredItems"u8))
ret.PreferredItems = reader.ReadNumberArray();
- else if (reader.CheckPropertyValue("RequiredFeatures"u8))
+ else if (reader.CheckProperty("RequiredFeatures"u8))
ret.RequiredFeatures = reader.ReadFlagEnumArray() ?? FeatureFlags.None;
else
reader.Skip();
diff --git a/Penumbra/Mods/ModSelection.cs b/Penumbra/Mods/ModSelection.cs
index 8b1092501..318472265 100644
--- a/Penumbra/Mods/ModSelection.cs
+++ b/Penumbra/Mods/ModSelection.cs
@@ -121,6 +121,9 @@ public enum Priority
///
ModEditWindow = 0,
+
+ ///
+ GroupNameCache = 0,
}
public readonly record struct Arguments(Mod? OldSelection, Mod? NewSelection);
diff --git a/Penumbra/Mods/Settings/ModSettings.cs b/Penumbra/Mods/Settings/ModSettings.cs
index 364032148..27c4a1e09 100644
--- a/Penumbra/Mods/Settings/ModSettings.cs
+++ b/Penumbra/Mods/Settings/ModSettings.cs
@@ -61,7 +61,7 @@ public bool HandleChanges(ModOptionChangeType type, Mod mod, IModGroup? group, I
case ModOptionChangeType.GroupRenamed: return true;
case ModOptionChangeType.GroupAdded:
// Add new empty setting for new mod.
- Settings.Insert(group!.GetIndex(), group.DefaultSettings);
+ Settings.Insert(group!.Index, group.DefaultSettings);
return true;
case ModOptionChangeType.GroupDeleted:
// Remove setting for deleted mod.
@@ -72,7 +72,7 @@ public bool HandleChanges(ModOptionChangeType type, Mod mod, IModGroup? group, I
// Fix settings for a changed group type.
// Single -> Multi: set single as enabled, rest as disabled
// Multi -> Single: set the first enabled option or 0.
- var idx = group!.GetIndex();
+ var idx = group!.Index;
var config = Settings[idx];
Settings[idx] = group.Type switch
{
@@ -86,7 +86,7 @@ public bool HandleChanges(ModOptionChangeType type, Mod mod, IModGroup? group, I
{
// Single -> select the previous option if any.
// Multi -> excise the corresponding bit.
- var groupIdx = group!.GetIndex();
+ var groupIdx = group!.Index;
var config = Settings[groupIdx];
Settings[groupIdx] = group!.Type switch
{
@@ -99,13 +99,13 @@ public bool HandleChanges(ModOptionChangeType type, Mod mod, IModGroup? group, I
}
case ModOptionChangeType.GroupMoved:
// Move the group the same way.
- return Settings.Move(fromIdx, group!.GetIndex());
+ return Settings.Move(fromIdx, group!.Index);
case ModOptionChangeType.OptionMoved:
{
// Single -> select the moved option if it was currently selected
// Multi -> move the corresponding bit
- var groupIdx = group!.GetIndex();
- var toIdx = option!.GetIndex();
+ var groupIdx = group!.Index;
+ var toIdx = option!.Index;
var config = Settings[groupIdx];
Settings[groupIdx] = group!.Type switch
{
diff --git a/Penumbra/Mods/SubMods/CombinedDataContainer.cs b/Penumbra/Mods/SubMods/CombinedDataContainer.cs
index efaa6fd4a..3312b8cd1 100644
--- a/Penumbra/Mods/SubMods/CombinedDataContainer.cs
+++ b/Penumbra/Mods/SubMods/CombinedDataContainer.cs
@@ -14,6 +14,11 @@ public IMod Mod
public IModGroup Group { get; } = group;
+ public int Index { get; private set; } = -1;
+
+ public void SetIndex(int index)
+ => Index = index;
+
public string Name { get; set; } = string.Empty;
public Dictionary Files { get; set; } = [];
public Dictionary FileSwaps { get; set; } = [];
@@ -28,7 +33,7 @@ public string GetName()
return Name;
var index = GetDataIndex();
- if (index == 0)
+ if (index is 0)
return "None";
var sb = new StringBuilder(128);
@@ -61,7 +66,7 @@ public unsafe string GetDirectoryName()
for (var i = 0; i < Group.Options.Count; ++i)
{
text[Group.Options.Count - 1 - i] = (index & 1) is 0 ? '0' : '1';
- index >>= 1;
+ index >>= 1;
}
return new string(text);
@@ -71,7 +76,7 @@ public string GetFullName()
=> $"{Group.Name}: {GetName()}";
public (int GroupIndex, int DataIndex) GetDataIndices()
- => (Group.GetIndex(), GetDataIndex());
+ => (Group.Index, GetDataIndex());
private int GetDataIndex()
{
diff --git a/Penumbra/Mods/SubMods/CombiningSubMod.cs b/Penumbra/Mods/SubMods/CombiningSubMod.cs
index 563e3a585..76f985955 100644
--- a/Penumbra/Mods/SubMods/CombiningSubMod.cs
+++ b/Penumbra/Mods/SubMods/CombiningSubMod.cs
@@ -1,6 +1,7 @@
using Luna;
using Newtonsoft.Json.Linq;
using Penumbra.Mods.Groups;
+using Penumbra.UI.Classes;
namespace Penumbra.Mods.SubMods;
@@ -8,21 +9,25 @@ public class CombiningSubMod(IModGroup group) : IModOption
{
public IModGroup Group { get; } = group;
+ public int Index { get; private set; } = -1;
+
+ public void SetIndex(int index)
+ => Index = index;
+
public Mod Mod
=> Group.Mod;
+ public Guid Id { get; set; } = Guid.NewGuid();
public string Name { get; set; } = "Option";
public string Description { get; set; } = string.Empty;
public ModSettingsLayout Layout { get; set; }
+ public ColorId Color { get; set; }
public ICondition? Condition { get; set; }
public string FullName
=> $"{Group.Name}: {Name}";
- public int GetIndex()
- => SubMod.GetIndex(this);
-
public CombiningSubMod(CombiningModGroup group, JToken json)
: this(group)
=> SubMod.LoadOptionData(json, this);
diff --git a/Penumbra/Mods/SubMods/DefaultSubMod.cs b/Penumbra/Mods/SubMods/DefaultSubMod.cs
index 3282f5185..bf50ba4bc 100644
--- a/Penumbra/Mods/SubMods/DefaultSubMod.cs
+++ b/Penumbra/Mods/SubMods/DefaultSubMod.cs
@@ -1,3 +1,4 @@
+using Luna;
using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
@@ -11,6 +12,12 @@ public class DefaultSubMod(IMod mod) : IModDataContainer
internal readonly IMod Mod = mod;
+ int IIndexed.Index
+ => -1;
+
+ void IIndexed.SetIndex(int _)
+ { }
+
public Dictionary Files { get; set; } = [];
public Dictionary FileSwaps { get; set; } = [];
public MetaDictionary Manipulations { get; set; } = new();
diff --git a/Penumbra/Mods/SubMods/IModDataContainer.cs b/Penumbra/Mods/SubMods/IModDataContainer.cs
index 008d5d5e8..ed560e271 100644
--- a/Penumbra/Mods/SubMods/IModDataContainer.cs
+++ b/Penumbra/Mods/SubMods/IModDataContainer.cs
@@ -1,3 +1,4 @@
+using Luna;
using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
@@ -5,17 +6,19 @@
namespace Penumbra.Mods.SubMods;
-public interface IModDataContainer
+public interface IModDataContainer : IIndexed
{
public IMod Mod { get; }
public IModGroup? Group { get; }
+ public int GroupIndex
+ => Group?.Index ?? -1;
+
public Dictionary Files { get; set; }
public Dictionary FileSwaps { get; set; }
public MetaDictionary Manipulations { get; set; }
- public string GetName();
- public string GetDirectoryName();
- public string GetFullName();
- public (int GroupIndex, int DataIndex) GetDataIndices();
+ public string GetName();
+ public string GetDirectoryName();
+ public string GetFullName();
}
diff --git a/Penumbra/Mods/SubMods/IModOption.cs b/Penumbra/Mods/SubMods/IModOption.cs
index e5dc1f8c1..844817af3 100644
--- a/Penumbra/Mods/SubMods/IModOption.cs
+++ b/Penumbra/Mods/SubMods/IModOption.cs
@@ -1,26 +1,114 @@
using Luna;
using Penumbra.Mods.Groups;
+using Penumbra.Mods.Settings;
+using Penumbra.UI.Classes;
namespace Penumbra.Mods.SubMods;
[Flags]
public enum ModSettingsLayout : ulong
{
- None = 0,
- Disable = 0x01, // Disable the option or group instead of hiding it when the conditions are not fulfilled.
- Indent = 0x02, // Indent the group if it is placed under another option or group.
+ None = 0,
+ Disable = 0x01, // Disable the option or group instead of hiding it when the conditions are not fulfilled.
+ Indent = 0x02, // Indent the group if it is placed under another option or group.
+ ParentHeader = 0x04, // Show the groups name or just its options if it is placed under another option or group.
+ Separator = 0x08, // Add a separator after this option.
+ DefaultClosed = 0x10, // A group should be closed by default.
}
-public interface IModOption
+public interface IModObject : CycleChecker.IHasParent, IEquatable
{
- public Mod Mod { get; }
- public IModGroup Group { get; }
-
+ public Mod Mod { get; }
+ public IModGroup Group { get; }
+ public Guid Id { get; set; }
public string Name { get; set; }
- public string FullName { get; }
public string Description { get; set; }
public ModSettingsLayout Layout { get; set; }
public ICondition? Condition { get; set; }
- public int GetIndex();
+ bool IEquatable.Equals(IModObject? other)
+ => ReferenceEquals(this, other);
+}
+
+public interface IModOption : IModObject, IIndexed
+{
+ public string FullName { get; }
+
+ public int GroupIndex
+ => Group.Index;
+
+ public ColorId Color { get; set; }
+
+ IModObject? CycleChecker.IHasParent.Parent
+ => Group.Parent;
+
+ public static ColorId ConvertColor(int color)
+ => color switch
+ {
+ 1 => ColorId.OptionColor1,
+ 2 => ColorId.OptionColor2,
+ 3 => ColorId.OptionColor3,
+ 4 => ColorId.OptionColor4,
+ 5 => ColorId.OptionColor5,
+ 6 => ColorId.OptionColor6,
+ 7 => ColorId.OptionColor7,
+ 8 => ColorId.OptionColor8,
+ _ => default,
+ };
+
+ public int ColorAsInteger
+ => Color switch
+ {
+ ColorId.OptionColor1 => 1,
+ ColorId.OptionColor2 => 2,
+ ColorId.OptionColor3 => 3,
+ ColorId.OptionColor4 => 4,
+ ColorId.OptionColor5 => 5,
+ ColorId.OptionColor6 => 6,
+ ColorId.OptionColor7 => 7,
+ ColorId.OptionColor8 => 8,
+ _ => 0,
+ };
+
+ public bool IsEnabled(ModSettings settings)
+ {
+ var setting = settings.IsEmpty || settings.Settings.Count <= GroupIndex
+ ? Group.DefaultSettings
+ : settings.Settings[GroupIndex];
+ if (Group.Behaviour is GroupDrawBehaviour.MultiSelection)
+ return setting.HasFlag(Index);
+
+ return setting.AsIndex == Index;
+ }
+}
+
+public static class ModSettingsLayoutExtensions
+{
+ public const ModSettingsLayout GroupValid = ModSettingsLayout.Disable | ModSettingsLayout.Indent | ModSettingsLayout.ParentHeader | ModSettingsLayout.DefaultClosed;
+ public const ModSettingsLayout OptionValid = ModSettingsLayout.Disable | ModSettingsLayout.Separator;
+
+ extension(ModSettingsLayout layout)
+ {
+ public IEnumerable Iterate()
+ {
+ if (layout.HasFlag(ModSettingsLayout.Disable))
+ yield return ModSettingsLayout.Disable;
+ if (layout.HasFlag(ModSettingsLayout.Indent))
+ yield return ModSettingsLayout.Indent;
+ if (layout.HasFlag(ModSettingsLayout.ParentHeader))
+ yield return ModSettingsLayout.ParentHeader;
+ if (layout.HasFlag(ModSettingsLayout.Separator))
+ yield return ModSettingsLayout.Separator;
+ if (layout.HasFlag(ModSettingsLayout.DefaultClosed))
+ yield return ModSettingsLayout.DefaultClosed;
+ }
+
+ public ModSettingsLayout Reduce(IModObject @object)
+ => @object switch
+ {
+ IModGroup => layout & GroupValid,
+ IModOption => layout & OptionValid,
+ _ => 0,
+ };
+ }
}
diff --git a/Penumbra/Mods/SubMods/ImcSubMod.cs b/Penumbra/Mods/SubMods/ImcSubMod.cs
index 6e2bce4bd..cf2a41be0 100644
--- a/Penumbra/Mods/SubMods/ImcSubMod.cs
+++ b/Penumbra/Mods/SubMods/ImcSubMod.cs
@@ -2,6 +2,7 @@
using Newtonsoft.Json.Linq;
using Penumbra.GameData.Structs;
using Penumbra.Mods.Groups;
+using Penumbra.UI.Classes;
namespace Penumbra.Mods.SubMods;
@@ -9,6 +10,11 @@ public class ImcSubMod(ImcModGroup group) : IModOption
{
public readonly ImcModGroup Group = group;
+ public int Index { get; private set; } = -1;
+
+ public void SetIndex(int index)
+ => Index = index;
+
public ImcSubMod(ImcModGroup group, JToken json)
: this(group)
{
@@ -29,16 +35,20 @@ public Mod Mod
=> Group.Mod;
public ushort AttributeMask;
- public bool IsDisableSubMod { get; private init; }
+ public bool IsDisableSubMod { get; internal set; }
- Mod IModOption.Mod
+ Mod IModObject.Mod
=> Mod;
- IModGroup IModOption.Group
+ IModGroup IModObject.Group
=> Group;
+ public Guid Id { get; set; } = Guid.NewGuid();
+
public string Name { get; set; } = "Part";
+ public ColorId Color { get; set; }
+
public string FullName
=> $"{Group.Name}: {Name}";
diff --git a/Penumbra/Mods/SubMods/OptionSubMod.cs b/Penumbra/Mods/SubMods/OptionSubMod.cs
index 143d97112..6f635ec59 100644
--- a/Penumbra/Mods/SubMods/OptionSubMod.cs
+++ b/Penumbra/Mods/SubMods/OptionSubMod.cs
@@ -3,6 +3,7 @@
using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
using Penumbra.String.Classes;
+using Penumbra.UI.Classes;
namespace Penumbra.Mods.SubMods;
@@ -13,16 +14,23 @@ public abstract class OptionSubMod(IModGroup group) : IModOption, IModDataContai
public Mod Mod
=> Group.Mod;
+ public int Index { get; private set; } = -1;
+
+ public void SetIndex(int index)
+ => Index = index;
+
public string Name { get; set; } = "Option";
public string Description { get; set; } = string.Empty;
public ModSettingsLayout Layout { get; set; }
+ public ColorId Color { get; set; }
+
public ICondition? Condition { get; set; }
public string FullName
=> $"{Group.Name}: {Name}";
- Mod IModOption.Mod
+ Mod IModObject.Mod
=> Mod;
IMod IModDataContainer.Mod
@@ -31,7 +39,9 @@ IMod IModDataContainer.Mod
IModGroup IModDataContainer.Group
=> Group;
- IModGroup IModOption.Group
+ public Guid Id { get; set; } = Guid.NewGuid();
+
+ IModGroup IModObject.Group
=> Group;
public Dictionary Files { get; set; } = [];
@@ -51,7 +61,7 @@ public string GetFullName()
=> FullName;
public (int GroupIndex, int DataIndex) GetDataIndices()
- => (Group.GetIndex(), GetDataIndex());
+ => (Group.Index, GetDataIndex());
public int GetIndex()
=> SubMod.GetIndex(this);
diff --git a/Penumbra/Mods/SubMods/SubMod.cs b/Penumbra/Mods/SubMods/SubMod.cs
index 0a9858ded..4cbde85c0 100644
--- a/Penumbra/Mods/SubMods/SubMod.cs
+++ b/Penumbra/Mods/SubMods/SubMod.cs
@@ -3,6 +3,7 @@
using Newtonsoft.Json.Linq;
using Penumbra.Meta.Manipulations;
using Penumbra.String.Classes;
+using Penumbra.UI.Classes;
namespace Penumbra.Mods.SubMods;
@@ -127,5 +128,11 @@ public static void WriteModOption(JsonWriter j, IModOption option)
j.WriteValue(option.Name);
j.WritePropertyName(nameof(option.Description));
j.WriteValue(option.Description);
+ var color = option.ColorAsInteger;
+ if (color is not 0)
+ {
+ j.WritePropertyName(nameof(option.Color));
+ j.WriteValue(color);
+ }
}
}
diff --git a/Penumbra/Penumbra.cs b/Penumbra/Penumbra.cs
index d97585987..659a9deea 100644
--- a/Penumbra/Penumbra.cs
+++ b/Penumbra/Penumbra.cs
@@ -233,9 +233,10 @@ private void GatherRelevantPlugins(StringBuilder sb)
"Glamourer", "CustomizePlus", "SimpleHeels",
"Ktisis", "Brio",
"heliosphere-plugin", "VfxEditor", "IllusioVitae", "Aetherment",
- "DynamicBridge", "GagSpeak", "ProjectGagSpeak", "RoleplayingVoiceDalamud", "AQuestReborn", "Proteus", "DragAndDropTexturing", "CharacterSelectPlugin",
+ "DynamicBridge", "GagSpeak", "ProjectGagSpeak", "RoleplayingVoiceDalamud", "AQuestReborn", "Proteus", "DragAndDropTexturing",
+ "CharacterSelectPlugin",
"MareSynchronos", "LoporritSync", "KittenSync", "Snowcloak", "LightlessSync", "Sphene", "XivSync",
- "MareSempiterne" /* PlayerSync */, "AnatoliIliou", "LaciSynchroni",
+ "MareSempiterne" /* PlayerSync */, "AnatoliIliou", "LaciSynchroni",
];
var plugins = _services.GetService().InstalledPlugins
.GroupBy(p => p.InternalName)
@@ -244,8 +245,16 @@ private void GatherRelevantPlugins(StringBuilder sb)
var item = g.OrderByDescending(p => p.IsLoaded).ThenByDescending(p => p.Version).First();
return (item.IsLoaded, item.Version, item.Name);
});
+
+ foreach (var plugin in IpcProviders.Callers.OrderBy(p => p.Name).ThenBy(p => p.Version))
+ sb.Append($"> **`{plugin.Name + ':',-29}`** {plugin.Version} (IPC)\n");
+
foreach (var plugin in relevantPlugins)
{
+ // Skip plugins included through caller tracking.
+ if (IpcProviders.Callers.Any(c => c.InternalName == plugin))
+ continue;
+
if (plugins.TryGetValue(plugin, out var data))
sb.Append($"> **`{data.Name + ':',-29}`** {data.Version}{(data.IsLoaded ? string.Empty : " (Disabled)")}\n");
}
@@ -285,7 +294,8 @@ public string GatherSupportInformation()
$"> **`Synchronous Load (Dalamud): `** {(_services.GetService().GetDalamudConfig(DalamudConfigService.WaitingForPluginsOption, out bool v) ? v.ToString() : "Unknown")} (first Start: {hdrEnabler.FirstLaunchWaitForPluginsState?.ToString() ?? "Unknown"})\n");
sb.Append(
$"> **`Logging: `** Log: {_config.Filters.ResourceLoggerWriteToLog}, Watcher: {_config.Filters.ResourceLoggerEnabled} ({_config.Filters.ResourceLoggerMaxEntries})\n");
- sb.Append($"> **`Use Ownership: `** {_config.UseOwnerNameForCharacterCollection}\n");
+ sb.Append(
+ $"> **`Use Ownership: `** {_config.UseOwnerNameForCharacterCollection} (Hostiles: {_config.UseOwnerForHostiles})\n");
GatherRelevantPlugins(sb);
sb.AppendLine("**Mods**");
sb.Append($"> **`Installed Mods: `** {_modManager.Count}\n");
diff --git a/Penumbra/Penumbra.csproj b/Penumbra/Penumbra.csproj
index 2241f124a..85161d047 100644
--- a/Penumbra/Penumbra.csproj
+++ b/Penumbra/Penumbra.csproj
@@ -53,10 +53,10 @@
-
-
-
-
+
+
+
+
diff --git a/Penumbra/Services/ArchiveExtractionNotification.cs b/Penumbra/Services/ArchiveExtractionNotification.cs
new file mode 100644
index 000000000..3fa7c8f62
--- /dev/null
+++ b/Penumbra/Services/ArchiveExtractionNotification.cs
@@ -0,0 +1,91 @@
+using Dalamud.Interface.ImGuiNotification;
+using Dalamud.Interface.ImGuiNotification.EventArgs;
+using ImSharp;
+using Luna;
+
+namespace Penumbra.Services;
+
+public sealed class ArchiveExtractionNotification(MessageService messageService)
+ : AmassingNotification(messageService), IService
+{
+ public readonly record struct ArchiveInfo(string ArchiveName, int ModCount);
+
+ private volatile bool _isExtracting;
+ private volatile int _currentEntryIndex;
+ private volatile int _totalEntries;
+ private volatile string? _currentEntryName;
+
+ private bool _wasExtracting;
+
+ public void AddArchive(string archiveName, int modCount)
+ => AddObject(new ArchiveInfo(archiveName, modCount));
+
+ public void SetProgress(int currentEntry, int totalEntries, string entryName)
+ {
+ _currentEntryIndex = currentEntry;
+ _totalEntries = totalEntries;
+ _currentEntryName = entryName;
+ _isExtracting = true;
+ }
+
+ public void ClearProgress()
+ {
+ _isExtracting = false;
+ _currentEntryIndex = 0;
+ _totalEntries = 0;
+ _currentEntryName = null;
+ }
+
+ public override NotificationType NotificationType
+ => NotificationType.Info;
+
+ public override string NotificationTitle
+ => Count switch
+ {
+ 1 => $"Extracting mods from {GatheredObjects[0].ArchiveName}",
+ _ => $"Extracting mods from {Count} archives",
+ };
+
+ public override string NotificationMessage
+ => _isExtracting
+ ? $"Extracting '{_currentEntryName}'..."
+ : "Waiting...";
+
+ public override TimeSpan NotificationDuration
+ => TimeSpan.MaxValue;
+
+ public override void NotificationActions(INotificationDrawArgs args)
+ {
+ if (_isExtracting)
+ {
+ _wasExtracting = true;
+ var total = _totalEntries;
+ if (total > 0 && CurrentNotification is { } notification)
+ {
+ notification.Progress = _currentEntryIndex / (float)total;
+ notification.Content = $"Extracting '{_currentEntryName}' ({_currentEntryIndex + 1} of {total})...";
+ }
+ }
+ else if (_wasExtracting)
+ {
+ _wasExtracting = false;
+ if (CurrentNotification is { } notification)
+ {
+ notification.Progress = 1.0f;
+ notification.Content = "Extraction complete.";
+ notification.InitialDuration = TimeSpan.FromSeconds(15);
+ }
+ }
+ }
+
+ protected override StoredNotification CreateStored(in ArchiveInfo @object)
+ => new Stored(this, @object);
+
+ private sealed class Stored(ArchiveExtractionNotification parent, ArchiveInfo info)
+ : StoredNotification(parent, info)
+ {
+ public override string LogMessage { get; } = $"Extracted {info.ModCount} mod(s) from {info.ArchiveName}.";
+ public override StringU8 StoredMessage { get; } = new($"[{info.ArchiveName}] {info.ModCount} mod(s) extracted.");
+ public override StringU8 StoredTooltip { get; } = new($"Archive: {info.ArchiveName}\nMods found: {info.ModCount}");
+ }
+}
diff --git a/Penumbra/Services/FileWatcher.cs b/Penumbra/Services/FileWatcher.cs
index b2eab1e1a..47724eb5f 100644
--- a/Penumbra/Services/FileWatcher.cs
+++ b/Penumbra/Services/FileWatcher.cs
@@ -1,6 +1,10 @@
-using ImSharp;
+using ImSharp;
using Luna;
using Penumbra.Mods.Manager;
+using SharpCompress.Archives;
+using SharpCompress.Archives.Rar;
+using SharpCompress.Archives.SevenZip;
+using ZipArchive = SharpCompress.Archives.Zip.ZipArchive;
namespace Penumbra.Services;
@@ -8,23 +12,46 @@ public sealed class FileWatcher : IDisposable, IService
{
private readonly ConcurrentSet _pending = new(StringComparer.OrdinalIgnoreCase);
private readonly ConcurrentDictionary _ignored = new(StringComparer.OrdinalIgnoreCase);
+ private readonly ConcurrentDictionary _extractedArchives = new(StringComparer.OrdinalIgnoreCase);
private readonly ModImportManager _modImportManager;
private readonly MessageService _messageService;
private readonly Configuration _config;
+ private readonly ArchiveExtractionNotification _archiveExtractionNotification;
private bool _pausedConsumer;
private FileSystemWatcher? _fsw;
private CancellationTokenSource? _cts = new();
private Task? _consumer;
+ private int _pendingNotifications;
+
+ /// The maximum number of concurrently open "new mod found" install notifications before further ones are deferred.
+ private const int MaxPendingNotifications = 3;
/// The time-to-live of ignore entries, in the same unit as , namely milliseconds.
private const long IgnoreTimeToLive = 60000L;
- public FileWatcher(ModImportManager modImportManager, MessageService messageService, Configuration config)
+ private static readonly HashSet ModExtensions =
+ new(StringComparer.OrdinalIgnoreCase) { ".pmp", ".pcp", ".ttmp", ".ttmp2" };
+
+ private static readonly HashSet ContainerExtensions =
+ new(StringComparer.OrdinalIgnoreCase) { ".zip", ".rar", ".7z" };
+
+ private static string GetTempPath(string basePath)
+ => Path.Combine(basePath, "Penumbra-FileWatcher");
+
+ ///
+ /// Subdirectory under the system temp directory used for extracted archive entries.
+ ///
+
+ public FileWatcher(ModImportManager modImportManager, MessageService messageService, Configuration config,
+ ArchiveExtractionNotification archiveExtractionNotification)
{
- _modImportManager = modImportManager;
- _messageService = messageService;
- _config = config;
+ _modImportManager = modImportManager;
+ _messageService = messageService;
+ _config = config;
+ _archiveExtractionNotification = archiveExtractionNotification;
+
+ WipeTempRoot(_config.WatchDirectory);
if (_config.EnableDirectoryWatch)
{
@@ -52,12 +79,38 @@ public void Toggle(bool value)
}
}
+ public void ToggleContainerPeeking(bool value)
+ {
+ if (_config.EnableContainerPeeking == value)
+ return;
+
+ _config.EnableContainerPeeking = value;
+ _config.Save();
+
+ // Re-create the FSW so its filter list reflects the new state.
+ if (_config.EnableDirectoryWatch && _fsw is not null)
+ SetupFileWatcher(_config.WatchDirectory);
+ }
+
public void IgnoreFile(string fullPath)
{
if (_config.EnableDirectoryWatch)
_ignored[fullPath] = Environment.TickCount64 + IgnoreTimeToLive;
}
+ ///
+ /// Deletes every extracted archive directory tracked by this instance. Called from the debug drawer.
+ ///
+ public void CleanExtracted()
+ {
+ foreach (var dir in _extractedArchives.Keys.ToList())
+ {
+ if (TryDeleteDirectory(dir))
+ _extractedArchives.TryRemove(dir, out _);
+ }
+ Penumbra.Log.Verbose("[FileWatcher] Manual cleanup of extracted archives requested.");
+ }
+
private void EndFileWatcher()
{
if (_fsw is null)
@@ -77,18 +130,24 @@ private void SetupFileWatcher(string directory)
InternalBufferSize = 32 * 1024,
};
- // Only wake us for the exact patterns we care about
+ // Only wake us for the exact patterns we care about.
_fsw.Filters.Add("*.pmp");
_fsw.Filters.Add("*.pcp");
_fsw.Filters.Add("*.ttmp");
_fsw.Filters.Add("*.ttmp2");
+ if (_config.EnableContainerPeeking)
+ {
+ _fsw.Filters.Add("*.zip");
+ _fsw.Filters.Add("*.rar");
+ _fsw.Filters.Add("*.7z");
+ }
+
_fsw.Created += OnPath;
_fsw.Renamed += OnPath;
UpdateDirectory(directory);
}
-
private void EndConsumerTask()
{
if (_cts is not null)
@@ -134,8 +193,14 @@ public void UpdateDirectory(string newPath)
private void OnPath(object? sender, FileSystemEventArgs e)
{
- if (!_ignored.TryRemove(e.FullPath, out var expiresAtTickCount) || expiresAtTickCount <= Environment.TickCount64)
- _pending.TryAdd(e.FullPath);
+ if (_ignored.TryRemove(e.FullPath, out var expiresAtTickCount) && expiresAtTickCount > Environment.TickCount64)
+ {
+ Penumbra.Log.Verbose($"[FileWatcher] FSW event for '{e.FullPath}' suppressed by ignore list.");
+ return;
+ }
+
+ if (_pending.TryAdd(e.FullPath))
+ Penumbra.Log.Verbose($"[FileWatcher] FSW event for '{e.FullPath}' enqueued.");
}
private async Task ConsumerLoopAsync(CancellationToken token)
@@ -143,6 +208,7 @@ private async Task ConsumerLoopAsync(CancellationToken token)
while (true)
{
GarbageCollectIgnored();
+
var path = _pending.FirstOrDefault();
if (path is null || _pausedConsumer)
{
@@ -150,9 +216,24 @@ private async Task ConsumerLoopAsync(CancellationToken token)
continue;
}
+ var totalSw = Stopwatch.StartNew();
+ Penumbra.Log.Verbose($"[FileWatcher] Picked up '{path}' from queue.");
+
+ var removePath = true;
try
{
- await ProcessOneAsync(path, token).ConfigureAwait(false);
+ var ext = Path.GetExtension(path);
+ if (ContainerExtensions.Contains(ext))
+ {
+ if (_config.EnableContainerPeeking)
+ await ProcessContainerAsync(path, token).ConfigureAwait(false);
+ // else: peeking was toggled off after the event was queued; drop silently.
+ }
+ else if (ModExtensions.Contains(ext))
+ {
+ removePath = await ProcessOneAsync(path, token).ConfigureAwait(false);
+ }
+ // else: extension we don't recognise (shouldn't happen given filters); drop silently.
}
catch (OperationCanceledException)
{
@@ -164,7 +245,11 @@ private async Task ConsumerLoopAsync(CancellationToken token)
}
finally
{
- _pending.TryRemove(path);
+ if (removePath)
+ {
+ _pending.TryRemove(path);
+ Penumbra.Log.Verbose($"[FileWatcher] Finished '{path}' in {totalSw.ElapsedMilliseconds}ms.");
+ }
}
}
}
@@ -178,54 +263,327 @@ private void GarbageCollectIgnored()
}
}
- private async Task ProcessOneAsync(string path, CancellationToken token)
+ private async Task ProcessOneAsync(string path, CancellationToken token)
+ {
+ if (!await WaitForStableAsync(path, token).ConfigureAwait(false))
+ return true;
+
+ if (!_config.EnableAutomaticModImport && _pendingNotifications >= MaxPendingNotifications)
+ return false;
+
+ Penumbra.Log.Verbose($"[FileWatcher] Triggering import for '{path}'.");
+ _ = TriggerImport(path);
+ return true;
+ }
+
+ ///
+ /// Polls the file until two consecutive size readings match, indicating the writer is done.
+ /// Returns false if the file never settled within the retry budget or the token was canceled.
+ ///
+ private static async Task WaitForStableAsync(string path, CancellationToken token)
{
- // Downloads often finish via rename; file may be locked briefly.
- // Wait until it exists and is readable; also require two stable size checks.
const int maxTries = 40;
- long lastLen = -1;
+ long lastLen = -1;
+ var sw = Stopwatch.StartNew();
for (var i = 0; i < maxTries && !token.IsCancellationRequested; i++)
{
if (!File.Exists(path))
{
- await Task.Delay(100, token);
+ await Task.Delay(100, token).ConfigureAwait(false);
continue;
}
try
{
- var fi = new FileInfo(path);
- var len = fi.Length;
+ var len = new FileInfo(path).Length;
if (len > 0 && len == lastLen)
{
- if (_config.EnableAutomaticModImport)
- _modImportManager.AddUnpack(path);
- else
- _messageService.AddMessage(new InstallNotification(_modImportManager, path), false);
- return;
+ Penumbra.Log.Verbose(
+ $"[FileWatcher] '{path}' stable at {len} bytes after {sw.ElapsedMilliseconds}ms ({i + 1} polls).");
+ return true;
}
lastLen = len;
}
catch (IOException)
{
- Penumbra.Log.Debug($"[FileWatcher] File is still being written to.");
+ Penumbra.Log.Debug("[FileWatcher] File is still being written to.");
}
catch (UnauthorizedAccessException)
{
- Penumbra.Log.Debug($"[FileWatcher] File is locked.");
+ Penumbra.Log.Debug("[FileWatcher] File is locked.");
}
- await Task.Delay(150, token);
+ await Task.Delay(150, token).ConfigureAwait(false);
+ }
+
+ Penumbra.Log.Verbose($"[FileWatcher] '{path}' did not stabilize within {sw.ElapsedMilliseconds}ms.");
+ return false;
+ }
+
+ private Task TriggerImport(string path)
+ {
+ if (_config.EnableAutomaticModImport)
+ return _modImportManager.AddUnpack(path);
+ else
+ {
+ var tcs = new TaskCompletionSource();
+ Interlocked.Increment(ref _pendingNotifications);
+ tcs.Task.ContinueWith(_ => Interlocked.Decrement(ref _pendingNotifications), TaskScheduler.Default);
+ _messageService.AddMessage(new InstallNotification(_modImportManager, path, tcs), false);
+ return tcs.Task;
}
}
+ ///
+ /// Opens an archive, scans entries for mod files (by entry-name extension only), extracts matches
+ /// into a per-archive subdirectory of , then queues each extracted file via
+ /// . Per-archive subdirectory keeps the original filename intact for the UI.
+ ///
+ private async Task ProcessContainerAsync(string path, CancellationToken token)
+ {
+ if (!await WaitForStableAsync(path, token).ConfigureAwait(false))
+ return;
+
+ var ext = Path.GetExtension(path);
+ string? archiveDir = null;
+ var extractedNow = new List();
+
+ try
+ {
+ var openSw = Stopwatch.StartNew();
+ Penumbra.Log.Verbose($"[FileWatcher] Opening container '{path}'.");
+ using var archive = OpenArchive(path, ext);
+ if (archive is null)
+ return;
+ Penumbra.Log.Verbose(
+ $"[FileWatcher] Opened container '{path}' in {openSw.ElapsedMilliseconds}ms.");
+
+ var enumSw = Stopwatch.StartNew();
+ var candidates = archive.Entries
+ .Where(e => !e.IsDirectory
+ && e.Key is { Length: > 0 } key
+ && ModExtensions.Contains(Path.GetExtension(key)))
+ .ToList();
+ Penumbra.Log.Verbose(
+ $"[FileWatcher] Enumerated entries of '{path}' in {enumSw.ElapsedMilliseconds}ms; {candidates.Count} mod entries found.");
+
+ // Silent ignore for archives that contain nothing relevant
+ if (candidates.Count == 0)
+ return;
+
+ var archiveName = Path.GetFileName(path);
+ _archiveExtractionNotification.AddArchive(archiveName, candidates.Count);
+
+ Directory.CreateDirectory(GetTempPath(_config.WatchDirectory));
+ archiveDir = Path.Combine(GetTempPath(_config.WatchDirectory), Guid.NewGuid().ToString("N"));
+ Directory.CreateDirectory(archiveDir);
+
+ foreach (var entry in candidates)
+ {
+ token.ThrowIfCancellationRequested();
+
+ if (entry.IsEncrypted)
+ {
+ Penumbra.Log.Warning(
+ $"[FileWatcher] Skipping encrypted entry '{entry.Key}' in container '{path}'.");
+ continue;
+ }
+
+ var safeName = Path.GetFileName(entry.Key!);
+ var tempPath = Path.Combine(archiveDir, safeName);
+
+ if (File.Exists(tempPath))
+ {
+ Penumbra.Log.Warning(
+ $"[FileWatcher] Duplicate entry name '{safeName}' in container '{path}'; skipping later occurrence.");
+ continue;
+ }
+
+ _archiveExtractionNotification.SetProgress(extractedNow.Count, candidates.Count, safeName);
+
+ try
+ {
+ var extractSw = Stopwatch.StartNew();
+ long bytesWritten;
+ await using (var input = entry.OpenEntryStream())
+ await using (var output = new FileStream(tempPath, FileMode.CreateNew, FileAccess.Write,
+ FileShare.None, 81920, useAsync: true))
+ {
+ await input.CopyToAsync(output, 81920, token).ConfigureAwait(false);
+ bytesWritten = output.Position;
+ }
+
+ Penumbra.Log.Verbose(
+ $"[FileWatcher] Extracted '{safeName}' ({bytesWritten} bytes) in {extractSw.ElapsedMilliseconds}ms.");
+ extractedNow.Add(tempPath);
+ }
+ catch (OperationCanceledException)
+ {
+ TryDelete(tempPath);
+ throw;
+ }
+ catch (Exception ex)
+ {
+ Penumbra.Log.Warning(
+ $"[FileWatcher] Failed to extract '{entry.Key}' from '{path}': {ex.Message}");
+ TryDelete(tempPath);
+ }
+
+ // Yield between entries so a large archive doesn't monopolise the worker thread
+ // while the game is rendering.
+ await Task.Yield();
+ }
+
+ _archiveExtractionNotification.ClearProgress();
+
+ if (extractedNow.Count > 0)
+ _extractedArchives[archiveDir] = Environment.TickCount64;
+ else
+ TryDeleteDirectory(archiveDir);
+ }
+ catch (OperationCanceledException)
+ {
+ _archiveExtractionNotification.ClearProgress();
+ if (archiveDir is not null)
+ TryDeleteDirectory(archiveDir);
+ throw;
+ }
+ catch (Exception ex)
+ {
+ _archiveExtractionNotification.ClearProgress();
+ Penumbra.Log.Warning($"[FileWatcher] Failed to read container '{path}': {ex.Message}");
+ if (archiveDir is not null)
+ TryDeleteDirectory(archiveDir);
+ return;
+ }
+
+ // Hand each extracted file off as if it were a fresh drop. The freshly-closed stream means
+ // we can skip WaitForStableAsync here and call TriggerImport directly.
+ var allSucceeded = true;
+ foreach (var tempPath in extractedNow)
+ {
+ var succeeded = false;
+ try
+ {
+ Penumbra.Log.Verbose($"[FileWatcher] Triggering import for extracted '{tempPath}'.");
+ var results = await TriggerImport(tempPath).ConfigureAwait(false);
+ succeeded = results.Length > 0 && results.All(r => r.Error is null);
+
+ foreach (var result in results)
+ {
+ if (result.Error is not null)
+ Penumbra.Log.Warning(
+ $"[FileWatcher] Import of '{result.File.Name}' encountered an error: {result.Error.Message}");
+ }
+ }
+ catch (Exception ex)
+ {
+ Penumbra.Log.Warning(
+ $"[FileWatcher] Failed to import extracted file '{tempPath}': {ex.Message}");
+ }
+
+ if (succeeded)
+ {
+ if (TryDelete(tempPath))
+ Penumbra.Log.Verbose($"[FileWatcher] Deleted extracted temp file '{tempPath}'.");
+ else
+ Penumbra.Log.Warning($"[FileWatcher] Could not delete extracted temp file '{tempPath}'.");
+ }
+ else
+ {
+ allSucceeded = false;
+ }
+ }
+
+ if (archiveDir is not null && allSucceeded)
+ {
+ if (TryDeleteDirectory(archiveDir))
+ {
+ _extractedArchives.TryRemove(archiveDir, out _);
+ Penumbra.Log.Verbose($"[FileWatcher] Cleaned up archive temp directory '{archiveDir}'.");
+ }
+ else
+ {
+ Penumbra.Log.Warning(
+ $"[FileWatcher] Could not fully clean archive temp directory '{archiveDir}'; "
+ + "it will remain tracked for manual cleanup.");
+ }
+ }
+ }
+
+ private static IArchive? OpenArchive(string path, string extension)
+ => extension.ToLowerInvariant() switch
+ {
+ ".zip" => ZipArchive.OpenArchive(path),
+ ".rar" => RarArchive.OpenArchive(path),
+ ".7z" => SevenZipArchive.OpenArchive(path),
+ _ => null,
+ };
+
+ private static void WipeTempRoot(string watchDir)
+ {
+ try
+ {
+ if (Directory.Exists(GetTempPath(watchDir)))
+ {
+ foreach (var entry in Directory.EnumerateFileSystemEntries(GetTempPath(watchDir)))
+ {
+ if (Directory.Exists(entry))
+ TryDeleteDirectory(entry);
+ else
+ TryDelete(entry);
+ }
+ }
+ else
+ {
+ Directory.CreateDirectory(GetTempPath(watchDir));
+ }
+ }
+ catch (Exception ex)
+ {
+ Penumbra.Log.Warning($"[FileWatcher] Could not prepare temp root '{GetTempPath(watchDir)}': {ex.Message}");
+ }
+ }
+
+ private static bool TryDelete(string path)
+ {
+ try
+ {
+ if (File.Exists(path))
+ File.Delete(path);
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+
+ private static bool TryDeleteDirectory(string path)
+ {
+ try
+ {
+ if (Directory.Exists(path))
+ Directory.Delete(path, recursive: true);
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+
+ return true; // Ignore this path.
+ }
+
public void Dispose()
{
EndConsumerTask();
EndFileWatcher();
+ // Cleanup of extracted files is intentionally skipped here. WipeTempRoot() on the next
+ // construction handles leftovers without blocking shutdown.
}
public sealed class FileWatcherDrawer(Configuration config, FileWatcher fileWatcher) : IUiService
@@ -246,9 +604,15 @@ public void Draw()
table.DrawColumn("Automatic Import"u8);
table.DrawColumn($"{config.EnableAutomaticModImport}");
+ table.DrawColumn("Container Peeking"u8);
+ table.DrawColumn($"{config.EnableContainerPeeking}");
+
table.DrawColumn("Watched Directory"u8);
table.DrawColumn(config.WatchDirectory);
+ table.DrawColumn("Temp Root"u8);
+ table.DrawColumn(GetTempPath(config.WatchDirectory));
+
table.DrawColumn("File Watcher Path"u8);
table.DrawColumn(fileWatcher._fsw?.Path ?? "");
@@ -277,6 +641,25 @@ public void Draw()
<= 0 => $" {entry.Key}",
var ttl => $"<{ttl}ms> {entry.Key}",
}).ToList()));
+
+ table.DrawColumn("Extracted Archives"u8);
+ table.DrawColumn(StringU8.Join((byte)'\n', fileWatcher._extractedArchives.Select(entry =>
+ {
+ var ageSec = (Environment.TickCount64 - entry.Value) / 1000;
+ var fileCount = TryCountFiles(entry.Key);
+ return $"<{ageSec}s, {fileCount} files> {entry.Key}";
+ }).ToList()));
+
+ table.DrawColumn("Clean Extracted"u8);
+ table.NextColumn();
+ if (Im.SmallButton("Delete All Extracted"u8))
+ fileWatcher.CleanExtracted();
+ }
+
+ private static int TryCountFiles(string dir)
+ {
+ try { return Directory.Exists(dir) ? Directory.EnumerateFiles(dir).Count() : 0; }
+ catch { return 0; }
}
}
}
diff --git a/Penumbra/Services/InstallNotification.cs b/Penumbra/Services/InstallNotification.cs
index 71c6884f1..44c665ca0 100644
--- a/Penumbra/Services/InstallNotification.cs
+++ b/Penumbra/Services/InstallNotification.cs
@@ -6,8 +6,11 @@
namespace Penumbra.Services;
-public class InstallNotification(ModImportManager modImportManager, string filePath) : Luna.IMessage
+public class InstallNotification(ModImportManager modImportManager, string filePath, TaskCompletionSource tcs)
+ : Luna.INotificationAwareMessage
{
+ private bool _reportCancellationOnDismissal = true;
+
public NotificationType NotificationType
=> NotificationType.Info;
@@ -37,7 +40,9 @@ public void OnNotificationActions(INotificationDrawArgs args)
var buttonSize = new Vector2((region.X - Im.Style.ItemSpacing.X) / 2, 0);
if (Im.Button("Install"u8, buttonSize))
{
- modImportManager.AddUnpack(filePath);
+ _reportCancellationOnDismissal = false;
+ modImportManager.AddUnpack(filePath)
+ .ContinueWith(tcs.SetFromTask);
args.Notification.DismissNow();
}
@@ -45,4 +50,13 @@ public void OnNotificationActions(INotificationDrawArgs args)
if (Im.Button("Ignore"u8, buttonSize))
args.Notification.DismissNow();
}
+
+ public void OnNotificationCreated(IActiveNotification notification)
+ {
+ notification.Dismiss += _ =>
+ {
+ if (_reportCancellationOnDismissal)
+ tcs.SetResult([]);
+ };
+ }
}
diff --git a/Penumbra/Services/MigrationManager.cs b/Penumbra/Services/MigrationManager.cs
index 34cf864f1..b6612755e 100644
--- a/Penumbra/Services/MigrationManager.cs
+++ b/Penumbra/Services/MigrationManager.cs
@@ -244,7 +244,7 @@ public void MigrateMdlDuringExtraction(ArchiveUtility.ReaderShim reader, string
return;
}
- var path = Path.Combine(directory, reader.Entry.Key!);
+ var path = Path.CombineSafely(directory, reader.Entry.Key!);
using var s = new MemoryStream();
using var e = reader.OpenEntryStream();
e.CopyTo(s);
@@ -276,7 +276,7 @@ public void MigrateMtrlDuringExtraction(ArchiveUtility.ReaderShim reader, string
return;
}
- var path = Path.Combine(directory, reader.Entry.Key);
+ var path = Path.CombineSafely(directory, reader.Entry.Key);
using var s = new MemoryStream();
using var e = reader.OpenEntryStream();
e.CopyTo(s);
@@ -299,7 +299,7 @@ public void MigrateMtrlDuringExtraction(ArchiveUtility.ReaderShim reader, string
public void FixMipMaps(ArchiveUtility.ReaderShim reader, string directory)
{
- var path = Path.Combine(directory, reader.Entry.Key!);
+ var path = Path.CombineSafely(directory, reader.Entry.Key!);
using var s = new MemoryStream();
using var e = reader.OpenEntryStream();
e.CopyTo(s);
diff --git a/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs b/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs
index d7da7a148..d19cd2450 100644
--- a/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs
+++ b/Penumbra/UI/AdvancedWindow/ItemSwapTab.cs
@@ -780,7 +780,8 @@ private void OnInheritanceChange(in CollectionInheritanceChanged.Arguments argum
private void OnModOptionChange(in ModOptionChanged.Arguments arguments)
{
- if (arguments.Type is ModOptionChangeType.PrepareChange or ModOptionChangeType.PrepareGroupDeletion or ModOptionChangeType.GroupAdded or ModOptionChangeType.OptionAdded
+ if (arguments.Type is ModOptionChangeType.PrepareChange or ModOptionChangeType.PrepareGroupDeletion or ModOptionChangeType.GroupAdded
+ or ModOptionChangeType.OptionAdded or ModOptionChangeType.ConditionChanged
|| arguments.Mod != _mod)
return;
diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs
index 189ba0166..a4952ab98 100644
--- a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs
+++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs
@@ -115,7 +115,7 @@ public void ChangeOption(IModDataContainer? subMod)
{
AppendTask(() =>
{
- var (groupIdx, dataIdx) = subMod?.GetDataIndices() ?? (-1, 0);
+ var (groupIdx, dataIdx) = (subMod?.GroupIndex ?? -1, subMod?.Index ?? 0);
_editor.LoadOption(groupIdx, dataIdx).Wait();
});
}
diff --git a/Penumbra/UI/Classes/Colors.cs b/Penumbra/UI/Classes/Colors.cs
index 9eadb7063..bb3ce4814 100644
--- a/Penumbra/UI/Classes/Colors.cs
+++ b/Penumbra/UI/Classes/Colors.cs
@@ -35,6 +35,14 @@ public enum ColorId : short
TemporaryModSettingsTint,
ChangedItemPreferenceStar,
NoTint,
+ OptionColor1,
+ OptionColor2,
+ OptionColor3,
+ OptionColor4,
+ OptionColor5,
+ OptionColor6,
+ OptionColor7,
+ OptionColor8,
}
public static class Colors
@@ -47,6 +55,7 @@ public static class Colors
public const uint FilterActive = 0x807070FF;
public const uint TutorialMarker = 0xFF20FFFF;
public const uint TutorialBorder = 0xD00000FF;
+ private const string OptionColorTooltip = "A color used for the selectable text or label for a mod option. The mod creator can associate one of these 8 colors (or none for default text), but you can choose the actual color.";
public static (uint DefaultColor, string Name, string Description) Data(this ColorId color)
=> color switch
@@ -83,6 +92,14 @@ public static (uint DefaultColor, string Name, string Description) Data(this Col
ColorId.NewModTint => ( 0x8000FF00, "New Mod Tint", "A mod that was newly imported or created during this session and has not been enabled yet. This color is used as a tint for the regular state colors."),
ColorId.NoTint => ( 0x00000000, "No Tint", "The default tint for all mods."),
ColorId.ChangedItemPreferenceStar => ( 0x30FFFFFF, "Preferred Changed Item Star", "The color of the star button in the mod panel's changed items tab to prioritize specific items."),
+ ColorId.OptionColor1 => ( 0xFFF8CD8E, "Selectable Color for Mod Option #1", OptionColorTooltip),
+ ColorId.OptionColor2 => ( 0xFFAAD898, "Selectable Color for Mod Option #2", OptionColorTooltip),
+ ColorId.OptionColor3 => ( 0xFF8AD1E6, "Selectable Color for Mod Option #3", OptionColorTooltip),
+ ColorId.OptionColor4 => ( 0xFF6B8CD9, "Selectable Color for Mod Option #4", OptionColorTooltip),
+ ColorId.OptionColor5 => ( 0xFFA38FD9, "Selectable Color for Mod Option #5", OptionColorTooltip),
+ ColorId.OptionColor6 => ( 0xFFDB9DB3, "Selectable Color for Mod Option #6", OptionColorTooltip),
+ ColorId.OptionColor7 => ( 0xFF6A5CC7, "Selectable Color for Mod Option #7", OptionColorTooltip),
+ ColorId.OptionColor8 => ( 0xFF6BB5A6, "Selectable Color for Mod Option #8", OptionColorTooltip),
_ => throw new ArgumentOutOfRangeException( nameof( color ), color, null ),
// @formatter:on
};
diff --git a/Penumbra/UI/Combos/Combos.cs b/Penumbra/UI/Combos/Combos.cs
index 9ad45bb88..802baedd5 100644
--- a/Penumbra/UI/Combos/Combos.cs
+++ b/Penumbra/UI/Combos/Combos.cs
@@ -7,7 +7,7 @@ namespace Penumbra.UI;
public static class Combos
{
- public static readonly EnumCombo ModelRace = new(ModelRaceExtensions.ToNameU8, ModelRaceExtensions.ToName);
+ public static readonly EnumCombo ModelRace = new(ModelRaceExtensions.ToNameU8, ModelRaceExtensions.ToName, null, GameData.Enums.ModelRace.Values.Skip(1).ToArray());
public static readonly EnumCombo TailedRace = new(ModelRaceExtensions.ToNameU8, ModelRaceExtensions.ToName, null, [GameData.Enums.ModelRace.Miqote, GameData.Enums.ModelRace.AuRa, GameData.Enums.ModelRace.Hrothgar]);
public static readonly EnumCombo Gender = new(GenderExtensions.ToNameU8, GenderExtensions.ToName);
diff --git a/Penumbra/UI/Combos/OptionSelectCombo.cs b/Penumbra/UI/Combos/OptionSelectCombo.cs
index 72c462594..dae0a4b06 100644
--- a/Penumbra/UI/Combos/OptionSelectCombo.cs
+++ b/Penumbra/UI/Combos/OptionSelectCombo.cs
@@ -18,8 +18,8 @@ public sealed class Option(IModDataContainer container)
{
public readonly IModDataContainer? Container = container;
public readonly StringU8 FullName = new(container.GetFullName());
- public readonly int GroupIndex = container.Group?.GetIndex() ?? -1;
- public readonly int DataIndex = container.GetDataIndices().DataIndex;
+ public readonly int GroupIndex = container.GroupIndex;
+ public readonly int DataIndex = container.Index;
}
private readonly Im.ColorStyleDisposable _border = new();
diff --git a/Penumbra/UI/Combos/SingleGroupCombo.cs b/Penumbra/UI/Combos/SingleGroupCombo.cs
index 1bc5f15d7..b8cf8030f 100644
--- a/Penumbra/UI/Combos/SingleGroupCombo.cs
+++ b/Penumbra/UI/Combos/SingleGroupCombo.cs
@@ -2,6 +2,8 @@
using Luna;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
+using Penumbra.Mods.SubMods;
+using Penumbra.UI.Classes;
using Penumbra.UI.ModsTab.Groups;
namespace Penumbra.UI;
@@ -24,7 +26,7 @@ public SingleGroupCombo()
protected override FilterComboBaseCache CreateCache()
=> new Cache(this);
- public readonly record struct GroupCache(int OptionIndex, StringU8 Name, StringU8 Description);
+ public readonly record struct GroupCache(int OptionIndex, StringU8 Name, StringU8 Description, Vector4 Color, bool Separator);
private readonly WeakReference _group = new(null!);
private Setting _currentOption;
@@ -41,7 +43,8 @@ public void Draw(ModGroupDrawer parent, SingleModGroup group, int groupIndex, Se
protected override IEnumerable GetItems()
=> _group.TryGetTarget(out var target)
- ? target.OptionData.Select(o => new GroupCache(o.GetIndex(), new StringU8(o.Name), new StringU8(o.Description)))
+ ? target.OptionData.Select(o => new GroupCache(o.GetIndex(), new StringU8(o.Name), new StringU8(o.Description),
+ o.Color is 0 ? Im.Style[ImGuiColor.Text] : o.Color.Value().ToVector(), o.Layout.HasFlag(ModSettingsLayout.Separator)))
: [];
protected override float ItemHeight
@@ -49,7 +52,18 @@ protected override float ItemHeight
protected override bool DrawItem(in GroupCache item, int globalIndex, bool selected)
{
- var ret = Im.Selectable(item.Name, selected);
+ bool ret;
+ using (ImGuiColor.Text.Push(item.Color))
+ {
+ ret = Im.Selectable(item.Name, selected);
+ }
+
+ if (item.Separator)
+ {
+ var right = Im.Item.LowerRightCorner;
+ Im.Window.DrawList.Shape.Line(right with { X = Im.Item.UpperLeftCorner.X }, right, ImGuiColor.Separator.Get());
+ }
+
if (item.Description.Length > 0)
{
Im.Line.SameInner();
@@ -67,7 +81,8 @@ private sealed class Cache(SingleGroupCombo parent) : FilterComboBaseCache i.Name.CalculateSize().X + (i.Description.Length > 0 ? Im.Style.FrameHeightWithSpacing : 0))
- + 2 * Im.Style.FramePadding.X + Im.Style.ScrollbarSize;
+ + 2 * Im.Style.FramePadding.X
+ + Im.Style.ScrollbarSize;
}
}
}
diff --git a/Penumbra/UI/FileEditing/Materials/MaterialEditor.CommonColorTable.cs b/Penumbra/UI/FileEditing/Materials/MaterialEditor.CommonColorTable.cs
index 8410d8289..c0640fb51 100644
--- a/Penumbra/UI/FileEditing/Materials/MaterialEditor.CommonColorTable.cs
+++ b/Penumbra/UI/FileEditing/Materials/MaterialEditor.CommonColorTable.cs
@@ -403,7 +403,7 @@ private static bool CtDragHalf(ReadOnlySpan label, ReadOnlySpan desc
float max, float speed, Action setter)
{
var tmp = (float)value;
- var result = Im.Drag(label, ref tmp, format, min, max, speed);
+ var result = Im.Drag(label, ref tmp, format, min, max, speed, SliderFlags.AlwaysClamp);
Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, description);
if (!result)
return false;
@@ -420,7 +420,7 @@ private static bool CtDragHalf(ReadOnlySpan label, ReadOnlySpan desc
float min, float max, float speed)
{
var tmp = (float)value;
- var result = Im.Drag(label, ref tmp, format, min, max, speed);
+ var result = Im.Drag(label, ref tmp, format, min, max, speed, SliderFlags.AlwaysClamp);
Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, description);
if (!result)
return false;
@@ -445,11 +445,12 @@ private static bool CtDragScalar(ReadOnlySpan label, ReadOnlySpan
T max, float speed, Action setter) where T : unmanaged, INumber
{
var tmp = value;
- var result = Im.Drag(label, ref tmp, format, min, max, speed);
+ var result = Im.Drag(label, ref tmp, format, min, max, speed, SliderFlags.AlwaysClamp);
Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, description);
if (!result || tmp == value)
return false;
+
setter(tmp);
return true;
}
@@ -458,7 +459,7 @@ private static bool CtDragScalar(ReadOnlySpan label, ReadOnlySpan
T max, float speed) where T : unmanaged, INumber
{
var tmp = value;
- var result = Im.Drag(label, ref tmp, format, min, max, speed);
+ var result = Im.Drag(label, ref tmp, format, min, max, speed, SliderFlags.AlwaysClamp);
Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, description);
if (!result || tmp == value)
return false;
diff --git a/Penumbra/UI/FileEditing/Models/ModelEditor.Interface.cs b/Penumbra/UI/FileEditing/Models/ModelEditor.Interface.cs
index 5f0e874ec..34bd974c0 100644
--- a/Penumbra/UI/FileEditing/Models/ModelEditor.Interface.cs
+++ b/Penumbra/UI/FileEditing/Models/ModelEditor.Interface.cs
@@ -12,6 +12,7 @@ namespace Penumbra.UI.FileEditing.Models;
public partial class ModelEditor
{
+ public const int OffByOneOffset = 0;
private const int MdlMaterialMaximum = ModelImporter.MaterialLimit;
private const string MdlImportDocumentation =
@@ -413,7 +414,7 @@ private static void DrawInvalidMaterialMarker()
private bool DrawModelLodDetails(int lodIndex, bool disabled)
{
- using var lodNode = Im.Tree.Node($"Level of Detail #{lodIndex + 1}", TreeNodeFlags.DefaultOpen);
+ using var lodNode = Im.Tree.Node($"Level of Detail #{lodIndex + OffByOneOffset}", TreeNodeFlags.DefaultOpen);
if (!lodNode)
return false;
@@ -428,7 +429,7 @@ private bool DrawModelLodDetails(int lodIndex, bool disabled)
private bool DrawModelMeshDetails(int meshIndex, bool disabled)
{
- using var meshNode = Im.Tree.Node($"Mesh #{meshIndex + 1}", TreeNodeFlags.DefaultOpen);
+ using var meshNode = Im.Tree.Node($"Mesh #{meshIndex + OffByOneOffset}", TreeNodeFlags.DefaultOpen);
if (!meshNode)
return false;
@@ -437,7 +438,7 @@ private bool DrawModelMeshDetails(int meshIndex, bool disabled)
if (!table)
return false;
- table.SetupColumn("name"u8, TableColumnFlags.WidthFixed, 100 * Im.Style.GlobalScale);
+ table.SetupColumn("name"u8, TableColumnFlags.WidthFixed, 150 * Im.Style.GlobalScale);
table.SetupColumn("field"u8, TableColumnFlags.WidthStretch, 1);
var file = Mdl;
@@ -521,7 +522,7 @@ private bool DrawSubMeshAttributes(in Im.TableDisposable table, int meshIndex, i
var mesh = Mdl.Meshes[meshIndex];
var subMeshIndex = mesh.SubMeshIndex + subMeshOffset;
- table.DrawFrameColumn($"Attributes #{subMeshOffset + 1}");
+ table.DrawFrameColumn($"Submesh #{subMeshOffset + OffByOneOffset} Attributes ");
table.NextColumn();
var attributes = GetSubMeshAttributes(subMeshIndex);
diff --git a/Penumbra/UI/GlobalModImporter.cs b/Penumbra/UI/GlobalModImporter.cs
index 2e63cd238..4c99ecb12 100644
--- a/Penumbra/UI/GlobalModImporter.cs
+++ b/Penumbra/UI/GlobalModImporter.cs
@@ -46,7 +46,7 @@ public void Dispose()
}
private void ImportFiles(IReadOnlyList files, IReadOnlyList _)
- => _importManager.AddUnpack(files.Where(f => ValidModExtensions.Contains(Path.GetExtension(f))));
+ => _importManager.AddUnpack(files.Where(f => ValidModExtensions.Contains(Path.GetExtension(f))).ToList());
private static bool ValidExtension(IDragDropManager manager)
=> manager.Extensions.Any(ValidModExtensions.Contains);
diff --git a/Penumbra/UI/ManagementTab/BrokenModsTab.cs b/Penumbra/UI/ManagementTab/BrokenModsTab.cs
index 1b52b14b5..3fdf9dd46 100644
--- a/Penumbra/UI/ManagementTab/BrokenModsTab.cs
+++ b/Penumbra/UI/ManagementTab/BrokenModsTab.cs
@@ -64,12 +64,12 @@ private static void DrawDeleteEmptyButton(FailedModNotification notification, Ca
private static void DrawMoveToTempButton(FailedModNotification notification, ModManager mods, Cache cache)
{
+ var path = Path.Combine(mods.BasePath.FullName, "broken_mods");
if (ImEx.Button("Move All Folders to Temp"u8, default,
- $"Moves all folders in the list to the '{mods.BasePath.FullName}/broken_mods' directory to make it easier to move them out of the Root directory.",
+ $"Moves all folders in the list to the '{path}' directory to make it easier to move them out of the Root directory.",
!LunaStyle.Modifier.Destructive))
{
cache.Dirty |= IManagedCache.DirtyFlags.Custom;
- var path = Path.Combine(mods.BasePath.FullName, "broken_mods");
try
{
var tmpDirectory = Directory.CreateDirectory(path);
diff --git a/Penumbra/UI/ManagementTab/CleanupTab.cs b/Penumbra/UI/ManagementTab/CleanupTab.cs
index b33618e0a..2133e2070 100644
--- a/Penumbra/UI/ManagementTab/CleanupTab.cs
+++ b/Penumbra/UI/ManagementTab/CleanupTab.cs
@@ -4,7 +4,7 @@
namespace Penumbra.UI.ManagementTab;
-public sealed class CleanupTab(CleanupService cleanup, Configuration config) : ITab
+public sealed class CleanupTab(CleanupService cleanup, FileWatcher fileWatcher, Configuration config) : ITab
{
public ReadOnlySpan Label
=> "General Cleanup"u8;
@@ -52,5 +52,12 @@ public void DrawContent()
cleanup.CleanupAllUnusedSettings();
if (!enabled)
Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteModModifier} while clicking to remove settings.");
+
+ if (ImEx.Button("Clear Extracted Archive Files"u8, default,
+ "Delete all temporary files extracted from archives by the File Watcher. Extracted files that have not yet been imported will be lost."u8,
+ !enabled || cleanup.IsRunning))
+ fileWatcher.CleanExtracted();
+ if (!enabled)
+ Im.Tooltip.OnHover(HoveredFlags.AllowWhenDisabled, $"Hold {config.DeleteModModifier} while clicking to delete files.");
}
}
diff --git a/Penumbra/UI/ManagementTab/ManagementLog.cs b/Penumbra/UI/ManagementTab/ManagementLog.cs
index db3028261..be3be51ad 100644
--- a/Penumbra/UI/ManagementTab/ManagementLog.cs
+++ b/Penumbra/UI/ManagementTab/ManagementLog.cs
@@ -1,6 +1,5 @@
using Luna;
using Penumbra.Files;
-using Penumbra.Services;
namespace Penumbra.UI.ManagementTab;
diff --git a/Penumbra/UI/ManagementTab/Reserved/FailedModNotification.cs b/Penumbra/UI/ManagementTab/Reserved/FailedModNotification.cs
index 09aafc333..057b07955 100644
--- a/Penumbra/UI/ManagementTab/Reserved/FailedModNotification.cs
+++ b/Penumbra/UI/ManagementTab/Reserved/FailedModNotification.cs
@@ -35,7 +35,7 @@ public override void NotificationActions(INotificationDrawArgs args)
if (Im.Button("Open Messages"u8, width))
navigator.OpenTo(TabType.Messages);
Im.Line.SameInner();
- if (ImEx.Button("Open Management"u8, width, true))
+ if (ImEx.Button("Open Management"u8, width))
navigator.OpenTo(ManagementTabType.BrokenMods);
}
diff --git a/Penumbra/UI/ModsTab/ConditionCombo.cs b/Penumbra/UI/ModsTab/ConditionCombo.cs
new file mode 100644
index 000000000..e78decca2
--- /dev/null
+++ b/Penumbra/UI/ModsTab/ConditionCombo.cs
@@ -0,0 +1,108 @@
+using ImSharp;
+using Penumbra.Mods.Groups;
+using Penumbra.Mods.SubMods;
+
+namespace Penumbra.UI.ModsTab;
+
+internal sealed class ConditionCombo : ModObjectCombo
+{
+ private IModOption? _optionSelected;
+ private SettingCondition? _currentCondition;
+ private readonly Im.ColorStyleDisposable _style = new();
+
+ public ConditionCombo()
+ => PreviewAlignment = new Vector2(0.5f);
+
+ protected override void PostDrawCombo(float width)
+ => _style.PopColor();
+
+ public bool Draw(ReadOnlySpan label, IModObject @object, float width, SettingCondition? existingCondition,
+ out SettingCondition? newCondition)
+ {
+ Mod = @object.Mod;
+ Group = @object.Group;
+ _optionSelected = @object as IModOption;
+ _currentCondition = existingCondition;
+
+ var color = Rgba32.Blue.WithAlpha(51);
+ _style.PushDefault(ImStyleDouble.FramePadding)
+ .PushDefault(ImGuiColor.ChildBackground)
+ .PushDefault(ImGuiColor.Border)
+ .Push(ImGuiColor.FrameBackground, color);
+
+ if (!base.Draw(label, _currentCondition?.Option.FullName ?? "Select New Condition...",
+ "Selecting an option here makes the display and application of this option or entire group dependent on the option being enabled."u8,
+ width, out var parent)
+ || parent.Object is not IModOption option
+ || option == existingCondition?.Option)
+ {
+ newCondition = existingCondition;
+ return false;
+ }
+
+ if (_currentCondition is null)
+ {
+ newCondition = new SettingCondition(option);
+ }
+ else
+ {
+ newCondition = _currentCondition;
+ newCondition!.Option = option;
+ }
+
+ _style.Dispose();
+ return true;
+ }
+
+ protected override IEnumerable GetItems()
+ {
+ if (Mod is null)
+ yield break;
+
+ foreach (var group in Mod.Groups)
+ {
+ var parent = new ModObjectCache(group, null)
+ {
+ CausesCycle = false,
+ Visible = false,
+ };
+ if (group == Group)
+ {
+ // Can not make a group dependent on itself, or an option in a single select group dependent on any options in its group.
+ if (_optionSelected is null || group.Behaviour is GroupDrawBehaviour.SingleSelection)
+ continue;
+
+ // TODO: Check cycles and sensibility.
+ foreach (var option in group.Options)
+ {
+ // Can not depend on itself.
+ if (option == _optionSelected)
+ continue;
+
+ yield return new ModObjectCache(option, parent);
+ }
+ }
+ else
+ {
+ // TODO: Check cycles and sensibility.
+ foreach (var option in group.Options)
+ yield return new ModObjectCache(option, parent);
+ }
+ }
+ }
+
+ protected override bool DrawItem(in ModObjectCache item, int globalIndex, bool selected)
+ {
+ var ret = Im.Selectable(item.Name.Utf8, selected);
+ Im.Line.NoSpacing();
+ using (ImGuiColor.Text.Push(Im.Style[ImGuiColor.TextDisabled]))
+ {
+ ImEx.TextRightAligned(item.GroupName.Utf8, Im.Style.FramePadding.X);
+ }
+
+ return ret;
+ }
+
+ protected override bool IsSelected(ModObjectCache item, int globalIndex)
+ => _currentCondition?.Option == item.Object;
+}
diff --git a/Penumbra/UI/ModsTab/ConditionEditPopup.cs b/Penumbra/UI/ModsTab/ConditionEditPopup.cs
new file mode 100644
index 000000000..4446dd81e
--- /dev/null
+++ b/Penumbra/UI/ModsTab/ConditionEditPopup.cs
@@ -0,0 +1,47 @@
+using ImSharp;
+using Luna;
+using Penumbra.Mods;
+using Penumbra.Mods.Groups;
+using Penumbra.Mods.Manager.OptionEditor;
+using Penumbra.Mods.Settings;
+using Penumbra.Mods.SubMods;
+using Penumbra.Services;
+
+namespace Penumbra.UI.ModsTab;
+
+public sealed class ConditionEditPopup(ModGroupEditor editor, CommunicatorService communicator) : ObjectEditPopup, IUiService
+{
+ protected override ReadOnlySpan PopupId
+ => "ConditionEdit"u8;
+
+ public void Open(IModObject @object)
+ => Open((object)@object);
+
+ protected override void DrawInternal()
+ {
+ if (Current is not IModObject obj)
+ return;
+
+ using var id = Im.Id.Push(obj.Id.GetHashCode());
+
+ var cache = CacheManager.Instance.GetOrCreateCache(Im.Id.Current,
+ () => new ModGroupConditionCache(communicator, new ModSettingContext(obj.Mod, ModSettings.Empty, obj)));
+ if (cache.Draw())
+ editor.SetCondition(obj, obj.Condition?.Reduce(), true);
+ //ImNodes.Tester.Show("editor"u8);
+
+ //Im.ScaledDummy(640);
+ //Im.Cursor.Position = cursor;
+ //if (drawer.Draw(obj.Condition, new ModSettingContext(obj.Mod, ModSettings.Empty, obj), out var newCondition))
+ // obj.Condition = newCondition;
+ }
+
+ protected override void PrePopup()
+ {
+ Im.Window.SetNextSize(ImEx.ScaledVector(640, 640));
+ ImStyleDouble.WindowPadding.Push(Vector2.Zero);
+ }
+
+ protected override void PostPopup()
+ => Im.StyleDisposable.PopUnsafe();
+}
diff --git a/Penumbra/UI/ModsTab/DescriptionEditPopup.cs b/Penumbra/UI/ModsTab/DescriptionEditPopup.cs
index 0489f4e10..9925229b1 100644
--- a/Penumbra/UI/ModsTab/DescriptionEditPopup.cs
+++ b/Penumbra/UI/ModsTab/DescriptionEditPopup.cs
@@ -1,4 +1,5 @@
using ImSharp;
+using Luna;
using Penumbra.Mods;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager;
@@ -6,65 +7,43 @@
namespace Penumbra.UI.ModsTab;
-public class DescriptionEditPopup(ModManager modManager) : Luna.IUiService
+public sealed class
+ DescriptionEditPopup(ModManager modManager) : ObjectEditPopup, IUiService
{
- private static ReadOnlySpan