├── .gitignore ├── LICENSE ├── README.html ├── README.md ├── README ├── Above4G.png ├── CommandRate.png ├── MSI.png ├── Omen-Raid0.png ├── ThioJoe.png ├── autoruns_v13.png ├── cpu.png ├── logo.png ├── mem.png ├── power.png └── todownload.png ├── README_files └── libs │ ├── bootstrap │ ├── bootstrap-icons.css │ ├── bootstrap-icons.woff │ ├── bootstrap.min.css │ └── bootstrap.min.js │ ├── clipboard │ └── clipboard.min.js │ └── quarto-html │ ├── anchor.min.js │ ├── popper.min.js │ ├── quarto-syntax-highlighting.css │ ├── quarto.js │ ├── tippy.css │ └── tippy.umd.min.js ├── WPFGUI └── MainWindow.xaml ├── facet4.ps1 ├── facet4.psm1 ├── facet4WPF.ps1 ├── script.cmd └── script.preset /.gitignore: -------------------------------------------------------------------------------- 1 | # List of ignored files -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Hermann Heringer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | readme 11 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
43 | 44 |
45 | 46 | 47 | 48 | 49 |

logo.png # FACET4 WINDOWS 10/11

50 | 63 |
64 |

Description

65 |
66 |

2024: Another latency-reducing, debloating, Windows-ruining script with thousands of registry tweaks, zero solid foundation, and absolutely no studies (like ANOVA) to prove you’re doing better than the actual OS developers themselves.”

67 |
68 |
69 |

“Reckless”? Nah… I’m just more into studying and removing junk and noise than chasing the “magic registry key” that’ll supposedly turn your system into something mind-blowing. Come on, give me a break!

70 |
71 |

Introduction:

72 |

The PowerShell script presented here automates routine tasks on Windows 10 and 11 distributions (24H2 compatible), specifically focusing on improving performance and reducing overall latency for devices with limited CPU and RAM resources. While the script does not target IT administrators or serve as an "anti-tracking" solution, it aims to balance maintaining desired functionality and optimising system performance.

73 |

Approach and Scope:

74 |

Unlike conventional "debloatware" scripts available on the web, this comprehensive script encompasses various elements beyond removing unnecessary features. Acknowledging that such deletions can lighten the system, my approach combines different methodologies and best practices to explore specific areas that warrant further optimisation.

75 |

It is crucial to recognise the complexity and quality of the operating system developed by Microsoft and its collaborators. Attempting further optimisation without compromising essential functionality would be audacious. Therefore, my script identifies areas where functionality can be optimised to gain performance while retaining the system’s overall characteristics and ensuring broad compatibility.

76 |

Respecting Official Distributions:

77 |

My philosophy does not endorse creating a barebones and featureless system through code. Suspicious distributions like "ATLAS" or "TINY 11" are not recommended, despite acknowledging the developers’ efforts. Instead, I emphasise relying on official distributions designed to meet most users’ requirements.

78 |

Challenges and Best Practices:

79 |

While tools like "NTlite" can help test scripts for optimisation purposes, I must approach this task with the utmost respect for the system’s developers and a deep understanding of its nuances. Disabling features or altering kernel behaviour without comprehensive knowledge can lead to adverse effects. Thoroughly filtering through official documentation, addressing misconceptions, and distinguishing signal from noise can be time-consuming, yet essential.

80 |

Windows Services Optimisation:

81 |

Based on my experience, extensive optimisation of Windows Services proved to be a fruitless endeavour. Accepting the system as it is maybe the wiser choice for most scenarios. However, individuals seeking further customisation may explore options involving low-level programming languages and kernel customisations.

82 |
83 |
84 |

Fresh installation of Windows LTSC 21H2 with all drivers and updates installed after applying this script :

85 |

CPU:

86 |
87 |
88 |

89 |
cpu.png
90 |
91 |
92 |

Memory:

93 |
94 |
95 |

96 |
mem.png
97 |
98 |
99 |
100 |
101 |
102 |

Before you run!

103 |
☝ Although the author has made an effort to provide broad compatibility,
104 |     this script was conceived aiming at a clean install of Windows,
105 |     and if you use it outside that context, some programs may stop working.
106 |     Be aware of the risk.
107 |
🚫 Do not run this script if you are not familiar with the topic.
108 |     Some functions may reduce security, uninstall or prevent applications from running again and disable
109 |     some internal operating system functionalities. If you don't understand what a function does, don't run it.
110 |
🚫 Never run scripts from strangers without checking the code first!
111 |     Research indicates that a significant 76% of ransomware attacks originate from PowerShell scripts.
112 |
🚫 This script can damage your operating system by forcing a complete reinstallation.
113 |     It is at your discretion and risk.
114 |
115 |
116 |

Liability

117 |

This script has taken dozens of hours and years of experimentation on my part, self-learning, and is being shared freely for use, distribution, and study. I’m not responsible for anything. All script is provided as it is, and you can use it at your own risk.

118 |
119 |
120 |

Execution

121 |

The script is divided into a module with all the functions and a preset file containing only the call of the procedures to be executed. Directly running the script.cmd file solves all these complexities for you, such as elevating privileges.

122 |

If you just want to run the script with the default preset, download and unpack it and then simply double-click on the script.cmd file and confirm the User Account Control prompt.

123 |
124 |
125 |

126 |
todownload.png
127 |
128 |
129 |
130 |
131 |

Interactivity

132 |

This script is designed to run without any user interaction. Modify it as you like.

133 |
134 |

Presets

135 |

The preset file is a simple list of function names which should be called. Any function which is not present or commented in a preset will not be called. Thus the corresponding function will not be applied.

136 |

The function name can be prefixed with an exclamation mark !, which will instead cause the function to be removed from the selection. This is useful when you want to apply the whole preset but omit a few specific functions in the current run.

137 |
138 |
139 |

Log

140 |

The script automatically stores the output of the script execution in a folder like C:\Temp\facet4 .

141 |
142 |
143 |

System Restore Point

144 |

The script automatically tries to create a system restore point before the functions run.

145 |

System Restore is a feature designed to create a snapshot of the current working state and save it as a “restore point” when essential changes are detected on your computer. Suppose a critical issue occurs after installing an update, driver, or application or incorrectly modifying system settings in the registry, you can use a restore point to revert your laptop or desktop computer to an earlier state to resolve the issue without losing your files.

146 |
147 |
148 |
149 |

Compatibility

150 |

The script was developed and tested using the latest Windows 10 and 11 Home and Pro distributions in English and Portuguese languages and aims to be fully compatible with the most up-to-date version of them, you can run the script on other distributions, but the code is still designed primarily for Home/Pro and is not compatible with versions before Windows 10.

151 |
    152 |
  • 153 |
      154 |
    • 155 |
    • 156 |
  • 157 |
  • 158 |
      159 |
    • 160 |
    • 161 |
  • 162 |
163 |
164 |
165 |

Known side effects

166 |
    167 |
  • Some Windows settings will show the message Some of these settings are hidden or managed by your organization. This is due to some functions of the script that use Group Policy Objects (GPO). The exact mechanism is used in companies so that users without administrative privileges cannot change the settings. I’m using this because, in theory, it prevents future system updates from reverting these settings without notice. If you would like to make these settings available, disable the DisableAppCompat function in the present file before running it.
  • 168 |
  • The script disables support for legacy 16-bit applications. If you still use any apps from the Jurassic period, disable the DisableAppCompat function in the present file before running it.
  • 169 |
  • The script disables some functionality of the Xbox subsystem. If you use any games from your Xbox account, disable the RemoveXboxFeatures function in the present file before running.
  • 170 |
  • This script automatically changes the Processor performance boost mode plan according to the processor brand (AMD/Intel) and computer type (Notebook/Desktop).
  • 171 |
172 |

You can easily change this option by accessing the steps below: 1. Open Command Prompt: hold down the Windows Key, and Press R on your keyboard. 2. Type power in the window and press Enter. 3. Click on the Change advanced power settings option and scroll down to the Processor power management tab. The default state is Aggressive . 4. Follow the on-screen options to change and click on the Apply button. It is not necessary to restart the device.

173 |
174 |
175 |

176 |
power.png
177 |
178 |
179 |
180 |
181 |

Known issues

182 |

When trying to change a specific key when using an Azure Active Directory account.

183 |

The problem is easily worked around by performing this modification manually using Regedit.

184 |
185 |
186 |

Undo changes

187 |
188 |

Reverse the entire script

189 |

Based on my “limited” knowledge acquired over the years as a user, I do not believe that reversing function by function will bring your operating system to the previous state with the same behaviour in all its details. I have always witnessed several inconsistencies using this approach in addition to spending many hours trying to solve this.

190 |

Based on the above, I find it advisable (which is why this built-in tool exists in Windows) to perform a System Restore Point before executing this script.

191 |

To revert the entire script, follow these steps:

192 |
    193 |
  1. Open Command Prompt hold down the Windows Key, and Press R on your keyboard.
  2. 194 |
  3. Type rstrui.exe in the window, and then press Enter.
  4. 195 |
  5. Find a restore point with a name like System Restore Point dated 00/00/0000 00:00:00 before running facet4 script. It should be the newest restore point there.
  6. 196 |
  7. Follow the on-screen instructions to complete the system restore.
  8. 197 |
198 |
199 |
200 |

Revert functions

201 |

To undo the effects of a specific function, you can write and add a complementary function that restores the original behavior and append it to the current file.

202 |

The code at the end of each instruction contains the default values for Windows 11 22H2 and Windows 10 LTSC 21H2 distributions.

203 |

You are welcome to experiment and modify the functions as you wish.

204 |
205 |
206 |
207 |

Final considerations

208 |

If you understand what you are doing, consider downloading and running Microsoft Autoruns to check your system.

209 |

This utility, which has the most comprehensive knowledge of auto-starting locations of any startup monitor, shows you what programs are configured to run during system bootup or login, and when you start various built-in Windows applications like Internet Explorer, Explorer and media players. These programs and drivers include ones in your startup folder, Run, RunOnce, and other Registry keys. Autoruns reports Explorer shell extensions, toolbars, browser helper objects, Winlogon notifications, auto-start services, and much more. Autoruns goes way beyond other autostart utilities.

210 |

https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns

211 |
212 |
213 |

214 |
autoruns_v13.png
215 |
216 |
217 |
218 |

After executing this script, I recommend the following steps to achieve an optimized experience. It’s advisable to conduct thorough research before implementing any changes, and please be aware that any alterations are at your own risk. The author cannot be held accountable for any issues or damages that may arise.

219 |
220 |
221 |

1.Adjust Memory Command Rate: Explore the BIOS settings for your memory and locate the “Command Rate” or similar settings such as “Nmode.” Change the value from 2T to 1T. This adjustment can lead to a perceptible improved performance.

222 |
223 |
224 |

225 |
CommandRate.png
226 |
227 |
228 |
229 | 232 |
233 |

3.Enhance GPU Performance: If using a first-rate video card, investigate whether it supports “Above 4G Decoding” or “Resizable BAR.” If compatible, research the process to enable this feature on your motherboard. It enhances graphics performance a lot.

234 |
235 |
236 |

237 |
Above4G.png
238 |
239 |
240 |
241 |
242 |

4.Explore RAID Configuration: For users with an AMD Ryzen platform, it’s worth exploring the possibility of utilizing RAID 0 for SATA or NVMe devices. Even notebooks with locked BIOS and two NVMe ports might support this unofficially. Search how to implement this configuration for improved storage performance. It’s pure luxury, but it is fantastic!

243 |
244 |
245 |

246 |
Omen-Raid0.png
247 |
248 |
249 |
250 |
251 |

5.Enable Message Signaled Interrupts. Be aware that enabling MSI for a driver without support will break your Windows!

252 |
253 |
254 |

255 |
MSI.png
256 |
257 |
258 |
259 |
260 |

6.And lastly, don’t forget, if it’s a fresh install of the operating system, select “English (World)” as the time zone; it pretty much solves the initial bloatware problem on your new Windows. This does not apply to the LTSC or IoT distros, as it already comes with reduced OS footprint. Credits to mastermind @ThioJoe!

261 |
262 |
263 |

264 |
ThioJoe.png
265 |
266 |
267 |
268 |
269 |

Following these guidelines can significantly optimize your system’s performance after running this script. Remember to conduct in-depth research and understand the potential implications of each modification before proceeding. Your own discretion and caution are advised, as the author takes no responsibility for any adverse outcomes.

270 |
271 |
272 |
273 |

Thanks To

274 |

The thousands of people who actively contribute to forums, websites and communities, making their knowledge available; without this, it would not be possible to waste/spend dozens of hours trying to learn things like this.

275 |

I leave my thanks.

276 |
277 | 278 |
279 | 280 | 700 |
701 | 702 | 703 | 704 | 705 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![logo.png](README/logo.png) 2 | # FACET4 WINDOWS 10/11 3 | 4 | - [**Description**](#description) 5 | - [**Before you run!**](#before-you-run) 6 | - [**Liability**](#liability) 7 | - [**Execution**](#execution) 8 | - [**Interactivity**](#interactivity) 9 | - [**Compatibility**](#compatibility) 10 | - [**Known side effects**](#known-side-effects) 11 | - [**Known issues**](#known-issues) 12 | - [**Undo changes**](#undo-changes) 13 | - [**Final considerations**](#final-considerations) 14 | - [**Thanks To**](#thanks-to) 15 | 16 | 17 | ## **Description** 18 | 19 | 20 | Introduction: 21 | 22 | The PowerShell script presented here automates routine tasks on Windows 10 and 11 distributions (24H2 compatible), specifically focusing on improving performance and reducing overall latency for devices with limited CPU and RAM resources. While the script does not target IT administrators or serve as an ``"anti-tracking"`` solution, it aims to balance maintaining desired functionality and optimising system performance. 23 | 24 | Approach and Scope: 25 | 26 | Unlike conventional ``"debloatware"`` scripts available on the web, this comprehensive script encompasses various elements beyond removing unnecessary features. Acknowledging that such deletions can lighten the system, my approach combines different methodologies and best practices to explore specific areas that warrant further optimisation. 27 | 28 | It is crucial to recognise the complexity and quality of the operating system developed by Microsoft and its collaborators. Attempting further optimisation without compromising essential functionality would be audacious. Therefore, my script identifies areas where functionality can be optimised to gain performance while retaining the system's overall characteristics and ensuring broad compatibility. 29 | 30 | Respecting Official Distributions: 31 | 32 | My philosophy does not endorse creating a barebones and featureless system through code. Suspicious distributions like ``"ATLAS"`` or ``"TINY 11"`` are not recommended, despite acknowledging the developers' efforts. Instead, I emphasise relying on official distributions designed to meet most users' requirements. 33 | 34 | Challenges and Best Practices: 35 | 36 | While tools like ``"NTlite"`` can help test scripts for optimisation purposes, I must approach this task with the utmost respect for the system's developers and a deep understanding of its nuances. Disabling features or altering kernel behaviour without comprehensive knowledge can lead to adverse effects. Thoroughly filtering through official documentation, addressing misconceptions, and distinguishing signal from noise can be time-consuming, yet essential. 37 | 38 | Windows Services Optimisation: 39 | 40 | Based on my experience, extensive optimisation of Windows Services proved to be a fruitless endeavour. Accepting the system as it is maybe the wiser choice for most scenarios. However, individuals seeking further customisation may explore options involving low-level programming languages and kernel customisations. 41 | 42 | #### Fresh installation of Windows LTSC 21H2 with all drivers and updates installed after applying this script : 43 | 44 | 45 | CPU: 46 | 47 | ![cpu.png](README/cpu.png) 48 | 49 | 50 | Memory: 51 | 52 | ![mem.png](README/mem.png) 53 | 54 | 55 | ## **Before you run!** 56 | 57 | ``` 58 | ☝ Although the author has made an effort to provide broad compatibility, 59 | this script was conceived aiming at a clean install of Windows, 60 | and if you use it outside that context, some programs may stop working. 61 | Be aware of the risk. 62 | ``` 63 | 64 | ``` 65 | 🚫 Do not run this script if you are not familiar with the topic. 66 | Some functions may reduce security, uninstall or prevent applications from running again and disable 67 | some internal operating system functionalities. If you don't understand what a function does, don't run it. 68 | ``` 69 | 70 | ``` 71 | 🚫 Never run scripts from strangers without checking the code first! 72 | Research indicates that a significant 76% of ransomware attacks originate from PowerShell scripts. 73 | ``` 74 | 75 | ``` 76 | 🚫 This script can damage your operating system by forcing a complete reinstallation. 77 | It is at your discretion and risk. 78 | ``` 79 | 80 | 81 | ## **Liability** 82 | 83 | This script has taken dozens of hours and years of experimentation on my part, self-learning, and is being shared freely for use, distribution, and study. I'm not responsible for anything. All script is provided as it is, and you can use it at your own risk. 84 | 85 | 86 | ## **Execution** 87 | 88 | The script is divided into a module with all the functions and a preset file containing only the call of the procedures to be executed. Directly running the script.cmd file solves all these complexities for you, such as elevating privileges. 89 | 90 | If you just want to run the script with the default preset, `download and unpack it` and then simply double-click on the script.cmd file and confirm the User Account Control prompt. 91 | 92 | ![todownload.png](README/todownload.png) 93 | 94 | 95 | ## **Interactivity** 96 | 97 | This script is designed to run without any user interaction. Modify it as you like. 98 | 99 | ### Presets 100 | 101 | The preset file is a simple list of function names which should be called. Any function which is not present or commented in a preset will not be called. Thus the corresponding function will not be applied. 102 | 103 | The function name can be prefixed with an exclamation mark `!`, which will instead cause the function to be removed from the selection. This is useful when you want to apply the whole preset but omit a few specific functions in the current run. 104 | 105 | ### Log 106 | 107 | The script automatically stores the output of the script execution in a folder like `C:\Temp\facet4` . 108 | 109 | ### System Restore Point 110 | 111 | The script automatically tries to create a system restore point before the functions run. 112 | 113 | System Restore is a feature designed to create a snapshot of the current working state and save it as a "restore point" when essential changes are detected on your computer. Suppose a critical issue occurs after installing an update, driver, or application or incorrectly modifying system settings in the registry, you can use a restore point to revert your laptop or desktop computer to an earlier state to resolve the issue without losing your files. 114 | 115 | 116 | ## **Compatibility** 117 | 118 | The script was developed and tested using the latest Windows 10 and 11 Home and Pro distributions in English and Portuguese languages and aims to be fully compatible with the most up-to-date version of them, you can run the script on other distributions, but the code is still designed primarily for Home/Pro and is not compatible with versions before Windows 10. 119 | 120 | - [x] Windows 10 (English/Portuguese) 121 | - [x] Home 122 | - [x] Pro 123 | - [x] Windows 11 (English/Portuguese) 124 | - [x] Home 125 | - [x] Pro 126 | 127 | 128 | ## **Known side effects** 129 | 130 | - Some Windows settings will show the message `Some of these settings are hidden or managed by your organization.` This is due to some functions of the script that use Group Policy Objects (GPO). 131 | The exact mechanism is used in companies so that users without administrative privileges cannot change the settings. I'm using this because, in theory, it prevents future system updates from reverting these settings without notice. 132 | If you would like to make these settings available, disable the `DisableAppCompat` function in the present file before running it. 133 | - The script disables support for legacy 16-bit applications. 134 | If you still use any apps from the Jurassic period, disable the `DisableAppCompat` function in the present file before running it. 135 | - The script disables some functionality of the `Xbox` subsystem. 136 | If you use any games from your Xbox account, disable the `RemoveXboxFeatures` function in the present file before running. 137 | - This script automatically changes the `Processor performance boost mode` plan according to the processor brand (AMD/Intel) and computer type (Notebook/Desktop). 138 | 139 | You can easily change this option by accessing the steps below: 140 | 1. Open Command Prompt: `hold down the Windows Key, and Press R` on your keyboard. 141 | 2. Type `power` in the window and press Enter. 142 | 3. Click on the `Change advanced power settings` option and scroll down to the `Processor power management` tab. The default state is `Aggressive` . 143 | 4. Follow the on-screen options to change and click on the `Apply` button. It is not necessary to restart the device. 144 | 145 | ![power.png](README/power.png) 146 | 147 | 148 | ## **Known issues** 149 | 150 | When trying to change a specific key when using an Azure Active Directory account. 151 | 152 | The problem is easily worked around by performing this modification manually using `Regedit`. 153 | 154 | 155 | ## **Undo changes** 156 | 157 | ### Reverse the entire script 158 | 159 | Based on my "limited" knowledge acquired over the years as a user, I do not believe that reversing function by function will bring your operating system to the previous state with the same behaviour in all its details. 160 | I have always witnessed several inconsistencies using this approach in addition to spending many hours trying to solve this. 161 | 162 | Based on the above, I find it advisable (which is why this built-in tool exists in Windows) to perform a **System Restore Point** before executing this script. 163 | 164 | To revert the entire script, follow these steps: 165 | 166 | 1. Open Command Prompt `hold down the Windows Key, and Press R` on your keyboard. 167 | 2. Type `rstrui.exe` in the window, and then press Enter. 168 | 3. Find a restore point with a name like `System Restore Point dated 00/00/0000 00:00:00 before running facet4 script`. It should be the newest restore point there. 169 | 4. Follow the on-screen instructions to complete the system restore. 170 | 171 | ### Revert functions 172 | 173 | To undo the effects of a specific function, you can write and add a complementary function that restores the original behavior and append it to the current file. 174 | 175 | The code at the end of each instruction contains the default values for Windows 11 22H2 and Windows 10 LTSC 21H2 distributions. 176 | 177 | You are welcome to experiment and modify the functions as you wish. 178 | 179 | ## **Final considerations** 180 | 181 | If you understand what you are doing, consider downloading and running Microsoft Autoruns to check your system. 182 | 183 | This utility, which has the most comprehensive knowledge of auto-starting locations of any startup monitor, shows you what programs are configured to run during system bootup or login, and when you start various built-in Windows applications like Internet Explorer, Explorer and media players. These programs and drivers include ones in your startup folder, Run, RunOnce, and other Registry keys. Autoruns reports Explorer shell extensions, toolbars, browser helper objects, Winlogon notifications, auto-start services, and much more. Autoruns goes way beyond other autostart utilities. 184 | 185 | https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns 186 | 187 | ![autoruns_v13.png](README/autoruns_v13.png) 188 | 189 | 190 | #### After executing this script, I recommend the following steps to achieve an optimized experience. It's advisable to conduct thorough research before implementing any changes, and please be aware that any alterations are at your own risk. The author cannot be held accountable for any issues or damages that may arise. 191 | 192 | #### 1.Adjust Memory Command Rate: Explore the BIOS settings for your memory and locate the "Command Rate" or similar settings such as "Nmode." Change the value from 2T to 1T. This adjustment can lead to a perceptible improved performance. 193 | 194 | ![CommandRate.png](README/CommandRate.png) 195 | 196 | 197 | #### 2.Modify "DDR Power Down Mode": Within the BIOS, find settings like "DDR PowerDown and idle counter" related to power management. Switch from "Auto" or "Enabled/BIOS" to "Disabled/PCODE." This change can contribute to better system responsiveness. Reduces, in most cases, ~8% of memory latency. 198 | 199 | #### 3.Enhance GPU Performance: If using a first-rate video card, investigate whether it supports "Above 4G Decoding" or "Resizable BAR." If compatible, research the process to enable this feature on your motherboard. It enhances graphics performance a lot. 200 | 201 | ![Above4G.png](README/Above4G.png) 202 | 203 | 204 | #### 4.Explore RAID Configuration: For users with an AMD Ryzen platform, it's worth exploring the possibility of utilizing RAID 0 for SATA or NVMe devices. Even notebooks with locked BIOS and two NVMe ports might support this `unofficially`. Search how to implement this configuration for improved storage performance. It's pure luxury, but it is fantastic! 205 | 206 | ![Omen-Raid0.png](README/Omen-Raid0.png) 207 | 208 | 209 | 210 | #### 5.Enable Message Signaled Interrupts. Be aware that enabling MSI for a driver without support will break your Windows! 211 | 212 | ![MSI.png](README/MSI.png) 213 | 214 | 215 | 216 | #### 6.And lastly, don't forget, if it's a fresh install of the operating system, select "English (World)" as the time zone; it pretty much solves the initial bloatware problem on your new Windows. This does not apply to the LTSC or IoT distros, as it already comes with reduced OS footprint. Credits to mastermind @ThioJoe! 217 | 218 | ![ThioJoe.png](README/ThioJoe.png) 219 | 220 | 221 | #### Following these guidelines can significantly optimize your system's performance after running this script. Remember to conduct in-depth research and understand the potential implications of each modification before proceeding. Your own discretion and caution are advised, as the author takes no responsibility for any adverse outcomes. 222 | 223 | ## **Thanks To** 224 | 225 | The thousands of people who actively contribute to forums, websites and communities, making their knowledge available; without this, it would not be possible to waste/spend dozens of hours trying to learn things like this. 226 | 227 | I leave my thanks. 228 | -------------------------------------------------------------------------------- /README/Above4G.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/Above4G.png -------------------------------------------------------------------------------- /README/CommandRate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/CommandRate.png -------------------------------------------------------------------------------- /README/MSI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/MSI.png -------------------------------------------------------------------------------- /README/Omen-Raid0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/Omen-Raid0.png -------------------------------------------------------------------------------- /README/ThioJoe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/ThioJoe.png -------------------------------------------------------------------------------- /README/autoruns_v13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/autoruns_v13.png -------------------------------------------------------------------------------- /README/cpu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/cpu.png -------------------------------------------------------------------------------- /README/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/logo.png -------------------------------------------------------------------------------- /README/mem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/mem.png -------------------------------------------------------------------------------- /README/power.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/power.png -------------------------------------------------------------------------------- /README/todownload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README/todownload.png -------------------------------------------------------------------------------- /README_files/libs/bootstrap/bootstrap-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hermannheringer/facet4windows/d9b5e5b480c5f0f4deb9c3053d9a8eef675ad8d3/README_files/libs/bootstrap/bootstrap-icons.woff -------------------------------------------------------------------------------- /README_files/libs/clipboard/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.11 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1.anchorjs-link,.anchorjs-link:focus{opacity:1}",A.sheet.cssRules.length),A.sheet.insertRule("[data-anchorjs-icon]::after{content:attr(data-anchorjs-icon)}",A.sheet.cssRules.length),A.sheet.insertRule('@font-face{font-family:anchorjs-icons;src:url(data:n/a;base64,AAEAAAALAIAAAwAwT1MvMg8yG2cAAAE4AAAAYGNtYXDp3gC3AAABpAAAAExnYXNwAAAAEAAAA9wAAAAIZ2x5ZlQCcfwAAAH4AAABCGhlYWQHFvHyAAAAvAAAADZoaGVhBnACFwAAAPQAAAAkaG10eASAADEAAAGYAAAADGxvY2EACACEAAAB8AAAAAhtYXhwAAYAVwAAARgAAAAgbmFtZQGOH9cAAAMAAAAAunBvc3QAAwAAAAADvAAAACAAAQAAAAEAAHzE2p9fDzz1AAkEAAAAAADRecUWAAAAANQA6R8AAAAAAoACwAAAAAgAAgAAAAAAAAABAAADwP/AAAACgAAA/9MCrQABAAAAAAAAAAAAAAAAAAAAAwABAAAAAwBVAAIAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAMCQAGQAAUAAAKZAswAAACPApkCzAAAAesAMwEJAAAAAAAAAAAAAAAAAAAAARAAAAAAAAAAAAAAAAAAAAAAQAAg//0DwP/AAEADwABAAAAAAQAAAAAAAAAAAAAAIAAAAAAAAAIAAAACgAAxAAAAAwAAAAMAAAAcAAEAAwAAABwAAwABAAAAHAAEADAAAAAIAAgAAgAAACDpy//9//8AAAAg6cv//f///+EWNwADAAEAAAAAAAAAAAAAAAAACACEAAEAAAAAAAAAAAAAAAAxAAACAAQARAKAAsAAKwBUAAABIiYnJjQ3NzY2MzIWFxYUBwcGIicmNDc3NjQnJiYjIgYHBwYUFxYUBwYGIwciJicmNDc3NjIXFhQHBwYUFxYWMzI2Nzc2NCcmNDc2MhcWFAcHBgYjARQGDAUtLXoWOR8fORYtLTgKGwoKCjgaGg0gEhIgDXoaGgkJBQwHdR85Fi0tOAobCgoKOBoaDSASEiANehoaCQkKGwotLXoWOR8BMwUFLYEuehYXFxYugC44CQkKGwo4GkoaDQ0NDXoaShoKGwoFBe8XFi6ALjgJCQobCjgaShoNDQ0NehpKGgobCgoKLYEuehYXAAAADACWAAEAAAAAAAEACAAAAAEAAAAAAAIAAwAIAAEAAAAAAAMACAAAAAEAAAAAAAQACAAAAAEAAAAAAAUAAQALAAEAAAAAAAYACAAAAAMAAQQJAAEAEAAMAAMAAQQJAAIABgAcAAMAAQQJAAMAEAAMAAMAAQQJAAQAEAAMAAMAAQQJAAUAAgAiAAMAAQQJAAYAEAAMYW5jaG9yanM0MDBAAGEAbgBjAGgAbwByAGoAcwA0ADAAMABAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAH//wAP) format("truetype")}',A.sheet.cssRules.length)),h=document.querySelectorAll("[id]"),t=[].map.call(h,function(A){return A.id}),i=0;i\]./()*\\\n\t\b\v\u00A0]/g,"-").replace(/-{2,}/g,"-").substring(0,this.options.truncate).replace(/^-+|-+$/gm,"").toLowerCase()},this.hasAnchorJSLink=function(A){var e=A.firstChild&&-1<(" "+A.firstChild.className+" ").indexOf(" anchorjs-link "),A=A.lastChild&&-1<(" "+A.lastChild.className+" ").indexOf(" anchorjs-link ");return e||A||!1}}}); 9 | // @license-end -------------------------------------------------------------------------------- /README_files/libs/quarto-html/popper.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @popperjs/core v2.11.7 - MIT License 3 | */ 4 | 5 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands&&Array.isArray(e.brands)?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function x(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:x(b(e))}function w(e,n){var r;void 0===n&&(n=[]);var o=x(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(w(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=w(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,x=Y("number"!=typeof b?b:G(b,k)),w=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?w:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+x.top,bottom:B.bottom-E.bottom+x.bottom,left:E.left-B.left+x.left,right:B.right-E.right+x.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),x=t.rects.reference,w=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;x[S]>w[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),x=C(t.placement),w=U(t.placement),O=!w,j=z(x),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=w===W?B[_]:H[_],Q=w===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(x),xe=null!=(ue=null==S?void 0:S[M])?ue:0,we=be?ye:me-B[ve]-H[ve]-xe+R.altAxis,Oe=be?me+B[ve]+H[ve]-xe-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(we,me,Oe):de(m?we:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,x=p[l],w=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(x,O,w),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),xe=[ee,te,oe,ie,ae,le,he,me,ge],we=Z({defaultModifiers:xe});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=we,e.createPopperLite=be,e.defaultModifiers=xe,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})})); 6 | 7 | -------------------------------------------------------------------------------- /README_files/libs/quarto-html/quarto-syntax-highlighting.css: -------------------------------------------------------------------------------- 1 | /* quarto syntax highlight colors */ 2 | :root { 3 | --quarto-hl-ot-color: #003B4F; 4 | --quarto-hl-at-color: #657422; 5 | --quarto-hl-ss-color: #20794D; 6 | --quarto-hl-an-color: #5E5E5E; 7 | --quarto-hl-fu-color: #4758AB; 8 | --quarto-hl-st-color: #20794D; 9 | --quarto-hl-cf-color: #003B4F; 10 | --quarto-hl-op-color: #5E5E5E; 11 | --quarto-hl-er-color: #AD0000; 12 | --quarto-hl-bn-color: #AD0000; 13 | --quarto-hl-al-color: #AD0000; 14 | --quarto-hl-va-color: #111111; 15 | --quarto-hl-bu-color: inherit; 16 | --quarto-hl-ex-color: inherit; 17 | --quarto-hl-pp-color: #AD0000; 18 | --quarto-hl-in-color: #5E5E5E; 19 | --quarto-hl-vs-color: #20794D; 20 | --quarto-hl-wa-color: #5E5E5E; 21 | --quarto-hl-do-color: #5E5E5E; 22 | --quarto-hl-im-color: #00769E; 23 | --quarto-hl-ch-color: #20794D; 24 | --quarto-hl-dt-color: #AD0000; 25 | --quarto-hl-fl-color: #AD0000; 26 | --quarto-hl-co-color: #5E5E5E; 27 | --quarto-hl-cv-color: #5E5E5E; 28 | --quarto-hl-cn-color: #8f5902; 29 | --quarto-hl-sc-color: #5E5E5E; 30 | --quarto-hl-dv-color: #AD0000; 31 | --quarto-hl-kw-color: #003B4F; 32 | } 33 | 34 | /* other quarto variables */ 35 | :root { 36 | --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 37 | } 38 | 39 | pre > code.sourceCode > span { 40 | color: #003B4F; 41 | } 42 | 43 | code span { 44 | color: #003B4F; 45 | } 46 | 47 | code.sourceCode > span { 48 | color: #003B4F; 49 | } 50 | 51 | div.sourceCode, 52 | div.sourceCode pre.sourceCode { 53 | color: #003B4F; 54 | } 55 | 56 | code span.ot { 57 | color: #003B4F; 58 | font-style: inherit; 59 | } 60 | 61 | code span.at { 62 | color: #657422; 63 | font-style: inherit; 64 | } 65 | 66 | code span.ss { 67 | color: #20794D; 68 | font-style: inherit; 69 | } 70 | 71 | code span.an { 72 | color: #5E5E5E; 73 | font-style: inherit; 74 | } 75 | 76 | code span.fu { 77 | color: #4758AB; 78 | font-style: inherit; 79 | } 80 | 81 | code span.st { 82 | color: #20794D; 83 | font-style: inherit; 84 | } 85 | 86 | code span.cf { 87 | color: #003B4F; 88 | font-weight: bold; 89 | font-style: inherit; 90 | } 91 | 92 | code span.op { 93 | color: #5E5E5E; 94 | font-style: inherit; 95 | } 96 | 97 | code span.er { 98 | color: #AD0000; 99 | font-style: inherit; 100 | } 101 | 102 | code span.bn { 103 | color: #AD0000; 104 | font-style: inherit; 105 | } 106 | 107 | code span.al { 108 | color: #AD0000; 109 | font-style: inherit; 110 | } 111 | 112 | code span.va { 113 | color: #111111; 114 | font-style: inherit; 115 | } 116 | 117 | code span.bu { 118 | font-style: inherit; 119 | } 120 | 121 | code span.ex { 122 | font-style: inherit; 123 | } 124 | 125 | code span.pp { 126 | color: #AD0000; 127 | font-style: inherit; 128 | } 129 | 130 | code span.in { 131 | color: #5E5E5E; 132 | font-style: inherit; 133 | } 134 | 135 | code span.vs { 136 | color: #20794D; 137 | font-style: inherit; 138 | } 139 | 140 | code span.wa { 141 | color: #5E5E5E; 142 | font-style: italic; 143 | } 144 | 145 | code span.do { 146 | color: #5E5E5E; 147 | font-style: italic; 148 | } 149 | 150 | code span.im { 151 | color: #00769E; 152 | font-style: inherit; 153 | } 154 | 155 | code span.ch { 156 | color: #20794D; 157 | font-style: inherit; 158 | } 159 | 160 | code span.dt { 161 | color: #AD0000; 162 | font-style: inherit; 163 | } 164 | 165 | code span.fl { 166 | color: #AD0000; 167 | font-style: inherit; 168 | } 169 | 170 | code span.co { 171 | color: #5E5E5E; 172 | font-style: inherit; 173 | } 174 | 175 | code span.cv { 176 | color: #5E5E5E; 177 | font-style: italic; 178 | } 179 | 180 | code span.cn { 181 | color: #8f5902; 182 | font-style: inherit; 183 | } 184 | 185 | code span.sc { 186 | color: #5E5E5E; 187 | font-style: inherit; 188 | } 189 | 190 | code span.dv { 191 | color: #AD0000; 192 | font-style: inherit; 193 | } 194 | 195 | code span.kw { 196 | color: #003B4F; 197 | font-weight: bold; 198 | font-style: inherit; 199 | } 200 | 201 | .prevent-inlining { 202 | content: " { 9 | // Find any conflicting margin elements and add margins to the 10 | // top to prevent overlap 11 | const marginChildren = window.document.querySelectorAll( 12 | ".column-margin.column-container > *, .margin-caption, .aside" 13 | ); 14 | 15 | let lastBottom = 0; 16 | for (const marginChild of marginChildren) { 17 | if (marginChild.offsetParent !== null) { 18 | // clear the top margin so we recompute it 19 | marginChild.style.marginTop = null; 20 | const top = marginChild.getBoundingClientRect().top + window.scrollY; 21 | if (top < lastBottom) { 22 | const marginChildStyle = window.getComputedStyle(marginChild); 23 | const marginBottom = parseFloat(marginChildStyle["marginBottom"]); 24 | const margin = lastBottom - top + marginBottom; 25 | marginChild.style.marginTop = `${margin}px`; 26 | } 27 | const styles = window.getComputedStyle(marginChild); 28 | const marginTop = parseFloat(styles["marginTop"]); 29 | lastBottom = top + marginChild.getBoundingClientRect().height + marginTop; 30 | } 31 | } 32 | }; 33 | 34 | window.document.addEventListener("DOMContentLoaded", function (_event) { 35 | // Recompute the position of margin elements anytime the body size changes 36 | if (window.ResizeObserver) { 37 | const resizeObserver = new window.ResizeObserver( 38 | throttle(() => { 39 | layoutMarginEls(); 40 | if ( 41 | window.document.body.getBoundingClientRect().width < 990 && 42 | isReaderMode() 43 | ) { 44 | quartoToggleReader(); 45 | } 46 | }, 50) 47 | ); 48 | resizeObserver.observe(window.document.body); 49 | } 50 | 51 | const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]'); 52 | const sidebarEl = window.document.getElementById("quarto-sidebar"); 53 | const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left"); 54 | const marginSidebarEl = window.document.getElementById( 55 | "quarto-margin-sidebar" 56 | ); 57 | // function to determine whether the element has a previous sibling that is active 58 | const prevSiblingIsActiveLink = (el) => { 59 | const sibling = el.previousElementSibling; 60 | if (sibling && sibling.tagName === "A") { 61 | return sibling.classList.contains("active"); 62 | } else { 63 | return false; 64 | } 65 | }; 66 | 67 | // fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior) 68 | function fireSlideEnter(e) { 69 | const event = window.document.createEvent("Event"); 70 | event.initEvent("slideenter", true, true); 71 | window.document.dispatchEvent(event); 72 | } 73 | const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]'); 74 | tabs.forEach((tab) => { 75 | tab.addEventListener("shown.bs.tab", fireSlideEnter); 76 | }); 77 | 78 | // fire slideEnter for tabby tab activations (for htmlwidget resize behavior) 79 | document.addEventListener("tabby", fireSlideEnter, false); 80 | 81 | // Track scrolling and mark TOC links as active 82 | // get table of contents and sidebar (bail if we don't have at least one) 83 | const tocLinks = tocEl 84 | ? [...tocEl.querySelectorAll("a[data-scroll-target]")] 85 | : []; 86 | const makeActive = (link) => tocLinks[link].classList.add("active"); 87 | const removeActive = (link) => tocLinks[link].classList.remove("active"); 88 | const removeAllActive = () => 89 | [...Array(tocLinks.length).keys()].forEach((link) => removeActive(link)); 90 | 91 | // activate the anchor for a section associated with this TOC entry 92 | tocLinks.forEach((link) => { 93 | link.addEventListener("click", () => { 94 | if (link.href.indexOf("#") !== -1) { 95 | const anchor = link.href.split("#")[1]; 96 | const heading = window.document.querySelector( 97 | `[data-anchor-id="${anchor}"]` 98 | ); 99 | if (heading) { 100 | // Add the class 101 | heading.classList.add("reveal-anchorjs-link"); 102 | 103 | // function to show the anchor 104 | const handleMouseout = () => { 105 | heading.classList.remove("reveal-anchorjs-link"); 106 | heading.removeEventListener("mouseout", handleMouseout); 107 | }; 108 | 109 | // add a function to clear the anchor when the user mouses out of it 110 | heading.addEventListener("mouseout", handleMouseout); 111 | } 112 | } 113 | }); 114 | }); 115 | 116 | const sections = tocLinks.map((link) => { 117 | const target = link.getAttribute("data-scroll-target"); 118 | if (target.startsWith("#")) { 119 | return window.document.getElementById(decodeURI(`${target.slice(1)}`)); 120 | } else { 121 | return window.document.querySelector(decodeURI(`${target}`)); 122 | } 123 | }); 124 | 125 | const sectionMargin = 200; 126 | let currentActive = 0; 127 | // track whether we've initialized state the first time 128 | let init = false; 129 | 130 | const updateActiveLink = () => { 131 | // The index from bottom to top (e.g. reversed list) 132 | let sectionIndex = -1; 133 | if ( 134 | window.innerHeight + window.pageYOffset >= 135 | window.document.body.offsetHeight 136 | ) { 137 | // This is the no-scroll case where last section should be the active one 138 | sectionIndex = 0; 139 | } else { 140 | // This finds the last section visible on screen that should be made active 141 | sectionIndex = [...sections].reverse().findIndex((section) => { 142 | if (section) { 143 | return window.pageYOffset >= section.offsetTop - sectionMargin; 144 | } else { 145 | return false; 146 | } 147 | }); 148 | } 149 | if (sectionIndex > -1) { 150 | const current = sections.length - sectionIndex - 1; 151 | if (current !== currentActive) { 152 | removeAllActive(); 153 | currentActive = current; 154 | makeActive(current); 155 | if (init) { 156 | window.dispatchEvent(sectionChanged); 157 | } 158 | init = true; 159 | } 160 | } 161 | }; 162 | 163 | const inHiddenRegion = (top, bottom, hiddenRegions) => { 164 | for (const region of hiddenRegions) { 165 | if (top <= region.bottom && bottom >= region.top) { 166 | return true; 167 | } 168 | } 169 | return false; 170 | }; 171 | 172 | const categorySelector = "header.quarto-title-block .quarto-category"; 173 | const activateCategories = (href) => { 174 | // Find any categories 175 | // Surround them with a link pointing back to: 176 | // #category=Authoring 177 | try { 178 | const categoryEls = window.document.querySelectorAll(categorySelector); 179 | for (const categoryEl of categoryEls) { 180 | const categoryText = categoryEl.textContent; 181 | if (categoryText) { 182 | const link = `${href}#category=${encodeURIComponent(categoryText)}`; 183 | const linkEl = window.document.createElement("a"); 184 | linkEl.setAttribute("href", link); 185 | for (const child of categoryEl.childNodes) { 186 | linkEl.append(child); 187 | } 188 | categoryEl.appendChild(linkEl); 189 | } 190 | } 191 | } catch { 192 | // Ignore errors 193 | } 194 | }; 195 | function hasTitleCategories() { 196 | return window.document.querySelector(categorySelector) !== null; 197 | } 198 | 199 | function offsetRelativeUrl(url) { 200 | const offset = getMeta("quarto:offset"); 201 | return offset ? offset + url : url; 202 | } 203 | 204 | function offsetAbsoluteUrl(url) { 205 | const offset = getMeta("quarto:offset"); 206 | const baseUrl = new URL(offset, window.location); 207 | 208 | const projRelativeUrl = url.replace(baseUrl, ""); 209 | if (projRelativeUrl.startsWith("/")) { 210 | return projRelativeUrl; 211 | } else { 212 | return "/" + projRelativeUrl; 213 | } 214 | } 215 | 216 | // read a meta tag value 217 | function getMeta(metaName) { 218 | const metas = window.document.getElementsByTagName("meta"); 219 | for (let i = 0; i < metas.length; i++) { 220 | if (metas[i].getAttribute("name") === metaName) { 221 | return metas[i].getAttribute("content"); 222 | } 223 | } 224 | return ""; 225 | } 226 | 227 | async function findAndActivateCategories() { 228 | const currentPagePath = offsetAbsoluteUrl(window.location.href); 229 | const response = await fetch(offsetRelativeUrl("listings.json")); 230 | if (response.status == 200) { 231 | return response.json().then(function (listingPaths) { 232 | const listingHrefs = []; 233 | for (const listingPath of listingPaths) { 234 | const pathWithoutLeadingSlash = listingPath.listing.substring(1); 235 | for (const item of listingPath.items) { 236 | if ( 237 | item === currentPagePath || 238 | item === currentPagePath + "index.html" 239 | ) { 240 | // Resolve this path against the offset to be sure 241 | // we already are using the correct path to the listing 242 | // (this adjusts the listing urls to be rooted against 243 | // whatever root the page is actually running against) 244 | const relative = offsetRelativeUrl(pathWithoutLeadingSlash); 245 | const baseUrl = window.location; 246 | const resolvedPath = new URL(relative, baseUrl); 247 | listingHrefs.push(resolvedPath.pathname); 248 | break; 249 | } 250 | } 251 | } 252 | 253 | // Look up the tree for a nearby linting and use that if we find one 254 | const nearestListing = findNearestParentListing( 255 | offsetAbsoluteUrl(window.location.pathname), 256 | listingHrefs 257 | ); 258 | if (nearestListing) { 259 | activateCategories(nearestListing); 260 | } else { 261 | // See if the referrer is a listing page for this item 262 | const referredRelativePath = offsetAbsoluteUrl(document.referrer); 263 | const referrerListing = listingHrefs.find((listingHref) => { 264 | const isListingReferrer = 265 | listingHref === referredRelativePath || 266 | listingHref === referredRelativePath + "index.html"; 267 | return isListingReferrer; 268 | }); 269 | 270 | if (referrerListing) { 271 | // Try to use the referrer if possible 272 | activateCategories(referrerListing); 273 | } else if (listingHrefs.length > 0) { 274 | // Otherwise, just fall back to the first listing 275 | activateCategories(listingHrefs[0]); 276 | } 277 | } 278 | }); 279 | } 280 | } 281 | if (hasTitleCategories()) { 282 | findAndActivateCategories(); 283 | } 284 | 285 | const findNearestParentListing = (href, listingHrefs) => { 286 | if (!href || !listingHrefs) { 287 | return undefined; 288 | } 289 | // Look up the tree for a nearby linting and use that if we find one 290 | const relativeParts = href.substring(1).split("/"); 291 | while (relativeParts.length > 0) { 292 | const path = relativeParts.join("/"); 293 | for (const listingHref of listingHrefs) { 294 | if (listingHref.startsWith(path)) { 295 | return listingHref; 296 | } 297 | } 298 | relativeParts.pop(); 299 | } 300 | 301 | return undefined; 302 | }; 303 | 304 | const manageSidebarVisiblity = (el, placeholderDescriptor) => { 305 | let isVisible = true; 306 | let elRect; 307 | 308 | return (hiddenRegions) => { 309 | if (el === null) { 310 | return; 311 | } 312 | 313 | // Find the last element of the TOC 314 | const lastChildEl = el.lastElementChild; 315 | 316 | if (lastChildEl) { 317 | // Converts the sidebar to a menu 318 | const convertToMenu = () => { 319 | for (const child of el.children) { 320 | child.style.opacity = 0; 321 | child.style.overflow = "hidden"; 322 | child.style.pointerEvents = "none"; 323 | } 324 | 325 | nexttick(() => { 326 | const toggleContainer = window.document.createElement("div"); 327 | toggleContainer.style.width = "100%"; 328 | toggleContainer.classList.add("zindex-over-content"); 329 | toggleContainer.classList.add("quarto-sidebar-toggle"); 330 | toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom 331 | toggleContainer.id = placeholderDescriptor.id; 332 | toggleContainer.style.position = "fixed"; 333 | 334 | const toggleIcon = window.document.createElement("i"); 335 | toggleIcon.classList.add("quarto-sidebar-toggle-icon"); 336 | toggleIcon.classList.add("bi"); 337 | toggleIcon.classList.add("bi-caret-down-fill"); 338 | 339 | const toggleTitle = window.document.createElement("div"); 340 | const titleEl = window.document.body.querySelector( 341 | placeholderDescriptor.titleSelector 342 | ); 343 | if (titleEl) { 344 | toggleTitle.append( 345 | titleEl.textContent || titleEl.innerText, 346 | toggleIcon 347 | ); 348 | } 349 | toggleTitle.classList.add("zindex-over-content"); 350 | toggleTitle.classList.add("quarto-sidebar-toggle-title"); 351 | toggleContainer.append(toggleTitle); 352 | 353 | const toggleContents = window.document.createElement("div"); 354 | toggleContents.classList = el.classList; 355 | toggleContents.classList.add("zindex-over-content"); 356 | toggleContents.classList.add("quarto-sidebar-toggle-contents"); 357 | for (const child of el.children) { 358 | if (child.id === "toc-title") { 359 | continue; 360 | } 361 | 362 | const clone = child.cloneNode(true); 363 | clone.style.opacity = 1; 364 | clone.style.pointerEvents = null; 365 | clone.style.display = null; 366 | toggleContents.append(clone); 367 | } 368 | toggleContents.style.height = "0px"; 369 | const positionToggle = () => { 370 | // position the element (top left of parent, same width as parent) 371 | if (!elRect) { 372 | elRect = el.getBoundingClientRect(); 373 | } 374 | toggleContainer.style.left = `${elRect.left}px`; 375 | toggleContainer.style.top = `${elRect.top}px`; 376 | toggleContainer.style.width = `${elRect.width}px`; 377 | }; 378 | positionToggle(); 379 | 380 | toggleContainer.append(toggleContents); 381 | el.parentElement.prepend(toggleContainer); 382 | 383 | // Process clicks 384 | let tocShowing = false; 385 | // Allow the caller to control whether this is dismissed 386 | // when it is clicked (e.g. sidebar navigation supports 387 | // opening and closing the nav tree, so don't dismiss on click) 388 | const clickEl = placeholderDescriptor.dismissOnClick 389 | ? toggleContainer 390 | : toggleTitle; 391 | 392 | const closeToggle = () => { 393 | if (tocShowing) { 394 | toggleContainer.classList.remove("expanded"); 395 | toggleContents.style.height = "0px"; 396 | tocShowing = false; 397 | } 398 | }; 399 | 400 | // Get rid of any expanded toggle if the user scrolls 401 | window.document.addEventListener( 402 | "scroll", 403 | throttle(() => { 404 | closeToggle(); 405 | }, 50) 406 | ); 407 | 408 | // Handle positioning of the toggle 409 | window.addEventListener( 410 | "resize", 411 | throttle(() => { 412 | elRect = undefined; 413 | positionToggle(); 414 | }, 50) 415 | ); 416 | 417 | window.addEventListener("quarto-hrChanged", () => { 418 | elRect = undefined; 419 | }); 420 | 421 | // Process the click 422 | clickEl.onclick = () => { 423 | if (!tocShowing) { 424 | toggleContainer.classList.add("expanded"); 425 | toggleContents.style.height = null; 426 | tocShowing = true; 427 | } else { 428 | closeToggle(); 429 | } 430 | }; 431 | }); 432 | }; 433 | 434 | // Converts a sidebar from a menu back to a sidebar 435 | const convertToSidebar = () => { 436 | for (const child of el.children) { 437 | child.style.opacity = 1; 438 | child.style.overflow = null; 439 | child.style.pointerEvents = null; 440 | } 441 | 442 | const placeholderEl = window.document.getElementById( 443 | placeholderDescriptor.id 444 | ); 445 | if (placeholderEl) { 446 | placeholderEl.remove(); 447 | } 448 | 449 | el.classList.remove("rollup"); 450 | }; 451 | 452 | if (isReaderMode()) { 453 | convertToMenu(); 454 | isVisible = false; 455 | } else { 456 | // Find the top and bottom o the element that is being managed 457 | const elTop = el.offsetTop; 458 | const elBottom = 459 | elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight; 460 | 461 | if (!isVisible) { 462 | // If the element is current not visible reveal if there are 463 | // no conflicts with overlay regions 464 | if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) { 465 | convertToSidebar(); 466 | isVisible = true; 467 | } 468 | } else { 469 | // If the element is visible, hide it if it conflicts with overlay regions 470 | // and insert a placeholder toggle (or if we're in reader mode) 471 | if (inHiddenRegion(elTop, elBottom, hiddenRegions)) { 472 | convertToMenu(); 473 | isVisible = false; 474 | } 475 | } 476 | } 477 | } 478 | }; 479 | }; 480 | 481 | const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]'); 482 | for (const tabEl of tabEls) { 483 | const id = tabEl.getAttribute("data-bs-target"); 484 | if (id) { 485 | const columnEl = document.querySelector( 486 | `${id} .column-margin, .tabset-margin-content` 487 | ); 488 | if (columnEl) 489 | tabEl.addEventListener("shown.bs.tab", function (event) { 490 | const el = event.srcElement; 491 | if (el) { 492 | const visibleCls = `${el.id}-margin-content`; 493 | // walk up until we find a parent tabset 494 | let panelTabsetEl = el.parentElement; 495 | while (panelTabsetEl) { 496 | if (panelTabsetEl.classList.contains("panel-tabset")) { 497 | break; 498 | } 499 | panelTabsetEl = panelTabsetEl.parentElement; 500 | } 501 | 502 | if (panelTabsetEl) { 503 | const prevSib = panelTabsetEl.previousElementSibling; 504 | if ( 505 | prevSib && 506 | prevSib.classList.contains("tabset-margin-container") 507 | ) { 508 | const childNodes = prevSib.querySelectorAll( 509 | ".tabset-margin-content" 510 | ); 511 | for (const childEl of childNodes) { 512 | if (childEl.classList.contains(visibleCls)) { 513 | childEl.classList.remove("collapse"); 514 | } else { 515 | childEl.classList.add("collapse"); 516 | } 517 | } 518 | } 519 | } 520 | } 521 | 522 | layoutMarginEls(); 523 | }); 524 | } 525 | } 526 | 527 | // Manage the visibility of the toc and the sidebar 528 | const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, { 529 | id: "quarto-toc-toggle", 530 | titleSelector: "#toc-title", 531 | dismissOnClick: true, 532 | }); 533 | const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, { 534 | id: "quarto-sidebarnav-toggle", 535 | titleSelector: ".title", 536 | dismissOnClick: false, 537 | }); 538 | let tocLeftScrollVisibility; 539 | if (leftTocEl) { 540 | tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, { 541 | id: "quarto-lefttoc-toggle", 542 | titleSelector: "#toc-title", 543 | dismissOnClick: true, 544 | }); 545 | } 546 | 547 | // Find the first element that uses formatting in special columns 548 | const conflictingEls = window.document.body.querySelectorAll( 549 | '[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]' 550 | ); 551 | 552 | // Filter all the possibly conflicting elements into ones 553 | // the do conflict on the left or ride side 554 | const arrConflictingEls = Array.from(conflictingEls); 555 | const leftSideConflictEls = arrConflictingEls.filter((el) => { 556 | if (el.tagName === "ASIDE") { 557 | return false; 558 | } 559 | return Array.from(el.classList).find((className) => { 560 | return ( 561 | className !== "column-body" && 562 | className.startsWith("column-") && 563 | !className.endsWith("right") && 564 | !className.endsWith("container") && 565 | className !== "column-margin" 566 | ); 567 | }); 568 | }); 569 | const rightSideConflictEls = arrConflictingEls.filter((el) => { 570 | if (el.tagName === "ASIDE") { 571 | return true; 572 | } 573 | 574 | const hasMarginCaption = Array.from(el.classList).find((className) => { 575 | return className == "margin-caption"; 576 | }); 577 | if (hasMarginCaption) { 578 | return true; 579 | } 580 | 581 | return Array.from(el.classList).find((className) => { 582 | return ( 583 | className !== "column-body" && 584 | !className.endsWith("container") && 585 | className.startsWith("column-") && 586 | !className.endsWith("left") 587 | ); 588 | }); 589 | }); 590 | 591 | const kOverlapPaddingSize = 10; 592 | function toRegions(els) { 593 | return els.map((el) => { 594 | const boundRect = el.getBoundingClientRect(); 595 | const top = 596 | boundRect.top + 597 | document.documentElement.scrollTop - 598 | kOverlapPaddingSize; 599 | return { 600 | top, 601 | bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize, 602 | }; 603 | }); 604 | } 605 | 606 | let hasObserved = false; 607 | const visibleItemObserver = (els) => { 608 | let visibleElements = [...els]; 609 | const intersectionObserver = new IntersectionObserver( 610 | (entries, _observer) => { 611 | entries.forEach((entry) => { 612 | if (entry.isIntersecting) { 613 | if (visibleElements.indexOf(entry.target) === -1) { 614 | visibleElements.push(entry.target); 615 | } 616 | } else { 617 | visibleElements = visibleElements.filter((visibleEntry) => { 618 | return visibleEntry !== entry; 619 | }); 620 | } 621 | }); 622 | 623 | if (!hasObserved) { 624 | hideOverlappedSidebars(); 625 | } 626 | hasObserved = true; 627 | }, 628 | {} 629 | ); 630 | els.forEach((el) => { 631 | intersectionObserver.observe(el); 632 | }); 633 | 634 | return { 635 | getVisibleEntries: () => { 636 | return visibleElements; 637 | }, 638 | }; 639 | }; 640 | 641 | const rightElementObserver = visibleItemObserver(rightSideConflictEls); 642 | const leftElementObserver = visibleItemObserver(leftSideConflictEls); 643 | 644 | const hideOverlappedSidebars = () => { 645 | marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries())); 646 | sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries())); 647 | if (tocLeftScrollVisibility) { 648 | tocLeftScrollVisibility( 649 | toRegions(leftElementObserver.getVisibleEntries()) 650 | ); 651 | } 652 | }; 653 | 654 | window.quartoToggleReader = () => { 655 | // Applies a slow class (or removes it) 656 | // to update the transition speed 657 | const slowTransition = (slow) => { 658 | const manageTransition = (id, slow) => { 659 | const el = document.getElementById(id); 660 | if (el) { 661 | if (slow) { 662 | el.classList.add("slow"); 663 | } else { 664 | el.classList.remove("slow"); 665 | } 666 | } 667 | }; 668 | 669 | manageTransition("TOC", slow); 670 | manageTransition("quarto-sidebar", slow); 671 | }; 672 | const readerMode = !isReaderMode(); 673 | setReaderModeValue(readerMode); 674 | 675 | // If we're entering reader mode, slow the transition 676 | if (readerMode) { 677 | slowTransition(readerMode); 678 | } 679 | highlightReaderToggle(readerMode); 680 | hideOverlappedSidebars(); 681 | 682 | // If we're exiting reader mode, restore the non-slow transition 683 | if (!readerMode) { 684 | slowTransition(!readerMode); 685 | } 686 | }; 687 | 688 | const highlightReaderToggle = (readerMode) => { 689 | const els = document.querySelectorAll(".quarto-reader-toggle"); 690 | if (els) { 691 | els.forEach((el) => { 692 | if (readerMode) { 693 | el.classList.add("reader"); 694 | } else { 695 | el.classList.remove("reader"); 696 | } 697 | }); 698 | } 699 | }; 700 | 701 | const setReaderModeValue = (val) => { 702 | if (window.location.protocol !== "file:") { 703 | window.localStorage.setItem("quarto-reader-mode", val); 704 | } else { 705 | localReaderMode = val; 706 | } 707 | }; 708 | 709 | const isReaderMode = () => { 710 | if (window.location.protocol !== "file:") { 711 | return window.localStorage.getItem("quarto-reader-mode") === "true"; 712 | } else { 713 | return localReaderMode; 714 | } 715 | }; 716 | let localReaderMode = null; 717 | 718 | const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded"); 719 | const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1; 720 | 721 | // Walk the TOC and collapse/expand nodes 722 | // Nodes are expanded if: 723 | // - they are top level 724 | // - they have children that are 'active' links 725 | // - they are directly below an link that is 'active' 726 | const walk = (el, depth) => { 727 | // Tick depth when we enter a UL 728 | if (el.tagName === "UL") { 729 | depth = depth + 1; 730 | } 731 | 732 | // It this is active link 733 | let isActiveNode = false; 734 | if (el.tagName === "A" && el.classList.contains("active")) { 735 | isActiveNode = true; 736 | } 737 | 738 | // See if there is an active child to this element 739 | let hasActiveChild = false; 740 | for (child of el.children) { 741 | hasActiveChild = walk(child, depth) || hasActiveChild; 742 | } 743 | 744 | // Process the collapse state if this is an UL 745 | if (el.tagName === "UL") { 746 | if (tocOpenDepth === -1 && depth > 1) { 747 | // toc-expand: false 748 | el.classList.add("collapse"); 749 | } else if ( 750 | depth <= tocOpenDepth || 751 | hasActiveChild || 752 | prevSiblingIsActiveLink(el) 753 | ) { 754 | el.classList.remove("collapse"); 755 | } else { 756 | el.classList.add("collapse"); 757 | } 758 | 759 | // untick depth when we leave a UL 760 | depth = depth - 1; 761 | } 762 | return hasActiveChild || isActiveNode; 763 | }; 764 | 765 | // walk the TOC and expand / collapse any items that should be shown 766 | if (tocEl) { 767 | updateActiveLink(); 768 | walk(tocEl, 0); 769 | } 770 | 771 | // Throttle the scroll event and walk peridiocally 772 | window.document.addEventListener( 773 | "scroll", 774 | throttle(() => { 775 | if (tocEl) { 776 | updateActiveLink(); 777 | walk(tocEl, 0); 778 | } 779 | if (!isReaderMode()) { 780 | hideOverlappedSidebars(); 781 | } 782 | }, 5) 783 | ); 784 | window.addEventListener( 785 | "resize", 786 | throttle(() => { 787 | if (tocEl) { 788 | updateActiveLink(); 789 | walk(tocEl, 0); 790 | } 791 | if (!isReaderMode()) { 792 | hideOverlappedSidebars(); 793 | } 794 | }, 10) 795 | ); 796 | hideOverlappedSidebars(); 797 | highlightReaderToggle(isReaderMode()); 798 | }); 799 | 800 | // grouped tabsets 801 | window.addEventListener("pageshow", (_event) => { 802 | function getTabSettings() { 803 | const data = localStorage.getItem("quarto-persistent-tabsets-data"); 804 | if (!data) { 805 | localStorage.setItem("quarto-persistent-tabsets-data", "{}"); 806 | return {}; 807 | } 808 | if (data) { 809 | return JSON.parse(data); 810 | } 811 | } 812 | 813 | function setTabSettings(data) { 814 | localStorage.setItem( 815 | "quarto-persistent-tabsets-data", 816 | JSON.stringify(data) 817 | ); 818 | } 819 | 820 | function setTabState(groupName, groupValue) { 821 | const data = getTabSettings(); 822 | data[groupName] = groupValue; 823 | setTabSettings(data); 824 | } 825 | 826 | function toggleTab(tab, active) { 827 | const tabPanelId = tab.getAttribute("aria-controls"); 828 | const tabPanel = document.getElementById(tabPanelId); 829 | if (active) { 830 | tab.classList.add("active"); 831 | tabPanel.classList.add("active"); 832 | } else { 833 | tab.classList.remove("active"); 834 | tabPanel.classList.remove("active"); 835 | } 836 | } 837 | 838 | function toggleAll(selectedGroup, selectorsToSync) { 839 | for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) { 840 | const active = selectedGroup === thisGroup; 841 | for (const tab of tabs) { 842 | toggleTab(tab, active); 843 | } 844 | } 845 | } 846 | 847 | function findSelectorsToSyncByLanguage() { 848 | const result = {}; 849 | const tabs = Array.from( 850 | document.querySelectorAll(`div[data-group] a[id^='tabset-']`) 851 | ); 852 | for (const item of tabs) { 853 | const div = item.parentElement.parentElement.parentElement; 854 | const group = div.getAttribute("data-group"); 855 | if (!result[group]) { 856 | result[group] = {}; 857 | } 858 | const selectorsToSync = result[group]; 859 | const value = item.innerHTML; 860 | if (!selectorsToSync[value]) { 861 | selectorsToSync[value] = []; 862 | } 863 | selectorsToSync[value].push(item); 864 | } 865 | return result; 866 | } 867 | 868 | function setupSelectorSync() { 869 | const selectorsToSync = findSelectorsToSyncByLanguage(); 870 | Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => { 871 | Object.entries(tabSetsByValue).forEach(([value, items]) => { 872 | items.forEach((item) => { 873 | item.addEventListener("click", (_event) => { 874 | setTabState(group, value); 875 | toggleAll(value, selectorsToSync[group]); 876 | }); 877 | }); 878 | }); 879 | }); 880 | return selectorsToSync; 881 | } 882 | 883 | const selectorsToSync = setupSelectorSync(); 884 | for (const [group, selectedName] of Object.entries(getTabSettings())) { 885 | const selectors = selectorsToSync[group]; 886 | // it's possible that stale state gives us empty selections, so we explicitly check here. 887 | if (selectors) { 888 | toggleAll(selectedName, selectors); 889 | } 890 | } 891 | }); 892 | 893 | function throttle(func, wait) { 894 | let waiting = false; 895 | return function () { 896 | if (!waiting) { 897 | func.apply(this, arguments); 898 | waiting = true; 899 | setTimeout(function () { 900 | waiting = false; 901 | }, wait); 902 | } 903 | }; 904 | } 905 | 906 | function nexttick(func) { 907 | return setTimeout(func, 0); 908 | } 909 | -------------------------------------------------------------------------------- /README_files/libs/quarto-html/tippy.css: -------------------------------------------------------------------------------- 1 | .tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1} -------------------------------------------------------------------------------- /README_files/libs/quarto-html/tippy.umd.min.js: -------------------------------------------------------------------------------- 1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("@popperjs/core")):"function"==typeof define&&define.amd?define(["@popperjs/core"],t):(e=e||self).tippy=t(e.Popper)}(this,(function(e){"use strict";var t={passive:!0,capture:!0},n=function(){return document.body};function r(e,t,n){if(Array.isArray(e)){var r=e[t];return null==r?Array.isArray(n)?n[t]:n:r}return e}function o(e,t){var n={}.toString.call(e);return 0===n.indexOf("[object")&&n.indexOf(t+"]")>-1}function i(e,t){return"function"==typeof e?e.apply(void 0,t):e}function a(e,t){return 0===t?e:function(r){clearTimeout(n),n=setTimeout((function(){e(r)}),t)};var n}function s(e,t){var n=Object.assign({},e);return t.forEach((function(e){delete n[e]})),n}function u(e){return[].concat(e)}function c(e,t){-1===e.indexOf(t)&&e.push(t)}function p(e){return e.split("-")[0]}function f(e){return[].slice.call(e)}function l(e){return Object.keys(e).reduce((function(t,n){return void 0!==e[n]&&(t[n]=e[n]),t}),{})}function d(){return document.createElement("div")}function v(e){return["Element","Fragment"].some((function(t){return o(e,t)}))}function m(e){return o(e,"MouseEvent")}function g(e){return!(!e||!e._tippy||e._tippy.reference!==e)}function h(e){return v(e)?[e]:function(e){return o(e,"NodeList")}(e)?f(e):Array.isArray(e)?e:f(document.querySelectorAll(e))}function b(e,t){e.forEach((function(e){e&&(e.style.transitionDuration=t+"ms")}))}function y(e,t){e.forEach((function(e){e&&e.setAttribute("data-state",t)}))}function w(e){var t,n=u(e)[0];return null!=n&&null!=(t=n.ownerDocument)&&t.body?n.ownerDocument:document}function E(e,t,n){var r=t+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(t){e[r](t,n)}))}function O(e,t){for(var n=t;n;){var r;if(e.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var x={isTouch:!1},C=0;function T(){x.isTouch||(x.isTouch=!0,window.performance&&document.addEventListener("mousemove",A))}function A(){var e=performance.now();e-C<20&&(x.isTouch=!1,document.removeEventListener("mousemove",A)),C=e}function L(){var e=document.activeElement;if(g(e)){var t=e._tippy;e.blur&&!t.state.isVisible&&e.blur()}}var D=!!("undefined"!=typeof window&&"undefined"!=typeof document)&&!!window.msCrypto,R=Object.assign({appendTo:n,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),k=Object.keys(R);function P(e){var t=(e.plugins||[]).reduce((function(t,n){var r,o=n.name,i=n.defaultValue;o&&(t[o]=void 0!==e[o]?e[o]:null!=(r=R[o])?r:i);return t}),{});return Object.assign({},e,t)}function j(e,t){var n=Object.assign({},t,{content:i(t.content,[e])},t.ignoreAttributes?{}:function(e,t){return(t?Object.keys(P(Object.assign({},R,{plugins:t}))):k).reduce((function(t,n){var r=(e.getAttribute("data-tippy-"+n)||"").trim();if(!r)return t;if("content"===n)t[n]=r;else try{t[n]=JSON.parse(r)}catch(e){t[n]=r}return t}),{})}(e,t.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?t.interactive:n.aria.expanded,content:"auto"===n.aria.content?t.interactive?null:"describedby":n.aria.content},n}function M(e,t){e.innerHTML=t}function V(e){var t=d();return!0===e?t.className="tippy-arrow":(t.className="tippy-svg-arrow",v(e)?t.appendChild(e):M(t,e)),t}function I(e,t){v(t.content)?(M(e,""),e.appendChild(t.content)):"function"!=typeof t.content&&(t.allowHTML?M(e,t.content):e.textContent=t.content)}function S(e){var t=e.firstElementChild,n=f(t.children);return{box:t,content:n.find((function(e){return e.classList.contains("tippy-content")})),arrow:n.find((function(e){return e.classList.contains("tippy-arrow")||e.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(e){return e.classList.contains("tippy-backdrop")}))}}function N(e){var t=d(),n=d();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=d();function o(n,r){var o=S(t),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||I(a,e.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(V(r.arrow))):i.appendChild(V(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),I(r,e.props),t.appendChild(n),n.appendChild(r),o(e.props,e.props),{popper:t,onUpdate:o}}N.$$tippy=!0;var B=1,H=[],U=[];function _(o,s){var v,g,h,C,T,A,L,k,M=j(o,Object.assign({},R,P(l(s)))),V=!1,I=!1,N=!1,_=!1,F=[],W=a(we,M.interactiveDebounce),X=B++,Y=(k=M.plugins).filter((function(e,t){return k.indexOf(e)===t})),$={id:X,reference:o,popper:d(),popperInstance:null,props:M,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:Y,clearDelayTimeouts:function(){clearTimeout(v),clearTimeout(g),cancelAnimationFrame(h)},setProps:function(e){if($.state.isDestroyed)return;ae("onBeforeUpdate",[$,e]),be();var t=$.props,n=j(o,Object.assign({},t,l(e),{ignoreAttributes:!0}));$.props=n,he(),t.interactiveDebounce!==n.interactiveDebounce&&(ce(),W=a(we,n.interactiveDebounce));t.triggerTarget&&!n.triggerTarget?u(t.triggerTarget).forEach((function(e){e.removeAttribute("aria-expanded")})):n.triggerTarget&&o.removeAttribute("aria-expanded");ue(),ie(),J&&J(t,n);$.popperInstance&&(Ce(),Ae().forEach((function(e){requestAnimationFrame(e._tippy.popperInstance.forceUpdate)})));ae("onAfterUpdate",[$,e])},setContent:function(e){$.setProps({content:e})},show:function(){var e=$.state.isVisible,t=$.state.isDestroyed,o=!$.state.isEnabled,a=x.isTouch&&!$.props.touch,s=r($.props.duration,0,R.duration);if(e||t||o||a)return;if(te().hasAttribute("disabled"))return;if(ae("onShow",[$],!1),!1===$.props.onShow($))return;$.state.isVisible=!0,ee()&&(z.style.visibility="visible");ie(),de(),$.state.isMounted||(z.style.transition="none");if(ee()){var u=re(),p=u.box,f=u.content;b([p,f],0)}A=function(){var e;if($.state.isVisible&&!_){if(_=!0,z.offsetHeight,z.style.transition=$.props.moveTransition,ee()&&$.props.animation){var t=re(),n=t.box,r=t.content;b([n,r],s),y([n,r],"visible")}se(),ue(),c(U,$),null==(e=$.popperInstance)||e.forceUpdate(),ae("onMount",[$]),$.props.animation&&ee()&&function(e,t){me(e,t)}(s,(function(){$.state.isShown=!0,ae("onShown",[$])}))}},function(){var e,t=$.props.appendTo,r=te();e=$.props.interactive&&t===n||"parent"===t?r.parentNode:i(t,[r]);e.contains(z)||e.appendChild(z);$.state.isMounted=!0,Ce()}()},hide:function(){var e=!$.state.isVisible,t=$.state.isDestroyed,n=!$.state.isEnabled,o=r($.props.duration,1,R.duration);if(e||t||n)return;if(ae("onHide",[$],!1),!1===$.props.onHide($))return;$.state.isVisible=!1,$.state.isShown=!1,_=!1,V=!1,ee()&&(z.style.visibility="hidden");if(ce(),ve(),ie(!0),ee()){var i=re(),a=i.box,s=i.content;$.props.animation&&(b([a,s],o),y([a,s],"hidden"))}se(),ue(),$.props.animation?ee()&&function(e,t){me(e,(function(){!$.state.isVisible&&z.parentNode&&z.parentNode.contains(z)&&t()}))}(o,$.unmount):$.unmount()},hideWithInteractivity:function(e){ne().addEventListener("mousemove",W),c(H,W),W(e)},enable:function(){$.state.isEnabled=!0},disable:function(){$.hide(),$.state.isEnabled=!1},unmount:function(){$.state.isVisible&&$.hide();if(!$.state.isMounted)return;Te(),Ae().forEach((function(e){e._tippy.unmount()})),z.parentNode&&z.parentNode.removeChild(z);U=U.filter((function(e){return e!==$})),$.state.isMounted=!1,ae("onHidden",[$])},destroy:function(){if($.state.isDestroyed)return;$.clearDelayTimeouts(),$.unmount(),be(),delete o._tippy,$.state.isDestroyed=!0,ae("onDestroy",[$])}};if(!M.render)return $;var q=M.render($),z=q.popper,J=q.onUpdate;z.setAttribute("data-tippy-root",""),z.id="tippy-"+$.id,$.popper=z,o._tippy=$,z._tippy=$;var G=Y.map((function(e){return e.fn($)})),K=o.hasAttribute("aria-expanded");return he(),ue(),ie(),ae("onCreate",[$]),M.showOnCreate&&Le(),z.addEventListener("mouseenter",(function(){$.props.interactive&&$.state.isVisible&&$.clearDelayTimeouts()})),z.addEventListener("mouseleave",(function(){$.props.interactive&&$.props.trigger.indexOf("mouseenter")>=0&&ne().addEventListener("mousemove",W)})),$;function Q(){var e=$.props.touch;return Array.isArray(e)?e:[e,0]}function Z(){return"hold"===Q()[0]}function ee(){var e;return!(null==(e=$.props.render)||!e.$$tippy)}function te(){return L||o}function ne(){var e=te().parentNode;return e?w(e):document}function re(){return S(z)}function oe(e){return $.state.isMounted&&!$.state.isVisible||x.isTouch||C&&"focus"===C.type?0:r($.props.delay,e?0:1,R.delay)}function ie(e){void 0===e&&(e=!1),z.style.pointerEvents=$.props.interactive&&!e?"":"none",z.style.zIndex=""+$.props.zIndex}function ae(e,t,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[e]&&n[e].apply(n,t)})),n)&&(r=$.props)[e].apply(r,t)}function se(){var e=$.props.aria;if(e.content){var t="aria-"+e.content,n=z.id;u($.props.triggerTarget||o).forEach((function(e){var r=e.getAttribute(t);if($.state.isVisible)e.setAttribute(t,r?r+" "+n:n);else{var o=r&&r.replace(n,"").trim();o?e.setAttribute(t,o):e.removeAttribute(t)}}))}}function ue(){!K&&$.props.aria.expanded&&u($.props.triggerTarget||o).forEach((function(e){$.props.interactive?e.setAttribute("aria-expanded",$.state.isVisible&&e===te()?"true":"false"):e.removeAttribute("aria-expanded")}))}function ce(){ne().removeEventListener("mousemove",W),H=H.filter((function(e){return e!==W}))}function pe(e){if(!x.isTouch||!N&&"mousedown"!==e.type){var t=e.composedPath&&e.composedPath()[0]||e.target;if(!$.props.interactive||!O(z,t)){if(u($.props.triggerTarget||o).some((function(e){return O(e,t)}))){if(x.isTouch)return;if($.state.isVisible&&$.props.trigger.indexOf("click")>=0)return}else ae("onClickOutside",[$,e]);!0===$.props.hideOnClick&&($.clearDelayTimeouts(),$.hide(),I=!0,setTimeout((function(){I=!1})),$.state.isMounted||ve())}}}function fe(){N=!0}function le(){N=!1}function de(){var e=ne();e.addEventListener("mousedown",pe,!0),e.addEventListener("touchend",pe,t),e.addEventListener("touchstart",le,t),e.addEventListener("touchmove",fe,t)}function ve(){var e=ne();e.removeEventListener("mousedown",pe,!0),e.removeEventListener("touchend",pe,t),e.removeEventListener("touchstart",le,t),e.removeEventListener("touchmove",fe,t)}function me(e,t){var n=re().box;function r(e){e.target===n&&(E(n,"remove",r),t())}if(0===e)return t();E(n,"remove",T),E(n,"add",r),T=r}function ge(e,t,n){void 0===n&&(n=!1),u($.props.triggerTarget||o).forEach((function(r){r.addEventListener(e,t,n),F.push({node:r,eventType:e,handler:t,options:n})}))}function he(){var e;Z()&&(ge("touchstart",ye,{passive:!0}),ge("touchend",Ee,{passive:!0})),(e=$.props.trigger,e.split(/\s+/).filter(Boolean)).forEach((function(e){if("manual"!==e)switch(ge(e,ye),e){case"mouseenter":ge("mouseleave",Ee);break;case"focus":ge(D?"focusout":"blur",Oe);break;case"focusin":ge("focusout",Oe)}}))}function be(){F.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),F=[]}function ye(e){var t,n=!1;if($.state.isEnabled&&!xe(e)&&!I){var r="focus"===(null==(t=C)?void 0:t.type);C=e,L=e.currentTarget,ue(),!$.state.isVisible&&m(e)&&H.forEach((function(t){return t(e)})),"click"===e.type&&($.props.trigger.indexOf("mouseenter")<0||V)&&!1!==$.props.hideOnClick&&$.state.isVisible?n=!0:Le(e),"click"===e.type&&(V=!n),n&&!r&&De(e)}}function we(e){var t=e.target,n=te().contains(t)||z.contains(t);"mousemove"===e.type&&n||function(e,t){var n=t.clientX,r=t.clientY;return e.every((function(e){var t=e.popperRect,o=e.popperState,i=e.props.interactiveBorder,a=p(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,c="top"===a?s.bottom.y:0,f="right"===a?s.left.x:0,l="left"===a?s.right.x:0,d=t.top-r+u>i,v=r-t.bottom-c>i,m=t.left-n+f>i,g=n-t.right-l>i;return d||v||m||g}))}(Ae().concat(z).map((function(e){var t,n=null==(t=e._tippy.popperInstance)?void 0:t.state;return n?{popperRect:e.getBoundingClientRect(),popperState:n,props:M}:null})).filter(Boolean),e)&&(ce(),De(e))}function Ee(e){xe(e)||$.props.trigger.indexOf("click")>=0&&V||($.props.interactive?$.hideWithInteractivity(e):De(e))}function Oe(e){$.props.trigger.indexOf("focusin")<0&&e.target!==te()||$.props.interactive&&e.relatedTarget&&z.contains(e.relatedTarget)||De(e)}function xe(e){return!!x.isTouch&&Z()!==e.type.indexOf("touch")>=0}function Ce(){Te();var t=$.props,n=t.popperOptions,r=t.placement,i=t.offset,a=t.getReferenceClientRect,s=t.moveTransition,u=ee()?S(z).arrow:null,c=a?{getBoundingClientRect:a,contextElement:a.contextElement||te()}:o,p=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(e){var t=e.state;if(ee()){var n=re().box;["placement","reference-hidden","escaped"].forEach((function(e){"placement"===e?n.setAttribute("data-placement",t.placement):t.attributes.popper["data-popper-"+e]?n.setAttribute("data-"+e,""):n.removeAttribute("data-"+e)})),t.attributes.popper={}}}}];ee()&&u&&p.push({name:"arrow",options:{element:u,padding:3}}),p.push.apply(p,(null==n?void 0:n.modifiers)||[]),$.popperInstance=e.createPopper(c,z,Object.assign({},n,{placement:r,onFirstUpdate:A,modifiers:p}))}function Te(){$.popperInstance&&($.popperInstance.destroy(),$.popperInstance=null)}function Ae(){return f(z.querySelectorAll("[data-tippy-root]"))}function Le(e){$.clearDelayTimeouts(),e&&ae("onTrigger",[$,e]),de();var t=oe(!0),n=Q(),r=n[0],o=n[1];x.isTouch&&"hold"===r&&o&&(t=o),t?v=setTimeout((function(){$.show()}),t):$.show()}function De(e){if($.clearDelayTimeouts(),ae("onUntrigger",[$,e]),$.state.isVisible){if(!($.props.trigger.indexOf("mouseenter")>=0&&$.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(e.type)>=0&&V)){var t=oe(!1);t?g=setTimeout((function(){$.state.isVisible&&$.hide()}),t):h=requestAnimationFrame((function(){$.hide()}))}}else ve()}}function F(e,n){void 0===n&&(n={});var r=R.plugins.concat(n.plugins||[]);document.addEventListener("touchstart",T,t),window.addEventListener("blur",L);var o=Object.assign({},n,{plugins:r}),i=h(e).reduce((function(e,t){var n=t&&_(t,o);return n&&e.push(n),e}),[]);return v(e)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(e){Object.keys(e).forEach((function(t){R[t]=e[t]}))},F.currentInput=x;var W=Object.assign({},e.applyStyles,{effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(e){var t;if(null==(t=e.props.render)||!t.$$tippy)return{};var n=S(e.popper),r=n.box,o=n.content,i=e.props.animateFill?function(){var e=d();return e.className="tippy-backdrop",y([e],"hidden"),e}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",e.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var e=r.style.transitionDuration,t=Number(e.replace("ms",""));o.style.transitionDelay=Math.round(t/10)+"ms",i.style.transitionDuration=e,y([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&y([i],"hidden")}}}};var $={clientX:0,clientY:0},q=[];function z(e){var t=e.clientX,n=e.clientY;$={clientX:t,clientY:n}}var J={name:"followCursor",defaultValue:!1,fn:function(e){var t=e.reference,n=w(e.props.triggerTarget||t),r=!1,o=!1,i=!0,a=e.props;function s(){return"initial"===e.props.followCursor&&e.state.isVisible}function u(){n.addEventListener("mousemove",f)}function c(){n.removeEventListener("mousemove",f)}function p(){r=!0,e.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||t.contains(n.target),o=e.props.followCursor,i=n.clientX,a=n.clientY,s=t.getBoundingClientRect(),u=i-s.left,c=a-s.top;!r&&e.props.interactive||e.setProps({getReferenceClientRect:function(){var e=t.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=e.left+u,r=e.top+c);var s="horizontal"===o?e.top:r,p="vertical"===o?e.right:n,f="horizontal"===o?e.bottom:r,l="vertical"===o?e.left:n;return{width:p-l,height:f-s,top:s,right:p,bottom:f,left:l}}})}function l(){e.props.followCursor&&(q.push({instance:e,doc:n}),function(e){e.addEventListener("mousemove",z)}(n))}function d(){0===(q=q.filter((function(t){return t.instance!==e}))).filter((function(e){return e.doc===n})).length&&function(e){e.removeEventListener("mousemove",z)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=e.props},onAfterUpdate:function(t,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!e.state.isMounted||o||s()||u()):(c(),p()))},onMount:function(){e.props.followCursor&&!o&&(i&&(f($),i=!1),s()||u())},onTrigger:function(e,t){m(t)&&($={clientX:t.clientX,clientY:t.clientY}),o="focus"===t.type},onHidden:function(){e.props.followCursor&&(p(),c(),i=!0)}}}};var G={name:"inlinePositioning",defaultValue:!1,fn:function(e){var t,n=e.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;e.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),t!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),e.setProps({getReferenceClientRect:function(){return function(e){return function(e,t,n,r){if(n.length<2||null===e)return t;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||t;switch(e){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===e,s=o.top,u=i.bottom,c=a?o.left:i.left,p=a?o.right:i.right;return{top:s,bottom:u,left:c,right:p,width:p-c,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(e){return e.left}))),l=Math.max.apply(Math,n.map((function(e){return e.right}))),d=n.filter((function(t){return"left"===e?t.left===f:t.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return t}}(p(e),n.getBoundingClientRect(),f(n.getClientRects()),r)}(a.placement)}})),t=a.placement)}};function s(){var t;o||(t=function(e,t){var n;return{popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat(((null==(n=e.popperOptions)?void 0:n.modifiers)||[]).filter((function(e){return e.name!==t.name})),[t])})}}(e.props,a),o=!0,e.setProps(t),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(t,n){if(m(n)){var o=f(e.reference.getClientRects()),i=o.find((function(e){return e.left-2<=n.clientX&&e.right+2>=n.clientX&&e.top-2<=n.clientY&&e.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var K={name:"sticky",defaultValue:!1,fn:function(e){var t=e.reference,n=e.popper;function r(t){return!0===e.props.sticky||e.props.sticky===t}var o=null,i=null;function a(){var s=r("reference")?(e.popperInstance?e.popperInstance.state.elements.reference:t).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Q(o,s)||u&&Q(i,u))&&e.popperInstance&&e.popperInstance.update(),o=s,i=u,e.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){e.props.sticky&&a()}}}};function Q(e,t){return!e||!t||(e.top!==t.top||e.right!==t.right||e.bottom!==t.bottom||e.left!==t.left)}return F.setDefaultProps({plugins:[Y,J,G,K],render:N}),F.createSingleton=function(e,t){var n;void 0===t&&(t={});var r,o=e,i=[],a=[],c=t.overrides,p=[],f=!1;function l(){a=o.map((function(e){return u(e.props.triggerTarget||e.reference)})).reduce((function(e,t){return e.concat(t)}),[])}function v(){i=o.map((function(e){return e.reference}))}function m(e){o.forEach((function(t){e?t.enable():t.disable()}))}function g(e){return o.map((function(t){var n=t.setProps;return t.setProps=function(o){n(o),t.reference===r&&e.setProps(o)},function(){t.setProps=n}}))}function h(e,t){var n=a.indexOf(t);if(t!==r){r=t;var s=(c||[]).concat("content").reduce((function(e,t){return e[t]=o[n].props[t],e}),{});e.setProps(Object.assign({},s,{getReferenceClientRect:"function"==typeof s.getReferenceClientRect?s.getReferenceClientRect:function(){var e;return null==(e=i[n])?void 0:e.getBoundingClientRect()}}))}}m(!1),v(),l();var b={fn:function(){return{onDestroy:function(){m(!0)},onHidden:function(){r=null},onClickOutside:function(e){e.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(e){e.props.showOnCreate&&!f&&(f=!0,h(e,i[0]))},onTrigger:function(e,t){h(e,t.currentTarget)}}}},y=F(d(),Object.assign({},s(t,["overrides"]),{plugins:[b].concat(t.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat((null==(n=t.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(e){if(w(),!r&&null==e)return h(y,i[0]);if(!r||null!=e){if("number"==typeof e)return i[e]&&h(y,i[e]);if(o.indexOf(e)>=0){var t=e.reference;return h(y,t)}return i.indexOf(e)>=0?h(y,e):void 0}},y.showNext=function(){var e=i[0];if(!r)return y.show(0);var t=i.indexOf(r);y.show(i[t+1]||e)},y.showPrevious=function(){var e=i[i.length-1];if(!r)return y.show(e);var t=i.indexOf(r),n=i[t-1]||e;y.show(n)};var E=y.setProps;return y.setProps=function(e){c=e.overrides||c,E(e)},y.setInstances=function(e){m(!0),p.forEach((function(e){return e()})),o=e,m(!1),v(),l(),p=g(y),y.setProps({triggerTarget:a})},p=g(y),y},F.delegate=function(e,n){var r=[],o=[],i=!1,a=n.target,c=s(n,["target"]),p=Object.assign({},c,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},c,{showOnCreate:!0}),l=F(e,p);function d(e){if(e.target&&!i){var t=e.target.closest(a);if(t){var r=t.getAttribute("data-tippy-trigger")||n.trigger||R.trigger;if(!t._tippy&&!("touchstart"===e.type&&"boolean"==typeof f.touch||"touchstart"!==e.type&&r.indexOf(X[e.type])<0)){var s=F(t,f);s&&(o=o.concat(s))}}}}function v(e,t,n,o){void 0===o&&(o=!1),e.addEventListener(t,n,o),r.push({node:e,eventType:t,handler:n,options:o})}return u(l).forEach((function(e){var n=e.destroy,a=e.enable,s=e.disable;e.destroy=function(e){void 0===e&&(e=!0),e&&o.forEach((function(e){e.destroy()})),o=[],r.forEach((function(e){var t=e.node,n=e.eventType,r=e.handler,o=e.options;t.removeEventListener(n,r,o)})),r=[],n()},e.enable=function(){a(),o.forEach((function(e){return e.enable()})),i=!1},e.disable=function(){s(),o.forEach((function(e){return e.disable()})),i=!0},function(e){var n=e.reference;v(n,"touchstart",d,t),v(n,"mouseover",d),v(n,"focusin",d),v(n,"click",d)}(e)})),l},F.hideAll=function(e){var t=void 0===e?{}:e,n=t.exclude,r=t.duration;U.forEach((function(e){var t=!1;if(n&&(t=g(n)?e.reference===n:e.popper===n.popper),!t){var o=e.props.duration;e.setProps({duration:r}),e.hide(),e.state.isDestroyed||e.setProps({duration:o})}}))},F.roundArrow='',F})); 2 | 3 | -------------------------------------------------------------------------------- /WPFGUI/MainWindow.xaml: -------------------------------------------------------------------------------- 1 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |