Full Code of ad2017gd/RainbowTaskbar for AI

main 5ee0f34e91e4 cached
163 files
675.4 KB
159.8k tokens
604 symbols
1 requests
Download .txt
Showing preview only (728K chars total). Download the full file or copy to clipboard to get everything.
Repository: ad2017gd/RainbowTaskbar
Branch: main
Commit: 5ee0f34e91e4
Files: 163
Total size: 675.4 KB

Directory structure:
gitextract_i3_ujbve/

├── .editorconfig
├── .github/
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       ├── feature_request.md
│       └── other-issue.md
├── .gitignore
├── LICENSE
├── MSIXPkg2/
│   ├── MSIXPkg2.wapproj
│   └── Package.appxmanifest
├── README.md
├── RainbowTaskbar/
│   ├── App.xaml
│   ├── App.xaml.cs
│   ├── AssemblyInfo.cs
│   ├── Configuration/
│   │   ├── Config.cs
│   │   ├── Instruction/
│   │   │   ├── DefaultPresets.cs
│   │   │   ├── Instruction.cs
│   │   │   ├── InstructionConfig.cs
│   │   │   ├── InstructionGroup.cs
│   │   │   ├── InstructionPreset.cs
│   │   │   └── Instructions/
│   │   │       ├── BorderRadiusInstruction.cs
│   │   │       ├── ClearLayerInstruction.cs
│   │   │       ├── ColorInstruction.cs
│   │   │       ├── DelayInstruction.cs
│   │   │       ├── ImageInstruction.cs
│   │   │       ├── ShapeInstruction.cs
│   │   │       ├── TextInstruction.cs
│   │   │       └── TransparencyInstruction.cs
│   │   └── Web/
│   │       └── WebConfig.cs
│   ├── Drawing/
│   │   ├── CanvasManager.cs
│   │   └── LayerManager.cs
│   ├── Editor/
│   │   ├── DebugWindow.xaml
│   │   ├── DebugWindow.xaml.cs
│   │   ├── EditorViewModel.cs
│   │   ├── EditorWindow.xaml
│   │   ├── EditorWindow.xaml.cs
│   │   └── Pages/
│   │       ├── About.xaml
│   │       ├── About.xaml.cs
│   │       ├── Browse.xaml
│   │       ├── Browse.xaml.cs
│   │       ├── Configs.xaml
│   │       ├── Configs.xaml.cs
│   │       ├── Controls/
│   │       │   ├── ConfigListItemControl.xaml
│   │       │   ├── ConfigListItemControl.xaml.cs
│   │       │   ├── InstructionContextMenu.xaml
│   │       │   ├── InstructionContextMenu.xaml.cs
│   │       │   ├── InstructionControls/
│   │       │   │   ├── BorderRadiusInstructionControl.xaml
│   │       │   │   ├── BorderRadiusInstructionControl.xaml.cs
│   │       │   │   ├── ClearLayerInstructionControl.xaml
│   │       │   │   ├── ClearLayerInstructionControl.xaml.cs
│   │       │   │   ├── ColorInstructionControl.xaml
│   │       │   │   ├── ColorInstructionControl.xaml.cs
│   │       │   │   ├── Converters/
│   │       │   │   │   ├── ColorConverter.cs
│   │       │   │   │   ├── DivideHalf.cs
│   │       │   │   │   ├── FileExists.cs
│   │       │   │   │   └── FloatToPercentage.cs
│   │       │   │   ├── DelayInstructionControl.xaml
│   │       │   │   ├── DelayInstructionControl.xaml.cs
│   │       │   │   ├── ImageInstructionControl.xaml
│   │       │   │   ├── ImageInstructionControl.xaml.cs
│   │       │   │   ├── ShapeInstructionControl.xaml
│   │       │   │   ├── ShapeInstructionControl.xaml.cs
│   │       │   │   ├── TextInstructionControl.xaml
│   │       │   │   ├── TextInstructionControl.xaml.cs
│   │       │   │   ├── TransparencyInstructionControl.xaml
│   │       │   │   └── TransparencyInstructionControl.xaml.cs
│   │       │   ├── IssueControl.xaml
│   │       │   ├── IssueControl.xaml.cs
│   │       │   ├── LoginControl.xaml
│   │       │   ├── LoginControl.xaml.cs
│   │       │   ├── ResultListItemControl.xaml
│   │       │   ├── ResultListItemControl.xaml.cs
│   │       │   ├── UnsafeImage.cs
│   │       │   └── WebControls/
│   │       │       ├── AddPropertyDialogControl.xaml
│   │       │       └── AddPropertyDialogControl.xaml.cs
│   │       ├── Edit/
│   │       │   ├── EditInfo.xaml
│   │       │   ├── EditInfo.xaml.cs
│   │       │   ├── EditPage.cs
│   │       │   ├── InstructionEditPage.xaml
│   │       │   ├── InstructionEditPage.xaml.cs
│   │       │   ├── ViewComments.xaml
│   │       │   ├── ViewComments.xaml.cs
│   │       │   ├── ViewInfo.xaml
│   │       │   ├── ViewInfo.xaml.cs
│   │       │   ├── WebEditPage.xaml
│   │       │   ├── WebEditPage.xaml.cs
│   │       │   └── WebView2Fixed.cs
│   │       ├── EmptyPageBadFix.xaml
│   │       ├── EmptyPageBadFix.xaml.cs
│   │       ├── EmptyPageBadFix2.xaml
│   │       ├── EmptyPageBadFix2.xaml.cs
│   │       ├── Home.xaml
│   │       ├── Home.xaml.cs
│   │       ├── Settings.xaml
│   │       └── Settings.xaml.cs
│   ├── ExplorerTAP/
│   │   └── ExplorerTAP.cs
│   ├── FodyWeavers.xml
│   ├── HTTPAPI/
│   │   └── WorkshopAPI.cs
│   ├── Helpers/
│   │   ├── AutoUpdate.cs
│   │   ├── Cache.cs
│   │   ├── DPIUtil.cs
│   │   ├── HiddenWebViewHost.xaml
│   │   ├── HiddenWebViewHost.xaml.cs
│   │   ├── JsonColorConverter.cs
│   │   ├── Taskbar.cs
│   │   └── Window.cs
│   ├── Interpolation/
│   │   └── ColorInterpolation.cs
│   ├── Languages/
│   │   ├── Localization.cs
│   │   ├── Translators.cs
│   │   ├── en_US.xaml
│   │   ├── en_US.xaml.cs
│   │   ├── fr_FR.xaml
│   │   ├── fr_FR.xaml.cs
│   │   ├── ro_RO.xaml
│   │   ├── ro_RO.xaml.cs
│   │   ├── zh_CN.cs
│   │   └── zh_CN.xaml
│   ├── Preferences/
│   │   └── Settings.cs
│   ├── Properties/
│   │   ├── Resources.Designer.cs
│   │   ├── Resources.resx
│   │   ├── Settings.Designer.cs
│   │   ├── Settings.settings
│   │   └── launchSettings.json
│   ├── RainbowTaskbar.csproj
│   ├── Taskbar.xaml
│   ├── Taskbar.xaml.cs
│   ├── TaskbarViewModel.cs
│   ├── TrayWindow.xaml
│   ├── TrayWindow.xaml.cs
│   ├── V2Legacy/
│   │   └── Configuration/
│   │       ├── Config.cs
│   │       ├── Instruction.cs
│   │       ├── InstructionPreset.cs
│   │       └── Instructions/
│   │           ├── BorderRadiusInstruction.cs
│   │           ├── ClearLayerInstruction.cs
│   │           ├── ColorInstruction.cs
│   │           ├── DelayInstruction.cs
│   │           ├── ImageInstruction.cs
│   │           ├── ShapeInstruction.cs
│   │           ├── TextInstruction.cs
│   │           └── TransparencyInstruction.cs
│   └── msix.build.props
├── RainbowTaskbar.sln
├── RainbowTaskbarDLL/
│   ├── AppearanceServiceAPI.cpp
│   ├── AppearanceServiceAPI.h
│   ├── ArmFix/
│   │   └── RpcProxy.h
│   ├── ErrorDebug.h
│   ├── Factory.h
│   ├── IUnused.h
│   ├── IUnused.idl
│   ├── RainbowTaskbarDLL.def
│   ├── RainbowTaskbarDLL.idl
│   ├── RainbowTaskbarDLL.vcxproj
│   ├── RainbowTaskbarDLL.vcxproj.filters
│   ├── TAP.cpp
│   ├── TAP.h
│   ├── Taskbar.h
│   ├── VisualTreeWatch.cpp
│   ├── VisualTreeWatch.h
│   ├── csharpinterop.cpp
│   ├── dllmain.cpp
│   ├── framework.h
│   ├── packages.config
│   └── winrt.h
├── SetupARM64.iss
└── SetupX64.iss

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
[*]
charset = utf-8-bom
end_of_line = crlf
trim_trailing_whitespace = false
insert_final_newline = false
indent_style = space
indent_size = 4

# Microsoft .NET properties
csharp_new_line_before_members_in_object_initializers = false
csharp_new_line_before_open_brace = none
csharp_preferred_modifier_order = public, private, protected, internal, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async:suggestion
csharp_space_after_cast = true
csharp_style_expression_bodied_accessors = true:suggestion
csharp_style_expression_bodied_methods = true:none
csharp_style_expression_bodied_properties = false: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
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.public_fields_rule.import_to_resharper = as_predefined
dotnet_naming_rule.public_fields_rule.severity = warning
dotnet_naming_rule.public_fields_rule.style = lower_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.unity_serialized_field_rule.import_to_resharper = True
dotnet_naming_rule.unity_serialized_field_rule.resharper_description = Unity serialized field
dotnet_naming_rule.unity_serialized_field_rule.resharper_guid = 5f0fdb63-c892-4d2c-9324-15c80b22a7ef
dotnet_naming_rule.unity_serialized_field_rule.severity = warning
dotnet_naming_rule.unity_serialized_field_rule.style = lower_camel_case_style
dotnet_naming_rule.unity_serialized_field_rule.symbols = unity_serialized_field_symbols
dotnet_naming_style.lower_camel_case_style.capitalization = camel_case
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.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.unity_serialized_field_symbols.applicable_accessibilities = *
dotnet_naming_symbols.unity_serialized_field_symbols.applicable_kinds =
dotnet_naming_symbols.unity_serialized_field_symbols.resharper_applicable_kinds = unity_serialised_field
dotnet_naming_symbols.unity_serialized_field_symbols.resharper_required_modifiers = instance
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none
dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none
dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none
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 = for_non_interface_members:suggestion

# ReSharper properties
resharper_apply_auto_detected_rules = false
resharper_autodetect_indent_settings = true
resharper_csharp_empty_block_style = together_same_line
resharper_csharp_stick_comment = false
resharper_indent_braces_inside_statement_conditions = false
resharper_local_function_body = expression_body
resharper_show_autodetect_configure_formatting_tip = false
resharper_space_within_single_line_array_initializer_braces = false
resharper_use_indent_from_vs = false

# ReSharper inspection severities
resharper_arrange_redundant_parentheses_highlighting = hint
resharper_arrange_this_qualifier_highlighting = hint
resharper_arrange_type_member_modifiers_highlighting = hint
resharper_arrange_type_modifiers_highlighting = hint
resharper_built_in_type_reference_style_for_member_access_highlighting = hint
resharper_built_in_type_reference_style_highlighting = hint
resharper_redundant_base_qualifier_highlighting = warning
resharper_suggest_var_or_type_built_in_types_highlighting = hint
resharper_suggest_var_or_type_elsewhere_highlighting = hint
resharper_suggest_var_or_type_simple_types_highlighting = hint
resharper_web_config_module_not_resolved_highlighting = warning
resharper_web_config_type_not_resolved_highlighting = warning
resharper_web_config_wrong_module_highlighting = warning

[{*.har,*.inputactions,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,jest.config}]
indent_style = space
indent_size = 2

[*.{appxmanifest,asax,ascx,aspx,axaml,build,cg,cginc,compute,cs,cshtml,dtd,fs,fsi,fsscript,fsx,hlsl,hlsli,hlslinc,master,ml,mli,nuspec,paml,razor,resw,resx,shader,skin,usf,ush,vb,xaml,xamlx,xoml,xsd}]
indent_style = space
indent_size = 4
tab_width = 4


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a bug report
title: "[BUG] "
labels: bug
assignees: ad2017gd

---

**Describe the bug**
*A clear and concise description of what the bug is.*

**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
...

**Screenshots**
If applicable, add screenshots to help explain your problem.

**Windows version and/or build**
... (can be a screenshot of winver.exe)

**RainbowTaskbar version**
...


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ad2017gd

---

**Describe your feature request.**
...


================================================
FILE: .github/ISSUE_TEMPLATE/other-issue.md
================================================
---
name: Other issue
about: ONLY USE IF NOT A BUG REPORT/FEATURE REQUEST!
title: ''
labels: ''
assignees: ad2017gd

---




================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore

# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Mono auto generated files
mono_crash.*

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/

# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# Visual Studio 2017 auto generated files
Generated\ Files/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# Benchmark Results
BenchmarkDotNet.Artifacts/

# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/

# ASP.NET Scaffolding
ScaffoldingReadMe.txt

# StyleCop
StyleCopReport.xml

# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# Visual Studio Trace Files
*.e2e

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json

# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info

# Visual Studio code coverage results
*.coverage
*.coveragexml

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj

# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/

# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/

# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs

# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk

# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak

# SQL Server files
*.mdf
*.ldf
*.ndf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw

# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp

# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp

# Visual Studio 6 technical files
*.ncb
*.aps

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# Paket dependency manager
.paket/paket.exe
paket-files/

# FAKE - F# Make
.fake/

# CodeRush personal settings
.cr/personal

# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc

# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config

# Tabs Studio
*.tss

# Telerik's JustMock configuration file
*.jmconfig

# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs

# OpenCover UI analysis results
OpenCover/

# Azure Stream Analytics local run output
ASALocalRun/

# MSBuild Binary and Structured Log
*.binlog

# NVidia Nsight GPU debugger configuration file
*.nvuser

# MFractors (Xamarin productivity tool) working folder
.mfractor/

# Local History for Visual Studio
.localhistory/

# Visual Studio History (VSHistory) files
.vshistory/

# BeatPulse healthcheck temp database
healthchecksdb

# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/

# Ionide (cross platform F# VS Code tools) working folder
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd

# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

# Local History for Visual Studio Code
.history/

# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp

# JetBrains Rider
*.sln.iml
.idea/*
/RainbowTaskbar/RainbowTaskbar - Backup.csproj
/vcpkg_installed
/Output


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2023 ad2017gd

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: MSIXPkg2/MSIXPkg2.wapproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '15.0'">
    <VisualStudioVersion>15.0</VisualStudioVersion>
  </PropertyGroup>
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|x86">
      <Configuration>Debug</Configuration>
      <Platform>x86</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release (MSIX)|AnyCPU">
      <Configuration>Release (MSIX)</Configuration>
      <Platform>AnyCPU</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release (MSIX)|ARM">
      <Configuration>Release (MSIX)</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release (MSIX)|ARM64">
      <Configuration>Release (MSIX)</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release (MSIX)|x64">
      <Configuration>Release (MSIX)</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release (MSIX)|x86">
      <Configuration>Release (MSIX)</Configuration>
      <Platform>x86</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x86">
      <Configuration>Release</Configuration>
      <Platform>x86</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|ARM">
      <Configuration>Debug</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|ARM">
      <Configuration>Release</Configuration>
      <Platform>ARM</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|ARM64">
      <Configuration>Debug</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|ARM64">
      <Configuration>Release</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|AnyCPU">
      <Configuration>Debug</Configuration>
      <Platform>AnyCPU</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|AnyCPU">
      <Configuration>Release</Configuration>
      <Platform>AnyCPU</Platform>
    </ProjectConfiguration>
  </ItemGroup>
  <PropertyGroup>
    <WapProjPath Condition="'$(WapProjPath)'==''">$(MSBuildExtensionsPath)\Microsoft\DesktopBridge\</WapProjPath>
  </PropertyGroup>
  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.props" />
  <PropertyGroup>
    <ProjectGuid>eeaf81a9-bb63-40d9-a733-7f25d2313df5</ProjectGuid>
    <TargetPlatformVersion>10.0.26100.0</TargetPlatformVersion>
    <TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
    <TargetFramework>net8.0-windows17763.0</TargetFramework>
    <DefaultLanguage>en-US</DefaultLanguage>
    <AppxPackageSigningEnabled>True</AppxPackageSigningEnabled>
    <NoWarn>$(NoWarn);NU1702</NoWarn>
    <EntryPointProjectUniqueName>..\RainbowTaskbar\RainbowTaskbar.csproj</EntryPointProjectUniqueName>
    <AppxBundlePlatforms>x64</AppxBundlePlatforms>
    <GenerateAppInstallerFile>False</GenerateAppInstallerFile>
    <PackageCertificateThumbprint>18A14CD3EECA6DA0643255C7613892FF281EC8AA</PackageCertificateThumbprint>
    <AppxPackageSigningTimestampDigestAlgorithm>SHA256</AppxPackageSigningTimestampDigestAlgorithm>
    <AppxAutoIncrementPackageRevision>False</AppxAutoIncrementPackageRevision>
    <GenerateTestArtifacts>False</GenerateTestArtifacts>
    <HoursBetweenUpdateChecks>0</HoursBetweenUpdateChecks>
    <GenerateTemporaryStoreCertificate>True</GenerateTemporaryStoreCertificate>
    <AppxSymbolPackageEnabled>False</AppxSymbolPackageEnabled>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release (MSIX)|x64'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release (MSIX)|ARM'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM64'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release (MSIX)|ARM64'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM64'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release (MSIX)|x86'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release (MSIX)|AnyCPU'">
    <AppxBundle>Always</AppxBundle>
  </PropertyGroup>
  <ItemGroup>
    <AppxManifest Include="Package.appxmanifest">
      <SubType>Designer</SubType>
    </AppxManifest>
  </ItemGroup>
  <ItemGroup>
    <Content Include="Images\LargeTile.scale-100.png" />
    <Content Include="Images\LargeTile.scale-125.png" />
    <Content Include="Images\LargeTile.scale-150.png" />
    <Content Include="Images\LargeTile.scale-200.png" />
    <Content Include="Images\LargeTile.scale-400.png" />
    <Content Include="Images\SmallTile.scale-100.png" />
    <Content Include="Images\SmallTile.scale-125.png" />
    <Content Include="Images\SmallTile.scale-150.png" />
    <Content Include="Images\SmallTile.scale-200.png" />
    <Content Include="Images\SmallTile.scale-400.png" />
    <Content Include="Images\SplashScreen.scale-100.png" />
    <Content Include="Images\SplashScreen.scale-125.png" />
    <Content Include="Images\SplashScreen.scale-150.png" />
    <Content Include="Images\SplashScreen.scale-200.png" />
    <Content Include="Images\LockScreenLogo.scale-200.png" />
    <Content Include="Images\SplashScreen.scale-400.png" />
    <Content Include="Images\Square150x150Logo.scale-100.png" />
    <Content Include="Images\Square150x150Logo.scale-125.png" />
    <Content Include="Images\Square150x150Logo.scale-150.png" />
    <Content Include="Images\Square150x150Logo.scale-200.png" />
    <Content Include="Images\Square150x150Logo.scale-400.png" />
    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-16.png" />
    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-24.png" />
    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-256.png" />
    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-32.png" />
    <Content Include="Images\Square44x44Logo.altform-lightunplated_targetsize-48.png" />
    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-16.png" />
    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-256.png" />
    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-32.png" />
    <Content Include="Images\Square44x44Logo.altform-unplated_targetsize-48.png" />
    <Content Include="Images\Square44x44Logo.scale-100.png" />
    <Content Include="Images\Square44x44Logo.scale-125.png" />
    <Content Include="Images\Square44x44Logo.scale-150.png" />
    <Content Include="Images\Square44x44Logo.scale-200.png" />
    <Content Include="Images\Square44x44Logo.scale-400.png" />
    <Content Include="Images\Square44x44Logo.targetsize-16.png" />
    <Content Include="Images\Square44x44Logo.targetsize-24.png" />
    <Content Include="Images\Square44x44Logo.targetsize-24_altform-unplated.png" />
    <Content Include="Images\Square44x44Logo.targetsize-256.png" />
    <Content Include="Images\Square44x44Logo.targetsize-32.png" />
    <Content Include="Images\Square44x44Logo.targetsize-48.png" />
    <Content Include="Images\StoreLogo.scale-100.png" />
    <Content Include="Images\StoreLogo.scale-125.png" />
    <Content Include="Images\StoreLogo.scale-150.png" />
    <Content Include="Images\StoreLogo.scale-200.png" />
    <Content Include="Images\StoreLogo.scale-400.png" />
    <Content Include="Images\Wide310x150Logo.scale-100.png" />
    <Content Include="Images\Wide310x150Logo.scale-125.png" />
    <Content Include="Images\Wide310x150Logo.scale-150.png" />
    <Content Include="Images\Wide310x150Logo.scale-200.png" />
    <Content Include="Images\Wide310x150Logo.scale-400.png" />
    <None Include="Package.StoreAssociation.xml" />
  </ItemGroup>
  <Import Project="$(WapProjPath)\Microsoft.DesktopBridge.targets" />
  <ItemGroup>
    <PackageReference Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.26100.1742" PrivateAssets="all" />
    <PackageReference Include="WPF-UI" Version="4.0.3" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\RainbowTaskbar\RainbowTaskbar.csproj">
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <None Include="..\RainbowTaskbar\msix.build.props" />
  </ItemGroup>
</Project>

================================================
FILE: MSIXPkg2/Package.appxmanifest
================================================
<?xml version="1.0" encoding="utf-8"?>

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"
  IgnorableNamespaces="uap rescap">

  <Identity
    Name="48822ad2017.30397FC5B3C66"
    Publisher="CN=7F27496D-0310-4FD3-81EF-B816897FD011"
    Version="3.2.2.0" />

  <Properties>
    <DisplayName>RainbowTaskbar.</DisplayName>
    <PublisherDisplayName>ad2017</PublisherDisplayName>
    <Logo>Images\StoreLogo.png</Logo>
  </Properties>

  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.26100.0" />
  </Dependencies>

  <Resources>
    <Resource Language="x-generate"/>
  </Resources>
    
    

  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="$targetentrypoint$">
      <uap:VisualElements
        DisplayName="RainbowTaskbar"
        Description="MSIXPkg"
        BackgroundColor="transparent"
        Square150x150Logo="Images\Square150x150Logo.png"
        Square44x44Logo="Images\Square44x44Logo.png">
        <uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png"  Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png"/>
        <uap:SplashScreen Image="Images\SplashScreen.png" />
      </uap:VisualElements>

        <Extensions>
            <uap5:Extension
              Category="windows.startupTask"
              Executable="RainbowTaskbar\RainbowTaskbar.exe"
              EntryPoint="Windows.FullTrustApplication">
                <uap5:StartupTask
                  TaskId="RnbTsk_Startup"
                  Enabled="true"
                  DisplayName="RainbowTaskbar" />
            </uap5:Extension>
        </Extensions>
    </Application>
  </Applications>

  <Capabilities>
    <Capability Name="internetClient" />
    <rescap:Capability Name="runFullTrust" />
    <Capability Name="internetClientServer"/>
  </Capabilities>

    
</Package>


================================================
FILE: README.md
================================================
<div align="center">
   
[<sub>*</sub>](#microsoft-store)
[<img src="https://get.microsoft.com/images/en-us%20dark.svg" alt="Download from Microsoft Store" height="64">](https://apps.microsoft.com/detail/9nn78x0674xw)
[<img src="https://github-production-user-asset-6210df.s3.amazonaws.com/39013925/280434808-334b68d6-9568-4cc5-988d-a9bf186c1b8c.png" alt="Download x64" height="64">](https://github.com/ad2017gd/RainbowTaskbar/releases/download/3.2.2/setup-x64.exe)
[<img src="https://github-production-user-asset-6210df.s3.amazonaws.com/39013925/280435213-f3b1165b-dba6-4f0d-84ac-2cae15ec992a.png" alt="Donate" height="64">](https://paypal.me/ad2k17)

   <h1><a href="https://rnb.ad2017.dev">RainbowTaskbar</a></h1>
<p>Useful tool for Windows taskbar customization. Supports web configurations or instruction-like configurations that feature color effects, transitions, blur, images, text, rounded corners, shapes, transparency. Now rewritten in .NET 8!</p>
   <p><strong>Conflicts with TranslucentTB! Close it before running RainbowTaskbar</strong></p>

   https://www.youtube.com/watch?v=HvbapfQLOZs

   <img style="margin: 0 auto; width: 90%;" src="https://github.com/ad2017gd/RainbowTaskbar/assets/39013925/4e5ce6d6-4222-4437-9822-f1a19291e028">

   <div style="margin: 0 auto;">
      <img style="width: 30%;" src="https://github.com/ad2017gd/RainbowTaskbar/assets/39013925/29a01115-9aff-40eb-afbf-7770aaf346b4">
      <img style="width: 30%;" src="https://github.com/ad2017gd/RainbowTaskbar/assets/39013925/3effb1a7-8adf-4628-b415-42a303f5090f">
   </div>
   

<br>
<br>
</div>

# Getting started
First off, grab yourself the hottest new release at https://github.com/ad2017gd/RainbowTaskbar/releases.

RainbowTaskbar is a portable app, so there's no installing required. There are setups available, but they only install a single file and create a nice shortcut for you. If not already installed, you will be prompted to install the **.NET 8** runtime.

After launching the app for the first time, the editor will automatically open. You can find other users' presets in the Browse tab, or you can create your own.

![image](https://github.com/user-attachments/assets/acf1be2d-c5ea-493a-9a63-e266cd909b20)


Have fun using RainbowTaskbar!

# Documentation
https://rnb.ad2017.dev/web/docs
TODO

<div align="center">

# Thank you for 100 stars

A sincere thank you to all the users of RainbowTaskbar! Since the first release of this program in 2021, I would have never expected it to have as many users as it has now.

RainbowTaskbar has really been a passion project of mine all this time. It all started thanks to my friend telling me about the fact that, at the time, there weren't any really good
taskbar customization software (actually there were and still are but none would fit my personalization needs).

The first version of RainbowTaskbar was written in C, which was a pretty bad idea. I didn't realise at the time, but the UI was also pretty much garbage. However, when I saw
open source software websites reposting my tool, it really gave me the motivation to still work on this program.

Thanks to my other friend, [zCri](https://github.com/zCri), we both rewrote RainbowTaskbar to the (then) current v2 .NET version (now v3!), which allowed me to implement even more
features with cleaner UI.

After the rewrite, RainbowTaskbar received even more attention from people, which also made me continue updating it. However, all the attention has also led to some
copies of this software being sold on markets such as the Microsoft Store by other people, stripping it of all the credits.

If you wish to support me in the future development of this app and, perhaps, other apps, you can [buy RainbowTaskbar from the Microsoft Store](https://www.microsoft.com/store/productId/9NN78X0674XW) 
which is actually published by me, or by donating on [PayPal](https://paypal.me/ad2k17). I thank you once again for using this software.

</div>

# License
See `LICENSE` for more information.

# Notes
## Microsoft Store
*The Microsoft Store version of this software is provided as a means for donations. This software is free and open-source. You can download it for free in the releases tab or by clicking the download button next to the Microsoft Store page button.


================================================
FILE: RainbowTaskbar/App.xaml
================================================
<Application x:Class="RainbowTaskbar.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             Startup="Application_Startup"
            xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
             
             xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
            StartupUri="TrayWindow.xaml">
    <Application.Resources>

        <ResourceDictionary >
            <ResourceDictionary.MergedDictionaries >
                <ui:ThemesDictionary Theme="Dark" />
                <ui:ControlsDictionary />
            </ResourceDictionary.MergedDictionaries>


        </ResourceDictionary>

    </Application.Resources>

</Application>

================================================
FILE: RainbowTaskbar/App.xaml.cs
================================================
using H.Pipes;
using H.Pipes.AccessControl;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Win32;
using PropertyChanged;
using RainbowTaskbar.Configuration;
using RainbowTaskbar.Configuration.Instruction;
using RainbowTaskbar.Configuration.Web;
using RainbowTaskbar.Drawing;
using RainbowTaskbar.Editor;
using RainbowTaskbar.Helpers;
using RainbowTaskbar.HTTPAPI;
using RainbowTaskbar.Languages;
using RainbowTaskbar.Preferences;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Pipes;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Threading;
using System.Xml;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using Localization = RainbowTaskbar.Languages.Localization;

namespace RainbowTaskbar;

/// <summary>
///     Interaction logic for App.xaml
/// </summary>
public partial class App : Application {
    [DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
    public static extern bool SetProcessWorkingSetSize(IntPtr pProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize);

    [DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
    public static extern IntPtr GetCurrentProcess();



    [StructLayout(LayoutKind.Sequential)]
    struct Point {
        public int X;
        public int Y;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct MOUSEHOOKSTRUCT {
        public Point pt;
        public IntPtr hwnd;
        public uint wHitTestCode;
        public IntPtr dwExtraInfo;
    }

    public delegate int MouseProc(int nCode, IntPtr wParam, IntPtr lParam);

    [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    public static extern int SetWindowsHookEx(int idHook, MouseProc lpfn, int hInstance, int threadId);

    [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);

    static int mouseHookId = -1;
    static MouseProc callback = new MouseProc(HookCallback);
    const int WH_MOUSE_LL = 14;

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT {
        public int X;
        public int Y;
    }
    [DllImport("user32.dll")]
    static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);
    static DateTime last = DateTime.MinValue;
    [DllImport("user32.dll", EntryPoint = "RealChildWindowFromPoint", SetLastError = false)]
    public static extern IntPtr RealChildWindowFromPoint(IntPtr hwndParent, int x, int y);
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool UnhookWindowsHookEx(IntPtr hhk);

    public static IntPtr FindLastChildAtPoint(IntPtr parent, int x, int y) {
        IntPtr neww = RealChildWindowFromPoint(parent, x, y);
        if (neww != 0 && neww != parent) return FindLastChildAtPoint(neww, x, y);
        else return parent;
    }
    static DateTime lastMove = DateTime.MinValue;
    private static int HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
        var mhs = Marshal.PtrToStructure<MOUSEHOOKSTRUCT>(lParam);

        
        if (nCode >= 0) {


            App.Current.Dispatcher.BeginInvoke(() => {

                try {
                    if (App.Settings.SelectedConfig is InstructionConfig) return;

                    if (wParam == 0x0201 && trayWindow.TrayIcon.ContextMenu.IsOpen || wParam == 0x0204) return;
                    if (wParam == 0x0200 /* MOUSEMOVE */) {
                        if (DateTime.Now - lastMove > TimeSpan.FromMilliseconds(8)) {
                            lastMove = DateTime.Now;
                        }
                        else return;

                    }
                    var farLeft = (int) (App.taskbars.Count > 0 ? App.taskbars.Min(x => x.Left) : 0);
                    App.taskbars.ForEach(x => {
                        if (x.webView is null) return;

                        // passing WM_LBUTTONDOWN interferes with tray icon, too bad

                        var pn = System.Windows.Forms.Control.MousePosition;
                        var scale = x.windowHelper.scale;
                        if (!new System.Drawing.Rectangle(new((int) (x.Left * scale), (int) (x.Top * scale)), new((int) (x.ActualWidth * scale), (int) (x.ActualHeight * scale))).Contains(pn)) return;

                        POINT p = new POINT { X = (int) (pn.X), Y = (int) (pn.Y) };
                        IntPtr cch = FindLastChildAtPoint(x.webView.Handle, 0, 0);
                        ScreenToClient(App.Settings.GraphicsRepeat ? cch : x.windowHelper.HWND, ref p);
                        if (!App.Settings.GraphicsRepeat) p.X += (int) x.Left - farLeft;
                        PostMessage(cch, (uint) wParam, 0x0000, (IntPtr) (((uint) (p.Y) << 16) | ((((ushort) (p.X)) & 0xFFFF))));
                    });
                } catch { }
            });
            

            
        }

        return CallNextHookEx(mouseHookId, nCode, wParam, lParam);
    }


    public static List<Taskbar> taskbars = new();
    public static bool monacoExtracted = false;
    public static EditorWindow editor = null;
    public static TrayWindow trayWindow = (TrayWindow) Current.MainWindow;
    public static Mutex mutex = new(true, "RainbowTaskbar Mutex");
    public static Localization localization;
    public static EditorViewModel editorViewModel = new();
    public static bool firstRun = false;
    public static string rainbowTaskbarDir = Path.Join(Environment.GetEnvironmentVariable("AppData"), "RainbowTaskbar");
    public static string configDir = Path.Join(rainbowTaskbarDir, "configurations");
    public static string monacoDir = Path.Join(rainbowTaskbarDir, "monaco");
    public static LayerManager layers = null;
    public static Random rnd = new();
    public static HiddenWebViewHost hiddenWebViewHost = null;
    public static Microsoft.Web.WebView2.Wpf.WebView2 webView { get => hiddenWebViewHost?.webView_; }
    public static Mutex webViewReady = new Mutex();
    public static int farLeft;

    public static List<Config> AllConfigsFromFiles() {
        List<Config> configs = new();

        if(!Directory.Exists(configDir)) Directory.CreateDirectory(configDir);
        foreach (string f in Directory.EnumerateFiles(configDir)) {
            try {
                Config cfg = Config.FromFile(f);
                cfg.fileName = f;
                configs.Add(cfg);
            } catch { }
        }
        return configs;
    }

    public static ObservableCollection<Config> Configs { get; set; } = new ObservableCollection<Config>(AllConfigsFromFiles().OrderBy(x => x.Created).Reverse());
    public static Settings Settings { get; set; } = Settings.FromFile();

    public static void LaunchEditor() {
        if (editor == null) {
            editor = new EditorWindow();
        }
        editor.Show();
        editor.WindowState = WindowState.Normal;
        editor.Activate();
        editor.BringIntoView();
        editor.Focus();
    }
    public App() {
        localization = new Localization();
    }
    
   

    public new static void Exit() {
        if(trayWindow is not null) trayWindow.TrayIcon.Dispose();

        StopHook();
        ExplorerTAP.ExplorerTAP.Reset();

        taskbars.ForEach(t => {
            t.taskbarHelper.Radius = 0;
            t.taskbarHelper.UpdateRadius();

            t.Close();
            t.taskbarHelper.SetAlpha(1);
            TaskbarHelper.SendMessage(t.taskbarHelper.HWND, TaskbarHelper.WM_DWMCOMPOSITIONCHANGED, 1, null);
            t.taskbarHelper.Style = TaskbarHelper.TaskbarStyle.ForceDefault;
            t.taskbarHelper.SetBlur();
            // win11 fix
        });
        Current.Dispatcher.Invoke(() => { Current.Shutdown(); });
    }

    [StructLayout(LayoutKind.Sequential)]
    struct MSG {
        public IntPtr hwnd;
        public uint message;
        public IntPtr wParam;
        public IntPtr lParam;
        public uint time;
        public System.Drawing.Point pt;
    }

    [DllImport("user32.dll")]
    static extern bool GetMessage(out MSG lpMsg, IntPtr hWnd, uint wMsgFilterMin, uint wMsgFilterMax);

    [DllImport("user32.dll")]
    static extern bool TranslateMessage(ref MSG lpMsg);

    [DllImport("user32.dll")]
    static extern IntPtr DispatchMessage(ref MSG lpMsg);
    [DllImport("user32.dll", SetLastError = true)]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    public static void StartHook() {
        Task.Run(() => {
            Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

            if (mouseHookId != -1) return;
            mouseHookId = SetWindowsHookEx(WH_MOUSE_LL, callback, 0, 0);

            MSG msg;
            while (GetMessage(out msg, IntPtr.Zero, 0, 0)) {
                TranslateMessage(ref msg);
                DispatchMessage(ref msg);
            }
        });
    }
    public static void StopHook() {
        UnhookWindowsHookEx(mouseHookId);
        mouseHookId = -1;
    }
    private static bool isappfullscreen = false;
    public static bool IsAppFullscreen { get => isappfullscreen; set {
            isappfullscreen = value;
            if(value) {
                App.taskbars.ForEach(x => x.Hide());
            } else {
                App.taskbars.ForEach(x => x.Show());
            }
        } }

    public static bool IsAppMicrosoftStore { get => IsMicrosoftStore(); }
    public static bool IsMicrosoftStore() {
        return System.Environment.ProcessPath.ToLower().StartsWith(@"c:\program files\windowsapps");
       
    }
    private void Application_Startup(object sender, StartupEventArgs e) {
        var exceptionCount = 0;
        AppDomain.CurrentDomain.UnhandledException += (_, e) => {
            if (++exceptionCount >= 3) return;

            Exception err = (Exception) e.ExceptionObject;
            if(App.Settings is not null && App.Settings.workshopAPI is not null && App.Settings.ReportExceptions) {
                App.Settings.workshopAPI.ReportException(err);
            }
            MessageBox.Show(err.Message + "\n" + err.StackTrace, "RainbowTaskbar - Unhandled exception", MessageBoxButton.OK, MessageBoxImage.Error);
            Exit();
        };
        if (mutex.WaitOne(TimeSpan.Zero, true)) {
            if (e.Args.Length > 0 && e.Args[0] == "shell") {
                Task.Run(() => {
                    Thread.Sleep(500);
                    Process.Start(Environment.ProcessPath, Environment.GetCommandLineArgs());
                });
            }


            Task.Run(async () => {
                await using var pipe = new PipeServer<string>("RainbowTaskbar Pipe");
                pipe.AddAccessRules(new PipeAccessRule("Everyone", PipeAccessRights.FullControl, AccessControlType.Allow));
                pipe.MessageReceived += (sender, args) => {
                    if (args.Message == "OpenEditor")
                        Dispatcher.Invoke(() => {
                            LaunchEditor();
                        });
                    if (args.Message.StartsWith("Shell=")) {
                        var uri = new Uri(args.Message.Split("Shell=")[1]);
                        Dispatcher.Invoke(() => {
                            LaunchEditor();
                        });

                        if (uri.Host == "config") {
                            var configs = App.Settings.workshopAPI.SearchConfigsAsync(uri.AbsolutePath.Substring(1), Editor.Pages.SortBy.Match).Result;
                            if(configs.Result && configs.Results.Count == 1) {
                                var config = configs.Parse().ElementAt(0);
                                config.CachedBase64Thumbnail = App.Settings.workshopAPI.DownloadThumbnailBase64(config).Result;
                                config.LoadImage();
                                Dispatcher.Invoke(() => {
                                    App.editor.OpenConfig(config);
                                });
                            }
                        }

                    }
                        
                };
                await pipe.StartAsync();
                await Task.Delay(Timeout.InfiniteTimeSpan);
            });



            if (!Settings.GraphicsRepeat) {
                webViewReady.WaitOne();
                //App.webView = new();
            }


            App.localization.Switch(Settings.language);
            if (Settings.CheckUpdate && !IsMicrosoftStore()) AutoUpdate.CheckForUpdate();


            // port old config bleh

            var oldconfigpath = Environment.ExpandEnvironmentVariables("%appdata%/rnbconf.xml");
            var nwoldconfigpath = Environment.ExpandEnvironmentVariables("%appdata%/rnbconf.bak.xml");
            if (File.Exists(oldconfigpath)) {
                var res = MessageBox.Show(App.localization.Get("msgbox_migrate"), "RainbowTaskbar", MessageBoxButton.YesNo);

                if (res == MessageBoxResult.Yes) {
                    File.WriteAllText(oldconfigpath, File.ReadAllText(oldconfigpath).Replace("RainbowTaskbar.Configuration", "RainbowTaskbar.V2Legacy.Configuration"));


                    using var fileStream = new FileStream(oldconfigpath, FileMode.OpenOrCreate);
                    using var reader = XmlDictionaryReader.CreateTextReader(fileStream, new XmlDictionaryReaderQuotas());

                    var serializerSettings = new DataContractSerializerSettings {
                        PreserveObjectReferences = true
                    };

                    var serializer = new DataContractSerializer(typeof(V2Legacy.Configuration.Config), serializerSettings);
                    var cfg = serializer.ReadObject(reader) as V2Legacy.Configuration.Config;

                    var curcfg = InstructionConfig.FromLegacyConfig(cfg);
                    curcfg.ToFile();
                    App.Configs.Add(curcfg);
                    foreach (var preset in cfg.Presets) {
                        var portcfg = InstructionConfig.FromLegacyPreset(preset);
                        portcfg.ToFile();
                        App.Configs.Add(portcfg);
                    }

                    reader.Close();
                    fileStream.Close();

                    File.Delete(oldconfigpath);
                } else {
                    File.Delete(oldconfigpath);
                }
            }






            Settings.workshopAPI = new WorkshopAPI() {};

            Settings.OnLoginKeyChanged();

            if (Settings.FirstStart) {
                Settings.FirstStart = false;
                Settings.ToFile();
                firstRun = true;
            }
            //TODO:remove this its for debugfging
            // LaunchEditor();

            if (Settings.WebTouchThrough) StartHook();

            if (App.Settings.Version < Assembly.GetExecutingAssembly().GetName().Version) {
                if (App.Settings.Version > new Version("1.0")) {
                    // Valid update
                    if (App.Settings.Version <= new Version("3.1.3") && App.IsMicrosoftStore()) {
                        App.Settings.RunAtStartup = true;
                    }
                }

                App.Settings.Version = Assembly.GetExecutingAssembly().GetName().Version;
                App.Settings.SaveChanged();
            }

            Task.Run(() => {
                ExplorerTAP.ExplorerTAP.TryInject();

                

                App.Current.Dispatcher.Invoke(() => {
                    taskbars = FindAllTaskbars();
                    SetupTaskbars();

                    Taskbar.SetupLayers();

                    Taskbar.SetupWebViews();

                    if(App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Start();

                    Settings.OnGlobalOpacityChanged();

                    


                    if (firstRun == true) {
                        Task.Run(() => {
                            Thread.Sleep(1000); // amazing coding
                            Dispatcher.Invoke(() => LaunchEditor());
                        });
                    }


                    // todo: add back?
                    // API.Start();
                });



            });


        }
        else {
            var shell = false;
            var shellMessage = "";
            foreach (string s in e.Args) {
                if(shell == true) {
                    shellMessage = s;
                }
                if(s == "shell") {
                    shell = true;
                }
                
            }


            var pipe = new PipeClient<string>("RainbowTaskbar Pipe");
            pipe.ConnectAsync().Wait();
            if (shell) {
                pipe.WriteAsync("Shell="+shellMessage).Wait();
            } else {
                pipe.WriteAsync("OpenEditor").Wait();
                
            }
            pipe.DisconnectAsync().Wait();
            Environment.Exit(0);

        }
    }

    public delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);

    [DllImport("user32.dll")]
    private static extern int EnumWindows(EnumWindowsProc proc, int lParam);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

    public static List<Taskbar> FindAllTaskbars() {
        List<Taskbar> tsk = new List<Taskbar>();

        var nw = new Taskbar(TaskbarHelper.FindWindow("Shell_TrayWnd", null));
        nw.Show();
        tsk.Add(nw);

        EnumWindows(new EnumWindowsProc((hWnd, lParam) =>
        {
            StringBuilder className = new StringBuilder(255);
            GetClassName(hWnd, className, 255);
            if (className.ToString() == "Shell_SecondaryTrayWnd") {
                var newWindow = new Taskbar(hWnd, true);
                newWindow.Show();
                tsk.Add(newWindow);
            }

            return true;
        }), 0);
        
        return tsk;
    }

    public static void SetupTaskbars() {
        
        taskbars.MinBy(t => t.Left).taskbarHelper.first = true;
        taskbars.MaxBy(t => t.Left).taskbarHelper.last = true;
        taskbars.ForEach(t => {
            t.taskbarHelper.UpdateRadius();
            int fals = 1;
            TaskbarHelper.DwmSetWindowAttribute(new WindowInteropHelper(t).EnsureHandle(), TaskbarHelper.DWMWINDOWATTRIBUTE.ExcludedFromPeek, ref fals, sizeof(int));
        });

        Task.Run(() => {
            if (!ExplorerTAP.ExplorerTAP.NeedsTAP()) return;

            var hwnd = TaskbarHelper.FindWindow("Shell_TrayWnd", null);
            while(hwnd != IntPtr.Zero) {
                Thread.Sleep(150);
                hwnd = TaskbarHelper.FindWindow("Shell_TrayWnd", null);
            }

            ExplorerTAP.ExplorerTAP.IsInjected = false;

            do {
                hwnd = TaskbarHelper.FindWindow("Shell_TrayWnd", null);
                Thread.Sleep(150);
            } while (hwnd == IntPtr.Zero);

            while (!ExplorerTAP.ExplorerTAP.NeedsTAP()) {
                Thread.Sleep(150);
            }

            Thread.Sleep(2000);
            
            ExplorerTAP.ExplorerTAP.TryInject();

            while (!ExplorerTAP.ExplorerTAP.IsInjected) {
                Thread.Sleep(150);
            }
            ReloadTaskbars();
        });



    }
    public static void ReloadTaskbars(bool startConfig = true) =>
        Current.Dispatcher.Invoke(() => {
            if (App.hiddenWebViewHost is not null) {
                if (App.hiddenWebViewHost.webView_ is not null) {
                    App.hiddenWebViewHost.webView_.Dispose();
                    App.hiddenWebViewHost.webView_ = null;
                }
                App.hiddenWebViewHost.Close();
                App.hiddenWebViewHost = null;
            }
            if (!App.Settings.GraphicsRepeat) {
                webViewReady.WaitOne();
                App.hiddenWebViewHost = new();
            }
            taskbars.ForEach(taskbar => {
                if(taskbar.webView_ is not null) taskbar.webView_.Dispose();
                taskbar.webView_ = null;
                taskbar.windowHelper.RemoveDuplicate();
                taskbar.Close();
            });
            if(Config.currentlyRunning is not null) Config.currentlyRunning.Stop().Wait(500);
            Config.currentlyRunning = null;

            taskbars = FindAllTaskbars();

            SetupTaskbars();
            Taskbar.SetupLayers();
            Taskbar.SetupWebViews();

            Task.Run(() => {
                Thread.Sleep(100);
                App.Current.Dispatcher.Invoke(() => Taskbar.SoftReset(startConfig));
            });
        });
}

================================================
FILE: RainbowTaskbar/AssemblyInfo.cs
================================================
using System.Windows;

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
    //(used if a resource is not found in the page,
    // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
    //(used if a resource is not found in the page,
    // app, or any theme specific resource dictionaries)
)]

================================================
FILE: RainbowTaskbar/Configuration/Config.cs
================================================
using RainbowTaskbar.Configuration.Instruction;
using RainbowTaskbar.Configuration.Instruction.Instructions;
using RainbowTaskbar.Configuration.Web;
using RainbowTaskbar.Helpers;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;

namespace RainbowTaskbar.Configuration {
    public enum ConfigPublishStatus {
        NotPublished,
        PreviouslyPublished,
        Published
    }

    [JsonDerivedType(typeof(InstructionConfigData), typeDiscriminator: "c")]
    [JsonDerivedType(typeof(WebConfigData), typeDiscriminator: "w")]
    [Serializable]
    public abstract class  ConfigData {
        
    }

    [JsonDerivedType(typeof(InstructionConfig), typeDiscriminator: "c")]
    [JsonDerivedType(typeof(WebConfig), typeDiscriminator: "w")]
    [Serializable]
    public abstract class Config : INotifyPropertyChanged {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        public string Name { get; set; } = App.localization?.Get("untitled") ?? "Untitled";
        public string Description { get; set; } = "";
        public string? PublishedID { get; set; }
        public string? PreviousPublishedID { get; set; }
        public string? CachedPublisherUsername { get; set; }
        public string? CachedBase64Thumbnail { get; set; }
        [JsonIgnore]
        public int? CachedLikeCount { get; set; }
        [JsonIgnore]
        public int? CachedCommentCount { get; set; }
        public string LocalID { get; set; }
        public DateTime Created { get; set; } = DateTime.Now;
        public DateTime Updated { get; set; } = DateTime.Now;
        public DateTime Published { get; set; } = DateTime.MinValue;
        [JsonIgnore]
        public bool ChangedSincePublish { get => Updated > Published; }
        [JsonIgnore]
        public ConfigPublishStatus PublishStatus { get => PublishedID is not null ? (ChangedSincePublish ? ConfigPublishStatus.PreviouslyPublished : ConfigPublishStatus.Published) : ConfigPublishStatus.NotPublished; }

        public static Config currentlyRunning;
        public ConfigData ConfigData { get; set; }
        [JsonIgnore]
        public static JsonSerializerOptions SerializerOptions { get; set; } = new JsonSerializerOptions { Converters = { new JsonColorConverter() } };
        [JsonIgnore]
        public string ConfigType { get => this.GetType().Name; }

        [JsonIgnore]
        public string fileName = null;

        public void InitNew() {
            LocalID = Guid.NewGuid().ToString();
        }
        public static Config FromFile(string file) {
            if (!File.Exists(file)) return null;
            Config cfg = JsonSerializer.Deserialize<Config>(File.ReadAllText(file), SerializerOptions);
            cfg.fileName = file;
            return cfg;
        }
        public void ToFile() {
            if (fileName is null)
                fileName = Path.Join(App.configDir, LocalID + ".json");
            File.WriteAllText(fileName,
                JsonSerializer.Serialize(this, SerializerOptions));
        }
        public Config Copy() {
            return JsonSerializer.Deserialize<Config>(JsonSerializer.Serialize(this, SerializerOptions), SerializerOptions);
        }
        public void DeleteFile() {
            if (File.Exists(fileName)) File.Delete(fileName);
        }

        static bool stopping = false;
        public virtual Task<bool> Start() {
            if (stopping) return Task.FromResult(false);

            return Task.Run(() => {
                stopping = true;

                if (currentlyRunning is not null) currentlyRunning.Stop().Wait(300);
                stopping = false;

                App.Current.Dispatcher.Invoke(() => {
                    var inst = new TransparencyInstruction() {
                        Type = TransparencyInstruction.TransparencyInstructionType.All, Opacity = 1
                    };
                    var inst2 = new TransparencyInstruction() {
                        Type = TransparencyInstruction.TransparencyInstructionType.TaskbarElements, Opacity = 1
                    };
                    App.taskbars.ForEach(x => { inst.Execute(x); inst2.Execute(x); });
                    currentlyRunning = this;
                });

                return true;

            });
            
           
            



        }
        public abstract Task Stop();
        public BitmapImage? LoadImage() {
            if (CachedBase64Thumbnail is null) return null;

            try {
                byte[] imageBytes = Convert.FromBase64String(CachedBase64Thumbnail);

                var bImg = new BitmapImage();
                using (var stream = new MemoryStream(imageBytes, 0, imageBytes.Length)) {
                    
                    bImg.BeginInit();
                    bImg.CacheOption = BitmapCacheOption.OnLoad;
                    bImg.StreamSource = stream;
                    bImg.EndInit();

                    bImg.Freeze();
                }
                

                return bImg;

            }
            catch { return null; }

        }


    }


}


================================================
FILE: RainbowTaskbar/Configuration/Instruction/DefaultPresets.cs
================================================
using RainbowTaskbar.Configuration.Instruction.Instructions;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;

namespace RainbowTaskbar.Configuration.Instruction;

public static class DefaultPresets {
    public static readonly InstructionPreset Rainbow = new() {
        Name = "Rainbow",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                new BorderRadiusInstruction {
                     Radius = 16
                },
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Style,
                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                },
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,
                    Opacity = 0.8
                },
            }
        },
        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {
            new InstructionGroup {
                Instructions = new BindingList<Instruction> {
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 255, 0, 0),
                        Color2 = Color.FromArgb(255, 255, 154, 0),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 255, 154, 0),
                        Color2 = Color.FromArgb(255, 208, 222, 33),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 208, 222, 33),
                        Color2 = Color.FromArgb(255, 79, 220, 74),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 79, 220, 74),
                        Color2 = Color.FromArgb(255, 63, 218, 216),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 63, 218, 216),
                        Color2 = Color.FromArgb(255, 47, 201, 226),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 47, 201, 226),
                        Color2 = Color.FromArgb(255, 28, 127, 238),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 28, 127, 238),
                        Color2 = Color.FromArgb(255, 95, 21, 242),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 95, 21, 242),
                        Color2 = Color.FromArgb(255, 186, 12, 248),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 186, 12, 248),
                        Color2 = Color.FromArgb(255, 251, 7, 217),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    },
                    new ColorInstruction {
                        Time = 1,
                        Color1 = Color.FromArgb(255, 251, 7, 217),
                        Color2 = Color.FromArgb(255, 255, 0, 0),
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Time2 = 500
                    }
                }
            }
        })
    };

    public static readonly InstructionPreset Chill = new() {
        Name = "Chill",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Style,
                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                },
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,
                    Opacity = 0.9
                },
            }
        },
        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {
            new InstructionGroup {
                Instructions = new BindingList<Instruction> {
                    new ColorInstruction {
                        Time = 5000,
                        Color1 = Color.RoyalBlue,
                        Color2 = Color.DarkBlue,
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Cubic,
                        Time2 = 3000
                    },
                    new ColorInstruction {
                        Time = 5000,
                        Color1 = Color.DarkBlue,
                        Color2 = Color.RoyalBlue,
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Cubic,
                        Time2 = 3000
                    }
                } 
            }
        })
    };

    public static readonly InstructionPreset Unknown = new() {
        Name = "Unknown",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Style,
                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                },
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,
                    Opacity = 0.9
                },
            }
        },
        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {
            new InstructionGroup {
                Instructions = new BindingList<Instruction> {
                    new ColorInstruction {
                        Time = 1001,
                        Randomize = true,
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Linear,
                        Time2 = 1000
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    }
                } 
            },
            new InstructionGroup {
                Instructions = new BindingList<Instruction> {
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    },
                    new TransparencyInstruction {
                        Type = TransparencyInstruction.TransparencyInstructionType.Style,
                        Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                    }
                }
            }
        })
    };

    public static readonly InstructionPreset HighContrast = new() {
        Name = "High contrast",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Style,
                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                },
                new ShapeInstruction {
                    Shape = ShapeInstruction.ShapeInstructionShapes.Rectangle,
                    Fill = Color.Transparent,
                    Line = Color.FromArgb(0, 255, 0),
                    Layer = 1,
                    LineSize = 4,
                    FitTaskbars = true
                },
                new ColorInstruction {
                    Time = 1001,
                    Color1 = Color.Black,
                    Effect = ColorInstruction.ColorInstructionEffect.Solid,
                }
            }
        }
    };

    public static readonly InstructionPreset ModernChill = new() {
        Name = "Modern Blue Chill",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                 new BorderRadiusInstruction {
                     Radius = 16
                 },
                 new TransparencyInstruction {
                     Type = TransparencyInstruction.TransparencyInstructionType.Style,
                     Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                 },
                 new TransparencyInstruction {
                     Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,
                     Opacity = 0.9
                 },
                 new TransparencyInstruction {
                     Type = TransparencyInstruction.TransparencyInstructionType.Layer,
                     Opacity = 0.8,
                     Layer = 0,
                 },
            }
        },
        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {
            new InstructionGroup {
                Instructions = new BindingList<Instruction> {
                    new ShapeInstruction {
                        FitTaskbars = true,
                        DrawOnce = true,
                        Shape = ShapeInstruction.ShapeInstructionShapes.Rectangle,
                        LineSize = 2,
                        Line = Color.FromArgb(255,0, 200, 255),
                        Fill = Color.Transparent,
                        Layer = 1
                    },
                    new ColorInstruction {
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Sine,
                        Time = 3000,
                        Color1 = Color.FromArgb(255, 0, 136, 196),
                        Color2 = Color.Black,
                        Angle = 0,
                        Time2 = 5000,
                        Layer = 0,
                        Randomize = false
                    },
                    new ColorInstruction {
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Sine,
                        Time = 3000,
                        Color1 = Color.Black,
                        Color2 = Color.FromArgb(255, 0, 136, 196),
                        Angle = 0,
                        Time2 = 5000,
                        Layer = 0,
                        Randomize = false
                    }
                } 
            }
        })
    };

    public static readonly InstructionPreset ModernChill2 = new() {
        Name = "Modern Red Chill",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                new BorderRadiusInstruction {
                    Radius = 16
                },
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Style,
                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                },
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.RainbowTaskbar,
                    Opacity = 0.9
                },
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Layer,
                    Opacity = 0.8,
                    Layer = 0,
                },
            }
        },
        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {
            new InstructionGroup {
                Instructions = new BindingList<Instruction> {
                    new ShapeInstruction {
                        FitTaskbars = true,
                        DrawOnce = true,
                        Shape = ShapeInstruction.ShapeInstructionShapes.Rectangle,
                        LineSize = 2,
                        Line = Color.FromArgb(255,255, 61, 0),
                        Fill = Color.Transparent,
                        Layer = 1
                    },
                    new ColorInstruction {
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Sine,
                        Time = 3000,
                        Color1 = Color.FromArgb(255, 176, 0, 0),
                        Color2 = Color.Black,
                        Angle = 0,
                        Time2 = 5000,
                        Layer = 0,
                        Randomize = false
                    },
                    new ColorInstruction {
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Sine,
                        Time = 3000,
                        Color1 = Color.Black,
                        Color2 = Color.FromArgb(255, 176, 0, 0),
                        Angle = 0,
                        Time2 = 5000,
                        Layer = 0,
                        Randomize = false
                    }
                } 
            }
        })
    };

    public static readonly InstructionPreset Translucent = new() {
        Name = "Translucent",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Style,
                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                }
            }
        },
    };

    public static readonly InstructionPreset Blurred = new() {
        Name = "Blurred",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Style,
                    Style = TransparencyInstruction.TransparencyInstructionStyle.Blur
                }
            }
        },
    };

    public static readonly InstructionPreset Vaporwave = new() {
        Name = "Vaporwave",
        RunOnceGroup = new InstructionGroup() {
            Instructions = {
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Style,
                    Style = TransparencyInstruction.TransparencyInstructionStyle.Transparent
                },
                new TransparencyInstruction {
                    Type = TransparencyInstruction.TransparencyInstructionType.Layer,
                    Opacity = 0.6,
                    Layer = 0,
                },
            }
        },
        LoopGroups = new BindingList<InstructionGroup>(new InstructionGroup[] {
            new InstructionGroup {
                Instructions = new BindingList<Instruction> {
                    new ShapeInstruction {
                        FitTaskbars = true,
                        DrawOnce = true,
                        Shape = ShapeInstruction.ShapeInstructionShapes.Rectangle,
                        LineSize = 2,
                        Line = Color.FromArgb(255, 159,198, 255),
                        Fill = Color.Transparent,
                        Layer = 1
                    },
                    new TextInstruction {
                        DrawOnce = true,
                        Text = " レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー  レーンボー・タスクバー ",
                        Center = true,
                        Y = 6,
                        Font = "Arial",
                        Size = 32,
                        Color = Color.FromArgb(63,220,247,255),
                        Layer = 1
                    },
                    new TextInstruction {
                        DrawOnce = true,
                        Text = "◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓        ◓",
                        X = 4,
                        Y = 6,
                        Font = "Arial",
                        Size = 32,
                        Color = Color.FromArgb(127,255,110,172),
                        Layer = 1
                    },
                    new TextInstruction {
                        DrawOnce = true,
                        Text = "◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓        ◒        ◓",
                        X = 6,
                        Y = 8,
                        Font = "Arial",
                        Size = 32,
                        Color = Color.FromArgb(127,255,214,110),
                        Layer = 1
                    },
                    new TextInstruction {
                        DrawOnce = true,
                        Text = "ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ツ                ",
                        Center = true,
                        Y = 29,
                        Font = "Arial",
                        Size = 16,
                        Color = Color.FromArgb(200,110,255,182),
                        Layer = 1
                    },
                    new ColorInstruction {
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Linear,
                        Time = 0,
                        Color1 = Color.FromArgb(255, 100, 112, 216),
                        Color2 = Color.FromArgb(255, 0, 185, 255),
                        Angle = 0,
                        Time2 = 1500,
                        Layer = 0,
                        Randomize = false
                    },
                    new ColorInstruction {
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Linear,
                        Time = 0,
                        Color1 = Color.FromArgb(255, 0, 185, 255),
                        Color2 = Color.FromArgb(255, 255, 0, 158),
                        Angle = 0,
                        Time2 = 1500,
                        Layer = 0,
                        Randomize = false
                    },
                    new ColorInstruction {
                        Effect = ColorInstruction.ColorInstructionEffect.FadeGradient,
                        Transition = ColorInstruction.ColorInstructionTransition.Linear,
                        Time = 0,
                        Color1 = Color.FromArgb(255, 255, 0, 158),
                        Color2 = Color.FromArgb(255, 100, 112, 216),
                        Angle = 0,
                        Time2 = 1500,
                        Layer = 0,
                        Randomize = false
                    }
                } 
            }
        })
    };

    public static readonly List<InstructionPreset> Presets = new List<InstructionPreset>() {
        Translucent, Blurred, Rainbow, Chill,
        HighContrast, ModernChill,ModernChill2,
        Vaporwave, Unknown
    };
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instruction.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading;
using FastMember;
using RainbowTaskbar.Configuration.Instruction.Instructions;
using RainbowTaskbar.Configuration.Web;


namespace RainbowTaskbar.Configuration.Instruction;

[JsonDerivedType(typeof(BorderRadiusInstruction), typeDiscriminator: "b")]
[JsonDerivedType(typeof(ClearLayerInstruction), typeDiscriminator: "c")]
[JsonDerivedType(typeof(ColorInstruction), typeDiscriminator: "cl")]
[JsonDerivedType(typeof(DelayInstruction), typeDiscriminator: "d")]
[JsonDerivedType(typeof(ImageInstruction), typeDiscriminator: "i")]
[JsonDerivedType(typeof(ShapeInstruction), typeDiscriminator: "s")]
[JsonDerivedType(typeof(TextInstruction), typeDiscriminator: "t")]
[JsonDerivedType(typeof(TransparencyInstruction), typeDiscriminator: "tr")]
public abstract class Instruction : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;


    public static IEnumerable<Type> InstructionTypes { get; set; } = GetKnownInstructionTypes();
    public static IEnumerable<Type> DisplayableInstructionTypes {
        get => InstructionTypes.Skip(1);
    }
    [JsonIgnore]
    public abstract string Description { get; }
    [JsonIgnore]
    public string Name {
        get {
            return App.localization.Name(GetType().Name.ToLower());
        }
    }
    [JsonIgnore]
    public string TypeName {
        get {
            return GetType().Name;
        }
    }


    public static IEnumerable<Type> GetKnownInstructionTypes() {
        if (InstructionTypes == null)
            InstructionTypes = Assembly.GetExecutingAssembly().GetTypes()
                .Where(type => typeof(Instruction).IsAssignableFrom(type)).ToList();

        return InstructionTypes;
    }

    public bool Execute(Taskbar window) => Execute(window, CancellationToken.None);

    public abstract bool Execute(Taskbar window, CancellationToken token);

    // TODO: Json or remove this idk
    //public abstract JObject ToJSON();
    /*
    public static Instruction FromJSON(Type type, JObject json) {
        dynamic inst = type.GetConstructor(Array.Empty<Type>()).Invoke(null) as Instruction;


        foreach (var prop in json.Properties())
            if (prop.Name != "Name" && prop.Name != "Position") {
                var wrapped = ObjectAccessor.Create(inst);
                if (prop.Name.StartsWith("Color"))
                    wrapped[prop.Name] = ColorTranslator.FromHtml(prop.Value.Value<string>());
                else
                    if (wrapped[prop.Name] is not null)
                    wrapped[prop.Name] = Convert.ChangeType(prop.Value, wrapped[prop.Name].GetType());
                else
                    wrapped[prop.Name] = prop.Value;
            }

        return inst;
    }
    */
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/InstructionConfig.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Dynamic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Animation;
using System.Xml;

using PropertyChanged;
using RainbowTaskbar.HTTPAPI;
using System.Diagnostics;
using RainbowTaskbar.Configuration.Instruction.Instructions;
using System.Text.Json.Serialization;

namespace RainbowTaskbar.Configuration.Instruction;
[Serializable]
public class InstructionConfigData : ConfigData, INotifyPropertyChanged {

    private static readonly int SupportedConfigVersion = 0;
    public int ConfigFileVersion { get; set; } = SupportedConfigVersion;
    public InstructionGroup RunOnceGroup { get; set; } = new();
    [OnChangedMethod(nameof(SetupPropertyChanged))]
    public BindingList<InstructionGroup> LoopGroups { get; set; } = new BindingList<InstructionGroup>();

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

    // PropertyChanged bullshit
    private void SetupPropertyChanged() {
        LoopGroups.ListChanged += (_, _) => OnPropertyChanged(nameof(Instructions));
    }
    // ------------------------
    public InstructionConfigData() {
        SetupPropertyChanged();
    }
}

[Serializable]
public class InstructionConfig : Config {

    public CancellationTokenSource cts = new CancellationTokenSource();

    public InstructionConfigData Data { get => ConfigData as InstructionConfigData; set => ConfigData = value; }

    public InstructionConfig() {
        ConfigData = new InstructionConfigData();

        Data.RunOnceGroup = new InstructionGroup();
    }
    public override async Task<bool> Start() {
        if(!(await base.Start())) return false;
        App.taskbars.ForEach(x => {
            x.ClassicGrid.Visibility = System.Windows.Visibility.Visible;
            x.WebGrid.Visibility = System.Windows.Visibility.Collapsed;
        });
        Task.Run(() => StartGroupTasks());
        return true;
    }
    public override Task Stop() {
        return Task.WhenAll(StopGroupTasks());
    }

    public List<Task> StopGroupTasks() {
        var tasks = new List<Task>();
        if(cts is not null) {
            cts.Cancel();
            cts = null;
        }
        if(Data.RunOnceGroup.Task is not null) tasks.Add(Data.RunOnceGroup.Task);
        foreach(var group in Data.LoopGroups) {
            if(group.Task is not null) tasks.Add(group.Task);
        }

        return tasks;
    }

    public void StartGroupTasks() {

        Stop().Wait();
        cts = new CancellationTokenSource();
        Data.RunOnceGroup.StartOnceTask(cts.Token);
        Data.RunOnceGroup.Task.Wait(cts.Token);
        foreach (var group in Data.LoopGroups) {
            group.StartLoopTask(cts.Token);
        }


    }

    public static BindingList<Instruction> LegacyInstructionsToV2(BindingList<V2Legacy.Configuration.Instruction> instructions) {
        var cfg = new BindingList<Instruction>();


        foreach (var inst in instructions) {
            if (inst is V2Legacy.Configuration.Instructions.BorderRadiusInstruction binst) {
                cfg.Add(new BorderRadiusInstruction() {
                    Radius = binst.Radius,
                });
            }
            if (inst is V2Legacy.Configuration.Instructions.ClearLayerInstruction cinst) {
                cfg.Add(new ClearLayerInstruction() {
                    Layer = cinst.Layer,
                });
            }
            if (inst is V2Legacy.Configuration.Instructions.ColorInstruction clinst) {
                cfg.Add(new ColorInstruction() {
                    Angle = clinst.Angle,
                    Color1 = clinst.Color1,
                    Color2 = clinst.Color2,
                    Effect = (ColorInstruction.ColorInstructionEffect) clinst.Effect,
                    Randomize = clinst.Randomize,
                    Layer = clinst.Layer,
                    Time = clinst.Time,
                    Time2 = clinst.Time2,
                    Transition = (ColorInstruction.ColorInstructionTransition) clinst.Transition
                });
            }
            if (inst is V2Legacy.Configuration.Instructions.DelayInstruction dinst) {
                cfg.Add(new DelayInstruction() {
                    Time = dinst.Time,
                });
            }
            if (inst is V2Legacy.Configuration.Instructions.ImageInstruction iinst) {
                cfg.Add(new ImageInstruction() {
                    DrawOnce = iinst.DrawOnce,
                    Height = iinst.Height,
                    Layer = iinst.Layer,
                    Width = iinst.Width,
                    Opacity = iinst.Opacity,
                    Path = iinst.Path,
                    X = iinst.X,
                    Y = iinst.Y
                });
            }
            if (inst is V2Legacy.Configuration.Instructions.ShapeInstruction sinst) {
                cfg.Add(new ShapeInstruction() {
                    DrawOnce = sinst.DrawOnce,
                    Shape = (ShapeInstruction.ShapeInstructionShapes) sinst.Shape,
                    Fill = sinst.Fill,
                    FitTaskbars = sinst.FitTaskbars,
                    Layer = sinst.Layer,
                    Line = sinst.Line,
                    LineSize = sinst.LineSize,
                    Radius = sinst.Radius,
                    X2 = sinst.X2,
                    Y2 = sinst.Y2,
                    X = sinst.X,
                    Y = sinst.Y
                });
            }
            if (inst is V2Legacy.Configuration.Instructions.TextInstruction tinst) {
                cfg.Add(new TextInstruction() {
                    Size = tinst.Size,
                    Center = tinst.Center,
                    Color = tinst.Color,
                    DrawOnce = tinst.DrawOnce,
                    Font = tinst.Font,
                    Layer = tinst.Layer,
                    Text = tinst.Text,
                    X = tinst.X,
                    Y = tinst.Y,
                });
            }
            if (inst is V2Legacy.Configuration.Instructions.TransparencyInstruction trinst) {
                cfg.Add(new TransparencyInstruction() {
                    Layer = trinst.Layer,
                    Style = (TransparencyInstruction.TransparencyInstructionStyle) trinst.Style,
                    Opacity = trinst.Opacity,
                    Type = (TransparencyInstruction.TransparencyInstructionType) trinst.Type
                });
            }
        }

        return cfg;
    }


    public static InstructionConfig FromLegacyConfig(V2Legacy.Configuration.Config config) {
        var cfg = new InstructionConfig();
        cfg.InitNew();
        var cfgData = (InstructionConfigData)cfg.ConfigData;
        cfgData.LoopGroups.Add(new());
        cfgData.LoopGroups[0].Instructions = LegacyInstructionsToV2(config.Instructions);
        cfg.Name = "(MIGRATED) Current";
        return cfg;
    }
    public static InstructionConfig FromLegacyPreset(V2Legacy.Configuration.InstructionPreset preset) {
        var cfg = new InstructionConfig();
        cfg.InitNew();
        var cfgData = (InstructionConfigData) cfg.ConfigData;
        cfgData.LoopGroups.Add(new());
        cfgData.LoopGroups[0].Instructions = LegacyInstructionsToV2(preset.Instructions);
        cfg.Name = "(MIGRATED) " + preset.Name;
        

        return cfg;
    }
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/InstructionGroup.cs
================================================
using PropertyChanged;
using RainbowTaskbar.HTTPAPI;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;

namespace RainbowTaskbar.Configuration.Instruction {
    public class InstructionGroup : INotifyPropertyChanged {

        [OnChangedMethod(nameof(SetupPropertyChanged))]
        public BindingList<Instruction> Instructions { get; set; } = new BindingList<Instruction>();
        [JsonIgnore]
        public Task Task { get; set; } = null;
        private int groupStep = 0;

        public event PropertyChangedEventHandler PropertyChanged;

        private void SetupPropertyChanged() {
            Instructions.ListChanged += (_, _) => OnPropertyChanged(nameof(Instructions));
        }

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));


        public InstructionGroup() {
            SetupPropertyChanged();
        }

        public bool RunOnceTask(CancellationToken token) {
            bool slept = false;
            for (groupStep = 0;
                     groupStep < Instructions.Count && !token.IsCancellationRequested;
                     groupStep++) {

                try {
                    


                    var tasks = new List<Task>();

                    App.taskbars.ForEach(taskbar => {
                        tasks.Add(Task.Run(() => {
                            if (groupStep < Instructions.Count && Instructions[groupStep].Execute(taskbar, token)) slept = true;
                        }));
                    });
                    Task.WaitAll(tasks.ToArray(), token);

                }
                catch (Exception e) {
                    if (e.GetType() == typeof(OperationCanceledException) || e.InnerException is not null && e.InnerException.GetType() == typeof(TaskCanceledException)) {
                        return slept;
                    }
                    MessageBox.Show(
                        $"The \"{Instructions[groupStep].Description}\" instruction at index {groupStep} (starting from 0) threw an exception, it will be removed from the instruction group.\n${e.Message}",
                        "RainbowTaskbar", MessageBoxButton.OK, MessageBoxImage.Error);
                    Application.Current.Dispatcher.Invoke(() => {
                        Instructions.RemoveAt(groupStep);
                        App.Settings.SelectedConfig.ToFile();
                        App.ReloadTaskbars();
                    });
                    return slept;
                }
            }
            return slept;
        }

        public void LoopTask(CancellationToken token) {
            while (!token.IsCancellationRequested) {
                var slept = RunOnceTask(token);

                if (!slept) break;
            }
        }
        public void StartOnceTask(CancellationToken token) {
            Task = Task.Run(() => RunOnceTask(token));
        }
        public void StartLoopTask(CancellationToken token) {
            Task = Task.Run(() => LoopTask(token));
        }
    }

}


================================================
FILE: RainbowTaskbar/Configuration/Instruction/InstructionPreset.cs
================================================
using System.ComponentModel;
using System.Runtime.Serialization;

namespace RainbowTaskbar.Configuration.Instruction;


public class InstructionPreset {
    public string Name { get; set; }
    public InstructionGroup RunOnceGroup { get; set; } = new InstructionGroup();
    public BindingList<InstructionGroup> LoopGroups { get; set; } = new BindingList<InstructionGroup>();
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instructions/BorderRadiusInstruction.cs
================================================
using System.Dynamic;
using System.Runtime.Serialization;
using System.Threading;


namespace RainbowTaskbar.Configuration.Instruction.Instructions;


internal class BorderRadiusInstruction : Instruction {
    public int Radius { get; set; } = 0;

    public override string Description {
        get {
            return App.localization.InstructionFormat(this, Radius);
        }
    }


    public override bool Execute(Taskbar window, CancellationToken _) {
        window.taskbarHelper.Radius = Radius;
        window.windowHelper.Radius = Radius;
        window.taskbarHelper.UpdateRadius();
        return false;
    }
    /*
    public override JObject ToJSON() {
        dynamic data = new ExpandoObject();
        data.Name = GetType().Name;
        data.Radius = Radius;

        return JObject.FromObject(data);
    }
    */
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instructions/ClearLayerInstruction.cs
================================================
using System.Dynamic;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;


namespace RainbowTaskbar.Configuration.Instruction.Instructions;


internal class ClearLayerInstruction : Instruction {
    public int Layer { get; set; } = 0;

    public override string Description {
        get {
            return App.localization.InstructionFormat(this, Layer);
        }
    }

    public override bool Execute(Taskbar window, CancellationToken token) {
        window.Dispatcher.Invoke(() => {
            window.canvasManager.layers.MakeIfNeeded(Layer);
            window.canvasManager.layers.renderTargets[Layer].Clear();
        }, System.Windows.Threading.DispatcherPriority.Normal, token);
        return false;
    }
    /*
    public override JObject ToJSON() {
        dynamic data = new ExpandoObject();
        data.Name = GetType().Name;
        data.Layer = Layer;

        return JObject.FromObject(data);
    }
    */
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instructions/ColorInstruction.cs
================================================

using System.Drawing;
using System.Dynamic;
using System.Runtime.Serialization;
using System.Threading;
using System.Windows.Media;
using RainbowTaskbar.Interpolation;
using Color = System.Drawing.Color;
using Brush = System.Windows.Media.Brush;
using RainbowTaskbar.Languages;

namespace RainbowTaskbar.Configuration.Instruction.Instructions;


internal class ColorInstruction : Instruction {

    public override string Description {
        get {
            if (Randomize) {
                return App.localization.InstructionFormatSuffix(this, "randomized", Effect.ToStringLocalized());
            }
            else if (Effect == ColorInstructionEffect.Gradient || Effect == ColorInstructionEffect.FadeGradient) {
                return App.localization.InstructionFormatSuffix(this, "gradient", Effect.ToStringLocalized(), ColorTranslator.ToHtml(Color1), ColorTranslator.ToHtml(Color2));
            }
            else {
                return App.localization.InstructionFormatSuffix(this, "solid", Effect.ToStringLocalized(), ColorTranslator.ToHtml(Color1));
            }
        }
    }
    public enum ColorInstructionEffect {
        Solid,
        Fade,
        Gradient,
        FadeGradient
    }

    public enum ColorInstructionTransition {
        Linear,
        Sine,
        Cubic,
        Exponential,
        Back
    }

    public int Time { get; set; } = 1;

    public Color Color1 { get; set; } = Color.FromArgb(0, 0, 0);

    public ColorInstructionEffect Effect { get; set; }

    public Color Color2 { get; set; } = Color.FromArgb(0, 0, 0);

    public int Time2 { get; set; } = 1;

    public ColorInstructionTransition Transition { get; set; }

    public double Angle { get; set; } = 0;

    public int Layer { get; set; } = 0;

    public bool Randomize { get; set; } = false;

    public bool Has2Colors { get => Effect == ColorInstructionEffect.FadeGradient || Effect == ColorInstructionEffect.Gradient; }

    /*
    public override JObject ToJSON() {
        dynamic data = new ExpandoObject();
        data.Name = GetType().Name;
        data.Time = Time;
        data.Effect = Effect;
        data.Transition = Transition;
        data.Time2 = Time2;
        data.Angle = Angle;
        data.Layer = Layer;
        data.Randomize = Randomize;
        data.Color1 = ColorExtension.HexConverter(Color1);
        data.Color2 = ColorExtension.HexConverter(Color2);


        return JObject.FromObject(data);
    }
    */

    public override bool Execute(Taskbar window, CancellationToken token) {
        
        var OldBrush = window.canvasManager.layers.brushes[Layer];
        if (Randomize) {
            Color1 = Color.FromArgb(255, App.rnd.Next(0, 255), App.rnd.Next(0, 255), App.rnd.Next(0, 255));
            Color2 = Color.FromArgb(255, App.rnd.Next(0, 255), App.rnd.Next(0, 255), App.rnd.Next(0, 255));
        }

        switch (Effect) {
            case ColorInstructionEffect.Solid:
                window.Dispatcher.Invoke(() => {
                    var Brush = new SolidColorBrush(Color1.ToMediaColor());
                    window.canvasManager.layers.DrawRect(Layer, Brush);
                }, System.Windows.Threading.DispatcherPriority.Normal, token);
                token.WaitHandle.WaitOne(Time);
                break;
            case ColorInstructionEffect.Gradient:
                window.Dispatcher.Invoke(() => {
                    var Brush = new LinearGradientBrush(Color1.ToMediaColor(), Color2.ToMediaColor(), Angle);
                    window.canvasManager.layers.DrawRect(Layer, Brush);
                }, System.Windows.Threading.DispatcherPriority.Normal, token);
                token.WaitHandle.WaitOne(Time);
                break;

            case ColorInstructionEffect.FadeGradient:

                if (OldBrush is SolidColorBrush) {
                    var Brush = (SolidColorBrush) OldBrush;

                    System.Windows.Media.Color OColor;
                    window.Dispatcher.Invoke(() => { OColor = Brush.Color; }, System.Windows.Threading.DispatcherPriority.Normal, token);

                    var j = 1;

                    while (j++ < Time2 / App.Settings.InterpolationQuality) {
                        var Color1Interpolated = ColorInterpolation.Interpolate(OColor.ToDrawingColor(), Color1,
                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));
                        var Color2Interpolated = ColorInterpolation.Interpolate(OColor.ToDrawingColor(), Color2,
                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));


                        window.Dispatcher.Invoke(() => {
                            var Brush = new LinearGradientBrush(Color1Interpolated.ToMediaColor(),
                                Color2Interpolated.ToMediaColor(), Angle);
                            window.canvasManager.layers.DrawRect(Layer, Brush);
                        }, System.Windows.Threading.DispatcherPriority.Normal, token);

                        token.WaitHandle.WaitOne(Time2 / (Time2 / App.Settings.InterpolationQuality));
                    }
                }
                else {
                    var Brush = (LinearGradientBrush) OldBrush;

                    System.Windows.Media.Color OColor1;
                    System.Windows.Media.Color OColor2;
                    window.Dispatcher.Invoke(() => {
                        OColor1 = Brush.GradientStops[0].Color;
                        OColor2 = Brush.GradientStops[1].Color;
                    }, System.Windows.Threading.DispatcherPriority.Normal, token);

                    var j = 1;

                    while (j++ < Time2 / App.Settings.InterpolationQuality) {
                        var Color1Interpolated = ColorInterpolation.Interpolate(OColor1.ToDrawingColor(), Color1,
                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));
                        var Color2Interpolated = ColorInterpolation.Interpolate(OColor2.ToDrawingColor(), Color2,
                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));


                        window.Dispatcher.Invoke(() => {
                            var Brush = new LinearGradientBrush(Color1Interpolated.ToMediaColor(),
                                Color2Interpolated.ToMediaColor(), Angle);
                            window.canvasManager.layers.DrawRect(Layer, Brush);
                        }, System.Windows.Threading.DispatcherPriority.Normal, token);


                        token.WaitHandle.WaitOne(Time2 / (Time2 / App.Settings.InterpolationQuality));
                    }
                }

                token.WaitHandle.WaitOne(Time);
                break;

            case ColorInstructionEffect.Fade:

                if (OldBrush is SolidColorBrush) {
                    var Brush = (SolidColorBrush) OldBrush;

                    System.Windows.Media.Color OColor;
                    window.Dispatcher.Invoke(() => { OColor = Brush.Color; }, System.Windows.Threading.DispatcherPriority.Normal, token);

                    var j = 1;

                    while (j++ < Time2 / App.Settings.InterpolationQuality) {
                        var Color1Interpolated = ColorInterpolation.Interpolate(OColor.ToDrawingColor(), Color1,
                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));

                        window.Dispatcher.Invoke(() => {
                            var Brush = new SolidColorBrush(Color1Interpolated.ToMediaColor());
                            window.canvasManager.layers.DrawRect(Layer, Brush);
                        }, System.Windows.Threading.DispatcherPriority.Normal, token);


                        token.WaitHandle.WaitOne(Time2 / (Time2 / App.Settings.InterpolationQuality));
                    }
                }
                else {
                    var Brush = (LinearGradientBrush) OldBrush;

                    System.Windows.Media.Color OColor1;
                    System.Windows.Media.Color OColor2;
                    window.Dispatcher.Invoke(() => {
                        OColor1 = Brush.GradientStops[0].Color;
                        OColor2 = Brush.GradientStops[1].Color;
                    }, System.Windows.Threading.DispatcherPriority.Normal, token);

                    var j = 1;

                    while (j++ < Time2 / App.Settings.InterpolationQuality) {
                        var Color1Interpolated = ColorInterpolation.Interpolate(OColor1.ToDrawingColor(), Color1,
                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));
                        var Color2Interpolated = ColorInterpolation.Interpolate(OColor2.ToDrawingColor(), Color1,
                            (ColorInterpolation.INTERPOLATE_FUNCTION) Transition, (double) j / (Time2 / App.Settings.InterpolationQuality));


                        window.Dispatcher.Invoke(() => {
                            var Brush = new LinearGradientBrush(Color1Interpolated.ToMediaColor(),
                                Color2Interpolated.ToMediaColor(), Angle);
                            window.canvasManager.layers.DrawRect(Layer, Brush);
                        }, System.Windows.Threading.DispatcherPriority.Normal, token);


                        token.WaitHandle.WaitOne(Time2 / (Time2 / App.Settings.InterpolationQuality));
                    }
                }

                token.WaitHandle.WaitOne(Time);
                break;
        }
        
        return true;

    }
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instructions/DelayInstruction.cs
================================================
using System.Dynamic;
using System.Runtime.Serialization;
using System.Threading;


namespace RainbowTaskbar.Configuration.Instruction.Instructions;


internal class DelayInstruction : Instruction {
    public int Time { get; set; } = 1;

    public override string Description {
        get {
            return App.localization.InstructionFormat(this, Time);
        }
    }
    public override bool Execute(Taskbar window, CancellationToken token) {
        token.WaitHandle.WaitOne(Time);
        return true;
    }
    /*
    public override JObject ToJSON() {
        dynamic data = new ExpandoObject();
        data.Name = GetType().Name;
        data.Time = Time;

        return JObject.FromObject(data);
    }
    */
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instructions/ImageInstruction.cs
================================================
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Dynamic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace RainbowTaskbar.Configuration.Instruction.Instructions;


internal class ImageInstruction : Instruction {

    public bool drawn = false;

    public int Layer { get; set; } = 0;

    public string Path { get; set; } = "";

    public int X { get; set; } = 0;

    public int Y { get; set; } = 0;

    public int Width { get; set; } = 0;

    public int Height { get; set; } = 0;

    public double Opacity { get; set; } = 1;

    public bool DrawOnce { get; set; } = false;

    public override string Description {
        get {
            return App.localization.InstructionFormat(this, System.IO.Path.GetFileName(Path));
        }
    }
    /*
    public override JObject ToJSON() {
        dynamic data = new ExpandoObject();

        data.Name = GetType().Name;
        data.Layer = Layer;
        data.Path = Path;
        data.X = X;
        data.Y = Y;
        data.Width = Width;
        data.Height = Height;
        data.Opacity = Opacity;
        data.DrawOnce = DrawOnce;

        return JObject.FromObject(data);
    }
    */
    public override bool Execute(Taskbar window, CancellationToken token) {
        if (Path == "") return false;

        if (DrawOnce && drawn) return false;

        window.Dispatcher.Invoke(() => {
            var bmp = new Bitmap(Path);
            var ms = new MemoryStream();

            bmp.Save(ms, ImageFormat.Png);

            var image = new BitmapImage();
            image.BeginInit();
            ms.Seek(0, SeekOrigin.Begin);
            image.StreamSource = ms;
            image.EndInit();

            window.canvasManager.layers.DrawImage(Layer, new Rect(X, Y, Width == 0 ? bmp.Width : Width, Height == 0 ? bmp.Height : Height), image);
        }, System.Windows.Threading.DispatcherPriority.Normal, token);

        if (DrawOnce) {
            drawn = true;
        }

        return false;
    }

}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instructions/ShapeInstruction.cs
================================================

using System;
using System.Dynamic;
using System.Globalization;
using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Shapes;

using RainbowTaskbar.Interpolation;
using RainbowTaskbar.Languages;

namespace RainbowTaskbar.Configuration.Instruction.Instructions;


public class ShapeInstruction : Instruction {

    public bool drawn = false;

    public int Layer { get; set; } = 0;

    public ShapeInstructionShapes Shape { get; set; } = ShapeInstructionShapes.Line;

    public int X { get; set; } = 0;

    public int Y { get; set; } = 0;

    public int X2 { get; set; } = 0;

    public int Y2 { get; set; } = 0;

    private Taskbar _tsk;
    private int x2 {
        get {
            if (FitTaskbars) {
                return App.Settings.GraphicsRepeat ? _tsk.canvasManager.layers.width : App.layers.width;
            }
            else {
                return X2;
            }
        }
    }

    private int y2 {
        get {
            if (FitTaskbars) {
                return App.Settings.GraphicsRepeat ? _tsk.canvasManager.layers.height : App.layers.height;
            }
            else {
                return Y2;
            }
        }
    }

    public bool DrawOnce { get; set; } = false;

    public System.Drawing.Color Fill { get; set; } = System.Drawing.Color.FromArgb(255, 0, 0, 0);

    public System.Drawing.Color Line { get; set; } = System.Drawing.Color.FromArgb(255, 0, 0, 0);

    public int LineSize { get; set; } = 1;

    public int Radius { get; set; } = 0;

    private int radius {
        get {
            if (FitTaskbars) {
                return _tsk.taskbarHelper.Radius + 1;
            }
            else {
                return Radius;
            }
        }
    }


    public bool FitTaskbars { get; set; } = false;

    public override string Description {
        get {
            var name = Shape == ShapeInstructionShapes.Rectangle && Radius > 0 ? App.localization.Get("enum_roundedrect") : Shape.ToStringLocalized();
            return App.localization.InstructionFormat(this, name);
        }
    }

    public override bool Execute(Taskbar window, CancellationToken token) {
        _tsk = window;
        if (DrawOnce && drawn) {
            return false;
        }

        switch (Shape) {
            case ShapeInstructionShapes.Line: {
                    var geometry = new LineGeometry(new Point(X, Y), new Point(x2, y2));
                    geometry.Freeze();
                    window.Dispatcher.Invoke(() =>
                        window.canvasManager.layers.DrawShape(Layer, geometry, null, new Pen(new SolidColorBrush(Line.ToMediaColor()), LineSize))
                    , System.Windows.Threading.DispatcherPriority.Normal, token);
                    break;
                }
            case ShapeInstructionShapes.Rectangle: {
                    var geometry = new RectangleGeometry(new Rect(new Point(X, Y), new Point(x2, y2)));
                    geometry.RadiusX = radius / 2.0; geometry.RadiusY = radius / 2.0;
                    geometry.Freeze();
                    window.Dispatcher.Invoke(() =>
                        window.canvasManager.layers.DrawShape(Layer, geometry, new SolidColorBrush(Fill.ToMediaColor()), new Pen(new SolidColorBrush(Line.ToMediaColor()), LineSize))
                    , System.Windows.Threading.DispatcherPriority.Normal, token);
                    break;
                }
            case ShapeInstructionShapes.Ellipse: {
                    var geometry = new EllipseGeometry(new Rect(new Point(X, Y), new Point(x2, y2)));
                    geometry.Freeze();
                    window.Dispatcher.Invoke(() =>
                        window.canvasManager.layers.DrawShape(Layer, geometry, new SolidColorBrush(Fill.ToMediaColor()), new Pen(new SolidColorBrush(Line.ToMediaColor()), LineSize))
                    , System.Windows.Threading.DispatcherPriority.Normal, token);
                    break;
                }
            
        }

        if (DrawOnce) {
            drawn = true;
        }

        return false;
    }

    public enum ShapeInstructionShapes {
        Line,
        Rectangle,
        Ellipse
    }
    /*
    public override JObject ToJSON() {
        dynamic data = new ExpandoObject();

        data.Name = GetType().Name;
        data.Layer = Layer;
        data.Shape = Shape;
        data.X = X;
        data.Y = Y;
        data.X2 = X2;
        data.Y2 = Y2;
        data.FitTaskbars = FitTaskbars;
        data.Fill = ColorExtension.HexConverter(Fill);
        data.Line = ColorExtension.HexConverter(Line);
        data.LineSize = LineSize;
        data.DrawOnce = DrawOnce;

        return JObject.FromObject(data);
    }
    */
}


================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instructions/TextInstruction.cs
================================================
using System.Dynamic;
using System.Runtime.Serialization;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using RainbowTaskbar.Interpolation;
using Color = System.Drawing.Color;

namespace RainbowTaskbar.Configuration.Instruction.Instructions;


internal class TextInstruction : Instruction {

    public bool drawn = false;

    public int Layer { get; set; } = 1;

    public string Text { get; set; } = "";

    public int X { get; set; } = 0;

    public int Y { get; set; } = 0;

    public string Font { get; set; } = "Arial";

    public int Size { get; set; } = 32;

    public bool DrawOnce { get; set; } = false;

    public Color Color { get; set; } = Color.Black;

    public bool Center { get; set; } = false;

    public override string Description {
        get {
            return App.localization.InstructionFormat(this, Text);
        }
    }
    /*
    public override JObject ToJSON() {
        dynamic data = new ExpandoObject();
        data.Name = GetType().Name;
        data.Layer = Layer;
        data.Text = Text;
        data.X = X;
        data.Y = Y;
        data.Font = Font;
        data.Size = Size;
        data.Color = ColorExtension.HexConverter(Color);
        data.DrawOnce = DrawOnce;
        data.Center = Center;

        return JObject.FromObject(data);
    }*/

    public override bool Execute(Taskbar window, CancellationToken token) {
        if (drawn && DrawOnce) {
            return false;
        }


        window.Dispatcher.Invoke(() =>
            window.canvasManager.layers.DrawText(Layer, Text, X, Y, Size, Font, new SolidColorBrush(Color.ToMediaColor()), Center)
        , System.Windows.Threading.DispatcherPriority.Normal, token);

        if (DrawOnce) drawn = true;

        return false;
    }
}

================================================
FILE: RainbowTaskbar/Configuration/Instruction/Instructions/TransparencyInstruction.cs
================================================
using System;
using System.Dynamic;
using System.Runtime.Serialization;
using System.Threading;
using System.Windows.Controls;
using RainbowTaskbar.Helpers;
using RainbowTaskbar.Languages;

namespace RainbowTaskbar.Configuration.Instruction.Instructions;


public class TransparencyInstruction : Instruction {
    public enum TransparencyInstructionStyle {
        Default,
        Blur,
        Transparent
    }

    public enum TransparencyInstructionType {
        Taskbar,
        RainbowTaskbar,
        All,
        Style,
        Layer,
        TaskbarElements
    }

    public TransparencyInstructionType Type { get; set; }

    public double Opacity { get; set; } = 1;

    public double TaskbarOpacity { get => App.Settings.GlobalOpacity == -1 ? Opacity : App.Settings.GlobalOpacity; }

    public TransparencyInstructionStyle Style { get; set; }

    public int Layer { get; set; }

    public override string Description {
        get {
            /*return Type == TransparencyInstructionType.Style ? $"Taskbar style - {Style.ToString()}" :
                (Type == TransparencyInstructionType.Layer ? $"Layer {Layer} - {Math.Round(Opacity * 100)}% opacity" :
                $"{Type.ToString()} - {Math.Round(Opacity * 100)}% opacity");*/
            if (Type == TransparencyInstructionType.Style) {
                return App.localization.InstructionFormatSuffix(this, "style", Style.ToStringLocalized());
            }
            else if (Type == TransparencyInstructionType.Layer) {
                return App.localization.InstructionFormatSuffix(this, "layer", Layer, Math.Round(Opacity * 100));
            }
            else {
                return App.localization.InstructionFormatSuffix(this, "opacity", Type.ToStringLocalized(), Math.Round(Opacity * 100));
            }

        }
    }
    /*
    public override JObject ToJSON() {
        dynamic data = new ExpandoObject();
        data.Name = GetType().Name;
        data.Opacity = Opacity;
        data.Layer = Layer;
        data.Style = Style;
        data.Type = Type;

        return JObject.FromObject(data);
    }
    */

    public override bool Execute(Taskbar window, CancellationToken token) {
        switch (Type) {
            case TransparencyInstructionType.Taskbar:

                window.taskbarHelper.SetAlpha(TaskbarOpacity);
                break;

            case TransparencyInstructionType.RainbowTaskbar:
                window.Dispatcher.Invoke(() => {
                    if (window.Opacity != Opacity) window.Opacity = Opacity;
                    
                }, System.Windows.Threading.DispatcherPriority.Normal, token);
                break;

            case TransparencyInstructionType.All:
                window.Dispatcher.Invoke(() => {
                    if (window.Opacity != Opacity) window.Opacity = Opacity;
                }, System.Windows.Threading.DispatcherPriority.Normal, token);
                window.taskbarHelper.SetAlpha(TaskbarOpacity);
                break;

            case TransparencyInstructionType.Style:

                switch (Style) {
                    case TransparencyInstructionStyle.Default:
                        if (window.taskbarHelper.Style != TaskbarHelper.TaskbarStyle.Default)
                            window.taskbarHelper.Style = TaskbarHelper.TaskbarStyle.ForceDefault;
                        break;
                    case TransparencyInstructionStyle.Blur:
                        window.taskbarHelper.Style = TaskbarHelper.TaskbarStyle.Blur;
                        break;
                    case TransparencyInstructionStyle.Transparent:
                        window.taskbarHelper.Style = TaskbarHelper.TaskbarStyle.Transparent;
                        break;
                }

                ExplorerTAP.ExplorerTAP.SetAppearanceType(Style);

                break;

            case TransparencyInstructionType.Layer:
                
                
                window.Dispatcher.Invoke(() =>
                    window.canvasManager.canvases[Layer].Opacity = Opacity
                    , System.Windows.Threading.DispatcherPriority.Normal, token);
                break;

            case TransparencyInstructionType.TaskbarElements:
                ExplorerTAP.ExplorerTAP.SetTaskbarElementsOpacity(Opacity);
                break;
        }

        return false;
    }
}

================================================
FILE: RainbowTaskbar/Configuration/Web/WebConfig.cs
================================================
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.Wpf;
using RainbowTaskbar.Helpers;
using RainbowTaskbar.Interpolation;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Data;
using System.Windows.Media;
using System.Windows.Threading;

namespace RainbowTaskbar.Configuration.Web {
    public enum WebConfigUserSettingDataType {
        String,
        Number,
        Color,
        Boolean
    }
    [Serializable]
    public class WebConfigUserSetting {
        public string Name { get; set; } = App.localization?.Get("defpropname") ?? "New property";
        public string Key { get; set; } = App.localization?.Get("defpropkey") ?? "property_1";
        public string _value { get; set; } = string.Empty;
        // probably should have used a converter but i gave up trying
        [JsonIgnore]
        public string ValueJS {
            get {
                switch (DataType) {
                    case WebConfigUserSettingDataType.Boolean: {
                            var suc = bool.TryParse(_value, out bool res);
                            return suc ? res.ToString().ToLower() : "false";
                        }
                    case WebConfigUserSettingDataType.Number: {
                            var suc = double.TryParse(_value, out double res);
                            return suc ? res.ToString() : "0";
                        }
                    default:
                        return $"{JsonSerializer.Serialize(_value)}";
                }
            }
        }
        [JsonIgnore]
        public dynamic Value { 
            get {
                switch (DataType) {
                    case WebConfigUserSettingDataType.Boolean: {
                            var suc = bool.TryParse(_value, out bool res);
                            return suc ? res : false;
                        }
                    case WebConfigUserSettingDataType.Number: {
                            var suc = double.TryParse(_value, out double res);
                            return suc ? res : 0;
                        }
                    case WebConfigUserSettingDataType.Color: {
                            try {
                                return (System.Windows.Media.Color) System.Windows.Media.ColorConverter.ConvertFromString(_value);
                            }
                            catch { return System.Windows.Media.Color.FromArgb(255, 0, 0, 0); }
                        }
                    default:
                        return _value;
                }
            } 
            set {
                switch (DataType) {
                    case WebConfigUserSettingDataType.Boolean: {
                            _value = value ? "true" : "false";
                            break;
                        }
                    case WebConfigUserSettingDataType.Number: {
                            _value = (value as object).ToString();
                            break;
                        }
                    case WebConfigUserSettingDataType.Color: {
                            _value = ColorTranslator.ToHtml(((System.Windows.Media.Color) value).ToDrawingColor());
                            break;
                        }
                    default:
                        _value = (value as object).ToString();
                        break;
                }
            } 
        }
        public WebConfigUserSettingDataType DataType { get; set; } = WebConfigUserSettingDataType.String;
    }
    [Serializable]
    public class WebConfigData : ConfigData {
        public string WebContent { get; set; }
        public BindingList<WebConfigUserSetting> UserSettings { get; set; } = new() { new() { } };

    }
    [Serializable]
    public class WebConfig : Config {
        [JsonIgnore]
        public WebConfigData Data { get => ConfigData as WebConfigData; set 
            {
                ConfigData = value;
            }
        }

        public WebConfig() {
            ConfigData = new WebConfigData() { WebContent = """
<html>
    <head>
        <style>
            body,html {
                width:100%;
                height:100%;
                margin:0;
                padding:0;
                overflow:hidden;
            }
        </style>
    </head>
    <body>

    </body>
    <script>
        rainbowTaskbar
            .setTaskbarOpacity(1)
            .setStyleTransparent();

        rainbowTaskbar.onUIChanged = (info) => {
            
        }
     </script>

</html>
""" };
        }

        private void _Start(WebView2 webView, Mutex webViewReady, Taskbar t) {
            if(!webViewReady.WaitOne(1500)) return;
            webViewReady.ReleaseMutex();
            App.Current.Dispatcher.Invoke(() => {
                webView?.CoreWebView2.Resume();
                webView.CoreWebView2.MemoryUsageTargetLevel = Microsoft.Web.WebView2.Core.CoreWebView2MemoryUsageTargetLevel.Low;

                File.WriteAllText(Path.Join(App.rainbowTaskbarDir, "current.html"), Data.WebContent);

                var code = $$"""
                        // requestAnimationFrame code adapted from https://github.com/PixelsCommander/fps-control-chrome-extension/blob/master/src/js/content.js

                        window.rtMaxFPS = {{App.Settings.MaxWebFPS}};
                        window.rtUserConfig = {};

                        let __rafs = 0;
                        let __raf = window.requestAnimationFrame;
                        let __nextRAFTime = Date.now();
                        let __mockedRaf = (callback) => {
                            let skip = (window.rtMaxFPS !== 0 && Date.now() < __nextRAFTime);

                            if (skip) {
                                __skippingRaf(callback);
                            } else {
                                __nextRAFTime = Date.now() + 1000/window.rtMaxFPS;
                                __raf(callback);
                            }

                            return __rafs++;
                        }
                        function __skippingRaf(func) {
                            __raf(() => {
                                window.requestAnimationFrame(func);
                            })
                        }

                        window.rainbowTaskbar = {
                            setTaskbarOpacity: (v) => {window.chrome.webview.postMessage({m:"transparency",v,which:0}); return window.rainbowTaskbar},
                            setUnderlayOpacity: (v) => {window.chrome.webview.postMessage({m:"transparency",v,which:1}); return window.rainbowTaskbar},
                            setTaskbarElementsOpacity: (v) => {window.chrome.webview.postMessage({m:"transparency",v,which:5}); return window.rainbowTaskbar},
                            setStyleDefault: () => {window.chrome.webview.postMessage({m:"style",style:0}); return window.rainbowTaskbar},
                            setStyleBlur: () => {window.chrome.webview.postMessage({m:"style",style:1}); return window.rainbowTaskbar},
                            setStyleTransparent: () => {window.chrome.webview.postMessage({m:"style",style:2}); return window.rainbowTaskbar},
                            setTaskbarOffset: (offset) => {window.chrome.webview.postMessage({m:"offset",v:offset}); return window.rainbowTaskbar},
                            
                            uiInfo: {},
                            graphicsRepeat: {{(App.Settings.GraphicsRepeat ? "true" : "false")}},
                            maxFps: window.rtMaxFPS,
                            rtUserConfig: window.rtUserConfig,
                            taskbarIndex: {{(t is not null ? App.taskbars.IndexOf(t) : -1)}},

                            helpers: {
                                normalizeTaskbarCoords: (_ui, copy = true) => {
                                    let ui = copy ? JSON.parse(JSON.stringify(_ui)) : _ui;
                        
                                    let minX = _ui.sort((a,b)=>a.taskbar.X - b.taskbar.X)[0].taskbar.X;
                                    for(let e of ui) {
                                        e.taskbar.X -= minX;
                                    }
                        
                                    return ui;
                                },
                                normalizeAndScaleUICoords: (_ui, copy = true) => {
                                    let ui = rainbowTaskbar.helpers.normalizeTaskbarCoords(_ui, copy);

                                    for(let e of ui) {
                                        e.taskbar.X /= window.devicePixelRatio;
                                        e.taskbar.Y /= window.devicePixelRatio;
                                        e.taskbar.Width /= window.devicePixelRatio;
                                        e.taskbar.Height /= window.devicePixelRatio;
                        
                                        e.taskbarFrameRepeater.X /= window.devicePixelRatio;
                                        e.taskbarFrameRepeater.Y /= window.devicePixelRatio;
                                        e.taskbarFrameRepeater.Width /= window.devicePixelRatio;
                                        e.taskbarFrameRepeater.Height /= window.devicePixelRatio;
                        
                                        e.systemTrayFrame.X /= window.devicePixelRatio;
                                        e.systemTrayFrame.Y /= window.devicePixelRatio;
                                        e.systemTrayFrame.Width /= window.devicePixelRatio;
                                        e.systemTrayFrame.Height /= window.devicePixelRatio;
                                    }

                                    return ui;
                                },
                                generateCSSMaskForUI: (_ui, fadeTop = true) => {
                                    let ui = rainbowTaskbar.helpers.normalizeAndScaleUICoords(_ui);
                                    ui.sort((a,b) => a.taskbar.X - b.taskbar.X);

                                    let genVis = ``;

                                    if(rainbowTaskbar.graphicsRepeat) {
                                        let x = ui.find(x=>x.taskbarIndex == rainbowTaskbar.taskbarIndex);

                                        genVis = `rgba(255, 255, 255, 0) ${x.taskbarFrameRepeater.X - 24}px, rgba(255, 255, 255, 1) ${x.taskbarFrameRepeater.X + 64}px, rgba(255, 255, 255, 1) ${x.taskbarFrameRepeater.X + x.taskbarFrameRepeater.Width - 64}px, rgba(255, 255, 255, 0) ${x.taskbarFrameRepeater.X + x.taskbarFrameRepeater.Width + 24}px, rgba(255, 255, 255, 0) ${x.systemTrayFrame.X - 24}px, rgba(255, 255, 255, 1) ${x.systemTrayFrame.X + 64}px, rgba(255, 255, 255, 1) ${x.taskbar.Width - 8}px, rgba(255, 255, 255, 0) ${x.taskbar.Width}px,`
                                    } else {
                                        genVis = ui.map((x,i)=>
                                            `rgba(255, 255, 255, ${+(x.taskbarFrameRepeater.X == 0)}) ${x.taskbar.X + x.taskbarFrameRepeater.X - 24}px, rgba(255, 255, 255, 1) ${x.taskbar.X + x.taskbarFrameRepeater.X + 64}px, rgba(255, 255, 255, 1) ${x.taskbar.X + x.taskbarFrameRepeater.X + x.taskbarFrameRepeater.Width - 64}px, rgba(255, 255, 255, 0) ${x.taskbar.X + x.taskbarFrameRepeater.X + x.taskbarFrameRepeater.Width + 24}px, rgba(255, 255, 255, 0) ${x.taskbar.X + x.systemTrayFrame.X - 24}px, rgba(255, 255, 255, 1) ${x.taskbar.X + x.systemTrayFrame.X + 64}px, rgba(255, 255, 255, 1) ${x.taskbar.X + x.taskbar.Width - 8}px, rgba(255, 255, 255, ${+(x.taskbarFrameRepeater.X == 0)}) ${x.taskbar.X + x.taskbar.Width}px,`
                                        ).join("")
                                    }

                                   

                                    let mask = `linear-gradient(90deg,rgba(255, 255, 255, 0) 0%, ${genVis} rgba(255, 255, 255, 1) 100%) 0px 0px / 100% 100% no-repeat${fadeTop ? ", linear-gradient(180deg,rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0) 1px, rgba(255, 255, 255, 1) 40%, rgba(255, 255, 255, 1) 100%) 0px 0px / 100% 100% no-repeat" : ""}`;
                                    let maskComposite = 'intersect';
                                    return {
                                        mask, maskComposite, 
                                        apply: () => {
                                            document.documentElement.style.mask = mask;
                                            document.documentElement.style.maskComposite = maskComposite;
                                        }
                                    }
                                }
                            },

                            onUIChanged: (uiInfo) => {},

                            __internal: {
                                __onUIChanged: (data) => {window.rainbowTaskbar.uiInfo=data;window.rainbowTaskbar.onUIChanged(window.rainbowTaskbar.uiInfo);},
                            }
                            
                        }

                        window.chrome.webview.addEventListener("message", (m) => {
                            let message = JSON.parse(m.data);
                            if(message.message == "ui") {
                                window.rainbowTaskbar.__internal.__onUIChanged(message.data);
                            }
                        });

                        window.chrome.webview.postMessage({m:"ui"})
                        for(let i = 1; i <= 5; i++) setTimeout(() => window.chrome.webview.postMessage({m:"ui"}), i*500);


                        window.requestAnimationFrame = __mockedRaf;
                        {{string.Join('\n', Data.UserSettings.Select((x) => {
                    return "window.rtUserConfig[" + JsonSerializer.Serialize(new Regex("[^\\w$]").Replace(x.Key, " ")) + "]=" + x.ValueJS + ";";
                })) ?? ""}}

                        """;
                
                webView?.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(
                    code).ContinueWith((s) => {
                        App.Current.Dispatcher.Invoke(() => {
                            webView?.CoreWebView2.Navigate(Path.Join(App.rainbowTaskbarDir, "current.html"));
                            EventHandler<CoreWebView2NavigationCompletedEventArgs> handler = null;
                            handler = (sender, args) => {
                                webView.CoreWebView2.RemoveScriptToExecuteOnDocumentCreated(s.Result);
                                webView.NavigationCompleted -= handler;
                            };
                            webView.NavigationCompleted += handler;
                        });
                    });

                
            });
        }

        public override async Task<bool> Start() {
            if (!(await base.Start())) return false;

            App.taskbars.ForEach(x => {
                x.ClassicGrid.Visibility = System.Windows.Visibility.Collapsed;
                x.WebGrid.Visibility = System.Windows.Visibility.Visible;
            });

            if(App.Settings.GraphicsRepeat) {
                App.taskbars.ForEach(x => {
                    Task.Run(() => {
                        _Start(x.webView, x.webViewReady_, x);
                    });
                });
            } else {
                Task.Run(() => {
                    _Start(App.webView, App.webViewReady, null);
                });
            }

            return true;
        }

        public override Task Stop() {
            var wv = App.webView;
            return Task.Run(() => {
                App.Current.Dispatcher.Invoke(() => {
                    try {
                        wv?.NavigateToString("<html></html>");
                        wv?.CoreWebView2.TrySuspendAsync();
                    }
                    catch { }
                });
            });
        }
    }
}


================================================
FILE: RainbowTaskbar/Drawing/CanvasManager.cs
================================================
using System.Drawing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Linq;
using System.Collections.Generic;
using System.Windows.Media;
using System.Globalization;
using System.Windows.Media.Imaging;

namespace RainbowTaskbar.Drawing;

public class CanvasManager {
    public List<Canvas> canvases;
    private LayerManager _layers = null;
    public LayerManager layers { 
        get {
            if (_layers == null) {
                return App.layers;
            }
            else return _layers;
        }
        set => _layers = value;
    }
    public Window window;

    public CanvasManager(Taskbar window, Canvas[] canvases) {
        this.window = window;
        this.canvases = canvases.ToList();

        this.canvases.ForEach((c) => {
            c.Width = window.Width;
            c.Height = window.Height;
        });
        if (App.Settings.GraphicsRepeat) _layers = new LayerManager(window);
    }

    public void SetImage(int index, RenderTargetBitmap target) {
        var c = canvases[index];
        var img = new System.Windows.Controls.Image();
        img.Name = $"{c.Name}Image";
        img.Width = layers.width;
        img.Height = c.Height;
        img.SnapsToDevicePixels = true;

        img.Source = target;

        img.Stretch = Stretch.None;
        c.Children.Add(img);
        Canvas.SetTop(img, 0);
        if(!App.Settings.GraphicsRepeat) {
            Canvas.SetLeft(img, -window.Left);
        }
    }

   

    

}

================================================
FILE: RainbowTaskbar/Drawing/LayerManager.cs
================================================
using RainbowTaskbar.Helpers;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace RainbowTaskbar.Drawing
{
    public class LayerManager
    {
        public int width = 0;
        public int height = 0;
        public Taskbar window = null;
        public List<RenderTargetBitmap> renderTargets = new List<RenderTargetBitmap>();
        public List<System.Windows.Media.Brush> brushes = new List<System.Windows.Media.Brush>();

        public LayerManager() {
            for (int i = 0; i < 16; i++) brushes.Add(new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 255)));
        }

        public LayerManager(Taskbar window) {
            this.window = window;
            width = (int) (window.Width);
            height = (int) (window.Height);
            for (int i = 0; i < 16; i++) brushes.Add(new SolidColorBrush(System.Windows.Media.Color.FromRgb(255, 255, 255)));
        }

        public void MakeIfNeeded(int layer) {
            if (renderTargets.Count - 1 < layer && layer < 16) {
                for (int i = renderTargets.Count; i <= layer; i++) {
                    var target = new RenderTargetBitmap((int) width, (int) height, 96, 96, PixelFormats.Pbgra32);
                    renderTargets.Add(target);
                    
                    if(window is not null) window.canvasManager.SetImage(i, target);
                    else {
                        App.taskbars.ForEach(b => {
                            b.canvasManager.SetImage(i, target);
                        });
                    }
                }

            }
        }

        public void DrawRect(int layer, System.Windows.Media.Brush fill, Rect? rect = null) {
            MakeIfNeeded(layer);

            var visual = new DrawingVisual();
            var ctx = visual.RenderOpen();
            ctx.DrawRectangle(fill, null, rect ?? new Rect(0, 0, width, height));
            brushes[layer] = fill;
            ctx.Close();
            renderTargets[layer].Render(visual);
        }
        public void DrawImage(int layer, Rect rect, ImageSource imageSource) {
            MakeIfNeeded(layer);

            var visual = new DrawingVisual();
            var ctx = visual.RenderOpen();
            ctx.DrawImage(imageSource, rect);
            ctx.Close();
            renderTargets[layer].Render(visual);
        }

        public void DrawShape(int layer, Geometry shape, System.Windows.Media.Brush brush = null, System.Windows.Media.Pen pen = null) {
            MakeIfNeeded(layer);

            var visual = new DrawingVisual();
            var ctx = visual.RenderOpen();
            ctx.DrawGeometry(brush, pen, shape);
            ctx.Close();
            renderTargets[layer].Render(visual);
        }
        public void DrawText(int layer, string content, int x = 0, int y = 0, int size = 32, string font = "Arial", System.Windows.Media.Brush fill = null, bool Center = false) {
            MakeIfNeeded(layer);

            var visual = new DrawingVisual();
            var ctx = visual.RenderOpen();
            var ftext = new FormattedText(
                content ?? "",
                CultureInfo.GetCultureInfo("en-us"),
                FlowDirection.LeftToRight,
                new Typeface(font),
                size,
                fill,
                TaskbarHelper.GetSystemDpi() / 96.0
                );
            ctx.DrawText(ftext, new System.Windows.Point(Center ? width/2 - ftext.Width/2 : x, y));
            ctx.Close();
            renderTargets[layer].Render(visual);
        }
    }
}


================================================
FILE: RainbowTaskbar/Editor/DebugWindow.xaml
================================================
<ui:FluentWindow  xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" x:Class="RainbowTaskbar.Editor.DebugWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RainbowTaskbar.Editor" xmlns:configuration="clr-namespace:RainbowTaskbar.Configuration" d:DataContext="{d:DesignInstance Type=local:DebugWindow}"
                  mc:Ignorable="d"
                  Closing="FluentWindow_Closing"
        Title="DebugWindow" Height="450" Width="800">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Languages/en_US.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>

        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>


        <ui:TitleBar Title="Debug"/>
        <Grid Grid.Row="1">
            <TextBlock Text="{Binding DebugText}"></TextBlock>
        </Grid>
    </Grid>
</ui:FluentWindow>


================================================
FILE: RainbowTaskbar/Editor/DebugWindow.xaml.cs
================================================
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Wpf.Ui.Appearance;
using Wpf.Ui.Controls;

namespace RainbowTaskbar.Editor
{
    /// <summary>
    /// Interaction logic for DebugWindow.xaml
    /// </summary>
    public partial class DebugWindow : FluentWindow, INotifyPropertyChanged
    {
        public string DebugText { get; set; }
        private bool active = true;
        public DebugWindow()
        {

            DataContext = this;
            InitializeComponent();
            ApplicationThemeManager.ApplySystemTheme(true);
            Task.Run(() => {
                while (active) {
                    List<string> missingKeys = new List<string>();
                    foreach (DictionaryEntry key in App.localization.dictionary_en_US) {
                        if(!App.localization.dictionary.Contains(key.Key)) missingKeys.Add((string)key.Key);
                    }
                    DebugText = $"Missing translation keys: {string.Join(", ", missingKeys)}\n\n";
                    if (ExplorerTAP.ExplorerTAP.IsInjected) {
                        DebugText += $"UI Data: {ExplorerTAP.ExplorerTAP.GetUIDataStr(App.taskbars[0])}\n";
                    }
                    Thread.Sleep(100);
                }
            });
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void FluentWindow_Closing(object sender, CancelEventArgs e) {
            active = false;
        }
    }
}


================================================
FILE: RainbowTaskbar/Editor/EditorViewModel.cs
================================================
using RainbowTaskbar.Editor.Pages.Edit;
using RainbowTaskbar.Helpers;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;

namespace RainbowTaskbar.Editor {
    public class EditorViewModel {
        public EditPage EditPage { get; set; }
        public string? LatestUpdateInfo { get; set; } = null;
        public bool IsAppMicrosoftStore { get => App.IsAppMicrosoftStore; }
    }
}


================================================
FILE: RainbowTaskbar/Editor/EditorWindow.xaml
================================================
<ui:FluentWindow x:Class="RainbowTaskbar.Editor.EditorWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RainbowTaskbar.Editor"
        xmlns:pages="clr-namespace:RainbowTaskbar.Editor.Pages"
        mc:Ignorable="d"
        KeyDown="FluentWindow_KeyDown"
        xmlns:extensions="clr-namespace:RainbowTaskbar.Editor.Pages.Controls"
        xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
                 Closing="FluentWindow_Closing"
                 Icon="pack://application:,,,/RainbowTaskbar;component/Resources/icon.ico"
        Title="EditorWindow" Height="700" Width="1200">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Languages/en_US.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        
        
        <ui:TitleBar Title="RainbowTaskbar"/>
        <Grid Grid.Row="1">
            <ui:NavigationView x:Name="nav"  PaneDisplayMode="LeftFluent" Navigating="nav_Navigating">
                <ui:NavigationView.MenuItems>
                    <ui:NavigationViewItem NavigationCacheMode="Enabled" Icon="{ui:SymbolIcon Home24}" TargetPageType="{x:Type pages:Home}">
                        <ui:NavigationViewItem.Content>
                            <Viewbox StretchDirection="DownOnly">
                                <TextBlock Text="{DynamicResource home}"></TextBlock>
                            </Viewbox>
                        </ui:NavigationViewItem.Content>
                    </ui:NavigationViewItem>
                    <ui:NavigationViewItem NavigationCacheMode="Disabled" Icon="{ui:SymbolIcon CalendarAgenda24}" TargetPageType="{x:Type pages:Configs}">
                        <ui:NavigationViewItem.Content>
                            <Viewbox StretchDirection="DownOnly">
                                <TextBlock Text="{DynamicResource configs}"></TextBlock>
                            </Viewbox>
                        </ui:NavigationViewItem.Content>
                    </ui:NavigationViewItem>
                    <ui:NavigationViewItem NavigationCacheMode="Enabled" Icon="{ui:SymbolIcon Globe24}" TargetPageType="{x:Type pages:Browse}">
                        <ui:NavigationViewItem.Content>
                            <Viewbox StretchDirection="DownOnly">
                                <TextBlock Text="{DynamicResource browse}"></TextBlock>
                            </Viewbox>
                        </ui:NavigationViewItem.Content>
                    </ui:NavigationViewItem>
                </ui:NavigationView.MenuItems>
                <ui:NavigationView.FooterMenuItems>
                    <ui:NavigationViewItem NavigationCacheMode="Disabled" Icon="{ui:SymbolIcon Settings24}" TargetPageType="{x:Type pages:Settings}">
                        <ui:NavigationViewItem.Content>
                            <Viewbox StretchDirection="DownOnly">
                                <TextBlock Text="{DynamicResource settings}"></TextBlock>
                            </Viewbox>
                        </ui:NavigationViewItem.Content>
                    </ui:NavigationViewItem>
                    <ui:NavigationViewItem NavigationCacheMode="Enabled" Icon="{ui:SymbolIcon Info24}" TargetPageType="{x:Type pages:About}">
                        <ui:NavigationViewItem.Content>
                            <Viewbox StretchDirection="DownOnly">
                                <TextBlock Text="{DynamicResource about}"></TextBlock>
                            </Viewbox>
                        </ui:NavigationViewItem.Content>
                    </ui:NavigationViewItem>
                </ui:NavigationView.FooterMenuItems>
            </ui:NavigationView>

        </Grid>

        <ContentPresenter x:Name="RootContentDialogPresenter" Grid.Row="0" Grid.RowSpan="2" />
    </Grid>
</ui:FluentWindow>


================================================
FILE: RainbowTaskbar/Editor/EditorWindow.xaml.cs
================================================
using RainbowTaskbar.Configuration;
using RainbowTaskbar.Editor.Pages;
using RainbowTaskbar.Editor.Pages.Controls;
using RainbowTaskbar.Editor.Pages.Edit;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using Wpf.Ui;
using Wpf.Ui.Appearance;
using Wpf.Ui.Controls;
using Wpf.Ui.Extensions;
using Xceed.Wpf.AvalonDock.Controls;

namespace RainbowTaskbar.Editor {
    /// <summary>
    /// Interaction logic for EditorWindow.xaml
    /// </summary>
    public partial class EditorWindow : FluentWindow {

        public IContentDialogService contentDialogService;
        public EditorWindow() {

            SystemThemeWatcher.Watch(this);
            InitializeComponent();

            nav.Loaded += (_, _) => {
                nav.Navigate(typeof(Home));
                ApplicationThemeManager.ApplySystemTheme(true);
            };

            this.DataContext = App.editorViewModel;

            this.contentDialogService = new ContentDialogService();
            contentDialogService.SetDialogHost(RootContentDialogPresenter);

            App.localization.Enable(Resources.MergedDictionaries);


            if (!App.monacoExtracted) {
                Stream stream = new MemoryStream(Properties.Resources.monaco);
                if (Directory.Exists(App.monacoDir))
                    Directory.Delete(App.monacoDir, true);
                ZipFile.ExtractToDirectory(stream, App.monacoDir);
            }

            
        }

        public void OpenConfig(Config config) {
            App.editor.nav.Navigate(typeof(EmptyPageBadFix));

            var page = new ViewInfo(config);
            Task.Run(() => {
                Thread.Sleep(50);
                Dispatcher.Invoke(() => App.editor.nav.Navigate(typeof(EmptyPageBadFix2)));
                Thread.Sleep(50);
                Dispatcher.Invoke(() => App.editor.nav.ReplaceContent(page));
            });
        }
        private void nav_Navigating(NavigationView sender, NavigatingCancelEventArgs args) {
            // this is totally disgusting but wpf ui is cooked so whatever


            if(args.Page is Browse b) {
                b.OnSortChanged(); 
            }

            var navigationViewContentPresenter = (NavigationViewContentPresenter) sender.GetType()
                .GetProperty("NavigationViewContentPresenter", BindingFlags.NonPublic | BindingFlags.Instance)
                .GetValue(sender);

            var current = (Page)navigationViewContentPresenter.Content;

            current.FindVisualChildren<UnsafeImage>().ToList().ForEach(x => {
                x.Dispose();
            });

            if (current is not null && current.GetType() != args.Page.GetType() && (current is Browse || App.editorViewModel.EditPage is InstructionEditPage) && args.Page is not EmptyPageBadFix) {
                

                
                args.Cancel = true;
                nav.Navigate(typeof(EmptyPageBadFix));
                Type t = args.Page.GetType();
                Task.Run(() => {
                    Thread.Sleep(50);
                    Dispatcher.Invoke(() => nav.Navigate(t));
                });
            }

            if(current is EditInfo editInfo) {
                editInfo.Save(null, null);
                
                return;
            }


            if (App.editorViewModel.EditPage is not null && App.editorViewModel.EditPage is InstructionEditPage) {
                var page = App.editorViewModel.EditPage as InstructionEditPage;
                page.Current.Stop();
                if (App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Start();
            }
            if (App.editorViewModel.EditPage is not null && App.editorViewModel.EditPage is WebEditPage) {
                if (App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Start();
            }

            if (App.editorViewModel.EditPage is not null && App.editorViewModel.EditPage.Modified) {

                args.Cancel = true;
                
                if(App.editorViewModel.EditPage is WebEditPage) {
                    var page = App.editorViewModel.EditPage as WebEditPage;
                    page.webView.Visibility = Visibility.Hidden;
                }

                var task = contentDialogService.ShowSimpleDialogAsync(
                    new SimpleContentDialogCreateOptions() {
                        Title = App.localization.Get("msgbox_save_title"),
                        Content = App.localization.Get("msgbox_save"),
                        PrimaryButtonText = App.localization.Get("msgbox_save_b1"),
                        SecondaryButtonText = App.localization.Get("msgbox_save_b2"),
                        CloseButtonText = App.localization.Get("msgbox_button_cancel"),
                });

                Task.Run(() => {
                    var res = task.Result;
                    var saving = false;

                    switch (res) {
                        case ContentDialogResult.Primary:
                            if (App.editorViewModel.EditPage is WebEditPage) {
                                var page = App.editorViewModel.EditPage as WebEditPage;

                                // INSANE!
                                Dispatcher.Invoke(() => {
                                    saving = true;
                                    page.Save();
                                    Task.Run(() => {
                                        Thread.Sleep(1500);
                                        saving = false;
                                        Dispatcher.Invoke(() => {
                                            try {
                                                page.webView.Dispose();
                                            }
                                            catch { }
                                        });
                                    });
                                });
                            }
                            goto case ContentDialogResult.Secondary;
                        case ContentDialogResult.Secondary:
                            Dispatcher.Invoke(() => {
                                // weird COM error sometimes?
                                try {
                                    if(!saving) (App.editorViewModel.EditPage as WebEditPage).webView.Dispose();
                                }
                                catch { }
                            });
                            App.editorViewModel.EditPage = null;
                            Dispatcher.Invoke(() => sender.Navigate(args.Page.GetType()));
                            Dispatcher.Invoke(() => { if (App.Settings.SelectedConfig is not null) App.Settings.SelectedConfig.Start(); });
                            break;
                        case ContentDialogResult.None:
                            if (App.editorViewModel.EditPage is WebEditPage) {
                                var page = App.editorViewModel.EditPage as WebEditPage;
                                Dispatcher.Invoke(() => page.webView.Visibility = Visibility.Visible);
                            }
                            break;
                    }
                });
                return;
                
            }
            if (App.editorViewModel.EditPage is not null && App.editorViewModel.EditPage is WebEditPage) {
                (App.editorViewModel.EditPage as WebEditPage).webView.Dispose();
            }
            if(App.editorViewModel.EditPage is not null) {
                App.editorViewModel.EditPage = null;
            }

            ApplicationThemeManager.ApplySystemTheme(true);
        }

        private void FluentWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
            App.editor = null;
            nav.FindVisualChildren<UnsafeImage>().ToList().ForEach(x => {
                x.Dispose();
            });
            //e.Cancel = true;
            //Hide();
        }
        DebugWindow curDeb = null;
        private void FluentWindow_KeyDown(object sender, KeyEventArgs e) {
            if(e.Key == Key.F12) {
                if(curDeb is not null) {
                    curDeb.Close();
                }
                curDeb = new DebugWindow();
                curDeb.Show();
            }
        }
    }
}


================================================
FILE: RainbowTaskbar/Editor/Pages/About.xaml
================================================
<Page x:Class="RainbowTaskbar.Editor.Pages.About"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:RainbowTaskbar.Editor.Pages"
      mc:Ignorable="d" 
      d:DesignHeight="450" d:DesignWidth="800"
      xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
      Title="About">
    <Page.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../../Languages/en_US.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Page.Resources>
    <Grid Margin="16">
        <StackPanel>
            <TextBlock HorizontalAlignment="Center" FontSize="32" FontWeight="SemiBold" Text="{DynamicResource aboutrnb}"></TextBlock>
            <TextBlock HorizontalAlignment="Center" Text="{DynamicResource description}"></TextBlock>
            <TextBlock HorizontalAlignment="Center" Text="{DynamicResource donations}"></TextBlock>
        </StackPanel>
        <Image VerticalAlignment="Center" x:Name="paypal" MouseLeftButtonDown="Image_MouseLeftButtonDown"
                                       Tag="https://paypal.me/ad2k17" Height="80" Width="200" Stretch="Fill"
                                       Source="pack://application:,,,/Resources/Paypal.png">
            <Image.Style>
                <Style TargetType="Image">
                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Cursor" Value="Hand"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>

        </Image>
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" TextAlignment="Center">
                <Hyperlink Click="Hyperlink_Click_2">
                    <TextBlock Text="{DynamicResource rnbweb}"></TextBlock>
                </Hyperlink>
                <LineBreak></LineBreak>
            <Hyperlink Click="Hyperlink_Click">
                GitHub
            </Hyperlink>
            <LineBreak></LineBreak>
            <Hyperlink Click="Hyperlink_Click_1" >
                <TextBlock Text="{DynamicResource issueorreq}"></TextBlock>
            </Hyperlink>
            <LineBreak></LineBreak>
            <Run Text="{DynamicResource langcredits}"></Run>
        </TextBlock>
        
    </Grid>
</Page>


================================================
FILE: RainbowTaskbar/Editor/Pages/About.xaml.cs
================================================
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Wpf.Ui.Appearance;

namespace RainbowTaskbar.Editor.Pages {
    /// <summary>
    /// Interaction logic for About.xaml
    /// </summary>
    public partial class About : Page {
        public About() {
            InitializeComponent();
            ApplicationThemeManager.ApplySystemTheme(true);

            App.localization.Enable(Resources.MergedDictionaries);


        }

        private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
            Process.Start(new ProcessStartInfo("https://paypal.me/ad2k17") { UseShellExecute = true });
        }

        private void Hyperlink_Click(object sender, RoutedEventArgs e) {
            Process.Start(new ProcessStartInfo("https://github.com/ad2017gd") { UseShellExecute = true });
        }

        private void Hyperlink_Click_1(object sender, RoutedEventArgs e) {
            Process.Start(new ProcessStartInfo("https://github.com/ad2017gd/RainbowTaskbar/issues/new/choose") { UseShellExecute = true });
        }

        private void Hyperlink_Click_2(object sender, RoutedEventArgs e) {
            Process.Start(new ProcessStartInfo("https://ad2017.dev/rnb") { UseShellExecute = true });
        }
    }
}


================================================
FILE: RainbowTaskbar/Editor/Pages/Browse.xaml
================================================
<Page x:Class="RainbowTaskbar.Editor.Pages.Browse" x:Name="browsePage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:RainbowTaskbar.Editor.Pages"
      xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" xmlns:controls="clr-namespace:RainbowTaskbar.Editor.Pages.Controls"
      mc:Ignorable="d"  ScrollViewer.CanContentScroll="False"
      xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:loc="clr-namespace:RainbowTaskbar.Languages"
      d:DesignHeight="450" d:DesignWidth="800"
      Title="Browse">
    <Page.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../../Languages/en_US.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <ObjectDataProvider x:Key="SortBy" ObjectType="{x:Type s:Enum}" MethodName="GetValues">
                <ObjectDataProvider.MethodParameters>
                    <x:Type TypeName="local:SortBy" />
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
            <loc:EnumTranslator x:Key="EnumTranslator" />
        </ResourceDictionary>
        
        
    </Page.Resources>
    <Grid Margin="16">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <ui:TextBox PlaceholderText="{DynamicResource search}" TextChanged="TextBox_TextChanged" x:Name="search" Grid.Column="0"></ui:TextBox>
            <ComboBox Grid.Column="1" ItemsSource="{Binding Source={StaticResource SortBy}}" SelectedValue="{Binding Sort}">
                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=., Converter={StaticResource EnumTranslator}}"></TextBlock>
                    </DataTemplate>
                </ComboBox.ItemTemplate>
            </ComboBox>
        </Grid>
        <ScrollViewer Grid.Row="1" Margin="-4,0,0,0" ScrollChanged="ScrollViewer_ScrollChanged" x:Name="scrollViewer">
            <StackPanel>
                <ItemsControl x:Name="itemscontrol" ItemsSource="{Binding ResultList}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <WrapPanel />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <controls:ResultListItemControl Margin="4" Config="{Binding}" PageParent="{Binding ElementName=browsePage, Path=.}"></controls:ResultListItemControl>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>

                <StackPanel>
                    <StackPanel.Style>
                        <Style TargetType="StackPanel">
                            <Setter Property="Visibility" Value="Visible"></Setter>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding SearchLoaded}" Value="True">
                                    <DataTrigger.Setters>
                                        <Setter Property="Visibility" Value="Collapsed"></Setter>
                                    </DataTrigger.Setters>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </StackPanel.Style>
                    <ui:ProgressRing IsIndeterminate="True" Margin="0,16,0,16"/>
                </StackPanel>
            </StackPanel>
        </ScrollViewer>
    </Grid>
</Page>


================================================
FILE: RainbowTaskbar/Editor/Pages/Browse.xaml.cs
================================================
using RainbowTaskbar.Configuration;
using RainbowTaskbar.Editor.Pages.Controls;
using RainbowTaskbar.HTTPAPI;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Wpf.Ui.Appearance;
using Xceed.Wpf.AvalonDock.Controls;

namespace RainbowTaskbar.Editor.Pages
{
    public enum SortBy {
        Likes,
        Match
    }
    /// <summary>
    /// Interaction logic for Browse.xaml
    /// </summary>
    public partial class Browse : Page, INotifyPropertyChanged
    {
        public ObservableCollection<Config> ResultList { get; set; } = new();
        public SortBy Sort { get; set; } = SortBy.Likes;
        public int Page { get; set; } = -1;
        private bool end = false;
        public bool SearchLoaded { get; set; } = true;
        public Browse()
        {
            DataContext = this;
            InitializeComponent();
            ApplicationThemeManager.ApplySystemTheme(true);
            App.localization.Enable(Resources.MergedDictionaries);




        }

        public void Clear() {
            itemscontrol.FindVisualChildren<UnsafeImage>().ToList().ForEach(x => {
                x.Dispose();
            });
            ResultList.Clear();
        }

        public void OnSortChanged() {

            if (!SearchLoaded) return;
            SearchLoaded = false;
            scrollViewer.ScrollToHome();
            Clear();
            Page = -1;
            end = false;
            Task.Run(() => {
                Thread.Sleep(300);
                while (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight && !end) {
                    Page++;
                    Task t = null;
                    Dispatcher.Invoke(() => t = Search());
                    t.Wait();
                    Thread.Sleep(300);

                }
            });
        }

        public Task Search() {
            SearchLoaded = false;
            var configsreq = App.Settings.workshopAPI.SearchConfigsAsync(search.Text.Trim(), Sort, Page);
            return Task.Run(() => {
                var cfgs = configsreq.Result;
                if (cfgs is null) {
                    end = true;
                    SearchLoaded = true;
                    return;
                }
                var parsed = cfgs.Parse();
                if(parsed.Count() == 0) {
                    end = true;
                    SearchLoaded = true;
                    return;
                }
                Dispatcher.Invoke(() => parsed.ToList().ForEach(x=>ResultList.Add(x)));
                SearchLoaded = true;
            });
            
        }
        Timer searchTimer;
        private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
            if (!SearchLoaded) return;
            if (searchTimer != null) searchTimer.Dispose();
            searchTimer = new Timer((_) => {
                Dispatcher.Invoke(() => {
                    Clear();
                    Page = 0;
                    end = false;
                    Search();
                });
            });
            searchTimer.Change(250, Timeout.Infinite);
        }

        private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e) {
            if (!SearchLoaded) return;
            var scroll = (ScrollViewer)sender;
            if (scroll.VerticalOffset == scroll.ScrollableHeight && e.ExtentHeightChange == 0 && !end) {
                Page++;
                Search();
            }
        }
    }
}


================================================
FILE: RainbowTaskbar/Editor/Pages/Configs.xaml
================================================
<Page x:Class="RainbowTaskbar.Editor.Pages.Configs"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:cfg="clr-namespace:RainbowTaskbar.Configuration"
      xmlns:local="clr-namespace:RainbowTaskbar.Editor.Pages" xmlns:controls="clr-namespace:RainbowTaskbar.Editor.Pages.Controls"
      mc:Ignorable="d"  
      xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
      d:DesignHeight="450" d:DesignWidth="800"
      Title="Configs">
    <Page.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../../Languages/en_US.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Page.Resources>
    <Grid Margin="16">
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <ui:DropDownButton Content="{DynamicResource new}" Icon="{ui:SymbolIcon Add24}">
                    <ui:DropDownButton.Flyout>
                        <ContextMenu >
                            <MenuItem Tag="classic"  Header="{DynamicResource enum_classic}" Click="AddNewConfig"/>
                            <MenuItem Tag="web" Header="{DynamicResource enum_web}" Click="AddNewConfig"/>
                        </ContextMenu>
                    </ui:DropDownButton.Flyout>
                </ui:DropDownButton>
            </StackPanel>
            <ItemsControl x:Name="itemscontrol" ItemsSource="{Binding ConfigList}" Margin="-4,0,0,0">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <controls:ConfigListItemControl Margin="4" Config="{Binding}"></controls:ConfigListItemControl>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </StackPanel>
    </Grid>
</Page>


================================================
FILE: RainbowTaskbar/Editor/Pages/Configs.xaml.cs
================================================
using PropertyChanged;
using RainbowTaskbar.Configuration;
using RainbowTaskbar.Configuration.Instruction;
using RainbowTaskbar.Configuration.Web;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Wpf.Ui.Appearance;

namespace RainbowTaskbar.Editor.Pages
{
    /// <summary>
    /// Interaction logic for Configs.xaml
    /// </summary>
    public partial class Configs : Page
    {
        public ObservableCollection<Config> ConfigList { get => App.Configs; }
        public Configs()
        {
            DataContext = this;
            InitializeComponent();

            ApplicationThemeManager.ApplySystemTheme(true);

            App.localization.Enable(Resources.MergedDictionaries);
        }

        private void AddNewConfig(object sender, RoutedEventArgs e) {
            var menu = (MenuItem)sender;
            Config cfg = null;
            if(menu.Tag.ToString() == "classic") {
                cfg = new InstructionConfig();
            } else {
                cfg = new WebConfig();
            }
            cfg.InitNew();
            cfg.ToFile();
            App.Configs.Insert(0, cfg);
        }
    }
}


================================================
FILE: RainbowTaskbar/Editor/Pages/Controls/ConfigListItemControl.xaml
================================================
<UserControl x:Class="RainbowTaskbar.Editor.Pages.Controls.ConfigListItemControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
             xmlns:local="clr-namespace:RainbowTaskbar.Editor.Pages.Controls"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <LinearGradientBrush
    x:Key="ImageOpacityMask"
    StartPoint="0,0"
    EndPoint="0,1">
            <GradientStop Color="#00FFFFFF" Offset="0"/>
            <GradientStop Color="#00FFFFFF" Offset="0.1"/>
            <GradientStop Color="#FFFFFFFF" Offset="0.3"/>
            <GradientStop Color="#FFFFFFFF" Offset="1"/>
        </LinearGradientBrush>
    </UserControl.Resources>
    <Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
        <Button Click="Select" Width="256" Height="256"  HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch">
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"></ColumnDefinition>
                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"></RowDefinition>
                    <RowDefinition Height="8"></RowDefinition>
                    <RowDefinition Height="48"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <Viewbox Grid.ColumnSpan="2" OpacityMask="{StaticResource ImageOpacityMask}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Stretch="UniformToFill">
                    <local:UnsafeImage x:Name="image" OpacityMask="White"></local:UnsafeImage>
                </Viewbox>
                <Viewbox Grid.ColumnSpan="2" Grid.Row="2" StretchDirection="DownOnly" Stretch="Uniform">
                    <TextBlock FontSize="32"  HorizontalAlignment="Center" Text="{Binding Config.Name}"></TextBlock>
                </Viewbox>
                <TextBlock Grid.ColumnSpan="2" x:Name="author" FontSize="8" Grid.Row="3" HorizontalAlignment="Center"></TextBlock>

                <StackPanel VerticalAlignment="Top" Grid.Column="1" Orientation="Horizontal">
                    <ui:Button Icon="{ui:SymbolIcon Delete24}" Click="Delete" Margin="0,0,2,0"></ui:Button>
                    <ui:Button Icon="{ui:SymbolIcon Edit24}" Click="Edit"></ui:Button>
                </StackPanel>
                <TextBlock Text="{Binding ConfigType}"></TextBlock>
            </Grid>
        </Button>
    </Grid>
</UserControl>


================================================
FILE: RainbowTaskbar/Editor/Pages/Controls/ConfigListItemControl.xaml.cs
================================================
using Kasay;
using PropertyChanged;
using RainbowTaskbar.Configuration;
using RainbowTaskbar.Configuration.Web;
using RainbowTaskbar.Editor.Pages.Edit;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Xceed.Wpf.AvalonDock.Controls;

namespace RainbowTaskbar.Editor.Pages.Controls
{
    /// <summary>
    /// Interaction logic for ConfigListItemControl.xaml
    /// </summary>
    public partial class ConfigListItemControl : UserControl, INotifyPropertyChanged
    {
        public static readonly DependencyProperty ConfigProperty =
                   DependencyProperty.Register(
                         "Config",
                          typeof(Config),
                          typeof(ConfigListItemControl));

        public Config Config {
            get {
                return (Config) GetValue(ConfigProperty);
            }
            set {
                SetValue(ConfigProperty, value);
                
            }
        }
        public string ConfigType { get => (Config is WebConfig) ? App.localization["enum_web"] : App.localization["enum_classic"]; }

        public void OnConfigChanged() {
            image.Source = Config.LoadImage();
        }
        public ConfigListItemControl()
        {

            InitializeComponent();
            DependencyPropertyDescriptor
                .FromProperty(ConfigProperty, typeof(ConfigListItemControl))
                .AddValueChanged(this, (s, e) => OnConfigChanged());

        }

        private void Delete(object sender, RoutedEventArgs e) {
            e.Handled = true;
            var button = (UIElement) sender;
            var control = button.FindVisualAncestor<ConfigListItemControl>();
            App.Configs.Remove(control.Config);
            control.Config.DeleteFile();
        }
        private void Edit(object sender, RoutedEventArgs e) {
            e.Handled = true;
            var page = new EditInfo(Config);
            App.editor.nav.Navigate(typeof(EmptyPageBadFix));
            Task.Run(() => {
                Thread.Sleep(50);
                Dispatcher.Invoke(() => App.editor.nav.ReplaceContent(page));
            });
            
        }

        private void Select(object sender, RoutedEventArgs e) {
            if (App.Settings.SelectedConfig != Config) {
                App.Settings.SelectedConfig = Config;
            } else {
                App.ReloadTaskbars();
            }
            App.Settings.ToFile();
        }

    }
}


================================================
FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionContextMenu.xaml
================================================
<ContextMenu x:Class="RainbowTaskbar.Editor.Pages.Controls.InstructionContextMenu"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:RainbowTaskbar.Editor.Pages.Controls"
        mc:Ignorable="d">
    <ContextMenu.Style>
        <Style TargetType="ContextMenu" BasedOn="{StaticResource {x:Type ContextMenu}}">
        </Style>
    </ContextMenu.Style>
    <MenuItem x:Name="duplicate" Click="Duplicate_Click" Header="{DynamicResource duplicate}"></MenuItem>
    <MenuItem x:Name="delete" Click="Delete_Click" Header="{DynamicResource delete}" />
</ContextMenu>


================================================
FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionContextMenu.xaml.cs
================================================
using RainbowTaskbar.Configuration.Instruction;
using RainbowTaskbar.Editor.Pages.Controls;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace RainbowTaskbar.Editor.Pages.Controls
{
    /// <summary>
    /// Interaction logic for InstructionContextMenu.xaml
    /// </summary>
    public partial class InstructionContextMenu : ContextMenu
    {
        public static readonly DependencyProperty ListBoxProperty =
                   DependencyProperty.Register(
                         "ParentListBox",
                          typeof(ListBox),
                          typeof(InstructionContextMenu));

        public ListBox ParentListBox {
            get {
                return (ListBox) GetValue(ListBoxProperty);
            }
            set {
                SetValue(ListBoxProperty, value);
            }
        }
        public InstructionContextMenu()
        {
            InitializeComponent();
            App.localization.Enable(Resources.MergedDictionaries);
        }

        private void Duplicate_Click(object sender, RoutedEventArgs e) {
            var list = (ParentListBox.ItemsSource as BindingList<Instruction>);
            list.Insert(ParentListBox.SelectedIndex+1, JsonSerializer.Deserialize<Instruction>(JsonSerializer.Serialize(ParentListBox.SelectedItem as Instruction)));
        }

        private void Delete_Click(object sender, RoutedEventArgs e) {
            (ParentListBox.ItemsSource as BindingList<Instruction>).Remove(ParentListBox.SelectedItem as Instruction);
        }
    }
}


================================================
FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/BorderRadiusInstructionControl.xaml
================================================
<UserControl x:Class="RainbowTaskbar.Editor.Pages.Controls.InstructionControls.BorderRadiusInstructionControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" xmlns:converters="clr-namespace:RainbowTaskbar.Editor.Pages.Controls.InstructionControls.Converters"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <converters:DivideHalf x:Key="DivideHalf"></converters:DivideHalf>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <Slider Minimum="0" Maximum="80" Value="{Binding SelectedInstruction.Radius}" HorizontalAlignment="Left"
            VerticalAlignment="Center" Width="240" />
                <ui:NumberBox ClearButtonEnabled="False" Value="{Binding SelectedInstruction.Radius}" Margin="5,0,0,0" HorizontalAlignment="Left" TextWrapping="NoWrap" Minimum="0" Maximum="80">
                </ui:NumberBox>
            </StackPanel>
        </StackPanel>
        <StackPanel Orientation="Horizontal" Grid.Row="1">
            <Canvas Margin="0,0,0,5" x:Name="Preview" Width="450" Height="40">
                <Rectangle RadiusX="{Binding SelectedInstruction.Radius, Converter={StaticResource DivideHalf}}"
                           RadiusY="{Binding SelectedInstruction.Radius, Converter={StaticResource DivideHalf}}"
                           Canvas.Left="0" Canvas.Top="0" Width="450" Height="40">
                    <Rectangle.Fill>
                        <SolidColorBrush Color="LightGray" />
                    </Rectangle.Fill>
                </Rectangle>
                <Label Margin="150,0,0,0" Content="This is some text." />
                <Label Margin="150,12,0,0" Foreground="White" Content="Radius preview!" />
                <Rectangle RadiusX="{Binding SelectedInstruction.Radius, Converter={StaticResource DivideHalf}}"
                           RadiusY="{Binding SelectedInstruction.Radius, Converter={StaticResource DivideHalf}}"
                           Name="PreviewRectangle" Opacity="0.8" Fill="MediumPurple" Canvas.Left="0" Canvas.Top="0"
                           Width="450" Height="40" />

                <Rectangle Width="10" Height="10" Canvas.Top="10" Canvas.Left="8" RadiusX="1" RadiusY="1" Fill="#2af" />
                <Rectangle Width="10" Height="10" Canvas.Top="10" Canvas.Left="19" RadiusX="1" RadiusY="1" Fill="#2af" />
                <Rectangle Width="10" Height="10" Canvas.Top="21" Canvas.Left="8" RadiusX="1" RadiusY="1" Fill="#2af" />
                <Rectangle Width="10" Height="10" Canvas.Top="21" Canvas.Left="19" RadiusX="1" RadiusY="1" Fill="#2af" />

                <TextBlock Width="440" Height="20" TextAlignment="Right" Margin="0,12,0,0" Foreground="White"
                           Text="22:11" />

            </Canvas>
        </StackPanel>
    </Grid>
</UserControl>


================================================
FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Bord
Download .txt
gitextract_i3_ujbve/

├── .editorconfig
├── .github/
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       ├── feature_request.md
│       └── other-issue.md
├── .gitignore
├── LICENSE
├── MSIXPkg2/
│   ├── MSIXPkg2.wapproj
│   └── Package.appxmanifest
├── README.md
├── RainbowTaskbar/
│   ├── App.xaml
│   ├── App.xaml.cs
│   ├── AssemblyInfo.cs
│   ├── Configuration/
│   │   ├── Config.cs
│   │   ├── Instruction/
│   │   │   ├── DefaultPresets.cs
│   │   │   ├── Instruction.cs
│   │   │   ├── InstructionConfig.cs
│   │   │   ├── InstructionGroup.cs
│   │   │   ├── InstructionPreset.cs
│   │   │   └── Instructions/
│   │   │       ├── BorderRadiusInstruction.cs
│   │   │       ├── ClearLayerInstruction.cs
│   │   │       ├── ColorInstruction.cs
│   │   │       ├── DelayInstruction.cs
│   │   │       ├── ImageInstruction.cs
│   │   │       ├── ShapeInstruction.cs
│   │   │       ├── TextInstruction.cs
│   │   │       └── TransparencyInstruction.cs
│   │   └── Web/
│   │       └── WebConfig.cs
│   ├── Drawing/
│   │   ├── CanvasManager.cs
│   │   └── LayerManager.cs
│   ├── Editor/
│   │   ├── DebugWindow.xaml
│   │   ├── DebugWindow.xaml.cs
│   │   ├── EditorViewModel.cs
│   │   ├── EditorWindow.xaml
│   │   ├── EditorWindow.xaml.cs
│   │   └── Pages/
│   │       ├── About.xaml
│   │       ├── About.xaml.cs
│   │       ├── Browse.xaml
│   │       ├── Browse.xaml.cs
│   │       ├── Configs.xaml
│   │       ├── Configs.xaml.cs
│   │       ├── Controls/
│   │       │   ├── ConfigListItemControl.xaml
│   │       │   ├── ConfigListItemControl.xaml.cs
│   │       │   ├── InstructionContextMenu.xaml
│   │       │   ├── InstructionContextMenu.xaml.cs
│   │       │   ├── InstructionControls/
│   │       │   │   ├── BorderRadiusInstructionControl.xaml
│   │       │   │   ├── BorderRadiusInstructionControl.xaml.cs
│   │       │   │   ├── ClearLayerInstructionControl.xaml
│   │       │   │   ├── ClearLayerInstructionControl.xaml.cs
│   │       │   │   ├── ColorInstructionControl.xaml
│   │       │   │   ├── ColorInstructionControl.xaml.cs
│   │       │   │   ├── Converters/
│   │       │   │   │   ├── ColorConverter.cs
│   │       │   │   │   ├── DivideHalf.cs
│   │       │   │   │   ├── FileExists.cs
│   │       │   │   │   └── FloatToPercentage.cs
│   │       │   │   ├── DelayInstructionControl.xaml
│   │       │   │   ├── DelayInstructionControl.xaml.cs
│   │       │   │   ├── ImageInstructionControl.xaml
│   │       │   │   ├── ImageInstructionControl.xaml.cs
│   │       │   │   ├── ShapeInstructionControl.xaml
│   │       │   │   ├── ShapeInstructionControl.xaml.cs
│   │       │   │   ├── TextInstructionControl.xaml
│   │       │   │   ├── TextInstructionControl.xaml.cs
│   │       │   │   ├── TransparencyInstructionControl.xaml
│   │       │   │   └── TransparencyInstructionControl.xaml.cs
│   │       │   ├── IssueControl.xaml
│   │       │   ├── IssueControl.xaml.cs
│   │       │   ├── LoginControl.xaml
│   │       │   ├── LoginControl.xaml.cs
│   │       │   ├── ResultListItemControl.xaml
│   │       │   ├── ResultListItemControl.xaml.cs
│   │       │   ├── UnsafeImage.cs
│   │       │   └── WebControls/
│   │       │       ├── AddPropertyDialogControl.xaml
│   │       │       └── AddPropertyDialogControl.xaml.cs
│   │       ├── Edit/
│   │       │   ├── EditInfo.xaml
│   │       │   ├── EditInfo.xaml.cs
│   │       │   ├── EditPage.cs
│   │       │   ├── InstructionEditPage.xaml
│   │       │   ├── InstructionEditPage.xaml.cs
│   │       │   ├── ViewComments.xaml
│   │       │   ├── ViewComments.xaml.cs
│   │       │   ├── ViewInfo.xaml
│   │       │   ├── ViewInfo.xaml.cs
│   │       │   ├── WebEditPage.xaml
│   │       │   ├── WebEditPage.xaml.cs
│   │       │   └── WebView2Fixed.cs
│   │       ├── EmptyPageBadFix.xaml
│   │       ├── EmptyPageBadFix.xaml.cs
│   │       ├── EmptyPageBadFix2.xaml
│   │       ├── EmptyPageBadFix2.xaml.cs
│   │       ├── Home.xaml
│   │       ├── Home.xaml.cs
│   │       ├── Settings.xaml
│   │       └── Settings.xaml.cs
│   ├── ExplorerTAP/
│   │   └── ExplorerTAP.cs
│   ├── FodyWeavers.xml
│   ├── HTTPAPI/
│   │   └── WorkshopAPI.cs
│   ├── Helpers/
│   │   ├── AutoUpdate.cs
│   │   ├── Cache.cs
│   │   ├── DPIUtil.cs
│   │   ├── HiddenWebViewHost.xaml
│   │   ├── HiddenWebViewHost.xaml.cs
│   │   ├── JsonColorConverter.cs
│   │   ├── Taskbar.cs
│   │   └── Window.cs
│   ├── Interpolation/
│   │   └── ColorInterpolation.cs
│   ├── Languages/
│   │   ├── Localization.cs
│   │   ├── Translators.cs
│   │   ├── en_US.xaml
│   │   ├── en_US.xaml.cs
│   │   ├── fr_FR.xaml
│   │   ├── fr_FR.xaml.cs
│   │   ├── ro_RO.xaml
│   │   ├── ro_RO.xaml.cs
│   │   ├── zh_CN.cs
│   │   └── zh_CN.xaml
│   ├── Preferences/
│   │   └── Settings.cs
│   ├── Properties/
│   │   ├── Resources.Designer.cs
│   │   ├── Resources.resx
│   │   ├── Settings.Designer.cs
│   │   ├── Settings.settings
│   │   └── launchSettings.json
│   ├── RainbowTaskbar.csproj
│   ├── Taskbar.xaml
│   ├── Taskbar.xaml.cs
│   ├── TaskbarViewModel.cs
│   ├── TrayWindow.xaml
│   ├── TrayWindow.xaml.cs
│   ├── V2Legacy/
│   │   └── Configuration/
│   │       ├── Config.cs
│   │       ├── Instruction.cs
│   │       ├── InstructionPreset.cs
│   │       └── Instructions/
│   │           ├── BorderRadiusInstruction.cs
│   │           ├── ClearLayerInstruction.cs
│   │           ├── ColorInstruction.cs
│   │           ├── DelayInstruction.cs
│   │           ├── ImageInstruction.cs
│   │           ├── ShapeInstruction.cs
│   │           ├── TextInstruction.cs
│   │           └── TransparencyInstruction.cs
│   └── msix.build.props
├── RainbowTaskbar.sln
├── RainbowTaskbarDLL/
│   ├── AppearanceServiceAPI.cpp
│   ├── AppearanceServiceAPI.h
│   ├── ArmFix/
│   │   └── RpcProxy.h
│   ├── ErrorDebug.h
│   ├── Factory.h
│   ├── IUnused.h
│   ├── IUnused.idl
│   ├── RainbowTaskbarDLL.def
│   ├── RainbowTaskbarDLL.idl
│   ├── RainbowTaskbarDLL.vcxproj
│   ├── RainbowTaskbarDLL.vcxproj.filters
│   ├── TAP.cpp
│   ├── TAP.h
│   ├── Taskbar.h
│   ├── VisualTreeWatch.cpp
│   ├── VisualTreeWatch.h
│   ├── csharpinterop.cpp
│   ├── dllmain.cpp
│   ├── framework.h
│   ├── packages.config
│   └── winrt.h
├── SetupARM64.iss
└── SetupX64.iss
Download .txt
SYMBOL INDEX (604 symbols across 97 files)

FILE: RainbowTaskbar/App.xaml.cs
  class App (line 47) | public partial class App : Application {
    method SetProcessWorkingSetSize (line 48) | [DllImport("KERNEL32.DLL", EntryPoint = "SetProcessWorkingSetSize", Se...
    method GetCurrentProcess (line 51) | [DllImport("KERNEL32.DLL", EntryPoint = "GetCurrentProcess", SetLastEr...
    type Point (line 56) | [StructLayout(LayoutKind.Sequential)]
    type MOUSEHOOKSTRUCT (line 62) | [StructLayout(LayoutKind.Sequential)]
    method SetWindowsHookEx (line 72) | [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = Calli...
    method CallNextHookEx (line 75) | [DllImport("user32", CharSet = CharSet.Auto, CallingConvention = Calli...
    method PostMessage (line 82) | [return: MarshalAs(UnmanagedType.Bool)]
    type POINT (line 86) | [StructLayout(LayoutKind.Sequential)]
    method ScreenToClient (line 91) | [DllImport("user32.dll")]
    method RealChildWindowFromPoint (line 94) | [DllImport("user32.dll", EntryPoint = "RealChildWindowFromPoint", SetL...
    method UnhookWindowsHookEx (line 96) | [DllImport("user32.dll", SetLastError = true)]
    method FindLastChildAtPoint (line 99) | public static IntPtr FindLastChildAtPoint(IntPtr parent, int x, int y) {
    method HookCallback (line 105) | private static int HookCallback(int nCode, IntPtr wParam, IntPtr lPara...
    method AllConfigsFromFiles (line 170) | public static List<Config> AllConfigsFromFiles() {
    method LaunchEditor (line 187) | public static void LaunchEditor() {
    method App (line 197) | public App() {
    method Exit (line 203) | public new static void Exit() {
    type MSG (line 223) | [StructLayout(LayoutKind.Sequential)]
    method GetMessage (line 233) | [DllImport("user32.dll")]
    method TranslateMessage (line 236) | [DllImport("user32.dll")]
    method DispatchMessage (line 239) | [DllImport("user32.dll")]
    method GetWindowThreadProcessId (line 241) | [DllImport("user32.dll", SetLastError = true)]
    method StartHook (line 244) | public static void StartHook() {
    method StopHook (line 258) | public static void StopHook() {
    method IsMicrosoftStore (line 273) | public static bool IsMicrosoftStore() {
    method Application_Startup (line 277) | private void Application_Startup(object sender, StartupEventArgs e) {
    method EnumWindows (line 481) | [DllImport("user32.dll")]
    method GetClassName (line 484) | [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    method FindAllTaskbars (line 487) | public static List<Taskbar> FindAllTaskbars() {
    method SetupTaskbars (line 510) | public static void SetupTaskbars() {
    method ReloadTaskbars (line 553) | public static void ReloadTaskbars(bool startConfig = true) =>

FILE: RainbowTaskbar/Configuration/Config.cs
  type ConfigPublishStatus (line 22) | public enum ConfigPublishStatus {
  class ConfigData (line 28) | [JsonDerivedType(typeof(InstructionConfigData), typeDiscriminator: "c")]
  class Config (line 35) | [JsonDerivedType(typeof(InstructionConfig), typeDiscriminator: "c")]
    method OnPropertyChanged (line 40) | protected virtual void OnPropertyChanged([CallerMemberName] string pro...
    method InitNew (line 72) | public void InitNew() {
    method FromFile (line 75) | public static Config FromFile(string file) {
    method ToFile (line 81) | public void ToFile() {
    method Copy (line 87) | public Config Copy() {
    method DeleteFile (line 90) | public void DeleteFile() {
    method Start (line 95) | public virtual Task<bool> Start() {
    method Stop (line 125) | public abstract Task Stop();
    method LoadImage (line 126) | public BitmapImage? LoadImage() {

FILE: RainbowTaskbar/Configuration/Instruction/DefaultPresets.cs
  class DefaultPresets (line 8) | public static class DefaultPresets {

FILE: RainbowTaskbar/Configuration/Instruction/Instruction.cs
  class Instruction (line 18) | [JsonDerivedType(typeof(BorderRadiusInstruction), typeDiscriminator: "b")]
    method GetKnownInstructionTypes (line 50) | public static IEnumerable<Type> GetKnownInstructionTypes() {
    method Execute (line 58) | public bool Execute(Taskbar window) => Execute(window, CancellationTok...
    method Execute (line 60) | public abstract bool Execute(Taskbar window, CancellationToken token);

FILE: RainbowTaskbar/Configuration/Instruction/InstructionConfig.cs
  class InstructionConfigData (line 27) | [Serializable]
    method OnPropertyChanged (line 37) | protected virtual void OnPropertyChanged([CallerMemberName] string pro...
    method SetupPropertyChanged (line 41) | private void SetupPropertyChanged() {
    method InstructionConfigData (line 45) | public InstructionConfigData() {
  class InstructionConfig (line 50) | [Serializable]
    method InstructionConfig (line 57) | public InstructionConfig() {
    method Start (line 62) | public override async Task<bool> Start() {
    method Stop (line 71) | public override Task Stop() {
    method StopGroupTasks (line 75) | public List<Task> StopGroupTasks() {
    method StartGroupTasks (line 89) | public void StartGroupTasks() {
    method LegacyInstructionsToV2 (line 102) | public static BindingList<Instruction> LegacyInstructionsToV2(BindingL...
    method FromLegacyConfig (line 190) | public static InstructionConfig FromLegacyConfig(V2Legacy.Configuratio...
    method FromLegacyPreset (line 199) | public static InstructionConfig FromLegacyPreset(V2Legacy.Configuratio...

FILE: RainbowTaskbar/Configuration/Instruction/InstructionGroup.cs
  class InstructionGroup (line 16) | public class InstructionGroup : INotifyPropertyChanged {
    method SetupPropertyChanged (line 26) | private void SetupPropertyChanged() {
    method OnPropertyChanged (line 30) | protected virtual void OnPropertyChanged([CallerMemberName] string pro...
    method InstructionGroup (line 34) | public InstructionGroup() {
    method RunOnceTask (line 38) | public bool RunOnceTask(CancellationToken token) {
    method LoopTask (line 76) | public void LoopTask(CancellationToken token) {
    method StartOnceTask (line 83) | public void StartOnceTask(CancellationToken token) {
    method StartLoopTask (line 86) | public void StartLoopTask(CancellationToken token) {

FILE: RainbowTaskbar/Configuration/Instruction/InstructionPreset.cs
  class InstructionPreset (line 7) | public class InstructionPreset {

FILE: RainbowTaskbar/Configuration/Instruction/Instructions/BorderRadiusInstruction.cs
  class BorderRadiusInstruction (line 9) | internal class BorderRadiusInstruction : Instruction {
    method Execute (line 19) | public override bool Execute(Taskbar window, CancellationToken _) {

FILE: RainbowTaskbar/Configuration/Instruction/Instructions/ClearLayerInstruction.cs
  class ClearLayerInstruction (line 14) | internal class ClearLayerInstruction : Instruction {
    method Execute (line 23) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/Configuration/Instruction/Instructions/ColorInstruction.cs
  class ColorInstruction (line 15) | internal class ColorInstruction : Instruction {
    type ColorInstructionEffect (line 30) | public enum ColorInstructionEffect {
    type ColorInstructionTransition (line 37) | public enum ColorInstructionTransition {
    method Execute (line 84) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/Configuration/Instruction/Instructions/DelayInstruction.cs
  class DelayInstruction (line 9) | internal class DelayInstruction : Instruction {
    method Execute (line 17) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/Configuration/Instruction/Instructions/ImageInstruction.cs
  class ImageInstruction (line 16) | internal class ImageInstruction : Instruction {
    method Execute (line 58) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/Configuration/Instruction/Instructions/ShapeInstruction.cs
  class ShapeInstruction (line 20) | public class ShapeInstruction : Instruction {
    method Execute (line 90) | public override bool Execute(Taskbar window, CancellationToken token) {
    type ShapeInstructionShapes (line 132) | public enum ShapeInstructionShapes {

FILE: RainbowTaskbar/Configuration/Instruction/Instructions/TextInstruction.cs
  class TextInstruction (line 13) | internal class TextInstruction : Instruction {
    method Execute (line 57) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/Configuration/Instruction/Instructions/TransparencyInstruction.cs
  class TransparencyInstruction (line 12) | public class TransparencyInstruction : Instruction {
    type TransparencyInstructionStyle (line 13) | public enum TransparencyInstructionStyle {
    type TransparencyInstructionType (line 19) | public enum TransparencyInstructionType {
    method Execute (line 68) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/Configuration/Web/WebConfig.cs
  type WebConfigUserSettingDataType (line 24) | public enum WebConfigUserSettingDataType {
  class WebConfigUserSetting (line 30) | [Serializable]
  class WebConfigData (line 97) | [Serializable]
  class WebConfig (line 103) | [Serializable]
    method WebConfig (line 112) | public WebConfig() {
    method _Start (line 143) | private void _Start(WebView2 webView, Mutex webViewReady, Taskbar t) {
    method Start (line 300) | public override async Task<bool> Start() {
    method Stop (line 323) | public override Task Stop() {

FILE: RainbowTaskbar/Drawing/CanvasManager.cs
  class CanvasManager (line 13) | public class CanvasManager {
    method CanvasManager (line 27) | public CanvasManager(Taskbar window, Canvas[] canvases) {
    method SetImage (line 38) | public void SetImage(int index, RenderTargetBitmap target) {

FILE: RainbowTaskbar/Drawing/LayerManager.cs
  class LayerManager (line 15) | public class LayerManager
    method LayerManager (line 23) | public LayerManager() {
    method LayerManager (line 27) | public LayerManager(Taskbar window) {
    method MakeIfNeeded (line 34) | public void MakeIfNeeded(int layer) {
    method DrawRect (line 51) | public void DrawRect(int layer, System.Windows.Media.Brush fill, Rect?...
    method DrawImage (line 61) | public void DrawImage(int layer, Rect rect, ImageSource imageSource) {
    method DrawShape (line 71) | public void DrawShape(int layer, Geometry shape, System.Windows.Media....
    method DrawText (line 80) | public void DrawText(int layer, string content, int x = 0, int y = 0, ...

FILE: RainbowTaskbar/Editor/DebugWindow.xaml.cs
  class DebugWindow (line 27) | public partial class DebugWindow : FluentWindow, INotifyPropertyChanged
    method DebugWindow (line 31) | public DebugWindow()
    method FluentWindow_Closing (line 54) | private void FluentWindow_Closing(object sender, CancelEventArgs e) {

FILE: RainbowTaskbar/Editor/EditorViewModel.cs
  class EditorViewModel (line 11) | public class EditorViewModel {

FILE: RainbowTaskbar/Editor/EditorWindow.xaml.cs
  class EditorWindow (line 34) | public partial class EditorWindow : FluentWindow {
    method EditorWindow (line 37) | public EditorWindow() {
    method OpenConfig (line 65) | public void OpenConfig(Config config) {
    method nav_Navigating (line 76) | private void nav_Navigating(NavigationView sender, NavigatingCancelEve...
    method FluentWindow_Closing (line 200) | private void FluentWindow_Closing(object sender, System.ComponentModel...
    method FluentWindow_KeyDown (line 209) | private void FluentWindow_KeyDown(object sender, KeyEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/About.xaml.cs
  class About (line 23) | public partial class About : Page {
    method About (line 24) | public About() {
    method Image_MouseLeftButtonDown (line 33) | private void Image_MouseLeftButtonDown(object sender, MouseButtonEvent...
    method Hyperlink_Click (line 37) | private void Hyperlink_Click(object sender, RoutedEventArgs e) {
    method Hyperlink_Click_1 (line 41) | private void Hyperlink_Click_1(object sender, RoutedEventArgs e) {
    method Hyperlink_Click_2 (line 45) | private void Hyperlink_Click_2(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Browse.xaml.cs
  type SortBy (line 27) | public enum SortBy {
  class Browse (line 34) | public partial class Browse : Page, INotifyPropertyChanged
    method Browse (line 41) | public Browse()
    method Clear (line 53) | public void Clear() {
    method OnSortChanged (line 60) | public void OnSortChanged() {
    method Search (line 81) | public Task Search() {
    method TextBox_TextChanged (line 103) | private void TextBox_TextChanged(object sender, TextChangedEventArgs e) {
    method ScrollViewer_ScrollChanged (line 117) | private void ScrollViewer_ScrollChanged(object sender, ScrollChangedEv...

FILE: RainbowTaskbar/Editor/Pages/Configs.xaml.cs
  class Configs (line 28) | public partial class Configs : Page
    method Configs (line 31) | public Configs()
    method AddNewConfig (line 41) | private void AddNewConfig(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Controls/ConfigListItemControl.xaml.cs
  class ConfigListItemControl (line 29) | public partial class ConfigListItemControl : UserControl, INotifyPropert...
    method OnConfigChanged (line 48) | public void OnConfigChanged() {
    method ConfigListItemControl (line 51) | public ConfigListItemControl()
    method Delete (line 61) | private void Delete(object sender, RoutedEventArgs e) {
    method Edit (line 68) | private void Edit(object sender, RoutedEventArgs e) {
    method Select (line 79) | private void Select(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionContextMenu.xaml.cs
  class InstructionContextMenu (line 24) | public partial class InstructionContextMenu : ContextMenu
    method InstructionContextMenu (line 40) | public InstructionContextMenu()
    method Duplicate_Click (line 46) | private void Duplicate_Click(object sender, RoutedEventArgs e) {
    method Delete_Click (line 51) | private void Delete_Click(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/BorderRadiusInstructionControl.xaml.cs
  class BorderRadiusInstructionControl (line 21) | public partial class BorderRadiusInstructionControl : UserControl {
    method BorderRadiusInstructionControl (line 22) | public BorderRadiusInstructionControl() {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ClearLayerInstructionControl.xaml.cs
  class ClearLayerInstructionControl (line 21) | public partial class ClearLayerInstructionControl : UserControl {
    method ClearLayerInstructionControl (line 22) | public ClearLayerInstructionControl() {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ColorInstructionControl.xaml.cs
  class ColorInstructionControl (line 23) | public partial class ColorInstructionControl : UserControl {
    method ColorInstructionControl (line 24) | public ColorInstructionControl() {
    method ColorPicker1_SelectedColorChanged (line 36) | private void ColorPicker1_SelectedColorChanged(object sender, RoutedPr...
    method Randomize_Checked (line 49) | private void Randomize_Checked(object sender, RoutedEventArgs e) {
    method UpdateColors (line 68) | public void UpdateColors() {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/ColorConverter.cs
  class ColorConverter (line 12) | public class ColorConverter : IValueConverter {
    method Convert (line 13) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 16) | public object ConvertBack(object value, Type targetType, object parame...

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/DivideHalf.cs
  class DivideHalf (line 10) | public class DivideHalf : IValueConverter {
    method Convert (line 11) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 16) | public object ConvertBack(object value, Type targetType, object parame...

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/FileExists.cs
  class FileExists (line 11) | public class FileExists : ValidationRule {
    method Validate (line 12) | public override ValidationResult Validate(object value, CultureInfo cu...

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/FloatToPercentage.cs
  class FloatToPercentage (line 10) | public class FloatToPercentage : IValueConverter {
    method Convert (line 11) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 16) | public object ConvertBack(object value, Type targetType, object parame...

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/DelayInstructionControl.xaml.cs
  class DelayInstructionControl (line 21) | public partial class DelayInstructionControl : UserControl {
    method DelayInstructionControl (line 22) | public DelayInstructionControl() {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ImageInstructionControl.xaml.cs
  class ImageInstructionControl (line 25) | public partial class ImageInstructionControl : UserControl {
    method ImageInstructionControl (line 26) | public ImageInstructionControl() {
    method Button_Click (line 32) | private void Button_Click(object sender, RoutedEventArgs e) {
    method GetImageFilter (line 43) | public string GetImageFilter() {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ShapeInstructionControl.xaml.cs
  class ShapeInstructionControl (line 21) | public partial class ShapeInstructionControl : UserControl {
    method ShapeInstructionControl (line 22) | public ShapeInstructionControl() {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TextInstructionControl.xaml.cs
  class TextInstructionControl (line 21) | public partial class TextInstructionControl : UserControl {
    method TextInstructionControl (line 22) | public TextInstructionControl() {

FILE: RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TransparencyInstructionControl.xaml.cs
  class TransparencyInstructionControl (line 22) | public partial class TransparencyInstructionControl : UserControl
    method TransparencyInstructionControl (line 24) | public TransparencyInstructionControl()

FILE: RainbowTaskbar/Editor/Pages/Controls/IssueControl.xaml.cs
  class IssueControl (line 21) | public partial class IssueControl : UserControl
    method IssueControl (line 26) | public IssueControl()

FILE: RainbowTaskbar/Editor/Pages/Controls/LoginControl.xaml.cs
  class LoginControl (line 20) | public partial class LoginControl : UserControl {
    method LoginControl (line 21) | public LoginControl() {

FILE: RainbowTaskbar/Editor/Pages/Controls/ResultListItemControl.xaml.cs
  class ResultListItemControl (line 32) | public partial class ResultListItemControl : UserControl, INotifyPropert...
    method OnConfigChanged (line 70) | public async void OnConfigChanged() {
    method ResultListItemControl (line 79) | public ResultListItemControl()
    method Select (line 89) | private void Select(object sender, RoutedEventArgs e) {
    method Download (line 95) | private void Download(object sender, RoutedEventArgs e) {
    method Delete (line 107) | private void Delete(object sender, RoutedEventArgs e) {
    method Verify (line 126) | private void Verify(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Controls/UnsafeImage.cs
  class UnsafeImage (line 9) | public class UnsafeImage : System.Windows.Controls.Image, IDisposable {
    method Dispose (line 10) | public void Dispose() {

FILE: RainbowTaskbar/Editor/Pages/Controls/WebControls/AddPropertyDialogControl.xaml.cs
  class AddPropertyDialogControl (line 21) | public partial class AddPropertyDialogControl : UserControl {
    method AddPropertyDialogControl (line 23) | public AddPropertyDialogControl() {

FILE: RainbowTaskbar/Editor/Pages/Edit/EditInfo.xaml.cs
  class EditInfo (line 37) | public partial class EditInfo : Page {
    method EditInfo (line 42) | public EditInfo(Config config) {
    method Save (line 62) | public void Save(object sender, RoutedEventArgs e) {
    method Edit (line 84) | private void Edit(object sender, RoutedEventArgs e) {
    method Preset (line 94) | private void Preset(object sender, RoutedEventArgs e) {
    method Publish (line 115) | private void Publish(object sender, RoutedEventArgs e) {
    method richDescription_MouseWheel (line 158) | private void richDescription_MouseWheel(object sender, MouseWheelEvent...
    method picture_Click (line 171) | private void picture_Click(object sender, RoutedEventArgs e) {
    method Delete (line 186) | private void Delete(object sender, RoutedEventArgs e) {
    method AddProperty (line 193) | private void AddProperty(object sender, RoutedEventArgs e) {
    method richDescription_Pasting (line 211) | private void richDescription_Pasting(object sender, DataObjectPastingE...

FILE: RainbowTaskbar/Editor/Pages/Edit/EditPage.cs
  class EditPage (line 12) | public class EditPage : Page {

FILE: RainbowTaskbar/Editor/Pages/Edit/InstructionEditPage.xaml.cs
  class InstructionEditPage (line 30) | public partial class InstructionEditPage : EditPage, INotifyPropertyChan...
    method OnSelectedInstructionChanged (line 59) | public void OnSelectedInstructionChanged() {
    method InstructionEditPage (line 62) | public InstructionEditPage(InstructionConfig config) {
    method ListBox_SelectionChanged (line 72) | private void ListBox_SelectionChanged(object sender, SelectionChangedE...
    method AddGroup (line 80) | private void AddGroup(object sender, RoutedEventArgs e) {
    method AddInstruction (line 84) | private void AddInstruction(object sender, RoutedEventArgs e) {
    method DeleteGroup (line 98) | private void DeleteGroup(object sender, RoutedEventArgs e) {
    method RunConfig (line 103) | private void RunConfig(object sender, RoutedEventArgs e) {
    method SaveConfig (line 109) | private void SaveConfig(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Edit/ViewComments.xaml.cs
  class ViewComments (line 36) | public partial class ViewComments : Page, INotifyPropertyChanged {
    method ViewComments (line 43) | public ViewComments(Config config) {
    method Button_Click (line 61) | private void Button_Click(object sender, RoutedEventArgs e) {
    method Button_Click_1 (line 71) | private void Button_Click_1(object sender, RoutedEventArgs e) {
    method Button_Click_2 (line 88) | private void Button_Click_2(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Edit/ViewInfo.xaml.cs
  class ViewInfo (line 34) | public partial class ViewInfo : Page, INotifyPropertyChanged {
    method ViewInfo (line 42) | public ViewInfo(Config config) {
    method Download (line 61) | private void Download(object sender, RoutedEventArgs e) {
    method Like (line 71) | private void Like(object sender, RoutedEventArgs e) {
    method Comment (line 86) | private void Comment(object sender, RoutedEventArgs e) {
    method OpenWeb (line 98) | private void OpenWeb(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Edit/WebEditPage.xaml.cs
  class WebEditPage (line 33) | public partial class WebEditPage : EditPage {
    method OnOpenDevToolsChanged (line 38) | public void OnOpenDevToolsChanged() {
    method WebEditPage (line 48) | public WebEditPage() {
    method GetContent (line 116) | public async Task<string> GetContent() {
    method Save (line 120) | public void Save() {
    method RunConfig (line 127) | private void RunConfig(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Edit/WebView2Fixed.cs
  class WebView2Fixed (line 10) | public class WebView2Fixed : WebView2 {
    method OnPreviewKeyDown (line 11) | protected override void OnPreviewKeyDown(KeyEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/EmptyPageBadFix.xaml.cs
  class EmptyPageBadFix (line 21) | public partial class EmptyPageBadFix : Page {
    method EmptyPageBadFix (line 22) | public EmptyPageBadFix() {

FILE: RainbowTaskbar/Editor/Pages/EmptyPageBadFix2.xaml.cs
  class EmptyPageBadFix2 (line 21) | public partial class EmptyPageBadFix2 : Page {
    method EmptyPageBadFix2 (line 22) | public EmptyPageBadFix2() {

FILE: RainbowTaskbar/Editor/Pages/Home.xaml.cs
  class Home (line 32) | public partial class Home : Page {
    method Home (line 33) | public Home() {
    method Button_Click (line 90) | private void Button_Click(object sender, RoutedEventArgs e) {
    method Button_Click_1 (line 94) | private void Button_Click_1(object sender, RoutedEventArgs e) {
    method Button_Click_2 (line 137) | private void Button_Click_2(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/Editor/Pages/Settings.xaml.cs
  class Settings (line 29) | public partial class Settings : Page {
    method Settings (line 36) | public Settings() {
    method genericLogin (line 43) | private void genericLogin(string oauthUrl) {
    method github_Click (line 74) | private void github_Click(object sender, RoutedEventArgs e) {
    method google_Click (line 79) | private void google_Click(object sender, RoutedEventArgs e) {
    method login_Click (line 83) | private void login_Click(object sender, RoutedEventArgs e) {
    method login2_Click (line 87) | private void login2_Click(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/ExplorerTAP/ExplorerTAP.cs
  type GUID (line 27) | [StructLayout(LayoutKind.Sequential)]
  class ExplorerTAP (line 35) | class ExplorerTAP
    method LoadLibrary (line 38) | [DllImport("kernel32.dll")]
    method FreeLibrary (line 40) | [DllImport("kernel32.dll")]
    method GetProcAddress (line 42) | [DllImport("kernel32.dll")]
    method GetWindowThreadProcessId (line 45) | [DllImport("user32.dll", SetLastError = true)]
    method InitializeXamlDiagnosticsEx (line 48) | [DllImport("Windows.UI.Xaml.dll", CharSet = CharSet.Unicode)]
    method PostMessage (line 51) | [DllImport("user32.dll", SetLastError = true)]
    method NeedsTAP (line 80) | public static bool NeedsTAP() {
    method StartExplorer (line 92) | private static void StartExplorer() {
    method TryInject (line 107) | public static bool TryInject() {
    method Reset (line 237) | public static void Reset() {
    method SetAppearanceType (line 247) | public static void SetAppearanceType(TransparencyInstruction.Transpare...
    method SetTaskbarElementsOpacity (line 268) | public static void SetTaskbarElementsOpacity(double opacity) {
    method GetDataPtr (line 275) | public static int GetDataPtr() {
    type TaskbarInfo (line 282) | [StructLayout(LayoutKind.Sequential, Pack = 8)]
    type TaskbarInfo2 (line 290) | [StructLayout(LayoutKind.Sequential, Pack = 8)]
    type RainbowTaskbarData (line 297) | [StructLayout(LayoutKind.Sequential, Pack = 8)]
    method ReadProcessMemory (line 306) | [DllImport("kernel32.dll", SetLastError = true)]
    method OpenProcess (line 313) | [DllImport("kernel32.dll", SetLastError = true)]
    type ProcessAccessFlags (line 319) | [Flags]
    method CloseHandle (line 335) | [DllImport("kernel32.dll", SetLastError = true)]
    method GetYPosition (line 342) | public static int GetYPosition(Taskbar t) {
    method GetUIDataStr (line 353) | public static string GetUIDataStr(Taskbar t) {
    class UIData (line 371) | [Serializable]
    method GetUIData (line 386) | public static UIData GetUIData(Taskbar t) {

FILE: RainbowTaskbar/HTTPAPI/WorkshopAPI.cs
  class AuthenticatedRequest (line 24) | public class AuthenticatedRequest {
  class ResultResponse (line 28) | public class ResultResponse {
  class PublishConfigRequest (line 32) | public class PublishConfigRequest : AuthenticatedRequest {
  class ConfigData (line 46) | public class ConfigData {
  class PublishConfigResponse (line 70) | public class PublishConfigResponse : ResultResponse {
  class CommentData (line 76) | public class CommentData {
  class ConfigCommentsResponse (line 90) | public class ConfigCommentsResponse : ResultResponse {
  class ConfigCommentRequest (line 94) | public class ConfigCommentRequest : AuthenticatedRequest {
  class ConfigCommentResponse (line 98) | public class ConfigCommentResponse : ResultResponse {
  class SearchConfigRequest (line 103) | public class SearchConfigRequest {
  class LikedConfigsResponse (line 113) | public class LikedConfigsResponse {
  class SearchConfigResponse (line 118) | public class SearchConfigResponse : ResultResponse {
    method Parse (line 122) | public IEnumerable<Config?> Parse() {
  class ThumbnailConfigRequest (line 144) | public class ThumbnailConfigRequest : AuthenticatedRequest {
  class IssueRequest (line 150) | public class IssueRequest {
  class ExceptionRequest (line 159) | public class ExceptionRequest {
  class WorkshopAPI (line 164) | public class WorkshopAPI {
    method PublishConfigAsync (line 166) | public async Task<PublishConfigResponse?> PublishConfigAsync(Config cf...
    method SearchConfigsAsync (line 186) | public async Task<SearchConfigResponse?> SearchConfigsAsync(string sea...
    method DeleteConfigAsync (line 203) | public async Task<ResultResponse?> DeleteConfigAsync(Config config) {
    method DownloadThumbnailBase64 (line 219) | public async Task<string?> DownloadThumbnailBase64(Config config, bool...
    method VerifyThumbnail (line 235) | public async Task<ResultResponse> VerifyThumbnail(Config config) {
    method GetLikedConfigs (line 251) | public async Task<LikedConfigsResponse> GetLikedConfigs() {
    method GetConfigComments (line 267) | public async Task<ConfigCommentsResponse> GetConfigComments(Config con...
    method AddConfigComment (line 282) | public async Task<ConfigCommentResponse> AddConfigComment(Config confi...
    method DeleteConfigComment (line 299) | public async Task<ResultResponse> DeleteConfigComment(Config config, s...
    method LikeConfig (line 315) | public async Task<ResultResponse> LikeConfig(Config cfg, bool like = t...
    method SubmitIssue (line 331) | public async Task<ResultResponse> SubmitIssue(string title, string des...
    method ReportException (line 348) | public async Task<ResultResponse> ReportException(Exception e) {
    method SetConfigThumbnail (line 365) | public async Task<ResultResponse?> SetConfigThumbnail(Config config, I...

FILE: RainbowTaskbar/Helpers/AutoUpdate.cs
  class AutoUpdate (line 20) | internal static class AutoUpdate {
    method CheckForUpdate (line 21) | public static void CheckForUpdate() =>
    method GetLatestBody (line 79) | public static async Task<string> GetLatestBody() {
    class Asset (line 92) | [DataContract]
    class GitHubAPIResponse (line 102) | [DataContract]

FILE: RainbowTaskbar/Helpers/Cache.cs
  class Cache (line 8) | public class Cache<T> {
    method Cache (line 13) | public Cache(T value, TimeSpan interval) { Value = value; UpdateInterv...

FILE: RainbowTaskbar/Helpers/DPIUtil.cs
  class DPIUtil (line 13) | public static class DPIUtil {
    method ScaleFactor (line 60) | public static double ScaleFactor(Taskbar window) {
    method FindWindow (line 65) | [DllImport("user32.dll", SetLastError = true)]
    type POINT (line 68) | [StructLayout(LayoutKind.Sequential)]
      method POINT (line 73) | public POINT(int x, int y) {
      method ToString (line 90) | public override string ToString() {
    method MonitorFromPoint (line 95) | [DllImport("user32.dll", SetLastError = true)]
    type MonitorOptions (line 98) | enum MonitorOptions : uint {
    method GetDpi (line 103) | public static uint GetDpi(Taskbar window) {
    method MonitorFromWindow (line 123) | [DllImport("user32.dll")]
    method GetDpiForMonitor (line 136) | [DllImport("Shcore.dll")]
    method GetDpiForWindow (line 139) | [DllImport("User32.dll")]
    method RtlGetVersion (line 152) | [SecurityCritical]
    type OSVERSIONINFOEXW (line 162) | [StructLayout(LayoutKind.Sequential)]
    type DpiType (line 227) | private enum DpiType {

FILE: RainbowTaskbar/Helpers/HiddenWebViewHost.xaml.cs
  class HiddenWebViewHost (line 19) | public partial class HiddenWebViewHost : Window {
    method HiddenWebViewHost (line 20) | public HiddenWebViewHost() {

FILE: RainbowTaskbar/Helpers/JsonColorConverter.cs
  class JsonColorConverter (line 11) | public class JsonColorConverter : JsonConverter<Color> {
    method Read (line 12) | public override Color Read(ref Utf8JsonReader reader, Type typeToConve...
    method Write (line 14) | public override void Write(Utf8JsonWriter writer, Color value, JsonSer...

FILE: RainbowTaskbar/Helpers/Taskbar.cs
  class TaskbarHelper (line 13) | public class TaskbarHelper {
    type DWMWINDOWATTRIBUTE (line 16) | public enum DWMWINDOWATTRIBUTE : uint {
    method DwmSetWindowAttribute (line 45) | [DllImport("dwmapi.dll", PreserveSig = true)]
    type CombineRgnStyles (line 50) | public enum CombineRgnStyles {
    type TaskbarStyle (line 60) | public enum TaskbarStyle {
    method TaskbarHelper (line 103) | public TaskbarHelper(IntPtr hWnd, bool secondary = false) {
    method SetLayeredWindowAttributes (line 113) | [DllImport("user32.dll")]
    method SetWindowLong (line 116) | [DllImport("user32.dll")]
    method GetWindowLong (line 119) | [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
    method FindWindow (line 122) | [DllImport("user32.dll", SetLastError = true)]
    method FindWindowEx (line 125) | [DllImport("user32.dll", SetLastError = true)]
    method GetWindowRect (line 129) | [DllImport("user32.dll")]
    method SetWindowPos (line 132) | [DllImport("user32.dll", SetLastError = true)]
    method EnumThreadWindows (line 136) | [DllImport("user32.dll")]
    method SetWinEventHook (line 141) | [DllImport("user32.dll")]
    method UnhookWinEvent (line 146) | [DllImport("user32.dll")]
    method SetWindowCompositionAttribute (line 149) | [DllImport("user32.dll")]
    method GetWindowCompositionAttribute (line 152) | [DllImport("user32.dll")]
    method WinEventProc (line 156) | private void WinEventProc(IntPtr hWinEventHook, uint eventType,
    method PositionChangedHook (line 167) | public void PositionChangedHook() {
    method PositionChangedUnhook (line 175) | public void PositionChangedUnhook() => UnhookWinEvent(hhook);
    method SetAlpha (line 177) | public void SetAlpha(double alpha) {
    method PostMessage (line 194) | [DllImport("user32")]
    method SendMessage (line 197) | [DllImport("user32.dll", CharSet = CharSet.Auto)]
    method IsWindow (line 201) | [DllImport("user32.dll")]
    method SetBlur (line 205) | public void SetBlur() {
    method GetPoint (line 252) | public System.Drawing.Point GetPoint() {
    method GetRealRectangle (line 260) | public Rectangle GetRealRectangle() {
    method GetRectangle (line 266) | public Rectangle GetRectangle(bool scaling = true) {
    type QUERY_USER_NOTIFICATION_STATE (line 281) | enum QUERY_USER_NOTIFICATION_STATE {
    method SHQueryUserNotificationState (line 290) | [DllImport("shell32.dll")]
    method PlaceWindowUnder (line 295) | public void PlaceWindowUnder(Taskbar window) {
    method SHAppBarMessage (line 313) | [DllImport("shell32.dll")]
    method IsAutoHide (line 317) | private static bool IsAutoHide() {
    method SetWindowRgn (line 323) | [DllImport("user32.dll")]
    method CreateRoundRectRgn (line 326) | [DllImport("gdi32.dll")]
    method CreateRectRgn (line 329) | [DllImport("gdi32.dll")]
    method CombineRgn (line 332) | [DllImport("gdi32.dll")]
    method GetDC (line 336) | [DllImport("user32.dll", SetLastError = true)]
    method ReleaseDC (line 339) | [DllImport("user32.dll", SetLastError = true)]
    method GetDeviceCaps (line 342) | [DllImport("gdi32.dll")]
    method DeleteObject (line 345) | [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
    method GetWindowRgn (line 349) | [DllImport("user32.dll")]
    method GetSystemDpi (line 352) | public static int GetSystemDpi() {
    method GetScalingFactor (line 364) | public float GetScalingFactor() {
    method OffsetRgn (line 376) | [DllImport("gdi32.dll")]
    method UpdateRadius (line 379) | public bool UpdateRadius() {
    type RECT (line 459) | [StructLayout(LayoutKind.Sequential)]
    class SWP (line 467) | public static class SWP {
    type WindowCompositionAttributeData (line 489) | [StructLayout(LayoutKind.Sequential)]
    type WindowCompositionAttribute (line 496) | internal enum WindowCompositionAttribute {
    type AccentState (line 502) | internal enum AccentState {
    type AccentPolicy (line 510) | [StructLayout(LayoutKind.Sequential)]
    type APPBARDATA (line 518) | [StructLayout(LayoutKind.Sequential)]

FILE: RainbowTaskbar/Helpers/Window.cs
  class WindowHelper (line 14) | public class WindowHelper {
    type CombineRgnStyles (line 15) | public enum CombineRgnStyles {
    method WindowHelper (line 38) | public WindowHelper(Taskbar window, TaskbarHelper taskbarHelper) {
    method SetWindowLong (line 45) | [DllImport("user32.dll")]
    method GetWindowLong (line 48) | [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
    method MonitorFromWindow (line 51) | [DllImport("user32.dll")]
    type MonitorInfoEx (line 58) | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
      method Init (line 67) | public void Init() {
    method GetMonitorInfo (line 73) | [DllImport("user32.dll")]
    method DeleteObject (line 75) | [DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
    method WindowFromPoint (line 79) | [DllImport("user32.dll")]
    method TaskbarPosChanged (line 91) | private void TaskbarPosChanged(object sender, EventArgs args) {
    method GetHWND (line 151) | public static IntPtr GetHWND(Window window) => new WindowInteropHelper...
    method SetParent (line 153) | [DllImport("user32.dll", SetLastError = true)]
    method Init (line 156) | public void Init(TaskbarHelper taskbarHelper) {
    method InitOther (line 175) | public static void InitOther(Window wnd) {
    method SHAppBarMessage (line 183) | [DllImport("shell32.dll")]
    method IsAutoHide (line 187) | private static bool IsAutoHide() {
    method SetWindowRgn (line 193) | [DllImport("user32.dll")]
    method CreateRoundRectRgn (line 196) | [DllImport("gdi32.dll")]
    method CreateRectRgn (line 199) | [DllImport("gdi32.dll")]
    method CombineRgn (line 202) | [DllImport("gdi32.dll")]
    method GetDC (line 206) | [DllImport("user32.dll", SetLastError = true)]
    method ReleaseDC (line 209) | [DllImport("user32.dll", SetLastError = true)]
    method DwmRegisterThumbnail (line 214) | [DllImport("dwmapi.dll", SetLastError = true)]
    type RECT (line 216) | [StructLayout(LayoutKind.Sequential)]
    type DWM_THUMBNAIL_PROPERTIES (line 220) | [StructLayout(LayoutKind.Sequential)]
    type DWM_TNP (line 229) | public enum DWM_TNP : uint {
    method DwmUpdateThumbnailProperties (line 236) | [DllImport("dwmapi.dll", PreserveSig = true)]
    method DwmUnregisterThumbnail (line 238) | [DllImport("dwmapi.dll")]
    method Duplicate (line 242) | public void Duplicate(nint handle) {
    method UpdateDuplicate (line 248) | public void UpdateDuplicate() {
    method RemoveDuplicate (line 264) | public void RemoveDuplicate() {
    type GWL (line 269) | public enum GWL {
    type WS (line 283) | [Flags]
    type WS_EX (line 318) | public enum WS_EX : uint {
    class SWP (line 370) | public static class SWP {
    type APPBARDATA (line 390) | [StructLayout(LayoutKind.Sequential)]

FILE: RainbowTaskbar/Interpolation/ColorInterpolation.cs
  class ColorInterpolation (line 10) | internal class ColorInterpolation {
    type INTERPOLATE_FUNCTION (line 11) | public enum INTERPOLATE_FUNCTION {
    method Cubic (line 19) | private static double Cubic(double x) => x < 0.5 ? 4 * x * x * x : 1 -...
    method Back (line 21) | private static double Back(double x) {
    method Sine (line 30) | private static double Sine(double x) => -(Math.Cos(3.14159 /*PI*/ * x)...
    method Exponential (line 32) | private static double Exponential(double x) =>
    method clamp (line 41) | private static double clamp(double d, double min, double max) {
    method interp (line 47) | private static Color interp(Color color1, Color color2, double fractio...
    method Interpolate (line 55) | public static Color Interpolate(Color color1, Color color2, INTERPOLAT...
  class ColorExtension (line 79) | internal static class ColorExtension {
    method ToDrawingColor (line 80) | public static Color ToDrawingColor(this System.Windows.Media.Color col...
    method ToMediaColor (line 83) | public static System.Windows.Media.Color ToMediaColor(this Color color...
    method HexConverter (line 86) | public static string HexConverter(Color c) => "#" + c.R.ToString("X2")...
  class ColorConverter (line 89) | public class ColorConverter : IValueConverter {
    method Convert (line 90) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 93) | public object ConvertBack(object value, Type targetType, object parame...

FILE: RainbowTaskbar/Languages/Localization.cs
  class Localization (line 14) | public class Localization
    method Localization (line 19) | public Localization() {
    method Switch (line 26) | public void Switch(string lang) {
    method Get (line 52) | public string Get(string key) {
    method InstructionFormat (line 67) | public string InstructionFormat(Instruction instruction, params object...
    method Name (line 70) | public string Name(string str) {
    method InstructionFormatSuffix (line 73) | public string InstructionFormatSuffix(Instruction instruction, string ...
    method Enum (line 77) | public string Enum(Enum en) {
    method Enable (line 82) | public void Enable(Collection<ResourceDictionary> mergedDicts) {
  class EnumLocalization (line 92) | public static class EnumLocalization {
    method ToStringLocalized (line 93) | public static string ToStringLocalized(this Enum shape) {

FILE: RainbowTaskbar/Languages/Translators.cs
  class EnumTranslator (line 12) | public class EnumTranslator : IValueConverter {
    method Convert (line 13) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 16) | public object ConvertBack(object value, Type targetType, object parame...
  class InstructionTranslator (line 20) | public class InstructionTranslator : IValueConverter {
    method Convert (line 21) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 24) | public object ConvertBack(object value, Type targetType, object parame...
  class LanguageConverter (line 28) | public class LanguageConverter : IValueConverter {
    method Convert (line 29) | public object Convert(object value, Type targetType, object parameter,...
    method ConvertBack (line 34) | public object ConvertBack(object value, Type targetType, object parame...

FILE: RainbowTaskbar/Languages/en_US.xaml.cs
  class en_US (line 20) | public partial class en_US : ResourceDictionary
    method en_US (line 22) | public en_US()

FILE: RainbowTaskbar/Languages/fr_FR.xaml.cs
  class fr_FR (line 8) | public partial class fr_FR : ResourceDictionary
    method fr_FR (line 10) | public fr_FR() {

FILE: RainbowTaskbar/Languages/ro_RO.xaml.cs
  class ro_RO (line 20) | public partial class ro_RO : ResourceDictionary
    method ro_RO (line 22) | public ro_RO()

FILE: RainbowTaskbar/Languages/zh_CN.cs
  class zh_CN (line 19) | public partial class zh_CN : ResourceDictionary {
    method zh_CN (line 20) | public zh_CN() {

FILE: RainbowTaskbar/Preferences/Settings.cs
  class Settings (line 32) | public class Settings : INotifyPropertyChanged {
    method OnWebTouchThroughChanged (line 71) | public void OnWebTouchThroughChanged() {
    method OnGlobalOpacityChanged (line 85) | public void OnGlobalOpacityChanged() {
    method OnWebScriptEnabledChanged (line 94) | public void OnWebScriptEnabledChanged() {
    method OnLoginKeyChanged (line 106) | public async void OnLoginKeyChanged() {
    method OnTaskbarBehaviourChanged (line 204) | public void OnTaskbarBehaviourChanged() {
    method OnLanguageChanged (line 209) | public void OnLanguageChanged() {
    method OnTrayIconVisibilityChanged (line 223) | public void OnTrayIconVisibilityChanged() {
    method OnConfigChanged (line 233) | public void OnConfigChanged() {
    method OnPropertyChanged (line 238) | protected virtual void OnPropertyChanged([CallerMemberName] string pro...
    method FromFile (line 241) | public static Settings FromFile(string file = null) {
    method ToFile (line 249) | public void ToFile(string file = null) {
    method SaveChanged (line 255) | public void SaveChanged() {

FILE: RainbowTaskbar/Properties/Resources.Designer.cs
  class Resources (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
    method Resources (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...

FILE: RainbowTaskbar/Properties/Settings.Designer.cs
  class Settings (line 14) | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]

FILE: RainbowTaskbar/Taskbar.xaml.cs
  class Taskbar (line 38) | public partial class Taskbar : System.Windows.Window {
    method Taskbar (line 52) | public Taskbar(IntPtr HWND, bool secondary) {
    method Taskbar (line 70) | public Taskbar(IntPtr HWND) : this(HWND, false) { }
    type WINDOWPOS (line 75) | public struct WINDOWPOS {
    method GetWindow (line 85) | [DllImport("user32.dll", SetLastError = true)]
    method GetClassName (line 87) | [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    method WndProc (line 89) | private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lPa...
    method RegisterWindowMessage (line 116) | [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    method RegisterShellHookWindow (line 119) | [DllImport("user32.dll", SetLastError = true)]
    method OnSourceInitialized (line 125) | protected override void OnSourceInitialized(EventArgs e) {
    method RainbowTaskbar_Closed (line 137) | private void RainbowTaskbar_Closed(object sender, EventArgs e) {
    method SetupLayers (line 144) | public static void SetupLayers() {
    method SetupWebView (line 160) | private static void SetupWebView(WebView2 webView, Mutex mutex = null) {
    class RectangleF (line 211) | [Serializable]
      method RectangleF (line 218) | public RectangleF(System.Drawing.Rectangle rectangle) {
      method RectangleF (line 224) | public RectangleF(System.Drawing.RectangleF rectangle) {
      method RectangleF (line 230) | public RectangleF(RectangleF rectangle) {
    class UIData (line 246) | [Serializable]
      method UIData (line 257) | public UIData(string rawUIData, Taskbar t) {
    class CS2WVMessage (line 275) | public class CS2WVMessage<T> {
      method CS2WVMessage (line 280) | public CS2WVMessage(string message, T data) {
    method UIDataForAllTaskbars (line 286) | public List<UIData> UIDataForAllTaskbars() {
    method SetupWebViewMessageReceiver (line 294) | public void SetupWebViewMessageReceiver() {
    method SetupWebViews (line 347) | public static void SetupWebViews() {
    method SoftReset (line 385) | public static void SoftReset(bool startConfig = true, Config cfg = nul...
    method Window_Closing (line 408) | private void Window_Closing(object sender, System.ComponentModel.Cance...

FILE: RainbowTaskbar/TaskbarViewModel.cs
  class TaskbarViewModel (line 17) | public class TaskbarViewModel {
    method TaskbarViewModel (line 24) | public TaskbarViewModel(Taskbar window, IntPtr HWND) {
    method OnWindowClosing (line 92) | public void OnWindowClosing(object sender, CancelEventArgs e) {

FILE: RainbowTaskbar/TrayWindow.xaml.cs
  class TrayWindow (line 28) | public partial class TrayWindow : Window {
    method TrayWindow (line 31) | public TrayWindow() {
    method TrayIcon_TrayMouseDoubleClick (line 42) | private void TrayIcon_TrayMouseDoubleClick(object sender, RoutedEventA...
    method Open_Click (line 47) | private void Open_Click(object sender, RoutedEventArgs e) {
    method Exit_Click (line 52) | private void Exit_Click(object sender, RoutedEventArgs e) {
    method Issue_Click (line 57) | private void Issue_Click(object sender, RoutedEventArgs e) {
    method ProjectPage_Click (line 62) | private void ProjectPage_Click(object sender, RoutedEventArgs e) {

FILE: RainbowTaskbar/V2Legacy/Configuration/Config.cs
  class Config (line 26) | [DataContract]
    method Config (line 28) | public Config() {

FILE: RainbowTaskbar/V2Legacy/Configuration/Instruction.cs
  class Instruction (line 15) | [DataContract]
    method GetKnownInstructionTypes (line 24) | public static IEnumerable<Type> GetKnownInstructionTypes() {
    method Execute (line 32) | public bool Execute(Taskbar window) => Execute(window, CancellationTok...
    method Execute (line 34) | public abstract bool Execute(Taskbar window, CancellationToken token);

FILE: RainbowTaskbar/V2Legacy/Configuration/InstructionPreset.cs
  class InstructionPreset (line 6) | [DataContract]

FILE: RainbowTaskbar/V2Legacy/Configuration/Instructions/BorderRadiusInstruction.cs
  class BorderRadiusInstruction (line 7) | [DataContract]
    method Execute (line 17) | public override bool Execute(Taskbar window, CancellationToken _) {

FILE: RainbowTaskbar/V2Legacy/Configuration/Instructions/ClearLayerInstruction.cs
  class ClearLayerInstruction (line 12) | [DataContract]
    method Execute (line 22) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/V2Legacy/Configuration/Instructions/ColorInstruction.cs
  class ColorInstruction (line 15) | [DataContract]
    type ColorInstructionEffect (line 23) | public enum ColorInstructionEffect {
    type ColorInstructionTransition (line 30) | public enum ColorInstructionTransition {
    method Execute (line 58) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/V2Legacy/Configuration/Instructions/DelayInstruction.cs
  class DelayInstruction (line 6) | [DataContract]
    method Execute (line 15) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/V2Legacy/Configuration/Instructions/ImageInstruction.cs
  class ImageInstruction (line 15) | [DataContract]
    method Execute (line 41) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/V2Legacy/Configuration/Instructions/ShapeInstruction.cs
  class ShapeInstruction (line 18) | [DataContract]
    method Execute (line 58) | public override bool Execute(Taskbar window, CancellationToken token) {
    type ShapeInstructionShapes (line 64) | public enum ShapeInstructionShapes {

FILE: RainbowTaskbar/V2Legacy/Configuration/Instructions/TextInstruction.cs
  class TextInstruction (line 12) | [DataContract]
    method Execute (line 41) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbar/V2Legacy/Configuration/Instructions/TransparencyInstruction.cs
  class TransparencyInstruction (line 11) | [DataContract]
    type TransparencyInstructionStyle (line 13) | public enum TransparencyInstructionStyle {
    type TransparencyInstructionType (line 19) | public enum TransparencyInstructionType {
    method Execute (line 42) | public override bool Execute(Taskbar window, CancellationToken token) {

FILE: RainbowTaskbarDLL/AppearanceServiceAPI.cpp
  function HRESULT (line 8) | HRESULT STDMETHODCALLTYPE AppearanceServiceAPI::SetAppearanceType(UINT t...
  function HRESULT (line 78) | HRESULT STDMETHODCALLTYPE AppearanceServiceAPI::Close() try { _F
  function HRESULT (line 92) | HRESULT STDMETHODCALLTYPE AppearanceServiceAPI::Version() {
  function HRESULT (line 135) | HRESULT STDMETHODCALLTYPE AppearanceServiceAPI::GetDataPtr(){
  function HRESULT (line 145) | HRESULT AppearanceServiceAPI::Invoke(DISPID dispIdMember, // 0 or 1
  function HRESULT (line 193) | HRESULT STDMETHODCALLTYPE AppearanceServiceAPI::GetTypeInfoCount(UINT* p...
  function HRESULT (line 198) | HRESULT STDMETHODCALLTYPE AppearanceServiceAPI::GetTypeInfo(UINT iTInfo,...
  function HRESULT (line 203) | HRESULT STDMETHODCALLTYPE AppearanceServiceAPI::GetIDsOfNames(REFIID rii...
  type RainbowTaskbarData (line 218) | struct RainbowTaskbarData
  type RainbowTaskbarData (line 218) | struct RainbowTaskbarData
  type RainbowTaskbarData (line 219) | struct RainbowTaskbarData

FILE: RainbowTaskbarDLL/ArmFix/RpcProxy.h
  type IRpcStubBufferVtbl (line 121) | typedef struct IRpcStubBufferVtbl IRpcStubBufferVtbl;
  type ICallFactoryVtbl (line 122) | typedef struct ICallFactoryVtbl ICallFactoryVtbl;
  type IReleaseMarshalBuffersVtbl (line 123) | typedef struct IReleaseMarshalBuffersVtbl IReleaseMarshalBuffersVtbl;
  type IPSFactoryBufferVtbl (line 124) | typedef struct IPSFactoryBufferVtbl IPSFactoryBufferVtbl;
  type CInterfaceStubVtbl (line 127) | typedef struct tagCInterfaceStubVtbl CInterfaceStubVtbl;
  type CInterfaceProxyVtbl (line 128) | typedef struct tagCInterfaceProxyVtbl CInterfaceProxyVtbl;
  type tagCInterfaceStubVtbl (line 130) | struct tagCInterfaceStubVtbl
  type tagCInterfaceProxyVtbl (line 131) | struct tagCInterfaceProxyVtbl
  type IIDLookupRtn (line 134) | typedef IIDLookupRtn * PIIDLookup;
  type ProxyFileInfo (line 147) | typedef struct tagProxyFileInfo
  type ProxyFileInfo (line 167) | typedef ProxyFileInfo ExtendedProxyFileInfo;
  type CInterfaceProxyHeader (line 174) | typedef struct tagCInterfaceProxyHeader
  type CInterfaceProxyVtbl (line 201) | typedef struct tagCInterfaceProxyVtbl
  type CInterfaceStubHeader (line 224) | typedef struct tagCInterfaceStubHeader
  type CInterfaceStubVtbl (line 237) | typedef struct tagCInterfaceStubVtbl
  type CInterfaceStubVtblTag (line 253) | typedef struct tagCInterfaceStubVtblTag
  type CStdStubBuffer (line 259) | typedef struct tagCStdStubBuffer
  type CStdPSFactoryBuffer (line 271) | typedef struct tagCStdPSFactoryBuffer
  function HRESULT (line 870) | HRESULT STDAPICALLTYPE DLLREGISTERSERVER_ENTRY() \
  function HRESULT (line 876) | HRESULT STDAPICALLTYPE DLLUNREGISTERSERVER_ENTRY() \

FILE: RainbowTaskbarDLL/ErrorDebug.h
  type TaskbarInfo (line 3) | struct TaskbarInfo {
  type TaskbarInfo2 (line 8) | struct TaskbarInfo2 {
  type RainbowTaskbarData (line 14) | struct RainbowTaskbarData {
  type IErrorDebug (line 19) | struct IErrorDebug

FILE: RainbowTaskbarDLL/Factory.h
  function HRESULT (line 8) | HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown* pUnkOuter, REFIID rii...
  function HRESULT (line 18) | HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock) noexcept override

FILE: RainbowTaskbarDLL/TAP.cpp
  function HRESULT (line 12) | HRESULT TAP::SetSite(IUnknown* pUnk) try
  function HRESULT (line 38) | HRESULT TAP::GetSite(REFIID riid, void** ppvSite) noexcept

FILE: RainbowTaskbarDLL/Taskbar.h
  type UITree (line 4) | struct UITree {
  type Taskbar (line 9) | struct Taskbar {

FILE: RainbowTaskbarDLL/VisualTreeWatch.cpp
  function FindRootElement (line 19) | winrt::Windows::UI::Xaml::FrameworkElement FindRootElement(winrt::Window...
  function _E (line 175) | _E                          if (rect) {
  function HRESULT (line 248) | HRESULT VisualTreeWatch::OnElementStateChanged(InstanceHandle, VisualEle...

FILE: RainbowTaskbarDLL/VisualTreeWatch.h
  type RainbowTaskbarData (line 30) | struct RainbowTaskbarData

FILE: RainbowTaskbarDLL/csharpinterop.cpp
  function STDAPI (line 38) | __declspec(dllexport) STDAPI SetAppearanceTypeDLL(UINT type) {
  function STDAPI (line 56) | __declspec(dllexport) STDAPI CloseDLL() {
  function STDAPI (line 64) | __declspec(dllexport) STDAPI VersionDLL() {
  function STDAPI (line 71) | __declspec(dllexport) STDAPI GetDataPtrDLL() {
  function STDAPI (line 79) | __declspec(dllexport) STDAPI DebugGetUITreeDLL(BSTR* tree) {
  function STDAPI (line 85) | __declspec(dllexport) STDAPI SetTaskbarElementsOpacityDLL(UINT opac) {

FILE: RainbowTaskbarDLL/dllmain.cpp
  function STDAPI (line 13) | STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) try
  function STDAPI (line 30) | STDAPI DllCanUnloadNow()
  function BOOL (line 36) | BOOL APIENTRY DllMain( HMODULE hModule,
Condensed preview — 163 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (734K chars).
[
  {
    "path": ".editorconfig",
    "chars": 5777,
    "preview": "[*]\ncharset = utf-8-bom\nend_of_line = crlf\ntrim_trailing_whitespace = false\ninsert_final_newline = false\nindent_style ="
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 450,
    "preview": "---\nname: Bug report\nabout: Create a bug report\ntitle: \"[BUG] \"\nlabels: bug\nassignees: ad2017gd\n\n---\n\n**Describe the bug"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "chars": 161,
    "preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ad2017gd\n\n---"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/other-issue.md",
    "chars": 123,
    "preview": "---\nname: Other issue\nabout: ONLY USE IF NOT A BUG REPORT/FEATURE REQUEST!\ntitle: ''\nlabels: ''\nassignees: ad2017gd\n\n---"
  },
  {
    "path": ".gitignore",
    "chars": 6940,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## G"
  },
  {
    "path": "LICENSE",
    "chars": 1065,
    "preview": "MIT License\n\nCopyright (c) 2023 ad2017gd\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\no"
  },
  {
    "path": "MSIXPkg2/MSIXPkg2.wapproj",
    "chars": 10274,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "MSIXPkg2/Package.appxmanifest",
    "chars": 2292,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows"
  },
  {
    "path": "README.md",
    "chars": 4274,
    "preview": "<div align=\"center\">\n   \n[<sub>*</sub>](#microsoft-store)\n[<img src=\"https://get.microsoft.com/images/en-us%20dark.svg\" "
  },
  {
    "path": "RainbowTaskbar/App.xaml",
    "chars": 757,
    "preview": "<Application x:Class=\"RainbowTaskbar.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  },
  {
    "path": "RainbowTaskbar/App.xaml.cs",
    "chars": 21633,
    "preview": "using H.Pipes;\nusing H.Pipes.AccessControl;\nusing Microsoft.Web.WebView2.WinForms;\nusing Microsoft.Win32;\nusing Propert"
  },
  {
    "path": "RainbowTaskbar/AssemblyInfo.cs",
    "chars": 445,
    "preview": "using System.Windows;\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dicti"
  },
  {
    "path": "RainbowTaskbar/Configuration/Config.cs",
    "chars": 5610,
    "preview": "using RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing Rain"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/DefaultPresets.cs",
    "chars": 26003,
    "preview": "using RainbowTaskbar.Configuration.Instruction.Instructions;\nusing System.Collections.Generic;\nusing System.ComponentMo"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instruction.cs",
    "chars": 3003,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nu"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/InstructionConfig.cs",
    "chars": 7833,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Dynamic"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/InstructionGroup.cs",
    "chars": 3357,
    "preview": "using PropertyChanged;\nusing RainbowTaskbar.HTTPAPI;\nusing System;\nusing System.Collections.Generic;\nusing System.Compo"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/InstructionPreset.cs",
    "chars": 378,
    "preview": "using System.ComponentModel;\nusing System.Runtime.Serialization;\n\nnamespace RainbowTaskbar.Configuration.Instruction;\n\n"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/BorderRadiusInstruction.cs",
    "chars": 839,
    "preview": "using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\n\n\nnamespace RainbowTaskbar.Configurat"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/ClearLayerInstruction.cs",
    "chars": 1072,
    "preview": "using System.Dynamic;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windo"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/ColorInstruction.cs",
    "chars": 9877,
    "preview": "\nusing System.Drawing;\nusing System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.W"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/DelayInstruction.cs",
    "chars": 729,
    "preview": "using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\n\n\nnamespace RainbowTaskbar.Configurat"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/ImageInstruction.cs",
    "chars": 2193,
    "preview": "using System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\nusing System.Dynamic;\nusing System."
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/ShapeInstruction.cs",
    "chars": 4862,
    "preview": "\nusing System;\nusing System.Dynamic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Runtime.Serialization;"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/TextInstruction.cs",
    "chars": 1818,
    "preview": "using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Wi"
  },
  {
    "path": "RainbowTaskbar/Configuration/Instruction/Instructions/TransparencyInstruction.cs",
    "chars": 4373,
    "preview": "using System;\nusing System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows.Co"
  },
  {
    "path": "RainbowTaskbar/Configuration/Web/WebConfig.cs",
    "chars": 16312,
    "preview": "using Microsoft.Web.WebView2.Core;\nusing Microsoft.Web.WebView2.Wpf;\nusing RainbowTaskbar.Helpers;\nusing RainbowTaskbar"
  },
  {
    "path": "RainbowTaskbar/Drawing/CanvasManager.cs",
    "chars": 1516,
    "preview": "using System.Drawing;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Shapes;\nusing System.Li"
  },
  {
    "path": "RainbowTaskbar/Drawing/LayerManager.cs",
    "chars": 3766,
    "preview": "using RainbowTaskbar.Helpers;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System."
  },
  {
    "path": "RainbowTaskbar/Editor/DebugWindow.xaml",
    "chars": 1363,
    "preview": "<ui:FluentWindow  xmlns:ui=\"http://schemas.lepo.co/wpfui/2022/xaml\" x:Class=\"RainbowTaskbar.Editor.DebugWindow\"\n       "
  },
  {
    "path": "RainbowTaskbar/Editor/DebugWindow.xaml.cs",
    "chars": 1888,
    "preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Dyn"
  },
  {
    "path": "RainbowTaskbar/Editor/EditorViewModel.cs",
    "chars": 481,
    "preview": "using RainbowTaskbar.Editor.Pages.Edit;\nusing RainbowTaskbar.Helpers;\nusing System;\nusing System.Collections.Generic;\nu"
  },
  {
    "path": "RainbowTaskbar/Editor/EditorWindow.xaml",
    "chars": 4399,
    "preview": "<ui:FluentWindow x:Class=\"RainbowTaskbar.Editor.EditorWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xa"
  },
  {
    "path": "RainbowTaskbar/Editor/EditorWindow.xaml.cs",
    "chars": 8809,
    "preview": "using RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Editor.Pages;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusin"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/About.xaml",
    "chars": 2654,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.About\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentatio"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/About.xaml.cs",
    "chars": 1633,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Text;\nusing S"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Browse.xaml",
    "chars": 4180,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.Browse\" x:Name=\"browsePage\"\n      xmlns=\"http://schemas.microsoft.com/winfx/"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Browse.xaml.cs",
    "chars": 3908,
    "preview": "using RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing RainbowTaskbar.HTTPAPI;\nusing Sys"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Configs.xaml",
    "chars": 2281,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.Configs\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentat"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Configs.xaml.cs",
    "chars": 1532,
    "preview": "using PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing Rainbo"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/ConfigListItemControl.xaml",
    "chars": 3044,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.ConfigListItemControl\"\n             xmlns=\"http://schemas.mi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/ConfigListItemControl.xaml.cs",
    "chars": 2853,
    "preview": "using Kasay;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Web;\nusing R"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionContextMenu.xaml",
    "chars": 832,
    "preview": "<ContextMenu x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionContextMenu\"\n        xmlns=\"http://schemas.micros"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionContextMenu.xaml.cs",
    "chars": 1892,
    "preview": "using RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing System;\nusing System."
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/BorderRadiusInstructionControl.xaml",
    "chars": 3450,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.BorderRadiusInstructionControl\"\n        "
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/BorderRadiusInstructionControl.xaml.cs",
    "chars": 872,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ClearLayerInstructionControl.xaml",
    "chars": 1455,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.ClearLayerInstructionControl\"\n          "
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ClearLayerInstructionControl.xaml.cs",
    "chars": 877,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ColorInstructionControl.xaml",
    "chars": 13780,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.ColorInstructionControl\"\n             xm"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ColorInstructionControl.xaml.cs",
    "chars": 3389,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing Sys"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/ColorConverter.cs",
    "chars": 747,
    "preview": "using RainbowTaskbar.Interpolation;\nusing System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System."
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/DivideHalf.cs",
    "chars": 783,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/FileExists.cs",
    "chars": 557,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing S"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/Converters/FloatToPercentage.cs",
    "chars": 799,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Text;\nusing"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/DelayInstructionControl.xaml",
    "chars": 1705,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.DelayInstructionControl\"\n             xm"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/DelayInstructionControl.xaml.cs",
    "chars": 862,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ImageInstructionControl.xaml",
    "chars": 3349,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.ImageInstructionControl\"\n             xm"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ImageInstructionControl.xaml.cs",
    "chars": 2431,
    "preview": "using Microsoft.Win32;\nusing RainbowTaskbar.Configuration.Instruction.Instructions;\nusing RainbowTaskbar.Editor.Pages.E"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ShapeInstructionControl.xaml",
    "chars": 21139,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.ShapeInstructionControl\"\n             xm"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/ShapeInstructionControl.xaml.cs",
    "chars": 862,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TextInstructionControl.xaml",
    "chars": 5053,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.TextInstructionControl\"\n             xml"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TextInstructionControl.xaml.cs",
    "chars": 859,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TransparencyInstructionControl.xaml",
    "chars": 13326,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.InstructionControls.TransparencyInstructionControl\"\n        "
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/InstructionControls/TransparencyInstructionControl.xaml.cs",
    "chars": 895,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/IssueControl.xaml",
    "chars": 2419,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.IssueControl\"\n             xmlns=\"http://schemas.microsoft.c"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/IssueControl.xaml.cs",
    "chars": 853,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/LoginControl.xaml",
    "chars": 1006,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.LoginControl\"\n             xmlns=\"http://schemas.microsoft.c"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/LoginControl.xaml.cs",
    "chars": 657,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/ResultListItemControl.xaml",
    "chars": 5841,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.ResultListItemControl\"\n             xmlns=\"http://schemas.mi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/ResultListItemControl.xaml.cs",
    "chars": 5066,
    "preview": "using Kasay;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Web;\nusing R"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/UnsafeImage.cs",
    "chars": 370,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing Syste"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/WebControls/AddPropertyDialogControl.xaml",
    "chars": 2460,
    "preview": "<UserControl x:Class=\"RainbowTaskbar.Editor.Pages.Controls.WebControls.AddPropertyDialogControl\"\n             xmlns=\"ht"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Controls/WebControls/AddPropertyDialogControl.xaml.cs",
    "chars": 844,
    "preview": "using RainbowTaskbar.Configuration.Web;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/EditInfo.xaml",
    "chars": 13104,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.Edit.EditInfo\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/pre"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/EditInfo.xaml.cs",
    "chars": 9113,
    "preview": "using Microsoft.Win32;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.In"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/EditPage.cs",
    "chars": 434,
    "preview": "using RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing System;\nusing System.Collections."
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/InstructionEditPage.xaml",
    "chars": 7418,
    "preview": "<local:EditPage x:Class=\"RainbowTaskbar.Editor.Pages.Edit.InstructionEditPage\"\n      xmlns=\"http://schemas.microsoft.co"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/InstructionEditPage.xaml.cs",
    "chars": 4831,
    "preview": "using PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing Rainbo"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/ViewComments.xaml",
    "chars": 5429,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.Edit.ViewComments\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/ViewComments.xaml.cs",
    "chars": 3338,
    "preview": "using PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing Rainbo"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/ViewInfo.xaml",
    "chars": 5609,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.Edit.ViewInfo\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/pre"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/ViewInfo.xaml.cs",
    "chars": 4028,
    "preview": "using PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Configuration.Instruction;\nusing Rainbo"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/WebEditPage.xaml",
    "chars": 1577,
    "preview": "<local:EditPage x:Class=\"RainbowTaskbar.Editor.Pages.Edit.WebEditPage\"\n      xmlns=\"http://schemas.microsoft.com/winfx/"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/WebEditPage.xaml.cs",
    "chars": 5924,
    "preview": "\nusing Microsoft.Web.WebView2.Core;\nusing Microsoft.Web.WebView2.Wpf;\nusing RainbowTaskbar.Configuration;\nusing Rainbow"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Edit/WebView2Fixed.cs",
    "chars": 374,
    "preview": "using Microsoft.Web.WebView2.Wpf;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/EmptyPageBadFix.xaml",
    "chars": 545,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.EmptyPageBadFix\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/p"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/EmptyPageBadFix.xaml.cs",
    "chars": 735,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/EmptyPageBadFix2.xaml",
    "chars": 547,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.EmptyPageBadFix2\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/EmptyPageBadFix2.xaml.cs",
    "chars": 738,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Home.xaml",
    "chars": 3044,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.Home\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Home.xaml.cs",
    "chars": 5974,
    "preview": "using RainbowTaskbar.Configuration.Web;\nusing RainbowTaskbar.Editor.Pages.Controls;\nusing RainbowTaskbar.Editor.Pages.C"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Settings.xaml",
    "chars": 7816,
    "preview": "<Page x:Class=\"RainbowTaskbar.Editor.Pages.Settings\"\n      xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presenta"
  },
  {
    "path": "RainbowTaskbar/Editor/Pages/Settings.xaml.cs",
    "chars": 3472,
    "preview": "using RainbowTaskbar.Editor.Pages.Controls;\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nu"
  },
  {
    "path": "RainbowTaskbar/ExplorerTAP/ExplorerTAP.cs",
    "chars": 16964,
    "preview": "using H.Pipes;\nusing RainbowTaskbar.Configuration.Instruction;\nusing RainbowTaskbar.Configuration.Instruction.Instructi"
  },
  {
    "path": "RainbowTaskbar/FodyWeavers.xml",
    "chars": 146,
    "preview": "<Weavers xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"FodyWeavers.xsd\">\n    <Pr"
  },
  {
    "path": "RainbowTaskbar/HTTPAPI/WorkshopAPI.cs",
    "chars": 14736,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Net;\nusing Syste"
  },
  {
    "path": "RainbowTaskbar/Helpers/AutoUpdate.cs",
    "chars": 4809,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing Sys"
  },
  {
    "path": "RainbowTaskbar/Helpers/Cache.cs",
    "chars": 553,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "RainbowTaskbar/Helpers/DPIUtil.cs",
    "chars": 8886,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.S"
  },
  {
    "path": "RainbowTaskbar/Helpers/HiddenWebViewHost.xaml",
    "chars": 845,
    "preview": "<Window x:Class=\"RainbowTaskbar.Helpers.HiddenWebViewHost\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/"
  },
  {
    "path": "RainbowTaskbar/Helpers/HiddenWebViewHost.xaml.cs",
    "chars": 788,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Helpers/JsonColorConverter.cs",
    "chars": 604,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing Syste"
  },
  {
    "path": "RainbowTaskbar/Helpers/Taskbar.cs",
    "chars": 18136,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.IO;\nusing "
  },
  {
    "path": "RainbowTaskbar/Helpers/Window.cs",
    "chars": 13280,
    "preview": "using System;\nusing System.Diagnostics;\nusing System.Drawing;\nusing System.Linq;\nusing System.Runtime.InteropServices;\n"
  },
  {
    "path": "RainbowTaskbar/Interpolation/ColorInterpolation.cs",
    "chars": 3354,
    "preview": "using System;\nusing System.Drawing;\nusing System.Globalization;\nusing System.Linq;\nusing System.Reflection;\nusing Syste"
  },
  {
    "path": "RainbowTaskbar/Languages/Localization.cs",
    "chars": 3248,
    "preview": "using RainbowTaskbar.Configuration.Instruction.Instructions;\nusing RainbowTaskbar.Configuration.Instruction;\nusing Syst"
  },
  {
    "path": "RainbowTaskbar/Languages/Translators.cs",
    "chars": 1584,
    "preview": "using RainbowTaskbar.Configuration;\nusing System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing S"
  },
  {
    "path": "RainbowTaskbar/Languages/en_US.xaml",
    "chars": 13750,
    "preview": "<ResourceDictionary x:Class=\"RainbowTaskbar.Languages.en_US\"\n                    xmlns=\"http://schemas.microsoft.com/wi"
  },
  {
    "path": "RainbowTaskbar/Languages/en_US.xaml.cs",
    "chars": 588,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Languages/fr_FR.xaml",
    "chars": 15168,
    "preview": "<ResourceDictionary x:Class=\"RainbowTaskbar.Languages.fr_FR\"\r\n                    xmlns=\"http://schemas.microsoft.com/w"
  },
  {
    "path": "RainbowTaskbar/Languages/fr_FR.xaml.cs",
    "chars": 257,
    "preview": "using System.Windows;\r\n\r\nnamespace RainbowTaskbar.Languages\r\n{\r\n    /// <summary>\r\n    /// Interaction logic for fr_FR."
  },
  {
    "path": "RainbowTaskbar/Languages/ro_RO.xaml",
    "chars": 14266,
    "preview": "<ResourceDictionary x:Class=\"RainbowTaskbar.Languages.ro_RO\"\n                    xmlns=\"http://schemas.microsoft.com/wi"
  },
  {
    "path": "RainbowTaskbar/Languages/ro_RO.xaml.cs",
    "chars": 588,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Languages/zh_CN.cs",
    "chars": 564,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusi"
  },
  {
    "path": "RainbowTaskbar/Languages/zh_CN.xaml",
    "chars": 11755,
    "preview": "<ResourceDictionary x:Class=\"RainbowTaskbar.Languages.zh_CN\"\n                    xmlns=\"http://schemas.microsoft.com/wi"
  },
  {
    "path": "RainbowTaskbar/Preferences/Settings.cs",
    "chars": 10022,
    "preview": "using Microsoft.Win32;\nusing PropertyChanged;\nusing RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Editor;\nusing Ra"
  },
  {
    "path": "RainbowTaskbar/Properties/Resources.Designer.cs",
    "chars": 3728,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "RainbowTaskbar/Properties/Resources.resx",
    "chars": 6374,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The prim"
  },
  {
    "path": "RainbowTaskbar/Properties/Settings.Designer.cs",
    "chars": 1070,
    "preview": "//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code w"
  },
  {
    "path": "RainbowTaskbar/Properties/Settings.settings",
    "chars": 232,
    "preview": "<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\""
  },
  {
    "path": "RainbowTaskbar/Properties/launchSettings.json",
    "chars": 297,
    "preview": "{\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmen"
  },
  {
    "path": "RainbowTaskbar/RainbowTaskbar.csproj",
    "chars": 7959,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n    <PropertyGroup>\n        <OutputType>WinExe</OutputType>\n        <TargetFramework"
  },
  {
    "path": "RainbowTaskbar/Taskbar.xaml",
    "chars": 2527,
    "preview": "<Window Name=\"RainbowTaskbar\"\n        x:Class=\"RainbowTaskbar.Taskbar\"\n        xmlns=\"http://schemas.microsoft.com/winf"
  },
  {
    "path": "RainbowTaskbar/Taskbar.xaml.cs",
    "chars": 16027,
    "preview": "using Microsoft.Web.WebView2.Core;\nusing Microsoft.Web.WebView2.WinForms;\nusing Microsoft.Web.WebView2.Wpf;\nusing Rainb"
  },
  {
    "path": "RainbowTaskbar/TaskbarViewModel.cs",
    "chars": 3487,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Diagnostics;\nusing System.Thr"
  },
  {
    "path": "RainbowTaskbar/TrayWindow.xaml",
    "chars": 1700,
    "preview": "<Window x:Class=\"RainbowTaskbar.TrayWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n "
  },
  {
    "path": "RainbowTaskbar/TrayWindow.xaml.cs",
    "chars": 2106,
    "preview": "using RainbowTaskbar.Configuration;\nusing RainbowTaskbar.Helpers;\n\n//using RainbowTaskbar.UserControls;\nusing System;\nu"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Config.cs",
    "chars": 1824,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Dynamic"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instruction.cs",
    "chars": 1102,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Linq;\nu"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/InstructionPreset.cs",
    "chars": 306,
    "preview": "using System.ComponentModel;\nusing System.Runtime.Serialization;\n\nnamespace RainbowTaskbar.V2Legacy.Configuration;\n\n[Da"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/BorderRadiusInstruction.cs",
    "chars": 478,
    "preview": "using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\n\nnamespace RainbowTaskbar.V2Legacy.Co"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/ClearLayerInstruction.cs",
    "chars": 608,
    "preview": "using System.Dynamic;\nusing System.Linq;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windo"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/ColorInstruction.cs",
    "chars": 1677,
    "preview": "\nusing System.Drawing;\nusing System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.W"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/DelayInstruction.cs",
    "chars": 468,
    "preview": "using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nnamespace RainbowTaskbar.V2Legacy.Con"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/ImageInstruction.cs",
    "chars": 1155,
    "preview": "using System.Drawing;\nusing System.Drawing.Drawing2D;\nusing System.Drawing.Imaging;\nusing System.Dynamic;\nusing System."
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/ShapeInstruction.cs",
    "chars": 1715,
    "preview": "\nusing System;\nusing System.Dynamic;\nusing System.Globalization;\nusing System.Linq;\nusing System.Runtime.Serialization;"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/TextInstruction.cs",
    "chars": 1152,
    "preview": "using System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows;\nusing System.Wi"
  },
  {
    "path": "RainbowTaskbar/V2Legacy/Configuration/Instructions/TransparencyInstruction.cs",
    "chars": 1046,
    "preview": "using System;\nusing System.Dynamic;\nusing System.Runtime.Serialization;\nusing System.Threading;\nusing System.Windows.Co"
  },
  {
    "path": "RainbowTaskbar/msix.build.props",
    "chars": 163,
    "preview": "<Project>\n  <PropertyGroup>\n    <IsMsixBuild>true</IsMsixBuild>\n    <DefineConstants>$(DefineConstants);MSIX_BUILD</Def"
  },
  {
    "path": "RainbowTaskbar.sln",
    "chars": 6423,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.3240"
  },
  {
    "path": "RainbowTaskbarDLL/AppearanceServiceAPI.cpp",
    "chars": 7678,
    "preview": "#include \"AppearanceServiceAPI.h\"\n#include \"Taskbar.h\"\n#include \"winrt.h\"\n#include <comdef.h>\n#include <tchar.h>\n\n#incl"
  },
  {
    "path": "RainbowTaskbarDLL/AppearanceServiceAPI.h",
    "chars": 1492,
    "preview": "#pragma once\n#include \"winrt.h\"\n#include \"VisualTreeWatch.h\"\n#include <winrt/Windows.Foundation.h>\n#include \"RainbowTas"
  },
  {
    "path": "RainbowTaskbarDLL/ArmFix/RpcProxy.h",
    "chars": 31051,
    "preview": "/*++\n\nCopyright (c) Microsoft Corporation. All rights reserved.\n\nModule Name:\n\n    rpcproxy.h\n\nAbstract:\n\n    Definitio"
  },
  {
    "path": "RainbowTaskbarDLL/ErrorDebug.h",
    "chars": 636,
    "preview": "#pragma once\n\nstruct TaskbarInfo {\n    HWND taskbar;\n    int YPosition;\n    char _reserved[16];\n};\nstruct TaskbarInfo2 "
  },
  {
    "path": "RainbowTaskbarDLL/Factory.h",
    "chars": 665,
    "preview": "#pragma once\n#include <Unknwn.h>\n#include \"winrt.h\"\n\ntemplate<class T>\nstruct Factory : winrt::implements<Factory<T>, I"
  },
  {
    "path": "RainbowTaskbarDLL/IUnused.h",
    "chars": 14,
    "preview": "#pragma once\n"
  },
  {
    "path": "RainbowTaskbarDLL/IUnused.idl",
    "chars": 130,
    "preview": "import \"oaidl.idl\";\nimport \"ocidl.idl\";\n\n[\nobject,\nuuid(3e987340-78d8-48ce-aa6b-46ec8ba343c7)\n]\ninterface IUnused : IUn"
  },
  {
    "path": "RainbowTaskbarDLL/RainbowTaskbarDLL.def",
    "chars": 160,
    "preview": "EXPORTS\nDllGetClassObject PRIVATE\nDllCanUnloadNow PRIVATE\nSetAppearanceTypeDLL\nCloseDLL\nVersionDLL\nGetDataPtrDLL\nDebugG"
  },
  {
    "path": "RainbowTaskbarDLL/RainbowTaskbarDLL.idl",
    "chars": 361,
    "preview": "import \"unknwn.idl\";\nimport \"ocidl.idl\";\n\n[uuid(b9684566-2c89-11ee-be56-0242ac120002)]\nlibrary RainbowTaskbarDLL {\n    "
  },
  {
    "path": "RainbowTaskbarDLL/RainbowTaskbarDLL.vcxproj",
    "chars": 32473,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/ms"
  },
  {
    "path": "RainbowTaskbarDLL/RainbowTaskbarDLL.vcxproj.filters",
    "chars": 3027,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuil"
  },
  {
    "path": "RainbowTaskbarDLL/TAP.cpp",
    "chars": 1015,
    "preview": "#include \"TAP.h\"\n#include \"AppearanceServiceAPI.h\"\n#include \"RainbowTaskbarDLL_h.h\"\n\n\n#include <comdef.h>\n#include <tch"
  },
  {
    "path": "RainbowTaskbarDLL/TAP.h",
    "chars": 607,
    "preview": "#pragma once\n#include \"winrt.h\"\n#include \"VisualTreeWatch.h\"\n#include <combaseapi.h>\n#include <ocidl.h>\n#include <xamlO"
  },
  {
    "path": "RainbowTaskbarDLL/Taskbar.h",
    "chars": 815,
    "preview": "#pragma once\n#include \"winrt.h\"\n\nstruct UITree {\n    winrt::Windows::UI::Xaml::UIElement element{ nullptr };\n    std::v"
  },
  {
    "path": "RainbowTaskbarDLL/VisualTreeWatch.cpp",
    "chars": 10744,
    "preview": "\n#include \"VisualTreeWatch.h\"\n#include \"winrt.h\"\n#include \"Taskbar.h\"\n#include <winrt/Windows.UI.Xaml.Hosting.h>\n#inclu"
  },
  {
    "path": "RainbowTaskbarDLL/VisualTreeWatch.h",
    "chars": 2416,
    "preview": "#pragma once\n\n\n#include \"winrt.h\"\n#include <xamlOM.h>\n#include \"Taskbar.h\"\n\n\n\nclass AppearanceServiceAPI;\nclass VisualT"
  },
  {
    "path": "RainbowTaskbarDLL/csharpinterop.cpp",
    "chars": 2632,
    "preview": "#include \"winrt.h\"\n#include \"RainbowTaskbarDLL_h.h\"\n#include <comdef.h>\n#include <windows.h>\n#include <winuser.h>\n\n\n#in"
  },
  {
    "path": "RainbowTaskbarDLL/dllmain.cpp",
    "chars": 1253,
    "preview": "// dllmain.cpp : Defines the entry point for the DLL application.\n#include \"framework.h\"\n#include \"winrt.h\"\n#include \"T"
  },
  {
    "path": "RainbowTaskbarDLL/framework.h",
    "chars": 149,
    "preview": "#pragma once\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Heade"
  },
  {
    "path": "RainbowTaskbarDLL/packages.config",
    "chars": 156,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.Windows.CppWinRT\" version=\"2.0.250303.1\" tar"
  },
  {
    "path": "RainbowTaskbarDLL/winrt.h",
    "chars": 304,
    "preview": "#pragma once\n\n\n#include <guiddef.h>\n#include <Unknwn.h>\n#include <winrt/base.h>\n\n#include <winrt/Windows.UI.Xaml.Hostin"
  },
  {
    "path": "SetupARM64.iss",
    "chars": 2545,
    "preview": "; Script generated by the Inno Setup Script Wizard.\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FI"
  },
  {
    "path": "SetupX64.iss",
    "chars": 2539,
    "preview": "; Script generated by the Inno Setup Script Wizard.\n; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FI"
  }
]

About this extraction

This page contains the full source code of the ad2017gd/RainbowTaskbar GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 163 files (675.4 KB), approximately 159.8k tokens, and a symbol index with 604 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!